@@ -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