]> localhost Git - SCSI2SD-V6.git/commitdiff
Expand direct SD interface to reads over 128 sectors
authorMichael McMaster <michael@codesrc.com>
Fri, 4 Feb 2022 11:22:39 +0000 (21:22 +1000)
committerMichael McMaster <michael@codesrc.com>
Fri, 4 Feb 2022 11:22:39 +0000 (21:22 +1000)
src/firmware/disk.c
src/firmware/sd.c
src/firmware/sd.h

index dac1715bb4e827dc90f14e1bbb04690bac03283d..6069eeb11d2fc5b92465f7ee2afcb4377ac86d8f 100755 (executable)
@@ -38,8 +38,6 @@
 #include "time.h"\r
 #include "bsp.h"\r
 \r
-#include "led.h"\r
-\r
 #include <string.h>\r
 \r
 // Global\r
@@ -690,7 +688,7 @@ static void diskDataInBuffered(int totalSDSectors, uint32_t sdLBA, int useSlowDa
 // Only functional for 512 byte sectors.\r
 static void diskDataInDirect(uint32_t totalSDSectors, uint32_t sdLBA, int useSlowDataCount, uint32_t* phaseChangeDelayNs)\r
 {\r
-    sdReadPIO(sdLBA, totalSDSectors);\r
+    sdReadCmd(sdLBA, totalSDSectors);\r
 \r
     // Wait while the SD card starts buffering data\r
     if (*phaseChangeDelayNs > 0)\r
@@ -701,11 +699,18 @@ static void diskDataInDirect(uint32_t totalSDSectors, uint32_t sdLBA, int useSlo
 \r
     for (int i = 0; i < totalSDSectors && !scsiDev.resetFlag; ++i)\r
     {\r
-        // TODO if i %128 == 0, and not in an error state, then do another read.\r
-\r
-        if (useSlowDataCount)\r
+        if (i % 128 == 0)\r
         {\r
-            scsiSetDataCount(SD_SECTOR_SIZE);\r
+            // SD DPSM has 24 bit limit. Re-use 128 (DMA limit)\r
+            uint32_t chunk = totalSDSectors - i > 128 ? 128 : totalSDSectors - i;\r
+            sdReadPIOData(chunk);\r
+\r
+            if (useSlowDataCount)\r
+            {\r
+                while (!scsiDev.resetFlag && !scsiPhyComplete())\r
+                {}\r
+                scsiSetDataCount(chunk * SD_SECTOR_SIZE); // SCSI_XFER_MAX > 65536\r
+            }\r
         }\r
 \r
         // The SCSI fifo is a full sector so we only need to check once.\r
@@ -735,13 +740,6 @@ static void diskDataInDirect(uint32_t totalSDSectors, uint32_t sdLBA, int useSlo
                     *((volatile uint32_t*)SCSI_FIFO_DATA) = data[1];\r
                     *((volatile uint32_t*)SCSI_FIFO_DATA) = data[2];\r
                     *((volatile uint32_t*)SCSI_FIFO_DATA) = data[3];\r
-\r
-                    /*\r
-                    scsiPhyTx32(data[0] & 0xFFFF, data[0] >> 16);\r
-                    scsiPhyTx32(data[1] & 0xFFFF, data[1] >> 16);\r
-                    scsiPhyTx32(data[2] & 0xFFFF, data[2] >> 16);\r
-                    scsiPhyTx32(data[3] & 0xFFFF, data[3] >> 16);\r
-                    */\r
                 }\r
 \r
                 byteCount += 64;\r
@@ -784,14 +782,8 @@ static void diskDataInDirect(uint32_t totalSDSectors, uint32_t sdLBA, int useSlo
             scsiPhyTx32(0, 0);\r
             byteCount += 4;\r
         }\r
-\r
-        while (useSlowDataCount && !scsiDev.resetFlag && !scsiPhyComplete())\r
-        {\r
-        }\r
     }\r
 \r
-//while(1) { s2s_ledOn(); s2s_delay_ms(1000); s2s_ledOff(); s2s_delay_ms(1000); }\r
-\r
     /* Send stop transmission command in case of multiblock read */\r
     if(totalSDSectors > 1U)\r
     {\r
@@ -838,7 +830,7 @@ static void diskDataIn()
 \r
 #ifdef STM32F4xx\r
     // Direct mode requires hardware flow control to be working on the SD peripheral\r
-    if (bytesPerSector == SD_SECTOR_SIZE && totalSDSectors < 128)\r
+    if (bytesPerSector == SD_SECTOR_SIZE)\r
     {\r
         diskDataInDirect(totalSDSectors, sdLBA, useSlowDataCount, &phaseChangeDelayNs);\r
     }\r
index 6158e97ba1ddb103535bb8a360a6b24266221ba8..7985b3efff150dd8f22bdfbf5c3da48b83eb4578 100755 (executable)
@@ -83,7 +83,7 @@ void sdReadDMA(uint32_t lba, uint32_t sectors, uint8_t* outputBuffer)
        }\r
 }\r
 \r
-void sdReadPIO(uint32_t lba, uint32_t sectors)\r
+void sdReadCmd(uint32_t lba, uint32_t sectors)\r
 {\r
        uint32_t errorstate;\r
        hsd.ErrorCode = HAL_SD_ERROR_NONE;\r
@@ -117,15 +117,6 @@ void sdReadPIO(uint32_t lba, uint32_t sectors)
                }\r
        }\r
 \r
-       SDIO_DataInitTypeDef config;\r
-       config.DataTimeOut   = SDMMC_DATATIMEOUT;\r
-       config.DataLength    = sectors * 512u;\r
-       config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;\r
-       config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;\r
-       config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;\r
-       config.DPSM          = SDIO_DPSM_ENABLE;\r
-       SDIO_ConfigData(hsd.Instance, &config);\r
-\r
        if(sectors > 1U)\r
        {\r
                hsd.Context = SD_CONTEXT_READ_MULTIPLE_BLOCK;\r
@@ -154,6 +145,21 @@ void sdReadPIO(uint32_t lba, uint32_t sectors)
        }\r
 }\r
 \r
+void sdReadPIOData(uint32_t sectors)\r
+{\r
+       /* Initialize data control register */\r
+       hsd.Instance->DCTRL = 0U;\r
+\r
+       SDIO_DataInitTypeDef config;\r
+       config.DataTimeOut   = SDMMC_DATATIMEOUT;\r
+       config.DataLength    = sectors * 512u;\r
+       config.DataBlockSize = SDIO_DATABLOCK_SIZE_512B;\r
+       config.TransferDir   = SDIO_TRANSFER_DIR_TO_SDIO;\r
+       config.TransferMode  = SDIO_TRANSFER_MODE_BLOCK;\r
+       config.DPSM          = SDIO_DPSM_ENABLE;\r
+       SDIO_ConfigData(hsd.Instance, &config);\r
+}\r
+\r
 \r
 void sdCompleteTransfer()\r
 {\r
index 67dc48c74beb537e70212b734b2bc4309299fecc..35b32e606c418459e190afc4cc278e2b62827645 100755 (executable)
@@ -37,7 +37,8 @@ int sdInit(void);
 void sdReadDMA(uint32_t lba, uint32_t sectors, uint8_t* outputBuffer);
 int sdReadDMAPoll(uint32_t remainingSectors);
 
-void sdReadPIO(uint32_t lba, uint32_t sectors);
+void sdReadCmd(uint32_t lba, uint32_t sectors);
+void sdReadPIOData(uint32_t sectors);
 
 void sdCompleteTransfer();
 void sdKeepAlive();