Optionally allow for SCSI device config to be loaded from a file.

This commit is contained in:
Eric Helgeson 2021-01-19 20:44:18 -06:00
parent 825dd5d7c9
commit 053cb78e2d

View File

@ -248,6 +248,20 @@ static const byte db2scsiid[256]={
#define LOG_FILENAME "LOG.txt" #define LOG_FILENAME "LOG.txt"
FsFile LOG_FILE; FsFile LOG_FILE;
// SCSI Drive Vendor information
byte SCSI_INFO_BUF[36] = {
0x00, //device type
0x00, //RMB = 0
0x01, //ISO, ECMA, ANSI version
0x01, //Response data format
35 - 4, //Additional data length
0, 0, //Reserve
0x00, //Support function
'Q', 'U', 'A', 'N', 'T', 'U', 'M', ' ', // vendor 8
'F', 'I', 'R', 'E', 'B', 'A', 'L', 'L', '1', ' ', ' ',' ', ' ', ' ', ' ', ' ', // product 16
'1', '.', '0', ' ' // version 4
};
void onFalseInit(void); void onFalseInit(void);
void onBusReset(void); void onBusReset(void);
void initFileLog(void); void initFileLog(void);
@ -269,6 +283,36 @@ inline byte readIO(void)
return bret; return bret;
} }
// If config file exists, read the first three lines and copy the contents.
// File must be well formed or you will get junk in the SCSI Vendor fields.
void readSCSIDeviceConfig() {
FsFile config_file = SD.open("scsi-config.txt", O_RDONLY);
if (!config_file.isOpen()) {
return;
}
char vendor[9];
memset(vendor, 0, sizeof(vendor));
config_file.readBytes(vendor, sizeof(vendor));
LOG_FILE.print("SCSI VENDOR: ");
LOG_FILE.println(vendor);
memcpy(&(SCSI_INFO_BUF[8]), vendor, 8);
char product[17];
memset(product, 0, sizeof(product));
config_file.readBytes(product, sizeof(product));
LOG_FILE.print("SCSI PRODUCT: ");
LOG_FILE.println(product);
memcpy(&(SCSI_INFO_BUF[16]), product, 16);
char version[5];
memset(version, 0, sizeof(version));
config_file.readBytes(version, sizeof(version));
LOG_FILE.print("SCSI VERSION: ");
LOG_FILE.println(version);
memcpy(&(SCSI_INFO_BUF[32]), version, 4);
config_file.close();
}
/* /*
* Open HDD image file * Open HDD image file
*/ */
@ -362,6 +406,7 @@ void setup()
onFalseInit(); onFalseInit();
} }
initFileLog(); initFileLog();
readSCSIDeviceConfig();
//Sector data overrun byte setting //Sector data overrun byte setting
m_buf[MAX_BLOCKSIZE] = 0xff; // DB0 all off,DBP off m_buf[MAX_BLOCKSIZE] = 0xff; // DB0 all off,DBP off
@ -765,19 +810,7 @@ byte onInquiryCommand(byte len)
#else #else
byte onInquiryCommand(byte len) byte onInquiryCommand(byte len)
{ {
byte buf[36] = { writeDataPhase(len < 36 ? len : 36, SCSI_INFO_BUF);
0x00, //device type
0x00, //RMB = 0
0x01, //ISO, ECMA, ANSI version
0x01, //Response data format
35 - 4, //Additional data length
0, 0, //Reserve
0x00, //Support function
'Q', 'U', 'A', 'N', 'T', 'U', 'M', ' ',
'F', 'I', 'R', 'E', 'B', 'A', 'L', 'L', '1', ' ', ' ',' ', ' ', ' ', ' ', ' ',
'1', '.', '0', ' ',
};
writeDataPhase(len < 36 ? len : 36, buf);
return 0x00; return 0x00;
} }
#endif #endif