Эх сурвалжийг харах

Tester Harness Improvements Part 2

androda 2 жил өмнө
parent
commit
506209dd88

+ 11 - 0
lib/BlueSCSI_platform_RP2040/BlueSCSI_platform.h

@@ -146,6 +146,17 @@ int platform_network_wifi_channel();
 #define SCSI_IN(pin) \
     ((sio_hw->gpio_in & (1 << (scsi_pins.IN_ ## pin))) ? 0 : 1)
 
+
+// Write a single SCSI pin with raw GPIO number
+// state 1 is asserted, state 0 is deasserted
+#define SCSI_TEST_OUT(pin, state) \
+    *(state ? &sio_hw->gpio_clr : &sio_hw->gpio_set) = 1 << (pin)
+
+// Read a single SCSI pin specifying raw GPIO number
+// Returns 1 for asserted, 0 for deasserted
+#define SCSI_TEST_IN(pin) \
+    ((sio_hw->gpio_in & (1 << (pin))) ? 0 : 1)
+
 // Set pin directions for initiator vs. target mode
 #define SCSI_ENABLE_INITIATOR() \
     (sio_hw->gpio_oe_set = (1 << SCSI_OUT_ACK) | \

+ 41 - 2
src/BlueSCSI.cpp

@@ -619,9 +619,29 @@ extern "C" void bluescsi_setup(void)
   LED_OFF();
 }
 
+int waitForPin(uint32_t asserted, uint32_t pin, uint32_t maxDelay) {
+  for (int i = 0; i < maxDelay; i++) {
+    if ((asserted ? SCSI_TEST_IN(pin) : ! SCSI_TEST_IN(pin))) {
+      return 1;
+    } else {
+      delay(1);
+    }
+  }
+  return 0;
+}
+
+void inputPinTest(uint32_t pin, uint32_t feedbackPin, uint32_t delayms) {
+  if (waitForPin(1, pin, delayms * 2)) {  // Wait for test input assert
+    SCSI_TEST_OUT(feedbackPin, 1);  // Assert the feedback pin
+    waitForPin(0, pin, delayms * 2);  // Wait for test input deassert
+    SCSI_TEST_OUT(feedbackPin, 0);  // Deassert the feedback pin regardless of whether the test input deasserted
+  }
+}
+
 void bluescsi_test_loop(void) {
   while(g_test_mode) {
-    long delayms = 8;
+    uint8_t defaultDelay = 8;
+    long delayms = defaultDelay;
     if (ini_getbool("SCSI", "TestMode", 0, CONFIGFILE))
     {
       // Blink each pin for longer in manual test mode
@@ -638,7 +658,19 @@ void bluescsi_test_loop(void) {
     delay(delayms);
     SCSI_OUT(ACK, 0);
     delay(delayms);
-    // ATN not tested here, there's no ATN output
+
+    if (delayms == defaultDelay) {
+      // Now waiting for signals from test harness
+      inputPinTest(scsi_pins.IN_IO, scsi_pins.OUT_ACK, delayms);
+      inputPinTest(scsi_pins.IN_REQ, scsi_pins.OUT_ACK, delayms);
+      inputPinTest(scsi_pins.IN_CD, scsi_pins.OUT_ACK, delayms);
+      inputPinTest(scsi_pins.IN_MSG, scsi_pins.OUT_ACK, delayms);
+
+      sio_hw->gpio_oe_clr = (1 << scsi_pins.IN_BSY);
+      inputPinTest(scsi_pins.IN_SEL, scsi_pins.OUT_ACK, delayms);
+      inputPinTest(scsi_pins.IN_BSY, scsi_pins.OUT_ACK, delayms);
+    }
+
     SCSI_RELEASE_INITIATOR();
 
     delay(delayms);
@@ -668,6 +700,13 @@ void bluescsi_test_loop(void) {
     // delay(25);
     // SCSI_OUT(ATN, 0);
 
+    if (delayms == defaultDelay) {
+      // Test harness signals
+      sio_hw->gpio_oe_clr = (1 << scsi_pins.IN_ATN);
+      inputPinTest(scsi_pins.IN_ACK, scsi_pins.OUT_REQ, delayms);
+      inputPinTest(scsi_pins.IN_ATN, scsi_pins.OUT_REQ, delayms);
+    }
+
     // Verify data + parity
     SCSI_OUT_DATA(0);
     delay(delayms);