浏览代码

Merge pull request #118 from BlueSCSI/eric/doubleImage

Initiator fixes
Eric Helgeson 1 年之前
父节点
当前提交
d268151483

+ 0 - 6
lib/BlueSCSI_platform_RP2040/BlueSCSI_platform_gpio.h

@@ -59,12 +59,6 @@
 #define LED_ON()     platform_network_supported() ? cyw43_gpio_set(&cyw43_state, 0, true) : sio_hw->gpio_set = 1 << LED_PIN
 #define LED_OFF()    platform_network_supported() ? cyw43_gpio_set(&cyw43_state, 0, false) : sio_hw->gpio_clr = 1 << LED_PIN
 
-#define STANDARD_LED_ON 	sio_hw->gpio_set = 1 << LED_PIN
-#define STANDARD_LED_OFF 	sio_hw->gpio_clr = 1 << LED_PIN
-
-#define W_LED_ON 	cyw43_gpio_set(&cyw43_state, 0, true)
-#define W_LED_OFF 	cyw43_gpio_set(&cyw43_state, 0, false)
-
 // SDIO and SPI block
 #define SD_SPI_SCK   10
 #define SDIO_CLK 10

+ 1 - 4
lib/BlueSCSI_platform_RP2040/scsiHostPhy.cpp

@@ -31,7 +31,7 @@ void scsiHostPhyReset(void)
 
 // Select a device, id 0-7.
 // Returns true if the target answers to selection request.
-bool scsiHostPhySelect(int target_id)
+bool scsiHostPhySelect(int target_id, int initiator_id)
 {
     SCSI_ENABLE_INITIATOR();
     SCSI_RELEASE_OUTPUTS();
@@ -55,9 +55,6 @@ bool scsiHostPhySelect(int target_id)
         }
     }
 
-    // Choose initiator ID different than target ID
-    uint8_t initiator_id = (target_id == 7) ? 0 : 7;
-
     // Selection phase
     scsiLogInitiatorPhaseChange(SELECTION);
     debuglog("------ SELECTING ", target_id, " with initiator ID ", (int)initiator_id);

+ 1 - 1
lib/BlueSCSI_platform_RP2040/scsiHostPhy.h

@@ -14,7 +14,7 @@ void scsiHostPhyReset(void);
 
 // Select a device, id 0-7.
 // Returns true if the target answers to selection request.
-bool scsiHostPhySelect(int target_id);
+bool scsiHostPhySelect(int target_id, int initiator_id);
 
 // Read the current communication phase as signaled by the target
 // Matches SCSI_PHASE enumeration from scsi.h.

+ 1 - 1
lib/BlueSCSI_platform_RP2040/scsi_accel_host.cpp

@@ -12,7 +12,7 @@
 #include <hardware/sync.h>
 
 #define SCSI_PIO pio0
