Commit 7a55c1a8 authored by Dave Hylands's avatar Dave Hylands Committed by Damien George
Browse files

stmhal: Port of f4 hal commit 1d7fb82f to f7 hal

parent 28e51c9e
...@@ -643,8 +643,9 @@ void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd); ...@@ -643,8 +643,9 @@ void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd);
* @{ * @{
*/ */
/* Blocking mode: Polling */ /* Blocking mode: Polling */
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); // dpgeorge: read/write functions renamed to emphasise that address is given by block number
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr); HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr);
/* Non-Blocking mode: Interrupt */ /* Non-Blocking mode: Interrupt */
...@@ -659,8 +660,9 @@ void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd); ...@@ -659,8 +660,9 @@ void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd);
void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd); void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd);
/* Non-Blocking mode: DMA */ /* Non-Blocking mode: DMA */
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); // dpgeorge: read/write functions renamed to emphasise that address is given by block number
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks);
HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout);
HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout);
/** /**
......
...@@ -453,14 +453,14 @@ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd) ...@@ -453,14 +453,14 @@ __weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)
* @brief Reads block(s) from a specified address in a card. The Data transfer * @brief Reads block(s) from a specified address in a card. The Data transfer
* is managed by polling mode. * is managed by polling mode.
* @param hsd: SD handle * @param hsd: SD handle
* @param pReadBuffer: pointer to the buffer that will contain the received data * @param pReadBuffer: pointer to the buffer that will contain the received data
* @param ReadAddr: Address from where data is to be read * @param BlockNumber: Block number from where data is to be read (byte address = BlockNumber * BlockSize)
* @param BlockSize: SD card Data block size * @param BlockSize: SD card Data block size
* @note BlockSize must be 512 bytes. * @note BlockSize must be 512 bytes.
* @param NumberOfBlocks: Number of SD blocks to read * @param NumberOfBlocks: Number of SD blocks to read
* @retval SD Card error state * @retval SD Card error state
*/ */
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
{ {
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure; SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
SDMMC_DataInitTypeDef sdmmc_datainitstructure; SDMMC_DataInitTypeDef sdmmc_datainitstructure;
...@@ -470,10 +470,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff ...@@ -470,10 +470,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
/* Initialize data control register */ /* Initialize data control register */
hsd->Instance->DCTRL = 0; hsd->Instance->DCTRL = 0;
uint32_t ReadAddr;
if (hsd->CardType == HIGH_CAPACITY_SD_CARD) if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
{ {
BlockSize = 512; BlockSize = 512;
ReadAddr /= 512; ReadAddr = BlockNumber;
}
else
{
// should not overflow for standard-capacity cards
ReadAddr = BlockNumber * BlockSize;
} }
/* Set Block Size for Card */ /* Set Block Size for Card */
...@@ -512,7 +518,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff ...@@ -512,7 +518,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK; sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
} }
sdmmc_cmdinitstructure.Argument = (uint32_t)ReadAddr; sdmmc_cmdinitstructure.Argument = ReadAddr;
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure); SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
/* Read block(s) in polling mode */ /* Read block(s) in polling mode */
...@@ -630,13 +636,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff ...@@ -630,13 +636,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuff
* transfer is managed by polling mode. * transfer is managed by polling mode.
* @param hsd: SD handle * @param hsd: SD handle
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
* @param WriteAddr: Address from where data is to be written * @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
* @param BlockSize: SD card Data block size * @param BlockSize: SD card Data block size
* @note BlockSize must be 512 bytes. * @note BlockSize must be 512 bytes.
* @param NumberOfBlocks: Number of SD blocks to write * @param NumberOfBlocks: Number of SD blocks to write
* @retval SD Card error state * @retval SD Card error state
*/ */
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
{ {
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure; SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
SDMMC_DataInitTypeDef sdmmc_datainitstructure; SDMMC_DataInitTypeDef sdmmc_datainitstructure;
...@@ -648,10 +654,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu ...@@ -648,10 +654,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
/* Initialize data control register */ /* Initialize data control register */
hsd->Instance->DCTRL = 0; hsd->Instance->DCTRL = 0;
uint32_t WriteAddr;
if (hsd->CardType == HIGH_CAPACITY_SD_CARD) if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
{ {
BlockSize = 512; BlockSize = 512;
WriteAddr /= 512; WriteAddr = BlockNumber;
}
else
{
// should not overflow for standard-capacity cards
WriteAddr = BlockNumber * BlockSize;
} }
/* Set Block Size for Card */ /* Set Block Size for Card */
...@@ -681,7 +693,7 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu ...@@ -681,7 +693,7 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; sdmmc_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;
} }
sdmmc_cmdinitstructure.Argument = (uint32_t)WriteAddr; sdmmc_cmdinitstructure.Argument = WriteAddr;
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure); SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
/* Check for error conditions */ /* Check for error conditions */
...@@ -840,13 +852,13 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu ...@@ -840,13 +852,13 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBu
* to check the completion of the read process * to check the completion of the read process
* @param hsd: SD handle * @param hsd: SD handle
* @param pReadBuffer: Pointer to the buffer that will contain the received data * @param pReadBuffer: Pointer to the buffer that will contain the received data
* @param ReadAddr: Address from where data is to be read * @param BlockNumber: Block number from where data is to be read (byte address = BlockNumber * BlockSize)
* @param BlockSize: SD card Data block size * @param BlockSize: SD card Data block size
* @note BlockSize must be 512 bytes. * @note BlockSize must be 512 bytes.
* @param NumberOfBlocks: Number of blocks to read. * @param NumberOfBlocks: Number of blocks to read.
* @retval SD Card error state * @retval SD Card error state
*/ */
HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
{ {
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure; SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
SDMMC_DataInitTypeDef sdmmc_datainitstructure; SDMMC_DataInitTypeDef sdmmc_datainitstructure;
...@@ -886,10 +898,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead ...@@ -886,10 +898,16 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
/* Enable the DMA Channel */ /* Enable the DMA Channel */
HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4); HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4);
uint32_t ReadAddr;
if (hsd->CardType == HIGH_CAPACITY_SD_CARD) if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
{ {
BlockSize = 512; BlockSize = 512;
ReadAddr /= 512; ReadAddr = BlockNumber;
}
else
{
// should not overflow for standard-capacity cards
ReadAddr = BlockNumber * BlockSize;
} }
/* Set Block Size for Card */ /* Set Block Size for Card */
...@@ -929,7 +947,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead ...@@ -929,7 +947,7 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK; sdmmc_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK;
} }
sdmmc_cmdinitstructure.Argument = (uint32_t)ReadAddr; sdmmc_cmdinitstructure.Argument = ReadAddr;
SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure); SDMMC_SendCommand(hsd->Instance, &sdmmc_cmdinitstructure);
/* Check for error conditions */ /* Check for error conditions */
...@@ -956,13 +974,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead ...@@ -956,13 +974,13 @@ HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pRead
* to check the completion of the write process (by SD current status polling). * to check the completion of the write process (by SD current status polling).
* @param hsd: SD handle * @param hsd: SD handle
* @param pWriteBuffer: pointer to the buffer that will contain the data to transmit * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit
* @param WriteAddr: Address from where data is to be read * @param BlockNumber: Block number to where data is to be written (byte address = BlockNumber * BlockSize)
* @param BlockSize: the SD card Data block size * @param BlockSize: the SD card Data block size
* @note BlockSize must be 512 bytes. * @note BlockSize must be 512 bytes.
* @param NumberOfBlocks: Number of blocks to write * @param NumberOfBlocks: Number of blocks to write
* @retval SD Card error state * @retval SD Card error state
*/ */
HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_BlockNumber_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint32_t BlockNumber, uint32_t BlockSize, uint32_t NumberOfBlocks)
{ {
SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure; SDMMC_CmdInitTypeDef sdmmc_cmdinitstructure;
SDMMC_DataInitTypeDef sdmmc_datainitstructure; SDMMC_DataInitTypeDef sdmmc_datainitstructure;
...@@ -1002,10 +1020,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri ...@@ -1002,10 +1020,16 @@ HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWri
/* Enable SDMMC DMA transfer */ /* Enable SDMMC DMA transfer */
__HAL_SD_SDMMC_DMA_ENABLE(hsd); __HAL_SD_SDMMC_DMA_ENABLE(hsd);
uint32_t WriteAddr;
if (hsd->CardType == HIGH_CAPACITY_SD_CARD) if (hsd->CardType == HIGH_CAPACITY_SD_CARD)
{ {
BlockSize = 512; BlockSize = 512;
WriteAddr /= 512; WriteAddr = BlockNumber;
}
else
{
// should not overflow for standard-capacity cards
WriteAddr = BlockNumber * BlockSize;
} }
/* Set Block Size for Card */ /* Set Block Size for Card */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment