|
|
@@ -26,6 +26,17 @@
|
|
|
#define ERROR_FALSE_INIT 3
|
|
|
#define ERROR_NO_SDCARD 5
|
|
|
|
|
|
+enum SCSI_DEVICE_TYPE
|
|
|
+{
|
|
|
+ SCSI_DEVICE_HDD,
|
|
|
+ SCSI_DEVICE_OPTICAL,
|
|
|
+};
|
|
|
+
|
|
|
+#define CDROM_RAW_SECTORSIZE 2352
|
|
|
+#define CDROM_COMMON_SECTORSIZE 2048
|
|
|
+
|
|
|
+#define MAX_SCSI_COMMAND 0xff
|
|
|
+#define SCSI_COMMAND_HANDLER(x) static byte x(SCSI_DEVICE *dev, const byte *cdb)
|
|
|
|
|
|
#if DEBUG
|
|
|
#define LOG(XX) Serial.print(XX)
|
|
|
@@ -178,7 +189,7 @@
|
|
|
|
|
|
#define SCSI_TARGET_ACTIVE() { gpio_mode(REQ, GPIO_OUTPUT_PP); gpio_mode(MSG, GPIO_OUTPUT_PP); gpio_mode(CD, GPIO_OUTPUT_PP); gpio_mode(IO, GPIO_OUTPUT_PP); gpio_mode(BSY, GPIO_OUTPUT_PP); TRANSCEIVER_IO_SET(vTR_TARGET,TR_OUTPUT);}
|
|
|
// BSY,REQ,MSG,CD,IO Turn off output, BSY is the last input
|
|
|
-#define SCSI_TARGET_INACTIVE() { pinMode(REQ, INPUT); pinMode(MSG, INPUT); pinMode(CD, INPUT); pinMode(IO, INPUT); pinMode(BSY, INPUT); TRANSCEIVER_IO_SET(vTR_TARGET,TR_INPUT); }
|
|
|
+#define SCSI_TARGET_INACTIVE() { gpio_mode(REQ, GPIO_INPUT_FLOATING); gpio_mode(MSG, GPIO_INPUT_FLOATING); gpio_mode(CD, GPIO_INPUT_FLOATING); gpio_mode(IO, GPIO_INPUT_FLOATING); gpio_mode(BSY, GPIO_INPUT_FLOATING); TRANSCEIVER_IO_SET(vTR_TARGET,TR_INPUT); }
|
|
|
|
|
|
#define DB_MODE_OUT 1 // push-pull mode
|
|
|
#define DB_MODE_IN 4 // floating inputs
|
|
|
@@ -207,7 +218,7 @@
|
|
|
// Put DB and DP in output mode
|
|
|
#define SCSI_DB_OUTPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_OUT; PBREG->CRH = 0x11111111*DB_MODE_OUT; }
|
|
|
// Put DB and DP in input mode
|
|
|
-#define SCSI_DB_INPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = 0x11111111*DB_MODE_IN; }
|
|
|
+#define SCSI_DB_INPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = (uint32_t)(0x11111111*DB_MODE_IN); }
|
|
|
|
|
|
// HDDiamge file
|
|
|
#define HDIMG_ID_POS 2 // Position to embed ID number
|
|
|
@@ -250,14 +261,7 @@ uint32_t db_bsrr[256];
|
|
|
// #define GET_CDB6_LBA(x) ((x[2] & 01f) << 16) | (x[3] << 8) | x[4]
|
|
|
#define READ_DATA_BUS() (byte)((~(uint32_t)GPIOB->regs->IDR)>>8)
|
|
|
|
|
|
-enum SCSI_DEVICE_TYPE
|
|
|
-{
|
|
|
- SCSI_DEVICE_HDD,
|
|
|
- SCSI_DEVICE_OPTICAL,
|
|
|
-};
|
|
|
|
|
|
-#define CDROM_RAW_SECTORSIZE 2352
|
|
|
-#define CDROM_COMMON_SECTORSIZE 2048
|
|
|
|
|
|
struct SCSI_INQUIRY_DATA
|
|
|
{
|
|
|
@@ -307,16 +311,18 @@ struct SCSI_INQUIRY_DATA
|
|
|
// HDD image
|
|
|
typedef __attribute__((aligned(4))) struct _SCSI_DEVICE
|
|
|
{
|
|
|
- FsFile *m_file; // File object
|
|
|
- uint64_t m_fileSize; // File size
|
|
|
- uint16_t m_blocksize; // SCSI BLOCK size
|
|
|
- uint8_t m_type; // SCSI device type
|
|
|
- uint32_t m_blockcount; // blockcount
|
|
|
- bool m_raw; // Raw disk
|
|
|
- SCSI_INQUIRY_DATA *inquiry_block; // SCSI information
|
|
|
+ FsFile *m_file; // File object
|
|
|
+ uint64_t m_fileSize; // File size
|
|
|
+ uint16_t m_blocksize; // SCSI BLOCK size
|
|
|
+ uint16_t m_rawblocksize; // OPTICAL raw sector size
|
|
|
+ uint8_t m_type; // SCSI device type
|
|
|
+ uint32_t m_blockcount; // blockcount
|
|
|
+ bool m_raw; // Raw disk
|
|
|
+ SCSI_INQUIRY_DATA *inquiry_block; // SCSI information
|
|
|
uint8_t m_senseKey; // Sense key
|
|
|
uint16_t m_additional_sense_code; // ASC/ASCQ
|
|
|
bool m_mode2; // MODE2 CDROM
|
|
|
+ uint8_t m_sector_offset; // optical sector offset for missing sync header
|
|
|
} SCSI_DEVICE;
|
|
|
|
|
|
|