Ver código fonte

Add support for SCSI-1 single initiator mode (#4, #42)

Petteri Aimonen 3 anos atrás
pai
commit
9387826b42

+ 9 - 2
lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_v1_0_gpio.h

@@ -50,8 +50,6 @@
 #define SCSI_OUT_REQ_PIN  SCSI_OUT_REQ
 
 // SCSI input status signals
-#define SCSI_SEL_PORT GPIOB
-#define SCSI_SEL_PIN  GPIO_PIN_11
 #define SCSI_ACK_PORT GPIOB
 #define SCSI_ACK_PIN  GPIO_PIN_12
 #define SCSI_IN_ACK_IDX 12
@@ -65,6 +63,15 @@
 #define SCSI_ATN_PIN  GPIO_PIN_6
 #endif
 
+// SEL pin uses EXTI interrupt
+#define SCSI_SEL_PORT GPIOB
+#define SCSI_SEL_PIN  GPIO_PIN_11
+#define SCSI_SEL_EXTI EXTI_11
+#define SCSI_SEL_EXTI_SOURCE_PORT GPIO_PORT_SOURCE_GPIOB
+#define SCSI_SEL_EXTI_SOURCE_PIN GPIO_PIN_SOURCE_11
+#define SCSI_SEL_IRQ EXTI10_15_IRQHandler
+#define SCSI_SEL_IRQn EXTI10_15_IRQn
+
 // BSY pin uses EXTI interrupt
 #define SCSI_BSY_PORT GPIOB
 #define SCSI_BSY_PIN  GPIO_PIN_10

+ 9 - 2
lib/ZuluSCSI_platform_GD32F205/ZuluSCSI_v1_1_gpio.h

@@ -87,8 +87,6 @@
 #define SCSI_OUT_REQ_PIN  SCSI_OUT_REQ
 
 // SCSI input status signals
-#define SCSI_SEL_PORT GPIOB
-#define SCSI_SEL_PIN  GPIO_PIN_11
 #define SCSI_ACK_PORT GPIOA
 #define SCSI_ACK_PIN  GPIO_PIN_0
 #define SCSI_ATN_PORT GPIOB
@@ -108,6 +106,15 @@
 #define SCSI_SYNC_TIMER TIMER1
 #define SCSI_SYNC_TIMER_RCU RCU_TIMER1
 
+// SEL pin uses EXTI interrupt
+#define SCSI_SEL_PORT GPIOB
+#define SCSI_SEL_PIN  GPIO_PIN_11
+#define SCSI_SEL_EXTI EXTI_11
+#define SCSI_SEL_EXTI_SOURCE_PORT GPIO_PORT_SOURCE_GPIOB
+#define SCSI_SEL_EXTI_SOURCE_PIN GPIO_PIN_SOURCE_11
+#define SCSI_SEL_IRQ EXTI10_15_IRQHandler
+#define SCSI_SEL_IRQn EXTI10_15_IRQn
+
 // BSY pin uses EXTI interrupt
 #define SCSI_BSY_PORT GPIOB
 #define SCSI_BSY_PIN  GPIO_PIN_10

+ 23 - 0
lib/ZuluSCSI_platform_GD32F205/scsiPhy.cpp

@@ -530,6 +530,15 @@ void SCSI_RST_IRQ (void)
         exti_interrupt_flag_clear(SCSI_BSY_EXTI);
         scsi_bsy_deassert_interrupt();
     }
+
+    if (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);
+        scsi_bsy_deassert_interrupt();
+    }
 }
 
 #if SCSI_RST_IRQn != SCSI_BSY_IRQn
@@ -540,6 +549,14 @@ void SCSI_BSY_IRQ (void)
 }
 #endif
 
+#if (SCSI_SEL_IRQn != SCSI_RST_IRQn) && (SCSI_SEL_IRQn != SCSI_BSY_IRQn)
+extern "C"
+void SCSI_SEL_IRQ (void)
+{
+    SCSI_RST_IRQ();
+}
+#endif
+
 static void init_irqs()
 {
     // Falling edge of RST pin
@@ -553,6 +570,12 @@ static void init_irqs()
     exti_init(SCSI_BSY_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
     NVIC_SetPriority(SCSI_BSY_IRQn, 1);
     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);
 }
 
 

+ 3 - 0
lib/ZuluSCSI_platform_template/scsiPhy.cpp

@@ -109,6 +109,9 @@ extern "C" void scsiPhyReset(void)
     /* Implement here code to enable two interrupts:
      * scsi_bsy_deassert_interrupt() on rising edge of BSY pin
      * scsi_rst_assert_interrupt() on falling edge of RST pin
+     *
+     * For SCSI-1 single-initiator support, also call:
+     * scsi_bsy_deassert_interrupt() on falling edge of SEL pin
      */
 }