Skip to content
This repository was archived by the owner on Oct 28, 2023. It is now read-only.

Commit daa279a

Browse files
dpslwkdpgeorge
authored andcommitted
stmhal: Port of f4 hal commit 1d7fb82 to l4 hal
1 parent 56845b6 commit daa279a

File tree

2 files changed

+45
-19
lines changed

2 files changed

+45
-19
lines changed

stmhal/hal/l4/inc/stm32l4xx_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/l4/src/stm32l4xx_hal_sd.c

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,13 @@ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
459459
* is managed by polling mode.
460460
* @param hsd: SD handle
461461
* @param pReadBuffer: pointer to the buffer that will contain the received data
462-
* @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)
463463
* @param BlockSize: SD card Data block size
464464
* @note BlockSize must be 512 bytes.
465465
* @param NumberOfBlocks: Number of SD blocks to read
466466
* @retval SD Card error state
467467
*/
468-
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)
469469
{
470470
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
471471
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -475,10 +475,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
475475
/* Initialize data control register */
476476
hsd->Instance->DCTRL = 0;
477477

478+
uint32_t ReadAddr;
478479
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
479480
{
480481
BlockSize = 512;
481-
ReadAddr /= 512;
482+
ReadAddr = BlockNumber;
483+
}
484+
else
485+
{
486+
// should not overflow for standard-capacity cards
487+
ReadAddr = BlockNumber * BlockSize;
482488
}
483489

484490
/* Set Block Size for Card */
@@ -517,7 +523,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
517523
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
518524
}
519525

520-
sdmmc_cmdinitstructure.Argument = (uint32_t)ReadAddr;
526+
sdmmc_cmdinitstructure.Argument = ReadAddr;
521527
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
522528

523529
/* Read block(s) in polling mode */
@@ -635,13 +641,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
635641
* transfer is managed by polling mode.
636642
* @param hsd: SD handle
637643
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
638-
* @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)
639645
* @param BlockSize: SD card Data block size
640646
* @note BlockSize must be 512 bytes.
641647
* @param NumberOfBlocks: Number of SD blocks to write
642648
* @retval SD Card error state
643649
*/
644-
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)
645651
{
646652
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
647653
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -653,10 +659,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
653659
/* Initialize data control register */
654660
hsd->Instance->DCTRL = 0;
655661

662+
uint32_t WriteAddr;
656663
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
657664
{
658665
BlockSize = 512;
659-
WriteAddr /= 512;
666+
WriteAddr = BlockNumber;
667+
}
668+
else
669+
{
670+
// should not overflow for standard-capacity cards
671+
WriteAddr = BlockNumber * BlockSize;
660672
}
661673

662674
/* Set Block Size for Card */
@@ -686,7 +698,7 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
686698
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
687699
}
688700

689-
sdmmc_cmdinitstructure.Argument = (uint32_t)WriteAddr;
701+
sdmmc_cmdinitstructure.Argument = WriteAddr;
690702
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
691703

692704
/* Check for error conditions */
@@ -845,13 +857,13 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
845857
* to check the completion of the read process
846858
* @param hsd: SD handle
847859
* @param pReadBuffer: Pointer to the buffer that will contain the received data
848-
* @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)
849861
* @param BlockSize: SD card Data block size
850862
* @note BlockSize must be 512 bytes.
851863
* @param NumberOfBlocks: Number of blocks to read.
852864
* @retval SD Card error state
853865
*/
854-
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)
855867
{
856868
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
857869
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -895,10 +907,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
895907
/* Enable the DMA Channel */
896908
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
897909

910+
uint32_t ReadAddr;
898911
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
899912
{
900913
BlockSize = 512;
901-
ReadAddr /= 512;
914+
ReadAddr = BlockNumber;
915+
}
916+
else
917+
{
918+
// should not overflow for standard-capacity cards
919+
ReadAddr = BlockNumber * BlockSize;
902920
}
903921

904922
/* Set Block Size for Card */
@@ -938,7 +956,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
938956
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
939957
}
940958

941-
sdmmc_cmdinitstructure.Argument = (uint32_t)ReadAddr;
959+
sdmmc_cmdinitstructure.Argument = ReadAddr;
942960
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
943961

944962
/* Check for error conditions */
@@ -965,13 +983,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
965983
* to check the completion of the write process (by SD current status polling).
966984
* @param hsd: SD handle
967985
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
968-
* @param WriteAddr: Address from where data is to be read
986+
* @param @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
969987
* @param BlockSize: the SD card Data block size
970988
* @note BlockSize must be 512 bytes.
971989
* @param NumberOfBlocks: Number of blocks to write
972990
* @retval SD Card error state
973991
*/
974-
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks)
992+
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
975993
{
976994
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
977995
SDMMC_DataInitTypeDef sdmmc_datainitstructure;
@@ -1015,10 +1033,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
10151033
/* Enable SDMMC DMA transfer */
10161034
__HAL_SD_SDMMC_DMA_ENABLE(hsd);
10171035

1036+
uint32_t WriteAddr;
10181037
if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
10191038
{
10201039
BlockSize = 512;
1021-
WriteAddr /= 512;
1040+
WriteAddr = BlockNumber;
1041+
}
1042+
else
1043+
{
1044+
// should not overflow for standard-capacity cards
1045+
WriteAddr = BlockNumber * BlockSize;
10221046
}
10231047

10241048
/* Set Block Size for Card */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy