From e5d78139de6ad60be2a4f7620df02068f58216a5 Mon Sep 17 00:00:00 2001 From: Troy Date: Sun, 3 Jul 2022 22:13:25 -0400 Subject: [PATCH] SCSI Phase handling improved for SCSI-2 --- src/BlueSCSI.cpp | 51 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/src/BlueSCSI.cpp b/src/BlueSCSI.cpp index 2683b44..30b2a50 100644 --- a/src/BlueSCSI.cpp +++ b/src/BlueSCSI.cpp @@ -1484,44 +1484,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.