|
|
@@ -111,93 +111,12 @@ static void enter_Status(uint8 status)
|
|
|
scsiDev.status = status;
|
|
|
scsiDev.phase = STATUS;
|
|
|
|
|
|
-
|
|
|
- #ifdef MM_DEBUG
|
|
|
scsiDev.lastStatus = scsiDev.status;
|
|
|
scsiDev.lastSense = scsiDev.sense.code;
|
|
|
- #endif
|
|
|
-}
|
|
|
-
|
|
|
-static void doReselectTest()
|
|
|
-{
|
|
|
- scsiDev.needReconnect = 0;
|
|
|
- scsiEnterPhase(MESSAGE_IN);
|
|
|
- scsiWriteByte(0x02); // save data pointer
|
|
|
-
|
|
|
- // TODO check if this message was rejected.
|
|
|
-
|
|
|
- scsiWriteByte(0x04); // disconnect msg.
|
|
|
- enter_BusFree();
|
|
|
-
|
|
|
- CyDelay(100);
|
|
|
-
|
|
|
- while (1)
|
|
|
- {
|
|
|
- int sel = SCSI_ReadPin(SCSI_In_SEL);
|
|
|
- int bsy = SCSI_ReadPin(SCSI_In_BSY);
|
|
|
- if (!sel && !bsy)
|
|
|
- {
|
|
|
- // TODO wait bus settle delay
|
|
|
- CyDelayUs(1); // TODO bus free delay 800ns
|
|
|
-
|
|
|
- // Arbitrate.
|
|
|
- ledOn();
|
|
|
- SCSI_Out_Bits_Write(scsiDev.scsiIdMask);
|
|
|
- SCSI_Out_Ctl_Write(1); // Write bits manually.
|
|
|
- SCSI_SetPin(SCSI_Out_BSY);
|
|
|
-
|
|
|
- CyDelayUs(3); // arbitrate delay. 2.4us.
|
|
|
-
|
|
|
- uint8_t dbx = scsiReadDBxPins();
|
|
|
- sel = SCSI_ReadPin(SCSI_In_SEL);
|
|
|
- if (sel || ((dbx ^ scsiDev.scsiIdMask) > scsiDev.scsiIdMask))
|
|
|
- {
|
|
|
- // Lost arbitration.
|
|
|
- SCSI_Out_Ctl_Write(0);
|
|
|
- SCSI_ClearPin(SCSI_Out_BSY);
|
|
|
- ledOff();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Won arbitration
|
|
|
- SCSI_SetPin(SCSI_Out_SEL);
|
|
|
- CyDelayUs(1); // Bus clear + Bus settle.
|
|
|
-
|
|
|
- // Reselection phase
|
|
|
- scsiEnterPhase(__scsiphase_io); // TODO get rid of delay
|
|
|
- SCSI_Out_Bits_Write(scsiDev.scsiIdMask | (1 << scsiDev.initiatorId));
|
|
|
- CyDelayCycles(4); // 2 deskew delays
|
|
|
- SCSI_ClearPin(SCSI_Out_BSY);
|
|
|
- CyDelayUs(1); // Bus Settle Delay
|
|
|
-
|
|
|
- bsy = SCSI_ReadPin(SCSI_In_BSY);
|
|
|
- while (!bsy) { bsy = SCSI_ReadPin(SCSI_In_BSY); } // Wait for initiator.
|
|
|
- SCSI_SetPin(SCSI_Out_BSY);
|
|
|
-
|
|
|
- // Prepare for the initial IDENTIFY message.
|
|
|
- scsiEnterPhase(MESSAGE_IN);
|
|
|
-
|
|
|
- SCSI_Out_Ctl_Write(0);
|
|
|
- SCSI_ClearPin(SCSI_Out_SEL);
|
|
|
-
|
|
|
- // Send identify command
|
|
|
- scsiWriteByte(0x80);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // Continue with status.
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static void process_Status()
|
|
|
{
|
|
|
- if (scsiDev.status == GOOD && scsiDev.needReconnect && scsiDev.allowDisconnect)
|
|
|
- {
|
|
|
- // doReselectTest();
|
|
|
- }
|
|
|
scsiEnterPhase(STATUS);
|
|
|
|
|
|
uint8 message;
|
|
|
@@ -222,10 +141,8 @@ static void process_Status()
|
|
|
}
|
|
|
scsiWriteByte(scsiDev.status);
|
|
|
|
|
|
- #ifdef MM_DEBUG
|
|
|
scsiDev.lastStatus = scsiDev.status;
|
|
|
scsiDev.lastSense = scsiDev.sense.code;
|
|
|
- #endif
|
|
|
|
|
|
// Command Complete occurs AFTER a valid status has been
|
|
|
// sent. then we go bus-free.
|
|
|
@@ -325,17 +242,13 @@ static void process_Command()
|
|
|
lun = scsiDev.cdb[1] >> 5;
|
|
|
control = scsiDev.cdb[scsiDev.cdbLen - 1];
|
|
|
|
|
|
- #ifdef MM_DEBUG
|
|
|
scsiDev.cmdCount++;
|
|
|
- #endif
|
|
|
|
|
|
if (scsiDev.resetFlag)
|
|
|
{
|
|
|
-#ifdef MM_DEBUG
|
|
|
// Don't log bogus commands
|
|
|
scsiDev.cmdCount--;
|
|
|
memset(scsiDev.cdb, 0xff, sizeof(scsiDev.cdb));
|
|
|
-#endif
|
|
|
return;
|
|
|
}
|
|
|
else if (scsiDev.parityError)
|
|
|
@@ -501,9 +414,7 @@ static void doReserveRelease()
|
|
|
|
|
|
static void scsiReset()
|
|
|
{
|
|
|
-#ifdef MM_DEBUG
|
|
|
scsiDev.rstCount++;
|
|
|
-#endif
|
|
|
ledOff();
|
|
|
|
|
|
scsiPhyReset();
|
|
|
@@ -513,7 +424,6 @@ static void scsiReset()
|
|
|
scsiDev.phase = BUS_FREE;
|
|
|
scsiDev.atnFlag = 0;
|
|
|
scsiDev.resetFlag = 0;
|
|
|
- scsiDev.needReconnect = 0;
|
|
|
|
|
|
if (scsiDev.unitAttention != POWER_ON_RESET)
|
|
|
{
|
|
|
@@ -548,8 +458,6 @@ static void enter_SelectionPhase()
|
|
|
scsiDev.dataLen = 0;
|
|
|
scsiDev.status = GOOD;
|
|
|
scsiDev.phase = SELECTION;
|
|
|
- scsiDev.needReconnect = 0;
|
|
|
- scsiDev.allowDisconnect = 0;
|
|
|
|
|
|
transfer.blocks = 0;
|
|
|
transfer.currentBlock = 0;
|
|
|
@@ -593,9 +501,7 @@ static void process_SelectionPhase()
|
|
|
SCSI_SetPin(SCSI_Out_BSY);
|
|
|
ledOn();
|
|
|
|
|
|
- #ifdef MM_DEBUG
|
|
|
scsiDev.selCount++;
|
|
|
- #endif
|
|
|
|
|
|
// Wait until the end of the selection phase.
|
|
|
while (!scsiDev.resetFlag)
|
|
|
@@ -643,9 +549,7 @@ static void process_MessageOut()
|
|
|
scsiDev.atnFlag = 0;
|
|
|
scsiDev.parityError = 0;
|
|
|
scsiDev.msgOut = scsiReadByte();
|
|
|
-#ifdef MM_DEBUG
|
|
|
scsiDev.msgCount++;
|
|
|
-#endif
|
|
|
|
|
|
if (scsiDev.parityError)
|
|
|
{
|
|
|
@@ -731,7 +635,7 @@ static void process_MessageOut()
|
|
|
//enter_Status(CHECK_CONDITION);
|
|
|
messageReject();
|
|
|
}
|
|
|
- scsiDev.allowDisconnect = scsiDev.msgOut & 0x40;
|
|
|
+ //scsiDev.allowDisconnect = scsiDev.msgOut & 0x40;
|
|
|
}
|
|
|
else if (scsiDev.msgOut >= 0x20 && scsiDev.msgOut <= 0x2F)
|
|
|
{
|