#include "time.h"\r
#include "bsp.h"\r
\r
-#include "led.h"\r
-\r
#include <string.h>\r
\r
// Global\r
// 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
\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
*((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
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
\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
}\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
}\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
}\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
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();