Skip to content

Commit

Permalink
arch/xtensa/src/esp32s3/esp32s3_sdmmc.c: wait for command done event …
Browse files Browse the repository at this point in the history
…also on error response

Wait for CMDDONE in esp32s3_waitresponse even an error response is received.
Otherwise, the CMDDONE event of this command will disrupt later command.

Signed-off-by: Yinzhe Wu <Yinzhe.Wu@sony.com>
Reviewed-by: Yuezhang Mo <Yuezhang.Mo@sony.com>
Reviewed-by: Jacky Cao <Jacky.Cao@sony.com>
Tested-by: Yinzhe Wu <Yinzhe.Wu@sony.com>
  • Loading branch information
Windrow14 authored and xiaoxiang781216 committed Aug 26, 2024
1 parent 25bd3be commit cc8d453
Showing 1 changed file with 20 additions and 31 deletions.
51 changes: 20 additions & 31 deletions arch/xtensa/src/esp32s3/esp32s3_sdmmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@
#endif

#define SDCARD_CMDDONE_STA (SDMMC_INT_CDONE)
#define SDCARD_RESPDONE_STA (0)

#define SDCARD_CMDDONE_MASK (SDMMC_INT_CDONE)
#define SDCARD_RESPDONE_MASK (SDMMC_INT_CDONE | SDCARD_INT_RESPERR)
Expand Down Expand Up @@ -521,8 +520,6 @@ static int esp32s3_ciu_sendcmd(uint32_t cmd, uint32_t arg)
{
clock_t watchtime;

DEBUGASSERT((esp32s3_getreg(ESP32S3_SDMMC_CMD) & SDMMC_CMD_STARTCMD) == 0);

watchtime = clock_systime_ticks();

while ((esp32s3_getreg(ESP32S3_SDMMC_CMD) & SDMMC_CMD_STARTCMD) != 0)
Expand All @@ -544,8 +541,6 @@ static int esp32s3_ciu_sendcmd(uint32_t cmd, uint32_t arg)

mcinfo("cmd=0x%x arg=0x%x\n", cmd, arg);

/* Poll until command is accepted by the CIU, or we timeout */

return 0;
}

Expand Down Expand Up @@ -1991,16 +1986,17 @@ static int esp32s3_cancel(struct sdio_dev_s *dev)

static int esp32s3_waitresponse(struct sdio_dev_s *dev, uint32_t cmd)
{
int ret = OK;
volatile int32_t timeout;
clock_t watchtime;
uint32_t events;

mcinfo("cmd=%04x\n", cmd);

switch (cmd & MMCSD_RESPONSE_MASK)
{
case MMCSD_NO_RESPONSE:
events = SDCARD_CMDDONE_STA;
case MMCSD_R3_RESPONSE:
case MMCSD_R7_RESPONSE:
timeout = SDCARD_CMDTIMEOUT;
break;

Expand All @@ -2010,48 +2006,41 @@ static int esp32s3_waitresponse(struct sdio_dev_s *dev, uint32_t cmd)
case MMCSD_R4_RESPONSE:
case MMCSD_R5_RESPONSE:
case MMCSD_R6_RESPONSE:
events = (SDCARD_CMDDONE_STA | SDCARD_RESPDONE_STA);
timeout = SDCARD_LONGTIMEOUT;
break;

case MMCSD_R3_RESPONSE:
case MMCSD_R7_RESPONSE:
events = (SDCARD_CMDDONE_STA | SDCARD_RESPDONE_STA);
timeout = SDCARD_CMDTIMEOUT;
break;

default:
return -EINVAL;
}

/* Then wait for the response (or timeout or error) */

watchtime = clock_systime_ticks();
while ((esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & events) != events)

/* We should wait for CMDDONE, even if there is a response error. */

while ((esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & SDMMC_INT_CDONE) == 0)
{
if (clock_systime_ticks() - watchtime > timeout)
{
mcerr("ERROR: Timeout cmd: %04x events: %04x STA: %08x "
"RINTSTS: %08x\n",
cmd, events, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
mcerr("ERROR: Timeout cmd: %04x STA: %08x RINTSTS: %08x\n",
cmd, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
esp32s3_getreg(ESP32S3_SDMMC_RINTSTS));

return -ETIMEDOUT;
ret = -ETIMEDOUT;
}
else if ((esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & SDCARD_INT_RESPERR)
!= 0)
{
mcerr("ERROR: SDMMC failure cmd: %04x events: %04x STA: %08x "
"RINTSTS: %08x\n",
cmd, events, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
esp32s3_getreg(ESP32S3_SDMMC_RINTSTS));
}

return -EIO;
}
/* Check if there is a response error. */

if (esp32s3_getreg(ESP32S3_SDMMC_RINTSTS) & SDCARD_INT_RESPERR)
{
mcerr("ERROR: SDMMC failure cmd: %04x STA: %08x RINTSTS: %08x\n",
cmd, esp32s3_getreg(ESP32S3_SDMMC_STATUS),
esp32s3_getreg(ESP32S3_SDMMC_RINTSTS));
ret = -EIO;
}

esp32s3_putreg(SDCARD_CMDDONE_CLEAR, ESP32S3_SDMMC_RINTSTS);
return OK;
return ret;
}

/****************************************************************************
Expand Down

0 comments on commit cc8d453

Please sign in to comment.