Browse Source

Fix select phase of ZuluSCSI v1.2

Some of the GD32F205 based board have their SCSI select input signal
moved to a different GPIO. The interrupt for the select signal
didn't reflect this possibility. Adding logic to differentiate
boards with or without this signal pin difference fixes the issue where
some systems were failing the select phase.
Morio 1 năm trước cách đây
mục cha
commit
8ca36b6df4

+ 2 - 1
lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_platform.cpp

@@ -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"
 
@@ -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);

+ 1 - 0
lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_platform.h

@@ -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

+ 20 - 8
lib/ZuluSCSI_platform_GD32F205/scsiPhy.cpp

@@ -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;
@@ -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);
     }
@@ -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();
     }
 }
@@ -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);
+    }
 }