瀏覽代碼

Update config loading (#10, #11, #12, #13)

- SectorsPerTrack default to 63
- Detect duplicate SCSI IDs
- Fix loading target settings from [SCSI] section
- Add log message whether config file is found
Petteri Aimonen 3 年之前
父節點
當前提交
020783cb5f
共有 3 個文件被更改,包括 53 次插入17 次删除
  1. 2 2
      azulscsi.ini
  2. 8 1
      src/AzulSCSI.cpp
  3. 43 14
      src/AzulSCSI_disk.cpp

+ 2 - 2
azulscsi.ini

@@ -17,8 +17,8 @@ Version = "1.0"
 Serial = "0123456789ABCDEF"
 Type = 0     # 0: Fixed, 1: Removable, 2: Optical, 3: Floppy, 4: Mag-optical, 5: Tape
 TypeModifier = 0  # Affects only INQUIRY response
-SectorsPerTrack = 18 # For floppies
-HeadsPerCylinder = 255 # Drive geometry
+SectorsPerTrack = 63
+HeadsPerCylinder = 255
 
 # Settings can be overriden for individual devices.
 [SCSI2]

+ 8 - 1
src/AzulSCSI.cpp

@@ -157,6 +157,7 @@ bool findHDDImages()
   SdFile file;
   bool imageReady;
   bool foundImage = false;
+  uint8_t usedIds = 0;
   int usedDefaultId = 0;
   while (1) {
     if (!file.openNext(&root, O_READ)) break;
@@ -208,16 +209,22 @@ bool findHDDImages()
           blk  = 2048;
         }
 
+        if (usedIds & (1 << id))
+        {
+          azlog("-- Ignoring ", name, ", SCSI ID ", id, " is already in use!");
+          continue;
+        }
+
         if(id < NUM_SCSIID && lun < NUM_SCSILUN) {
           azlog("-- Opening ", name, " for id:", id, " lun:", lun);
           imageReady = scsiDiskOpenHDDImage(id, name, id, lun, blk);
           if(imageReady) { // Marked as a responsive ID
             foundImage = true;
+            usedIds |= (1 << id);
           }
         } else {
           azlog("-- Invalid lun or id for image ", name);
         }
-      } else {
       }
     }
   }

+ 43 - 14
src/AzulSCSI_disk.cpp

@@ -65,31 +65,48 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int
     return false;
 }
 
+// Set target configuration to default values
+static void scsiDiskConfigDefaults(int target_idx)
+{
+    image_config_t &img = g_DiskImages[target_idx];
+    img.deviceType = S2S_CFG_FIXED;
+    img.deviceTypeModifier = 0;
+    img.sectorsPerTrack = 63;
+    img.headsPerCylinder = 255;
+    img.quirks = S2S_CFG_QUIRKS_NONE;
+    memcpy(img.vendor, DEFAULT_VENDOR, 8);
+    memcpy(img.prodId, DEFAULT_PRODUCT, 16);
+    memcpy(img.revision, DEFAULT_VERSION, 4);
+    memcpy(img.serial, DEFAULT_SERIAL, 16);
+}
+
+// Load values for target configuration from given section if they exist.
+// Otherwise keep current settings.
 static void scsiDiskLoadConfig(int target_idx, const char *section)
 {
     image_config_t &img = g_DiskImages[target_idx];
-    img.deviceType = ini_getl(section, "Type", S2S_CFG_FIXED, CONFIGFILE);
-    img.deviceTypeModifier = ini_getl(section, "TypeModifier", 0, CONFIGFILE);
-    img.sectorsPerTrack = ini_getl(section, "SectorsPerTrack", 18, CONFIGFILE);
-    img.headsPerCylinder = ini_getl(section, "HeadsPerCylinder", 255, CONFIGFILE);
-    img.quirks = ini_getl(section, "Quirks", S2S_CFG_QUIRKS_NONE, CONFIGFILE);
+    img.deviceType = ini_getl(section, "Type", img.deviceType, CONFIGFILE);
+    img.deviceTypeModifier = ini_getl(section, "TypeModifier", img.deviceTypeModifier, CONFIGFILE);
+    img.sectorsPerTrack = ini_getl(section, "SectorsPerTrack", img.sectorsPerTrack, CONFIGFILE);
+    img.headsPerCylinder = ini_getl(section, "HeadsPerCylinder", img.headsPerCylinder, CONFIGFILE);
+    img.quirks = ini_getl(section, "Quirks", img.quirks, CONFIGFILE);
     
     char tmp[32];
     memset(tmp, 0, sizeof(tmp));
-    ini_gets(section, "Vendor", DEFAULT_VENDOR, tmp, sizeof(tmp), CONFIGFILE);
-    memcpy(img.vendor, tmp, 8);
+    ini_gets(section, "Vendor", "", tmp, sizeof(tmp), CONFIGFILE);
+    if (tmp[0]) memcpy(img.vendor, tmp, 8);
 
     memset(tmp, 0, sizeof(tmp));
-    ini_gets(section, "Product", DEFAULT_PRODUCT, tmp, sizeof(tmp), CONFIGFILE);
-    memcpy(img.prodId, tmp, 16);
+    ini_gets(section, "Product", "", tmp, sizeof(tmp), CONFIGFILE);
+    if (tmp[0]) memcpy(img.prodId, tmp, 16);
 
     memset(tmp, 0, sizeof(tmp));
-    ini_gets(section, "Version", DEFAULT_VERSION, tmp, sizeof(tmp), CONFIGFILE);
-    memcpy(img.revision, tmp, 4);
+    ini_gets(section, "Version", "", tmp, sizeof(tmp), CONFIGFILE);
+    if (tmp[0]) memcpy(img.revision, tmp, 4);
     
     memset(tmp, 0, sizeof(tmp));
-    ini_gets(section, "Serial", DEFAULT_SERIAL, tmp, sizeof(tmp), CONFIGFILE);
-    memcpy(img.serial, tmp, 16);
+    ini_gets(section, "Serial", "", tmp, sizeof(tmp), CONFIGFILE);
+    if (tmp[0]) memcpy(img.serial, tmp, 16);
 }
 
 void scsiDiskLoadConfig(int target_idx)
@@ -97,6 +114,9 @@ void scsiDiskLoadConfig(int target_idx)
     char section[6] = "SCSI0";
     section[4] = '0' + target_idx;
 
+    // Set default settings
+    scsiDiskConfigDefaults(target_idx);
+
     // First load global settings
     scsiDiskLoadConfig(target_idx, "SCSI");
 
@@ -111,7 +131,16 @@ void scsiDiskLoadConfig(int target_idx)
 extern "C"
 void s2s_configInit(S2S_BoardCfg* config)
 {
-    azlog("Reading configuration");
+    if (SD.exists(CONFIGFILE))
+    {
+        azlog("Reading configuration from " CONFIGFILE);
+    }
+    else
+    {
+        azlog("Config file " CONFIGFILE " not found, using defaults");
+    }
+
+    azlog("Active configuration:");
     memset(config, 0, sizeof(S2S_BoardCfg));
     memcpy(config->magic, "BCFG", 4);
     config->flags = 0;