Implement reading spi flash over SCSI
authorMichael McMaster <michael@codesrc.com>
Wed, 27 Jan 2021 21:20:13 +0000 (07:20 +1000)
committerMichael McMaster <michael@codesrc.com>
Wed, 27 Jan 2021 21:20:13 +0000 (07:20 +1000)
software/SCSI2SD/src/disk.c

index acae400d7c5705140247bb6d87592098ea3ea3a5..8f3a36789b9bd2430dcbbac74d5f78c82144ce58 100755 (executable)
@@ -161,7 +161,8 @@ static void doWrite(uint32 lba, uint32 blocks)
        MEDIA_STATE* mediaState = &(scsiDev.target->device->mediaState);\r
 \r
        if (unlikely(*mediaState & MEDIA_WP) ||\r
-               unlikely(scsiDev.target->cfg->deviceType == CONFIG_OPTICAL))\r
+               unlikely(scsiDev.target->cfg->deviceType == CONFIG_OPTICAL) ||\r
+        (scsiDev.target->cfg->storageDevice != CONFIG_STOREDEVICE_SD))\r
 \r
        {\r
                scsiDev.status = CHECK_CONDITION;\r
@@ -245,7 +246,8 @@ static void doRead(uint32 lba, uint32 blocks)
                                (sdSectors == 1) &&\r
                                !(scsiDev.boardCfg.flags & CONFIG_ENABLE_CACHE)\r
                        ) ||\r
-                       unlikely(((uint64) lba) + blocks == capacity)\r
+                       unlikely(((uint64) lba) + blocks == capacity) ||\r
+            (scsiDev.target->cfg->storageDevice != CONFIG_STOREDEVICE_SD)\r
                        )\r
                {\r
                        // We get errors on reading the last sector using a multi-sector\r
@@ -599,16 +601,26 @@ void scsiDiskPoll()
                                (prep - i < buffers) &&\r
                                (prep < totalSDSectors))\r
                        {\r
-                               // Start an SD transfer if we have space.\r
-                               if (transfer.multiBlock)\r
-                               {\r
-                                       sdReadMultiSectorDMA(&scsiDev.data[SD_SECTOR_SIZE * (prep % buffers)]);\r
-                               }\r
-                               else\r
-                               {\r
-                                       sdReadSingleSectorDMA(sdLBA + prep, &scsiDev.data[SD_SECTOR_SIZE * (prep % buffers)]);\r
-                               }\r
-                               sdActive = 1;\r
+                if (scsiDev.target->cfg->storageDevice == CONFIG_STOREDEVICE_SD)\r
+                {\r
+                                   // Start an SD transfer if we have space.\r
+                                   if (transfer.multiBlock)\r
+                                   {\r
+                                           sdReadMultiSectorDMA(&scsiDev.data[SD_SECTOR_SIZE * (prep % buffers)]);\r
+                                   }\r
+                                   else\r
+                                   {\r
+                                           sdReadSingleSectorDMA(sdLBA + prep, &scsiDev.data[SD_SECTOR_SIZE * (prep % buffers)]);\r
+                                   }\r
+                                   sdActive = 1;\r
+                }\r
+                else\r
+                {\r
+                    // Sync Read onboard flash\r
+                    S2S_Device* device = scsiDev.target->device;\r
+                    device->read(device, sdLBA + prep, 1, &scsiDev.data[SD_SECTOR_SIZE * (prep % buffers)]);\r
+                    prep++;\r
+                }\r
                        }\r
 \r
                        if (scsiActive && !scsiBusy && scsiWriteDMAPoll())\r