Skip to content

Commit 44cb2ff

Browse files
flowergrassdpgeorge
authored andcommitted
stmhal: Port of f4 hal commit 1d7fb82 to updated f7 hal.
1 parent 8218637 commit 44cb2ff

2 files changed

Lines changed: 46 additions & 21 deletions

File tree

stmhal/hal/f7/inc/stm32f7xx_hal_sd.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -643,8 +643,9 @@ void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd);
643643
* @{
644644
*/
645645
/* Blocking mode: Polling */
646-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
647-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
646+
// dpgeorge: read/write functions renamed to emphasise that address is given by block number
647+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
648+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
648649
HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr);
649650

650651
/* Non-Blocking mode: Interrupt */
@@ -659,8 +660,9 @@ void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd);
659660
void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd);
660661

661662
/* Non-Blocking mode: DMA */
662-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
663-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
663+
// dpgeorge: read/write functions renamed to emphasise that address is given by block number
664+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
665+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
664666
HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout);
665667
HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout);
666668
/**

stmhal/hal/f7/src/stm32f7xx_hal_sd.c

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,6 @@ HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *S
367367

368368
/* Initialize the present SDMMC card(s) and put them in idle state */
369369
errorstate = SD_Initialize_Cards(hsd);
370-
371370
if (errorstate != SD_OK)
372371
{
373372
return errorstate;
@@ -460,13 +459,13 @@ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
460459
* is managed by polling mode.
461460
* @param hsd: SD handle
462461
* @param pReadBuffer: pointer to the buffer that will contain the received data
463-
* @param ReadAddr: Address from where data is to be read
462+
* @param BlockNumber: Block number from where data is to be read (byte address = BlockNumber * BlockSize)
464463
* @param BlockSize: SD card Data block size
465464
* @note BlockSize must be 512 bytes.
466465
* @param NumberOfBlocks: Number of SD blocks to read
467466
* @retval SD Card error state
468467
*/
469-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
468+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
470469
{
471470
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
472471
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -476,10 +475,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
476475
/* Initialize data control register */
477476
hsd->Instance->DCTRL = 0;
478477

478+
uint32_t ReadAddr;
479479
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
480480
{
481481
BlockSize = 512;
482-
ReadAddr /= 512;
482+
ReadAddr = BlockNumber;
483+
}
484+
else
485+
{
486+
// should not overflow for standard-capacity cards
487+
ReadAddr = BlockNumber * BlockSize;
483488
}
484489

485490
/* Set Block Size for Card */
@@ -518,7 +523,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
518523
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
519524
}
520525

521-
sdmmc_cmdinitstructure.Argument = (uint32_t)ReadAddr;
526+
sdmmc_cmdinitstructure.Argument = ReadAddr;
522527
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
523528

524529
/* Read block(s) in polling mode */
@@ -636,13 +641,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
636641
* transfer is managed by polling mode.
637642
* @param hsd: SD handle
638643
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
639-
* @param WriteAddr: Address from where data is to be written
644+
* @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
640645
* @param BlockSize: SD card Data block size
641646
* @note BlockSize must be 512 bytes.
642647
* @param NumberOfBlocks: Number of SD blocks to write
643648
* @retval SD Card error state
644649
*/
645-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
650+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
646651
{
647652
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
648653
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -654,10 +659,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
654659
/* Initialize data control register */
655660
hsd->Instance->DCTRL = 0;
656661

662+
uint32_t WriteAddr;
657663
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
658664
{
659665
BlockSize = 512;
660-
WriteAddr /= 512;
666+
WriteAddr = BlockNumber;
667+
}
668+
else
669+
{
670+
// should not overflow for standard-capacity cards
671+
WriteAddr = BlockNumber * BlockSize;
661672
}
662673

663674
/* Set Block Size for Card */
@@ -687,7 +698,7 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
687698
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
688699
}
689700

690-
sdmmc_cmdinitstructure.Argument = (uint32_t)WriteAddr;
701+
sdmmc_cmdinitstructure.Argument = WriteAddr;
691702
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
692703

693704
/* Check for error conditions */
@@ -846,13 +857,13 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
846857
* to check the completion of the read process
847858
* @param hsd: SD handle
848859
* @param pReadBuffer: Pointer to the buffer that will contain the received data
849-
* @param ReadAddr: Address from where data is to be read
860+
* @param BlockNumber: Block number from where data is to be read (byte address = BlockNumber * BlockSize)
850861
* @param BlockSize: SD card Data block size
851862
* @note BlockSize must be 512 bytes.
852863
* @param NumberOfBlocks: Number of blocks to read.
853864
* @retval SD Card error state
854865
*/
855-
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
866+
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
856867
{
857868
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
858869
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -892,10 +903,17 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
892903
/* Enable the DMA Channel */
893904
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
894905

906+
uint32_t ReadAddr;
895907
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
896908
{
897909
BlockSize = 512;
898-
ReadAddr /= 512;
910+
ReadAddr = BlockNumber;
911+
}
912+
else
913+
{
914+
// should not overflow for standard-capacity cards
915+
ReadAddr = BlockNumber * BlockSize;
916+
899917
}
900918

901919
/* Set Block Size for Card */
@@ -935,7 +953,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
935953
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
936954
}
937955

938-
sdmmc_cmdinitstructure.Argument = (uint32_t)ReadAddr;
956+
sdmmc_cmdinitstructure.Argument = ReadAddr;
939957
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
940958

941959
/* Check for error conditions */
@@ -962,13 +980,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
962980
* to check the completion of the write process (by SD current status polling).
963981
* @param hsd: SD handle
964982
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
965-
* @param WriteAddr: Address from where data is to be read
983+
* @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
966984
* @param BlockSize: the SD card Data block size
967985
* @note BlockSize must be 512 bytes.
968986
* @param NumberOfBlocks: Number of blocks to write
969987
* @retval SD Card error state
970988
*/
971-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
989+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
972990
{
973991
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
974992
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -1008,10 +1026,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
10081026
/* Enable SDMMC DMA transfer */
10091027
__HAL_SD_SDMMC_DMA_ENABLE(hsd);
10101028

1029+
uint32_t WriteAddr;
10111030
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
10121031
{
10131032
BlockSize = 512;
1014-
WriteAddr /= 512;
1033+
WriteAddr = BlockNumber;
1034+
}
1035+
else
1036+
{
1037+
// should not overflow for standard-capacity cards
1038+
WriteAddr = BlockNumber * BlockSize;
10151039
}
10161040

10171041
/* Set Block Size for Card */
@@ -2686,7 +2710,6 @@ static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CM
26862710
{
26872711
HAL_SD_ErrorTypedef errorstate = SD_OK;
26882712
uint32_t response_r1;
2689-
26902713
while(!__HAL_SD_SDMMC_GET_FLAG(hsd, SDMMC_FLAG_CCRCFAIL | SDMMC_FLAG_CMDREND | SDMMC_FLAG_CTIMEOUT))
26912714
{
26922715
}

0 commit comments

Comments
 (0)