|
|
@@ -116,6 +116,10 @@ SdFs SD;
|
|
|
#define SD_CS PA4 // SDCARD:CS
|
|
|
#define LED PC13 // LED
|
|
|
|
|
|
+// Image Set Selector
|
|
|
+#define IMAGE_SELECT1 PA1
|
|
|
+#define IMAGE_SELECT2 PB1
|
|
|
+
|
|
|
// GPIO register port
|
|
|
#define PAREG GPIOA->regs
|
|
|
#define PBREG GPIOB->regs
|
|
|
@@ -252,6 +256,7 @@ void noSDCardFound(void);
|
|
|
void onBusReset(void);
|
|
|
void initFileLog(int);
|
|
|
void finalizeFileLog(void);
|
|
|
+void findDriveImages(FsFile root);
|
|
|
|
|
|
/*
|
|
|
* IO read.
|
|
|
@@ -335,16 +340,14 @@ void readSDCardInfo()
|
|
|
* Open HDD image file
|
|
|
*/
|
|
|
|
|
|
-bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize)
|
|
|
+bool hddimageOpen(HDDIMG *h, FsFile file,int id,int lun,int blocksize)
|
|
|
{
|
|
|
h->m_fileSize = 0;
|
|
|
h->m_blocksize = blocksize;
|
|
|
- h->m_file = SD.open(image_name, O_RDWR);
|
|
|
+ h->m_file = file;
|
|
|
if(h->m_file.isOpen())
|
|
|
{
|
|
|
h->m_fileSize = h->m_file.size();
|
|
|
- LOG_FILE.print("Imagefile: ");
|
|
|
- LOG_FILE.print(image_name);
|
|
|
if(h->m_fileSize>0)
|
|
|
{
|
|
|
// check blocksize dummy file
|
|
|
@@ -359,9 +362,9 @@ bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize)
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ LOG_FILE.println(" - file is 0 bytes, can not use.");
|
|
|
h->m_file.close();
|
|
|
h->m_fileSize = h->m_blocksize = 0; // no file
|
|
|
- LOG_FILE.println("FileSizeError");
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
@@ -392,6 +395,14 @@ void setup()
|
|
|
// PIN initialization
|
|
|
gpio_mode(LED2, GPIO_OUTPUT_PP);
|
|
|
gpio_mode(LED, GPIO_OUTPUT_OD);
|
|
|
+
|
|
|
+ // Image Set Select Init
|
|
|
+ gpio_mode(IMAGE_SELECT1, GPIO_INPUT_PU);
|
|
|
+ gpio_mode(IMAGE_SELECT2, GPIO_INPUT_PU);
|
|
|
+ pinMode(IMAGE_SELECT1, INPUT);
|
|
|
+ pinMode(IMAGE_SELECT2, INPUT);
|
|
|
+ int image_file_set = ((digitalRead(IMAGE_SELECT1) == LOW) ? 1 : 0) | ((digitalRead(IMAGE_SELECT2) == LOW) ? 2 : 0);
|
|
|
+
|
|
|
LED_OFF();
|
|
|
|
|
|
//GPIO(SCSI BUS)Initialization
|
|
|
@@ -450,18 +461,71 @@ void setup()
|
|
|
scsi_id_mask = 0x00;
|
|
|
|
|
|
// Iterate over the root path in the SD card looking for candidate image files.
|
|
|
- SdFile root;
|
|
|
- root.open("/");
|
|
|
- SdFile file;
|
|
|
- bool imageReady;
|
|
|
- int usedDefaultId = 0;
|
|
|
+ FsFile root;
|
|
|
+
|
|
|
+ char image_set_dir_name[] = "/ImageSetX/";
|
|
|
+ image_set_dir_name[9] = char(image_file_set) + 0x30;
|
|
|
+ root.open(image_set_dir_name);
|
|
|
+ if (root.isDirectory()) {
|
|
|
+ LOG_FILE.print("Looking for images in: ");
|
|
|
+ LOG_FILE.println(image_set_dir_name);
|
|
|
+ LOG_FILE.sync();
|
|
|
+ } else {
|
|
|
+ root.close();
|
|
|
+ root.open("/");
|
|
|
+ }
|
|
|
+
|
|
|
+ findDriveImages(root);
|
|
|
+ root.close();
|
|
|
+
|
|
|
+ FsFile images_all_dir;
|
|
|
+ images_all_dir.open("/ImageSetAll/");
|
|
|
+ if (images_all_dir.isDirectory()) {
|
|
|
+ LOG_FILE.println("Looking for images in: /ImageSetAll/");
|
|
|
+ LOG_FILE.sync();
|
|
|
+ findDriveImages(images_all_dir);
|
|
|
+ }
|
|
|
+ images_all_dir.close();
|
|
|
+
|
|
|
+ // Error if there are 0 image files
|
|
|
+ if(scsi_id_mask==0) {
|
|
|
+ LOG_FILE.println("ERROR: No valid images found!");
|
|
|
+ onFalseInit();
|
|
|
+ }
|
|
|
+
|
|
|
+ finalizeFileLog();
|
|
|
+ LED_OFF();
|
|
|
+ //Occurs when the RST pin state changes from HIGH to LOW
|
|
|
+ attachInterrupt(RST, onBusReset, FALLING);
|
|
|
+}
|
|
|
+
|
|
|
+void findDriveImages(FsFile root) {
|
|
|
+ bool image_ready;
|
|
|
+ FsFile file;
|
|
|
+ char path_name[MAX_FILE_PATH+1];
|
|
|
+ root.getName(path_name, sizeof(path_name));
|
|
|
+ SD.chdir(path_name);
|
|
|
+
|
|
|
while (1) {
|
|
|
- if (!file.openNext(&root, O_READ)) break;
|
|
|
+ // Directories can not be opened RDWR, so it will fail, but fails the same way with no file/dir, so we need to peek at the file first.
|
|
|
+ FsFile file_test = root.openNextFile(O_RDONLY);
|
|
|
char name[MAX_FILE_PATH+1];
|
|
|
- if(!file.isDir()) {
|
|
|
- file.getName(name, MAX_FILE_PATH+1);
|
|
|
- file.close();
|
|
|
- String file_name = String(name);
|
|
|
+ file_test.getName(name, MAX_FILE_PATH+1);
|
|
|
+ String file_name = String(name);
|
|
|
+
|
|
|
+ // Skip directories and already open files.
|
|
|
+ if(file_test.isDir() || file_name.startsWith("LOG.txt")) {
|
|
|
+ file_test.close();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // If error there is no next file to open.
|
|
|
+ if(file_test.getError() > 0) {
|
|
|
+ file_test.close();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ // Valid file, open for reading/writing.
|
|
|
+ file = SD.open(name, O_RDWR);
|
|
|
+ if(file && file.isFile()) {
|
|
|
file_name.toLowerCase();
|
|
|
if(file_name.startsWith("hd")) {
|
|
|
// Defaults for Hard Disks
|
|
|
@@ -479,7 +543,8 @@ void setup()
|
|
|
if(tmp_id > -1 && tmp_id < 8) {
|
|
|
id = tmp_id;
|
|
|
} else {
|
|
|
- usedDefaultId++;
|
|
|
+ LOG_FILE.print(name);
|
|
|
+ LOG_FILE.println(" - bad SCSI id in filename, Using default ID 1");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -501,38 +566,23 @@ void setup()
|
|
|
|
|
|
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
|
|
|
+ LOG_FILE.print(" - ");
|
|
|
+ LOG_FILE.print(name);
|
|
|
+ image_ready = hddimageOpen(h, file, id, lun, blk);
|
|
|
+ if(image_ready) { // 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);
|
|
|
- LOG_FILE.sync();
|
|
|
}
|
|
|
- } else {
|
|
|
- LOG_FILE.print("Not an image: ");
|
|
|
- LOG_FILE.println(name);
|
|
|
- LOG_FILE.sync();
|
|
|
}
|
|
|
+ } else {
|
|
|
+ file.close();
|
|
|
+ LOG_FILE.print("Not an image: ");
|
|
|
+ LOG_FILE.println(name);
|
|
|
}
|
|
|
- }
|
|
|
- if(usedDefaultId > 1) {
|
|
|
- LOG_FILE.println("!! More than one image did not specify a SCSI ID. Last file will be used at ID 1 !!");
|
|
|
LOG_FILE.sync();
|
|
|
}
|
|
|
- root.close();
|
|
|
-
|
|
|
- // Error if there are 0 image files
|
|
|
- if(scsi_id_mask==0) {
|
|
|
- LOG_FILE.println("ERROR: No valid images found!");
|
|
|
- onFalseInit();
|
|
|
- }
|
|
|
-
|
|
|
- finalizeFileLog();
|
|
|
- LED_OFF();
|
|
|
- //Occurs when the RST pin state changes from HIGH to LOW
|
|
|
- attachInterrupt(RST, onBusReset, FALLING);
|
|
|
+ // cd .. before going back.
|
|
|
+ SD.chdir("/");
|
|
|
}
|
|
|
|
|
|
/*
|