Selaa lähdekoodia

Merge pull request #142 from mynameistroy/troy/phase_fix

SCSI Phase handling improved for SCSI-2
Eric Helgeson 3 vuotta sitten
vanhempi
sitoutus
2a95bc35ff
1 muutettua tiedostoa jossa 26 lisäystä ja 25 poistoa
  1. 26 25
      src/BlueSCSI.cpp

+ 26 - 25
src/BlueSCSI.cpp

@@ -1494,44 +1494,45 @@ void loop()
   m_lun = 0xff;
   SCSI_DEVICE *dev = (SCSI_DEVICE *)0; // HDD image for current SCSI-ID, LUN
 
-  // Wait until RST = H, BSY = H, SEL = L
+  do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
+  // We're in ARBITRATION
+  //LOG(" A:"); LOGHEX(readIO()); LOG(" ");
+  
   do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
-
-  // BSY+ SEL-
-  // If the ID to respond is not driven, wait for the next
-  //byte db = readIO();
-  //byte scsiid = db & scsi_id_mask;
+  //LOG(" S:"); LOGHEX(readIO()); LOG(" ");
+  // We're in SELECTION
+  
   byte scsiid = readIO() & scsi_id_mask;
-  if((scsiid) == 0) {
+  if(SCSI_IN(vIO) || (scsiid) == 0) {
     delayMicroseconds(1);
     return;
   }
-  LOGN("Selection");
-  m_isBusReset = false;
-  if (setjmp(m_resetJmpBuf) == 1) {
-    LOGN("Reset, going to BusFree");
-    goto BusFree;
-  }
-  enableResetJmp();
-  
+  // We've been selected
+
+  #ifdef XCVR
+  // Reconfigure target pins to output mode, after resetting their values
+  GPIOB->regs->BSRR = 0x000000E8; // MSG, CD, REQ, IO
+  //  GPIOA->regs->BSRR = 0x00000200; // BSY
+#endif
+  SCSI_TARGET_ACTIVE()  // (BSY), REQ, MSG, CD, IO output turned on
+
   // Set BSY to-when selected
   SCSI_BSY_ACTIVE();     // Turn only BSY output ON, ACTIVE
 
+  // Wait until SEL becomes inactive
+  while(isHigh(gpio_read(SEL))) {}
+  
   // Ask for a TARGET-ID to respond
   m_id = 31 - __builtin_clz(scsiid);
 
-  // Wait until SEL becomes inactive
-  while(isHigh(gpio_read(SEL)) && isLow(gpio_read(BSY))) {
+  m_isBusReset = false;
+  if (setjmp(m_resetJmpBuf) == 1) {
+    LOGN("Reset, going to BusFree");
+    goto BusFree;
   }
+  enableResetJmp();
   
-#ifdef XCVR
-  // Reconfigure target pins to output mode, after resetting their values
-  GPIOB->regs->BSRR = 0x000000E8; // MSG, CD, REQ, IO
-//  GPIOA->regs->BSRR = 0x00000200; // BSY
-#endif
-  SCSI_TARGET_ACTIVE()  // (BSY), REQ, MSG, CD, IO output turned on
-
-  //  
+  // In SCSI-2 this is mandatory, but in SCSI-1 it's optional 
   if(isHigh(gpio_read(ATN))) {
     SCSI_PHASE_CHANGE(SCSI_PHASE_MESSAGEOUT);
     // Bus settle delay 400ns. Following code was measured at 350ns before REQ asserted. Added another 50ns. STM32F103.