-#define SCSI_SM 0
+#define SCSI_SM 1
 
 static struct {
     // PIO configurations

+ 23 - 22
src/BlueSCSI_initiator.cpp

@@ -10,6 +10,7 @@
 #include "BlueSCSI_log_trace.h"
 #include "BlueSCSI_initiator.h"
 #include <BlueSCSI_platform.h>
+#include <minIni.h>
 #include "SdFat.h"
 
 #include <scsi2sd.h>
@@ -49,6 +50,8 @@ static struct {
     // Bitmap of all drives that have been imaged
     uint32_t drives_imaged;
 
+    uint8_t initiator_id;
+
     // Is imaging a drive in progress, or are we scanning?
     bool imaging;
 
@@ -75,7 +78,17 @@ void scsiInitiatorInit()
 {
     scsiHostPhyReset();
 
-    g_initiator_state.drives_imaged = 0;
+    g_initiator_state.initiator_id = ini_getl("SCSI", "InitiatorID", 7, CONFIGFILE);
+    if (g_initiator_state.initiator_id > 7)
+    {
+        log("InitiatorID set to illegal value in, ", CONFIGFILE, ", defaulting to 7");
+        g_initiator_state.initiator_id = 7;
+    } else
+    {
+        log_f("InitiatorID set to ID %d", g_initiator_state.initiator_id);
+    }
+    // treat initiator id as already imaged drive so it gets skipped
+    g_initiator_state.drives_imaged = 1 << g_initiator_state.initiator_id;
     g_initiator_state.imaging = false;
     g_initiator_state.target_id = -1;
     g_initiator_state.sectorsize = 0;
@@ -100,15 +113,11 @@ static void scsiInitiatorUpdateLed()
 
     if (phase <= duty)
     {
-        if (!platform_network_supported()) {
-            STANDARD_LED_ON;
-        }
+        LED_ON();
     }
     else
     {
-        if (!platform_network_supported()) {
-            STANDARD_LED_OFF;
-        }
+        LED_OFF();
     }
 }
 
@@ -147,10 +156,7 @@ void scsiInitiatorMainLoop()
 
             uint8_t inquiry_data[36];
 
-            if (!platform_network_supported()) {
-                STANDARD_LED_ON;
-            }
-
+            LED_ON();
             bool startstopok =
                 scsiTestUnitReady(g_initiator_state.target_id) &&
                 scsiStartStopUnit(g_initiator_state.target_id, true);
@@ -162,10 +168,7 @@ void scsiInitiatorMainLoop()
 
             bool inquiryok = startstopok &&
                 scsiInquiry(g_initiator_state.target_id, inquiry_data);
-
-            if (!platform_network_supported()) {
-                STANDARD_LED_OFF;
-            }
+            LED_OFF();
 
             uint64_t total_bytes = 0;
             if (readcapok)
@@ -173,6 +176,7 @@ void scsiInitiatorMainLoop()
                 log("SCSI ID ", g_initiator_state.target_id,
                     " capacity ", (int)g_initiator_state.sectorcount,
                     " sectors x ", (int)g_initiator_state.sectorsize, " bytes");
+                log_f("Vendor: %.8s, Product: %.16s, Version: %.4s", &inquiry_data[8], &inquiry_data[16], &inquiry_data[32]);
 
                 g_initiator_state.sectorcount_all = g_initiator_state.sectorcount;
 
@@ -197,7 +201,7 @@ void scsiInitiatorMainLoop()
             }
             else
             {
-                debuglog("No response from SCSI ID ", g_initiator_state.target_id);
+                log("* No response from SCSI ID ", g_initiator_state.target_id);
                 g_initiator_state.sectorsize = 0;
                 g_initiator_state.sectorcount = g_initiator_state.sectorcount_all = 0;
             }
@@ -233,7 +237,7 @@ void scsiInitiatorMainLoop()
                 }
                 if(lun != 0)
                 {
-                    log(filename_format, " already exists, using ", filename);
+                    log("Using filename: ", filename, " to avoid overwriting existing file.");
                 }
                 g_initiator_state.target_file = SD.open(filename, O_RDWR | O_CREAT | O_TRUNC);
                 if (!g_initiator_state.target_file.isOpen())
@@ -262,10 +266,7 @@ void scsiInitiatorMainLoop()
         {
             scsiStartStopUnit(g_initiator_state.target_id, false);
             log("Finished imaging drive with id ", g_initiator_state.target_id);
-
-            if (!platform_network_supported()) {
-                STANDARD_LED_OFF;
-            }
+            LED_OFF();
 
             if (g_initiator_state.sectorcount != g_initiator_state.sectorcount_all)
             {
@@ -347,7 +348,7 @@ int scsiInitiatorRunCommand(int target_id,
                             const uint8_t *bufOut, size_t bufOutLen,
                             bool returnDataPhase)
 {
-    if (!scsiHostPhySelect(target_id))
+    if (!scsiHostPhySelect(target_id, g_initiator_state.initiator_id))
     {
         debuglog("------ Target ", target_id, " did not respond");
         scsiHostPhyRelease();