| 
														
															@@ -65,12 +65,9 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     return false; 
														 | 
														
														 | 
														
															     return false; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-void scsiDiskLoadConfig(int target_idx) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+static void scsiDiskLoadConfig(int target_idx, const char *section) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     image_config_t &img = g_DiskImages[target_idx]; 
														 | 
														
														 | 
														
															     image_config_t &img = g_DiskImages[target_idx]; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    char section[6] = "SCSI0"; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    section[4] = '0' + target_idx; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     img.deviceType = ini_getl(section, "Type", S2S_CFG_FIXED, CONFIGFILE); 
														 | 
														
														 | 
														
															     img.deviceType = ini_getl(section, "Type", S2S_CFG_FIXED, CONFIGFILE); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     img.deviceTypeModifier = ini_getl(section, "TypeModifier", 0, CONFIGFILE); 
														 | 
														
														 | 
														
															     img.deviceTypeModifier = ini_getl(section, "TypeModifier", 0, CONFIGFILE); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     img.sectorsPerTrack = ini_getl(section, "SectorsPerTrack", 18, CONFIGFILE); 
														 | 
														
														 | 
														
															     img.sectorsPerTrack = ini_getl(section, "SectorsPerTrack", 18, CONFIGFILE); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -95,6 +92,18 @@ void scsiDiskLoadConfig(int target_idx) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     memcpy(img.serial, tmp, 16); 
														 | 
														
														 | 
														
															     memcpy(img.serial, tmp, 16); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+void scsiDiskLoadConfig(int target_idx) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    char section[6] = "SCSI0"; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    section[4] = '0' + target_idx; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    // First load global settings 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    scsiDiskLoadConfig(target_idx, "SCSI"); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    // Then settings specific to target ID 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    scsiDiskLoadConfig(target_idx, section); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /*******************************/ 
														 | 
														
														 | 
														
															 /*******************************/ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /* Config handling for SCSI2SD */ 
														 | 
														
														 | 
														
															 /* Config handling for SCSI2SD */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /*******************************/ 
														 | 
														
														 | 
														
															 /*******************************/ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -108,7 +117,12 @@ void s2s_configInit(S2S_BoardCfg* config) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     config->startupDelay = 0; 
														 | 
														
														 | 
														
															     config->startupDelay = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     config->selectionDelay = ini_getl("SCSI", "SelectionDelay", 255, CONFIGFILE); 
														 | 
														
														 | 
														
															     config->selectionDelay = ini_getl("SCSI", "SelectionDelay", 255, CONFIGFILE); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     config->flags6 = ini_getl("SCSI", "Flags6", 0, CONFIGFILE); 
														 | 
														
														 | 
														
															     config->flags6 = ini_getl("SCSI", "Flags6", 0, CONFIGFILE); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    config->scsiSpeed = ini_getl("SCSI", "SCSISpeed", S2S_CFG_SPEED_ASYNC_50, CONFIGFILE); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    config->scsiSpeed = ini_getl("SCSI", "SCSISpeed", PLATFORM_MAX_SCSI_SPEED, CONFIGFILE); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    if (config->scsiSpeed > PLATFORM_MAX_SCSI_SPEED) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        config->scsiSpeed = PLATFORM_MAX_SCSI_SPEED; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 extern "C" 
														 | 
														
														 | 
														
															 extern "C" 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -354,7 +368,7 @@ static void doSeek(uint32_t lba) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /* Transfer state for read / write commands */ 
														 | 
														
														 | 
														
															 /* Transfer state for read / write commands */ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /********************************************/ 
														 | 
														
														 | 
														
															 /********************************************/ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-BlockDevice blockDev; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+BlockDevice blockDev = {DISK_PRESENT | DISK_INITIALISED}; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 Transfer transfer; 
														 | 
														
														 | 
														
															 Transfer transfer; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /*****************/ 
														 | 
														
														 | 
														
															 /*****************/ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -400,11 +414,13 @@ static void doWrite(uint32_t lba, uint32_t blocks) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         transfer.blocks = blocks; 
														 | 
														
														 | 
														
															         transfer.blocks = blocks; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         transfer.currentBlock = 0; 
														 | 
														
														 | 
														
															         transfer.currentBlock = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         scsiDev.phase = DATA_OUT; 
														 | 
														
														 | 
														
															         scsiDev.phase = DATA_OUT; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        scsiDev.dataLen = bytesPerSector; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        scsiDev.dataPtr = bytesPerSector; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        scsiDev.dataLen = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        scsiDev.dataPtr = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        azdbg("------ Write ", (int)blocks, "x", (int)bytesPerSector, " starting at ", (int)lba); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															         image_config_t &img = *(image_config_t*)scsiDev.target->cfg; 
														 | 
														
														 | 
														
															         image_config_t &img = *(image_config_t*)scsiDev.target->cfg; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        if (!img.file.seek(transfer.lba * img.bytesPerSector)) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (!img.file.seek(transfer.lba * bytesPerSector)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         { 
														 | 
														
														 | 
														
															         { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             azlog("Seek to ", transfer.lba, " failed for ", scsiDev.target->targetId); 
														 | 
														
														 | 
														
															             azlog("Seek to ", transfer.lba, " failed for ", scsiDev.target->targetId); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             scsiDev.status = CHECK_CONDITION; 
														 | 
														
														 | 
														
															             scsiDev.status = CHECK_CONDITION; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -447,18 +463,21 @@ void diskDataOut() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     uint32_t maxblocks = sizeof(scsiDev.data) / scsiDev.target->liveCfg.bytesPerSector; 
														 | 
														
														 | 
														
															     uint32_t maxblocks = sizeof(scsiDev.data) / scsiDev.target->liveCfg.bytesPerSector; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     if (blockcount > maxblocks) blockcount = maxblocks; 
														 | 
														
														 | 
														
															     if (blockcount > maxblocks) blockcount = maxblocks; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     uint32_t transferlen = blockcount * scsiDev.target->liveCfg.bytesPerSector; 
														 | 
														
														 | 
														
															     uint32_t transferlen = blockcount * scsiDev.target->liveCfg.bytesPerSector; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    // Read first block from SCSI bus 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     scsiDev.dataLen = transferlen; 
														 | 
														
														 | 
														
															     scsiDev.dataLen = transferlen; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     scsiDev.dataPtr = 0; 
														 | 
														
														 | 
														
															     scsiDev.dataPtr = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    diskDataOut_callback(0); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															      
														 | 
														
														 | 
														
															      
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    // Start writing blocks to SD card. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    // The callback will simultaneously read the next block from SCSI bus. 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     image_config_t &img = *(image_config_t*)scsiDev.target->cfg; 
														 | 
														
														 | 
														
															     image_config_t &img = *(image_config_t*)scsiDev.target->cfg; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     uint32_t written = 0; 
														 | 
														
														 | 
														
															     uint32_t written = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     while (written < transferlen) 
														 | 
														
														 | 
														
															     while (written < transferlen) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     { 
														 | 
														
														 | 
														
															     { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // Read next block from SCSI bus 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (scsiDev.dataPtr == written) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            diskDataOut_callback(0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // Start writing blocks to SD card. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // The callback will simultaneously read the next block from SCSI bus.     
														 | 
													
												
											
												
													
														| 
														 | 
														
															         uint8_t *buf = scsiDev.data + written; 
														 | 
														
														 | 
														
															         uint8_t *buf = scsiDev.data + written; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         uint32_t buflen = scsiDev.dataPtr - written; 
														 | 
														
														 | 
														
															         uint32_t buflen = scsiDev.dataPtr - written; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         azplatform_set_sd_callback(&diskDataOut_callback, buf); 
														 | 
														
														 | 
														
															         azplatform_set_sd_callback(&diskDataOut_callback, buf); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -475,8 +494,8 @@ void diskDataOut() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     azplatform_set_sd_callback(NULL, NULL); 
														 | 
														
														 | 
														
															     azplatform_set_sd_callback(NULL, NULL); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     transfer.currentBlock += blockcount; 
														 | 
														
														 | 
														
															     transfer.currentBlock += blockcount; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    scsiDev.dataPtr = scsiDev.dataLen = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 /*****************/ 
														 | 
														
														 | 
														
															 /*****************/ 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -512,8 +531,11 @@ static void doRead(uint32_t lba, uint32_t blocks) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         scsiDev.dataLen = 0; 
														 | 
														
														 | 
														
															         scsiDev.dataLen = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         scsiDev.dataPtr = 0; 
														 | 
														
														 | 
														
															         scsiDev.dataPtr = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        uint32_t bytesPerSector = scsiDev.target->liveCfg.bytesPerSector; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        azdbg("------ Read ", (int)blocks, "x", (int)bytesPerSector, " starting at ", (int)lba); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         image_config_t &img = *(image_config_t*)scsiDev.target->cfg; 
														 | 
														
														 | 
														
															         image_config_t &img = *(image_config_t*)scsiDev.target->cfg; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        if (!img.file.seek(transfer.lba * img.bytesPerSector)) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (!img.file.seek(transfer.lba * bytesPerSector)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         { 
														 | 
														
														 | 
														
															         { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             azlog("Seek to ", transfer.lba, " failed for ", scsiDev.target->targetId); 
														 | 
														
														 | 
														
															             azlog("Seek to ", transfer.lba, " failed for ", scsiDev.target->targetId); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             scsiDev.status = CHECK_CONDITION; 
														 | 
														
														 | 
														
															             scsiDev.status = CHECK_CONDITION; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -564,8 +586,11 @@ static void diskDataIn() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         scsiDev.phase = STATUS; 
														 | 
														
														 | 
														
															         scsiDev.phase = STATUS; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    diskDataIn_callback(transferlen); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     azplatform_set_sd_callback(NULL, NULL); 
														 | 
														
														 | 
														
															     azplatform_set_sd_callback(NULL, NULL); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     transfer.currentBlock += blockcount; 
														 | 
														
														 | 
														
															     transfer.currentBlock += blockcount; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    scsiDev.dataPtr = scsiDev.dataLen = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -595,7 +620,6 @@ int scsiDiskCommand() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         else if (start) 
														 | 
														
														 | 
														
															         else if (start) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         { 
														 | 
														
														 | 
														
															         { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             scsiDev.target->started = 1; 
														 | 
														
														 | 
														
															             scsiDev.target->started = 1; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            blockDev.state = DISK_INITIALISED; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         else 
														 | 
														
														 | 
														
															         else 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         { 
														 | 
														
														 | 
														
															         { 
														 |