mirror of
https://github.com/erichelgeson/BlueSCSI.git
synced 2025-08-07 06:31:04 +00:00
alternative sector size supported
this let's .BIN files get used at the very least, maybe more depending on how some of the other optical formats look reverted a small SCSI phase change that causes problems
This commit is contained in:
@@ -215,8 +215,9 @@ bool VerifyISOPVD(SCSI_DEVICE *dev, unsigned sector_size, bool mode2)
|
|||||||
bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
|
bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
|
||||||
{
|
{
|
||||||
dev->m_fileSize= 0;
|
dev->m_fileSize= 0;
|
||||||
dev->m_offset = 0;
|
dev->m_sector_offset = 0;
|
||||||
dev->m_blocksize = blocksize;
|
dev->m_blocksize = blocksize;
|
||||||
|
dev->m_rawblocksize = blocksize;
|
||||||
dev->m_file = file;
|
dev->m_file = file;
|
||||||
if(!dev->m_file->isOpen()) { goto failed; }
|
if(!dev->m_file->isOpen()) { goto failed; }
|
||||||
|
|
||||||
@@ -229,25 +230,25 @@ bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
|
|||||||
|
|
||||||
if(dev->m_type == SCSI_DEVICE_OPTICAL) {
|
if(dev->m_type == SCSI_DEVICE_OPTICAL) {
|
||||||
LOG_FILE.print(" CDROM");
|
LOG_FILE.print(" CDROM");
|
||||||
|
dev->m_blocksize = CDROM_COMMON_SECTORSIZE;
|
||||||
|
|
||||||
// Borrowed from PCEM
|
// Borrowed from PCEM
|
||||||
if(VerifyISOPVD(dev, CDROM_COMMON_SECTORSIZE, false)) {
|
if(VerifyISOPVD(dev, CDROM_COMMON_SECTORSIZE, false)) {
|
||||||
dev->m_blocksize = CDROM_COMMON_SECTORSIZE;
|
|
||||||
dev->m_mode2 = false;
|
|
||||||
} else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, false)) {
|
|
||||||
dev->m_blocksize = CDROM_RAW_SECTORSIZE;
|
|
||||||
dev->m_rawblocksize = CDROM_COMMON_SECTORSIZE;
|
dev->m_rawblocksize = CDROM_COMMON_SECTORSIZE;
|
||||||
dev->m_mode2 = false;
|
dev->m_mode2 = false;
|
||||||
|
} else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, false)) {
|
||||||
|
dev->m_rawblocksize = CDROM_RAW_SECTORSIZE;
|
||||||
|
dev->m_mode2 = false;
|
||||||
dev->m_raw = true;
|
dev->m_raw = true;
|
||||||
dev->m_offset = 16;
|
dev->m_sector_offset = 16;
|
||||||
} else if(VerifyISOPVD(dev, 2336, true)) {
|
} else if(VerifyISOPVD(dev, 2336, true)) {
|
||||||
dev->m_blocksize = 2336;
|
dev->m_rawblocksize = 2336;
|
||||||
dev->m_mode2 = true;
|
dev->m_mode2 = true;
|
||||||
} else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, true)) {
|
} else if(VerifyISOPVD(dev, CDROM_RAW_SECTORSIZE, true)) {
|
||||||
dev->m_blocksize = CDROM_RAW_SECTORSIZE;
|
dev->m_rawblocksize = CDROM_RAW_SECTORSIZE;
|
||||||
dev->m_mode2 = true;
|
dev->m_mode2 = true;
|
||||||
dev->m_raw = true;
|
dev->m_raw = true;
|
||||||
dev->m_offset = 16;
|
dev->m_sector_offset = 24;
|
||||||
} else {
|
} else {
|
||||||
// Last ditch effort
|
// Last ditch effort
|
||||||
// size must be less than 700MB
|
// size must be less than 700MB
|
||||||
@@ -282,7 +283,7 @@ bool hddimageOpen(SCSI_DEVICE *dev, FsFile *file,int id,int lun,int blocksize)
|
|||||||
|
|
||||||
if(dev->m_type == SCSI_DEVICE_OPTICAL) {
|
if(dev->m_type == SCSI_DEVICE_OPTICAL) {
|
||||||
LOG_FILE.print(" MODE2:");LOG_FILE.print(dev->m_mode2);
|
LOG_FILE.print(" MODE2:");LOG_FILE.print(dev->m_mode2);
|
||||||
LOG_FILE.print(" BlockSize:");LOG_FILE.println(dev->m_blocksize);
|
LOG_FILE.print(" BlockSize:");LOG_FILE.println(dev->m_rawblocksize);
|
||||||
}
|
}
|
||||||
return true; // File opened
|
return true; // File opened
|
||||||
|
|
||||||
@@ -927,7 +928,7 @@ void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
|
|||||||
LOG (" DI(SD) ");
|
LOG (" DI(SD) ");
|
||||||
SCSI_PHASE_CHANGE(SCSI_PHASE_DATAIN);
|
SCSI_PHASE_CHANGE(SCSI_PHASE_DATAIN);
|
||||||
//Bus settle delay 400ns, file.seek() measured at over 1000ns.
|
//Bus settle delay 400ns, file.seek() measured at over 1000ns.
|
||||||
uint64_t pos = (uint64_t)adds * dev->m_blocksize;
|
uint64_t pos = (uint64_t)adds * dev->m_rawblocksize;
|
||||||
dev->m_file->seekSet(pos);
|
dev->m_file->seekSet(pos);
|
||||||
#ifdef XCVR
|
#ifdef XCVR
|
||||||
TRANSCEIVER_IO_SET(vTR_DBP,TR_OUTPUT)
|
TRANSCEIVER_IO_SET(vTR_DBP,TR_OUTPUT)
|
||||||
@@ -937,10 +938,10 @@ void writeDataPhaseSD(SCSI_DEVICE *dev, uint32_t adds, uint32_t len)
|
|||||||
for(uint32_t i = 0; i < len; i++) {
|
for(uint32_t i = 0; i < len; i++) {
|
||||||
// Asynchronous reads will make it faster ...
|
// Asynchronous reads will make it faster ...
|
||||||
m_resetJmp = false;
|
m_resetJmp = false;
|
||||||
dev->m_file->read(m_buf, dev->m_blocksize);
|
dev->m_file->read(m_buf, dev->m_rawblocksize);
|
||||||
enableResetJmp();
|
enableResetJmp();
|
||||||
|
|
||||||
writeDataLoop(dev->m_blocksize, m_buf);
|
writeDataLoop(dev->m_blocksize, &m_buf[dev->m_sector_offset]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1073,11 +1074,12 @@ void loop()
|
|||||||
m_lun = 0xff;
|
m_lun = 0xff;
|
||||||
SCSI_DEVICE *dev = (SCSI_DEVICE *)0; // HDD image for current SCSI-ID, LUN
|
SCSI_DEVICE *dev = (SCSI_DEVICE *)0; // HDD image for current SCSI-ID, LUN
|
||||||
|
|
||||||
do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
|
do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
|
||||||
|
//do {} while( !SCSI_IN(vBSY) || SCSI_IN(vRST));
|
||||||
// We're in ARBITRATION
|
// We're in ARBITRATION
|
||||||
//LOG(" A:"); LOGHEX(readIO()); LOG(" ");
|
//LOG(" A:"); LOGHEX(readIO()); LOG(" ");
|
||||||
|
|
||||||
do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
|
//do {} while( SCSI_IN(vBSY) || !SCSI_IN(vSEL) || SCSI_IN(vRST));
|
||||||
//LOG(" S:"); LOGHEX(readIO()); LOG(" ");
|
//LOG(" S:"); LOGHEX(readIO()); LOG(" ");
|
||||||
// We're in SELECTION
|
// We're in SELECTION
|
||||||
|
|
||||||
@@ -1368,6 +1370,7 @@ byte onReadCapacity(SCSI_DEVICE *dev, const byte *cdb)
|
|||||||
(byte)(dev->m_blocksize >> 8),
|
(byte)(dev->m_blocksize >> 8),
|
||||||
(byte)(dev->m_blocksize)
|
(byte)(dev->m_blocksize)
|
||||||
};
|
};
|
||||||
|
|
||||||
writeDataPhase(sizeof(buf), buf);
|
writeDataPhase(sizeof(buf), buf);
|
||||||
return SCSI_STATUS_GOOD;
|
return SCSI_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
@@ -1552,7 +1555,7 @@ byte onModeSense(SCSI_DEVICE *dev, const byte *cdb)
|
|||||||
0, //Reserve
|
0, //Reserve
|
||||||
(byte)(dev->m_blocksize >> 16),
|
(byte)(dev->m_blocksize >> 16),
|
||||||
(byte)(dev->m_blocksize >> 8),
|
(byte)(dev->m_blocksize >> 8),
|
||||||
(byte)(dev->m_blocksize),
|
(byte)(dev->m_blocksize),
|
||||||
};
|
};
|
||||||
memcpy(&m_buf[a], c, 8);
|
memcpy(&m_buf[a], c, 8);
|
||||||
a += 8;
|
a += 8;
|
||||||
|
@@ -218,7 +218,7 @@ enum SCSI_DEVICE_TYPE
|
|||||||
// Put DB and DP in output mode
|
// 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; }
|
#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
|
// Put DB and DP in input mode
|
||||||
#define SCSI_DB_INPUT() { PBREG->CRL=(PBREG->CRL &0xfffffff0)|DB_MODE_IN ; PBREG->CRH = (uint32_t)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
|
// HDDiamge file
|
||||||
#define HDIMG_ID_POS 2 // Position to embed ID number
|
#define HDIMG_ID_POS 2 // Position to embed ID number
|
||||||
@@ -311,18 +311,18 @@ struct SCSI_INQUIRY_DATA
|
|||||||
// HDD image
|
// HDD image
|
||||||
typedef __attribute__((aligned(4))) struct _SCSI_DEVICE
|
typedef __attribute__((aligned(4))) struct _SCSI_DEVICE
|
||||||
{
|
{
|
||||||
FsFile *m_file; // File object
|
FsFile *m_file; // File object
|
||||||
uint64_t m_fileSize; // File size
|
uint64_t m_fileSize; // File size
|
||||||
uint16_t m_blocksize; // SCSI BLOCK size
|
uint16_t m_blocksize; // SCSI BLOCK size
|
||||||
uint16_t m_rawblocksize;
|
uint16_t m_rawblocksize; // OPTICAL raw sector size
|
||||||
uint8_t m_type; // SCSI device type
|
uint8_t m_type; // SCSI device type
|
||||||
uint32_t m_blockcount; // blockcount
|
uint32_t m_blockcount; // blockcount
|
||||||
bool m_raw; // Raw disk
|
bool m_raw; // Raw disk
|
||||||
SCSI_INQUIRY_DATA *inquiry_block; // SCSI information
|
SCSI_INQUIRY_DATA *inquiry_block; // SCSI information
|
||||||
uint8_t m_senseKey; // Sense key
|
uint8_t m_senseKey; // Sense key
|
||||||
uint16_t m_additional_sense_code; // ASC/ASCQ
|
uint16_t m_additional_sense_code; // ASC/ASCQ
|
||||||
bool m_mode2; // MODE2 CDROM
|
bool m_mode2; // MODE2 CDROM
|
||||||
uint8_t m_offset; // ISO offset for missing sync header
|
uint8_t m_sector_offset; // optical sector offset for missing sync header
|
||||||
} SCSI_DEVICE;
|
} SCSI_DEVICE;
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user