Skip to content

Commit

Permalink
Merge pull request #427 from ZuluSCSI/fix/zuluscsi-v1.2-select-signal
Browse files Browse the repository at this point in the history
Fix select phase of ZuluSCSI v1.2
  • Loading branch information
aperezbios authored May 23, 2024
2 parents 2ddc0f1 + 43e981a commit c49f994
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 9 deletions.
3 changes: 2 additions & 1 deletion lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const char *g_platform_name = PLATFORM_NAME;
static bool g_enable_apple_quirks = false;
bool g_direct_mode = false;
ZuluSCSIVersion_t g_zuluscsi_version = ZSVersion_unknown;

bool g_moved_select_in = false;
// hw_config.cpp c functions
#include "platform_hw_config.h"

Expand Down Expand Up @@ -236,6 +236,7 @@ void platform_init()

// determine the ZulusSCSI board version
g_zuluscsi_version = get_zuluscsi_version();
g_moved_select_in = g_zuluscsi_version == ZSVersion_v1_1_ODE || g_zuluscsi_version == ZSVersion_v1_2;

// Init SCSI pins GPIOs
gpio_init(SCSI_OUT_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SCSI_OUT_DATA_MASK | SCSI_OUT_REQ);
Expand Down
1 change: 1 addition & 0 deletions lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ enum ZuluSCSIVersion_t
};

extern enum ZuluSCSIVersion_t g_zuluscsi_version;
extern bool g_moved_select_in;

#ifndef PLATFORM_VDD_WARNING_LIMIT_mV
#define PLATFORM_VDD_WARNING_LIMIT_mV 2800
Expand Down
5 changes: 5 additions & 0 deletions lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_v1_0_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,11 @@
// Unused place holders for compiling
#define SCSI_ODE_SEL_PORT SCSI_SEL_PORT
#define SCSI_ODE_SEL_PIN SCSI_SEL_PIN
#define SCSI_ODE_SEL_EXTI SCSI_SEL_EXTI
#define SCSI_ODE_SEL_EXTI_SOURCE_PORT SCSI_SEL_EXTI_SOURCE_PORT
#define SCSI_ODE_SEL_EXTI_SOURCE_PIN SCSI_SEL_EXTI_SOURCE_PIN
#define SCSI_ODE_SEL_IRQ SCSI_SEL_IRQ
#define SCSI_ODE_SEL_IRQn SCSI_SEL_IRQn


// BSY pin uses EXTI interrupt
Expand Down
28 changes: 20 additions & 8 deletions lib/ZuluSCSI_platform_GD32F205/scsiPhy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ volatile uint8_t g_scsi_ctrl_bsy;

static void scsi_bsy_deassert_interrupt()
{
if (!SCSI_IN(BSY) && (((g_zuluscsi_version == ZSVersion_v1_1_ODE || g_zuluscsi_version == ZSVersion_v1_2) && SCSI_IN(ODE_SEL)) || SCSI_IN(SEL)) )
if (!SCSI_IN(BSY) && ((g_moved_select_in && SCSI_IN(ODE_SEL)) || (!g_moved_select_in && SCSI_IN(SEL))))
{
uint8_t sel_bits = SCSI_IN_DATA();
int sel_id = -1;
Expand Down Expand Up @@ -126,7 +126,7 @@ extern "C" bool scsiStatusSEL()
SCSI_OUT(BSY, 1);
}

if (g_zuluscsi_version == ZSVersion_v1_1_ODE || g_zuluscsi_version == ZSVersion_v1_2)
if (g_moved_select_in)
{
return SCSI_IN(ODE_SEL);
}
Expand Down Expand Up @@ -586,12 +586,14 @@ void SCSI_RST_IRQ (void)
scsi_bsy_deassert_interrupt();
}

if (exti_interrupt_flag_get(SCSI_SEL_EXTI))
if ((g_moved_select_in && exti_interrupt_flag_get(SCSI_ODE_SEL_EXTI)) ||
(!g_moved_select_in && exti_interrupt_flag_get(SCSI_SEL_EXTI))
)
{
// Check BSY line status when SEL goes active.
// This is needed to handle SCSI-1 hosts that use the single initiator mode.
// The host will just assert the SEL directly, without asserting BSY first.
exti_interrupt_flag_clear(SCSI_SEL_EXTI);
exti_interrupt_flag_clear(g_moved_select_in ? SCSI_ODE_SEL_EXTI : SCSI_SEL_EXTI);
scsi_bsy_deassert_interrupt();
}
}
Expand Down Expand Up @@ -627,10 +629,20 @@ static void init_irqs()
NVIC_EnableIRQ(SCSI_BSY_IRQn);

// Falling edge of SEL pin
gpio_exti_source_select(SCSI_SEL_EXTI_SOURCE_PORT, SCSI_SEL_EXTI_SOURCE_PIN);
exti_init(SCSI_SEL_EXTI, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
NVIC_SetPriority(SCSI_SEL_IRQn, 1);
NVIC_EnableIRQ(SCSI_SEL_IRQn);
if (g_moved_select_in)
{
gpio_exti_source_select(SCSI_ODE_SEL_EXTI_SOURCE_PORT, SCSI_ODE_SEL_EXTI_SOURCE_PIN);
exti_init(SCSI_ODE_SEL_EXTI, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
NVIC_SetPriority(SCSI_ODE_SEL_IRQn, 1);
NVIC_EnableIRQ(SCSI_ODE_SEL_IRQn);
}
else
{
gpio_exti_source_select(SCSI_SEL_EXTI_SOURCE_PORT, SCSI_SEL_EXTI_SOURCE_PIN);
exti_init(SCSI_SEL_EXTI, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
NVIC_SetPriority(SCSI_SEL_IRQn, 1);
NVIC_EnableIRQ(SCSI_SEL_IRQn);
}
}


0 comments on commit c49f994

Please sign in to comment.