mirror of
https://github.com/apache/nuttx.git
synced 2026-06-05 07:12:54 +08:00
MMCSD SDIO: Add support for a new SDWAIT_WRCOMPLETE condition. The previous logic used a busy-wait loop to pool the card R1 start to determine when the card was ready for the next transfer. That busy-wait can be quite long -- hundreds of milliseconds. And alternative is to look the the SD D0 pin which will change state when the card is no longer busy.
This logic implements a change the avoids the busy-wait poll by reconfiguring the SD D0 pin as a GPIO interrupt, then waiting for the card to becom ready without taking up CPU cycles. This change is conditioned on CONFIG_MMCSD_SDIOWATI_WRCOMPLETE and is currenlty only implemented for the STM32 SDIO driver. From David Sidrane
This commit is contained in:
Regular → Executable
+15
@@ -1150,6 +1150,15 @@ static int mmcsd_transferready(FAR struct mmcsd_state_s *priv)
|
||||
* the TRANSFER state when the card completes the WRITE operation.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE)
|
||||
ret = mmcsd_eventwait(priv, SDIOWAIT_TIMEOUT|SDIOWAIT_ERROR,
|
||||
MMCSD_BLOCK_WDATADELAY);
|
||||
if (ret != OK)
|
||||
{
|
||||
fdbg("ERROR: mmcsd_eventwait for transfer ready failed: %d\n", ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
starttime = clock_systimer();
|
||||
do
|
||||
{
|
||||
@@ -1721,6 +1730,12 @@ static ssize_t mmcsd_writesingle(FAR struct mmcsd_state_s *priv,
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE)
|
||||
/* Arm the write complete detection with timeout */
|
||||
|
||||
SDIO_WAITENABLE(priv->dev, SDIOWAIT_WRCOMPLETE|SDIOWAIT_TIMEOUT);
|
||||
#endif
|
||||
|
||||
/* On success, return the number of blocks written */
|
||||
|
||||
return 1;
|
||||
|
||||
Reference in New Issue
Block a user