1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 00:35:18 +03:00

SDIO timeout fixes

This commit is contained in:
Damjan Adamic 2016-09-11 21:53:32 +02:00
parent e229c8f8e7
commit 0076dd99e0
3 changed files with 15 additions and 17 deletions

View file

@ -159,7 +159,7 @@ DRESULT __disk_read(
if (Status == SD_OK) { if (Status == SD_OK) {
SDTransferState State; SDTransferState State;
Status = SD_WaitReadOperation(); // Check if the Transfer is finished Status = SD_WaitReadOperation(100*count); // Check if the Transfer is finished
while ((State = SD_GetStatus()) == SD_TRANSFER_BUSY); // BUSY, OK (DONE), ERROR (FAIL) while ((State = SD_GetStatus()) == SD_TRANSFER_BUSY); // BUSY, OK (DONE), ERROR (FAIL)
@ -230,7 +230,7 @@ DRESULT __disk_write(
if (Status == SD_OK) { if (Status == SD_OK) {
SDTransferState State; SDTransferState State;
Status = SD_WaitWriteOperation(); // Check if the Transfer is finished Status = SD_WaitWriteOperation(500*count); // Check if the Transfer is finished
while((State = SD_GetStatus()) == SD_TRANSFER_BUSY); // BUSY, OK (DONE), ERROR (FAIL) while((State = SD_GetStatus()) == SD_TRANSFER_BUSY); // BUSY, OK (DONE), ERROR (FAIL)

View file

@ -70,7 +70,7 @@
#define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000) #define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000)
#define SD_CARD_LOCKED ((uint32_t)0x02000000) #define SD_CARD_LOCKED ((uint32_t)0x02000000)
#define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFF) #define SD_DATATIMEOUT ((uint32_t)100000)
#define SD_0TO7BITS ((uint32_t)0x000000FF) #define SD_0TO7BITS ((uint32_t)0x000000FF)
#define SD_8TO15BITS ((uint32_t)0x0000FF00) #define SD_8TO15BITS ((uint32_t)0x0000FF00)
#define SD_16TO23BITS ((uint32_t)0x00FF0000) #define SD_16TO23BITS ((uint32_t)0x00FF0000)
@ -1338,7 +1338,7 @@ OPTIMIZE("O0") SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr,
return(errorstatus); return(errorstatus);
} }
SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; // TODO consider setting shorter timeout SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT * NumberOfBlocks;
SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize;
SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b; SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b;
SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
@ -1372,25 +1372,24 @@ OPTIMIZE("O0") SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr,
* @param None. * @param None.
* @retval SD_Error: SD Card Error code. * @retval SD_Error: SD Card Error code.
*/ */
OPTIMIZE("O0") SD_Error SD_WaitReadOperation(void) OPTIMIZE("O0") SD_Error SD_WaitReadOperation(uint32_t timeout)
{ {
SD_Error errorstatus = SD_OK; SD_Error errorstatus = SD_OK;
uint32_t timeout;
timeout = SD_DATATIMEOUT;
while (!DMAEndOfTransfer && !TransferEnd && (TransferError == SD_OK) && (timeout > 0)) while (!DMAEndOfTransfer && !TransferEnd && (TransferError == SD_OK) && (timeout > 0))
{ {
delay_ms(1);
timeout--; timeout--;
} }
TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_read, (TransferError << 8) + (DMAEndOfTransfer << 1) + TransferEnd); TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_read, (TransferError << 8) + (DMAEndOfTransfer << 1) + TransferEnd);
DMAEndOfTransfer = 0; DMAEndOfTransfer = 0;
timeout = SD_DATATIMEOUT; timeout = 10;
while(((SDIO->STA & SDIO_FLAG_RXACT)) && (timeout > 0)) while(((SDIO->STA & SDIO_FLAG_RXACT)) && (timeout > 0))
{ {
delay_ms(1);
timeout--; timeout--;
} }
TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_read, -1); TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_read, -1);
@ -1590,7 +1589,7 @@ OPTIMIZE("O0") SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAd
return(errorstatus); return(errorstatus);
} }
SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT * NumberOfBlocks;
SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize;
SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b; SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b;
SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
@ -1610,25 +1609,24 @@ OPTIMIZE("O0") SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAd
* @param None. * @param None.
* @retval SD_Error: SD Card Error code. * @retval SD_Error: SD Card Error code.
*/ */
OPTIMIZE("O0") SD_Error SD_WaitWriteOperation(void) OPTIMIZE("O0") SD_Error SD_WaitWriteOperation(uint32_t timeout)
{ {
SD_Error errorstatus = SD_OK; SD_Error errorstatus = SD_OK;
uint32_t timeout;
timeout = SD_DATATIMEOUT;
while (!DMAEndOfTransfer && !TransferEnd && (TransferError == SD_OK) && (timeout > 0)) while (!DMAEndOfTransfer && !TransferEnd && (TransferError == SD_OK) && (timeout > 0))
{ {
delay_ms(1);
timeout--; timeout--;
} }
TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_write, (TransferError << 8) + (DMAEndOfTransfer << 1) + TransferEnd); TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_write, (TransferError << 8) + (DMAEndOfTransfer << 1) + TransferEnd);
DMAEndOfTransfer = 0; DMAEndOfTransfer = 0;
timeout = SD_DATATIMEOUT; timeout = 10;
while(((SDIO->STA & SDIO_FLAG_TXACT)) && (timeout > 0)) while(((SDIO->STA & SDIO_FLAG_TXACT)) && (timeout > 0))
{ {
delay_ms(1);
timeout--; timeout--;
} }
TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_write, -1); TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_write, -1);

View file

@ -207,8 +207,8 @@ SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAddr, uint16_t Bl
SDTransferState SD_GetTransferState(void); SDTransferState SD_GetTransferState(void);
// SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr); // SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);
// SD_Error SD_SendSDStatus(uint32_t *psdstatus); // SD_Error SD_SendSDStatus(uint32_t *psdstatus);
SD_Error SD_WaitReadOperation(void); SD_Error SD_WaitReadOperation(uint32_t timeout);
SD_Error SD_WaitWriteOperation(void); SD_Error SD_WaitWriteOperation(uint32_t timeout);
#ifdef __cplusplus #ifdef __cplusplus
} }