Parcourir la source

Merge pull request #427 from ZuluSCSI/fix/zuluscsi-v1.2-select-signal

Fix select phase of ZuluSCSI v1.2
Alex Perez il y a 1 an
Parent
commit
c49f9941e3

+ 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

+ 5 - 0
lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_v1_0_gpio.h

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

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