|
|
@@ -164,11 +164,9 @@ SdFs SD;
|
|
|
#define SCSI_TARGET_INACTIVE() { SCSI_OUT(vREQ,inactive); SCSI_OUT(vMSG,inactive); SCSI_OUT(vCD,inactive);SCSI_OUT(vIO,inactive); SCSI_OUT(vBSY,inactive); gpio_mode(BSY, GPIO_INPUT_PU); }
|
|
|
|
|
|
// HDDiamge file
|
|
|
-#define HDIMG_FILE_256 "HDxx_256.hda" // BLOCKSIZE=256 HDD image file
|
|
|
-#define HDIMG_FILE_512 "HDxx_512.hda" // BLOCKSIZE=512 HDD image file name base
|
|
|
-#define HDIMG_FILE_1024 "HDxx_1024.hda" // BLOCKSIZE=1024 HDD image file
|
|
|
#define HDIMG_ID_POS 2 // Position to embed ID number
|
|
|
#define HDIMG_LUN_POS 3 // Position to embed LUN numbers
|
|
|
+#define HDIMG_BLK_POS 5 // Position to embed block size numbers
|
|
|
#define MAX_FILE_PATH 32 // Maximum file name length
|
|
|
|
|
|
// HDD image
|
|
|
@@ -277,20 +275,14 @@ inline byte readIO(void)
|
|
|
|
|
|
bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize)
|
|
|
{
|
|
|
- char file_path[MAX_FILE_PATH+1];
|
|
|
-
|
|
|
- // build file path
|
|
|
- strcpy(file_path,image_name);
|
|
|
- file_path[HDIMG_ID_POS ] = '0'+id;
|
|
|
- file_path[HDIMG_LUN_POS] = '0'+lun;
|
|
|
h->m_fileSize = 0;
|
|
|
h->m_blocksize = blocksize;
|
|
|
- h->m_file = SD.open(file_path, O_RDWR);
|
|
|
+ h->m_file = SD.open(image_name, O_RDWR);
|
|
|
if(h->m_file.isOpen())
|
|
|
{
|
|
|
h->m_fileSize = h->m_file.size();
|
|
|
LOG_FILE.print("Imagefile: ");
|
|
|
- LOG_FILE.print(file_path);
|
|
|
+ LOG_FILE.print(image_name);
|
|
|
if(h->m_fileSize>0)
|
|
|
{
|
|
|
// check blocksize dummy file
|
|
|
@@ -375,31 +367,49 @@ void setup()
|
|
|
m_buf[MAX_BLOCKSIZE] = 0xff; // DB0 all off,DBP off
|
|
|
//HD image file open
|
|
|
scsi_id_mask = 0x00;
|
|
|
- for(int id=0;id<NUM_SCSIID;id++)
|
|
|
- {
|
|
|
- for(int lun=0;lun<NUM_SCSILUN;lun++)
|
|
|
- {
|
|
|
- HDDIMG *h = &img[id][lun];
|
|
|
- bool imageReady = false;
|
|
|
- if(!imageReady)
|
|
|
- {
|
|
|
- imageReady = hddimageOpen(h,HDIMG_FILE_256,id,lun,256);
|
|
|
- }
|
|
|
- if(!imageReady)
|
|
|
- {
|
|
|
- imageReady = hddimageOpen(h,HDIMG_FILE_512,id,lun,512);
|
|
|
- }
|
|
|
- if(!imageReady)
|
|
|
- {
|
|
|
- imageReady = hddimageOpen(h,HDIMG_FILE_1024,id,lun, 1024);
|
|
|
- }
|
|
|
- if(imageReady)
|
|
|
- {
|
|
|
- // Marked as a responsive ID
|
|
|
- scsi_id_mask |= 1<<id;
|
|
|
+
|
|
|
+ // Iterate over the root path in the SD card looking for candidate image files.
|
|
|
+ SdFile root;
|
|
|
+ root.open("/");
|
|
|
+ SdFile file;
|
|
|
+ bool imageReady;
|
|
|
+ while (1) {
|
|
|
+ if (!file.openNext(&root, O_READ)) break;
|
|
|
+ char name[MAX_FILE_PATH+1];
|
|
|
+ if(!file.isDir()) {
|
|
|
+ file.getName(name, MAX_FILE_PATH+1);
|
|
|
+ file.close();
|
|
|
+ String file_name = String(name);
|
|
|
+ if(file_name.startsWith("HD") && file_name.endsWith(".hda")) {
|
|
|
+ int id = name[HDIMG_ID_POS] - '0';
|
|
|
+ int lun = name[HDIMG_LUN_POS] - '0';
|
|
|
+ int blk = name[HDIMG_BLK_POS] - '0';
|
|
|
+ if(blk == 2) {
|
|
|
+ blk = 256;
|
|
|
+ } else if(blk == 1) {
|
|
|
+ blk = 1024;
|
|
|
+ } else {
|
|
|
+ blk = 512;
|
|
|
+ }
|
|
|
+ if(id < NUM_SCSIID && lun < NUM_SCSILUN) {
|
|
|
+ HDDIMG *h = &img[id][lun];
|
|
|
+ imageReady = hddimageOpen(h,name,id,lun,blk);
|
|
|
+ if(imageReady) { // Marked as a responsive ID
|
|
|
+ scsi_id_mask |= 1<<id;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LOG_FILE.print("Bad LUN or SCSI id for image: ");
|
|
|
+ LOG_FILE.println(name);
|
|
|
+ }
|
|
|
}
|
|
|
+ // else {
|
|
|
+ // LOG_FILE.print("Not an image: ");
|
|
|
+ // LOG_FILE.println(name);
|
|
|
+ // }
|
|
|
}
|
|
|
}
|
|
|
+ root.close();
|
|
|
+
|
|
|
// Error if there are 0 image files
|
|
|
if(scsi_id_mask==0) onFalseInit();
|
|
|
|
|
|
@@ -425,6 +435,8 @@ void initFileLog() {
|
|
|
LOG_FILE.println(SDFAT_FILE_TYPE);
|
|
|
LOG_FILE.print("SdFat version: ");
|
|
|
LOG_FILE.println(SD_FAT_VERSION_STR);
|
|
|
+ LOG_FILE.print("SdFat Max FileName Length: ");
|
|
|
+ LOG_FILE.println(MAX_FILE_PATH);
|
|
|
LOG_FILE.println("Initialized SD Card - lets go!");
|
|
|
}
|
|
|
|