|
@@ -43,7 +43,7 @@
|
|
#include <setjmp.h>
|
|
#include <setjmp.h>
|
|
#include <libmaple/exti.h>
|
|
#include <libmaple/exti.h>
|
|
|
|
|
|
-#define DEBUG 1 // 0:No debug information output
|
|
|
|
|
|
+#define DEBUG 0 // 0:No debug information output
|
|
// 1: Debug information output to USB Serial
|
|
// 1: Debug information output to USB Serial
|
|
// 2: Debug information output to LOG.txt (slow)
|
|
// 2: Debug information output to LOG.txt (slow)
|
|
|
|
|
|
@@ -86,6 +86,7 @@ SCSI_INQUIRY_DATA default_hdd, default_optical;
|
|
// function table
|
|
// function table
|
|
byte (*scsi_command_table[MAX_SCSI_COMMAND])(SCSI_DEVICE *dev, const byte *cdb);
|
|
byte (*scsi_command_table[MAX_SCSI_COMMAND])(SCSI_DEVICE *dev, const byte *cdb);
|
|
uint32_t db_bsrr[256];
|
|
uint32_t db_bsrr[256];
|
|
|
|
+uint32_t test=0;
|
|
// scsi command functions
|
|
// scsi command functions
|
|
SCSI_COMMAND_HANDLER(onUnimplemented);
|
|
SCSI_COMMAND_HANDLER(onUnimplemented);
|
|
SCSI_COMMAND_HANDLER(onNOP);
|
|
SCSI_COMMAND_HANDLER(onNOP);
|
|
@@ -699,7 +700,7 @@ inline void writeHandshake(byte d)
|
|
while(!SCSI_IN(vACK));
|
|
while(!SCSI_IN(vACK));
|
|
// ACK.Fall to REQ.Raise delay 500ns(typ.) (DTC-510B)
|
|
// ACK.Fall to REQ.Raise delay 500ns(typ.) (DTC-510B)
|
|
uint32_t bsrrCall = (db_bsrr[0xff] );
|
|
uint32_t bsrrCall = (db_bsrr[0xff] );
|
|
- GPIOE->regs->BSRR = bsrrCall; // DB=0xFF , SCSI_OUT(vREQ,inactive) //PM2022 should wirite data to bus
|
|
|
|
|
|
+ GPIOD->regs->BSRR = bsrrCall; // DB=0xFF , SCSI_OUT(vREQ,inactive) //PM2022 should wirite data to bus
|
|
SCSI_OUT(vREQ,inactive)
|
|
SCSI_OUT(vREQ,inactive)
|
|
// REQ.Raise to DB hold time 0ns
|
|
// REQ.Raise to DB hold time 0ns
|
|
SCSI_DB_INPUT() // (150ns)
|
|
SCSI_DB_INPUT() // (150ns)
|
|
@@ -925,12 +926,14 @@ void loop()
|
|
// Precaution against bugs or jumps which don't clean up properly
|
|
// Precaution against bugs or jumps which don't clean up properly
|
|
SCSI_DB_INPUT();
|
|
SCSI_DB_INPUT();
|
|
TRANSCEIVER_IO_SET(vDTD,DB_INPUT)
|
|
TRANSCEIVER_IO_SET(vDTD,DB_INPUT)
|
|
- SCSI_TARGET_INACTIVE();
|
|
|
|
TRANSCEIVER_IO_SET(vIND,TR_INPUT)
|
|
TRANSCEIVER_IO_SET(vIND,TR_INPUT)
|
|
|
|
+ SCSI_TARGET_INACTIVE();
|
|
|
|
+ SCSI_OUT(vACK,inactive);
|
|
|
|
+ SCSI_SET_PULL();
|
|
|
|
+ //pinMode(vBSY,INPUT_PULLUP);
|
|
// Reset target state bits (BSY, MSG, CD, REQ, IO)
|
|
// Reset target state bits (BSY, MSG, CD, REQ, IO)
|
|
-
|
|
|
|
- LED3_ON();
|
|
|
|
-
|
|
|
|
|
|
+ GPIOE->regs->BSRR = 0x00000074; // MSG, CD, REQ, IO
|
|
|
|
+ GPIOB->regs->BSRR = 0x00000040; // BSY
|
|
//int msg = 0;
|
|
//int msg = 0;
|
|
m_msg = 0;
|
|
m_msg = 0;
|
|
m_lun = 0xff;
|
|
m_lun = 0xff;
|
|
@@ -954,9 +957,9 @@ void loop()
|
|
}
|
|
}
|
|
// We've been selected
|
|
// We've been selected
|
|
SCSI_OUT(vATN,inactive);
|
|
SCSI_OUT(vATN,inactive);
|
|
- SCSI_OUT(vACK,inactive);
|
|
|
|
|
|
+
|
|
TRANSCEIVER_IO_SET(vTAD,TR_OUTPUT);
|
|
TRANSCEIVER_IO_SET(vTAD,TR_OUTPUT);
|
|
- LOGN("SELECTED");
|
|
|
|
|
|
+
|
|
|
|
|
|
SCSI_TARGET_ACTIVE() // (BSY), REQ, MSG, CD, IO output turned on
|
|
SCSI_TARGET_ACTIVE() // (BSY), REQ, MSG, CD, IO output turned on
|
|
|
|
|
|
@@ -1138,14 +1141,14 @@ void loop()
|
|
Status:
|
|
Status:
|
|
LOG(" STS:"); LOGHEX(m_sts);
|
|
LOG(" STS:"); LOGHEX(m_sts);
|
|
|
|
|
|
- //SCSI_PHASE_CHANGE(SCSI_PHASE_STATUS);
|
|
|
|
- SCSI_OUT(vCD,inactive);
|
|
|
|
|
|
+ SCSI_PHASE_CHANGE(SCSI_PHASE_STATUS);
|
|
|
|
+ //SCSI_OUT(vCD,inactive);
|
|
// Bus settle delay 400ns built in to writeHandshake
|
|
// Bus settle delay 400ns built in to writeHandshake
|
|
writeHandshake(m_sts);
|
|
writeHandshake(m_sts);
|
|
|
|
|
|
LOG(" MI:"); LOGHEX(m_msg);
|
|
LOG(" MI:"); LOGHEX(m_msg);
|
|
- //SCSI_PHASE_CHANGE(SCSI_PHASE_MESSAGEIN);
|
|
|
|
- SCSI_OUT(vMSG,active);
|
|
|
|
|
|
+ SCSI_PHASE_CHANGE(SCSI_PHASE_MESSAGEIN);
|
|
|
|
+ //SCSI_OUT(vMSG,active);
|
|
// Bus settle delay 400ns built in to writeHandshake
|
|
// Bus settle delay 400ns built in to writeHandshake
|
|
writeHandshake(m_msg);
|
|
writeHandshake(m_msg);
|
|
|
|
|
|
@@ -1159,7 +1162,6 @@ BusFree:
|
|
//SCSI_OUT(vBSY,inactive)
|
|
//SCSI_OUT(vBSY,inactive)
|
|
SCSI_TARGET_INACTIVE() // Turn off BSY, REQ, MSG, CD, IO output
|
|
SCSI_TARGET_INACTIVE() // Turn off BSY, REQ, MSG, CD, IO output
|
|
TRANSCEIVER_IO_SET(vTAD,TR_INPUT);
|
|
TRANSCEIVER_IO_SET(vTAD,TR_INPUT);
|
|
- TRANSCEIVER_IO_SET(vIND,TR_INPUT);
|
|
|
|
// Something in code linked after this function is performing better with a +4 alignment.
|
|
// Something in code linked after this function is performing better with a +4 alignment.
|
|
// Adding this nop is causing the next function (_GLOBAL__sub_I_SD) to have an address with a last digit of 0x4.
|
|
// Adding this nop is causing the next function (_GLOBAL__sub_I_SD) to have an address with a last digit of 0x4.
|
|
// Last digit of 0xc also works.
|
|
// Last digit of 0xc also works.
|
|
@@ -1168,6 +1170,7 @@ BusFree:
|
|
asm("nop.w");
|
|
asm("nop.w");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
static byte onUnimplemented(SCSI_DEVICE *dev, const byte *cdb)
|
|
static byte onUnimplemented(SCSI_DEVICE *dev, const byte *cdb)
|
|
{
|
|
{
|
|
// does nothing!
|
|
// does nothing!
|
|
@@ -1281,20 +1284,22 @@ static byte onRead10(SCSI_DEVICE *dev, const byte *cdb)
|
|
{
|
|
{
|
|
unsigned adds = ((uint32_t)cdb[2] << 24) | ((uint32_t)cdb[3] << 16) | ((uint32_t)cdb[4] << 8) | cdb[5];
|
|
unsigned adds = ((uint32_t)cdb[2] << 24) | ((uint32_t)cdb[3] << 16) | ((uint32_t)cdb[4] << 8) | cdb[5];
|
|
unsigned len = ((uint32_t)cdb[7] << 8) | cdb[8];
|
|
unsigned len = ((uint32_t)cdb[7] << 8) | cdb[8];
|
|
-
|
|
|
|
|
|
+ /*
|
|
LOG (" Read10 ");
|
|
LOG (" Read10 ");
|
|
LOG("A:");
|
|
LOG("A:");
|
|
LOGHEX(adds);
|
|
LOGHEX(adds);
|
|
LOG(":");
|
|
LOG(":");
|
|
LOGHEX(len);
|
|
LOGHEX(len);
|
|
LOG(" ");
|
|
LOG(" ");
|
|
-
|
|
|
|
|
|
+ */
|
|
|
|
+ LED3_ON();
|
|
byte sts = checkBlockCommand(dev, adds, len);
|
|
byte sts = checkBlockCommand(dev, adds, len);
|
|
if (sts) {
|
|
if (sts) {
|
|
return sts;
|
|
return sts;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ LED3_OFF();
|
|
writeDataPhaseSD(dev, adds, len);
|
|
writeDataPhaseSD(dev, adds, len);
|
|
|
|
+ LED3_OFF();
|
|
return SCSI_STATUS_GOOD;
|
|
return SCSI_STATUS_GOOD;
|
|
}
|
|
}
|
|
|
|
|