diff --git a/subsys/sd/Kconfig b/subsys/sd/Kconfig index 403eaef341a..be2a5775664 100644 --- a/subsys/sd/Kconfig +++ b/subsys/sd/Kconfig @@ -80,6 +80,12 @@ config SD_BUFFER_SIZE Size in bytes of internal buffer SD card uses for unaligned reads and internal data reads during initialization +config SD_CMD_RETRIES + int "Number of times to retry sending command to card" + default 0 + help + Number of times to retry sending command to SD card in case of failure + config SD_DATA_RETRIES int "Number of times to retry sending data to card" default 3 diff --git a/subsys/sd/sd.c b/subsys/sd/sd.c index 87ec7a29910..f4859b25a43 100644 --- a/subsys/sd/sd.c +++ b/subsys/sd/sd.c @@ -27,6 +27,7 @@ static inline int sd_idle(struct sd_card *card) cmd.opcode = SD_GO_IDLE_STATE; cmd.arg = 0x0; cmd.response_type = (SD_RSP_TYPE_NONE | SD_SPI_RSP_TYPE_R1); + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; return sdhc_request(card->sdhc, &cmd, NULL); } @@ -41,6 +42,7 @@ static int sd_send_interface_condition(struct sd_card *card) cmd.opcode = SD_SEND_IF_COND; cmd.arg = SD_IF_COND_VHS_3V3 | SD_IF_COND_CHECK; cmd.response_type = (SD_RSP_TYPE_R7 | SD_SPI_RSP_TYPE_R7); + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; ret = sdhc_request(card->sdhc, &cmd, NULL); if (ret) { @@ -77,6 +79,7 @@ static int sd_enable_crc(struct sd_card *card) cmd.opcode = SD_SPI_CRC_ON_OFF; cmd.arg = 0x1; /* Enable CRC */ cmd.response_type = SD_SPI_RSP_TYPE_R1; + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; return sdhc_request(card->sdhc, &cmd, NULL); } diff --git a/subsys/sd/sd_ops.c b/subsys/sd/sd_ops.c index 8fc6400dcf0..bf804679d68 100644 --- a/subsys/sd/sd_ops.c +++ b/subsys/sd/sd_ops.c @@ -27,6 +27,7 @@ int sdmmc_read_status(struct sd_card *card) cmd.arg = (card->relative_addr << 16U); } cmd.response_type = (SD_RSP_TYPE_R1 | SD_SPI_RSP_TYPE_R2); + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; ret = sdhc_request(card->sdhc, &cmd, NULL); @@ -211,6 +212,7 @@ static int sdmmc_spi_read_cxd(struct sd_card *card, uint32_t opcode, uint32_t *c cmd.opcode = opcode; cmd.arg = 0; cmd.response_type = SD_SPI_RSP_TYPE_R1; + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; /* CID/CSD is 16 bytes */ @@ -239,6 +241,7 @@ static int sdmmc_read_cxd(struct sd_card *card, uint32_t opcode, uint32_t rca, u cmd.opcode = opcode; cmd.arg = (rca << 16); cmd.response_type = SD_RSP_TYPE_R2; + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; ret = sdhc_request(card->sdhc, &cmd, NULL); @@ -332,6 +335,7 @@ int sdmmc_switch_voltage(struct sd_card *card) cmd.opcode = SD_VOL_SWITCH; cmd.arg = 0U; cmd.response_type = SD_RSP_TYPE_R1; + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; ret = sdhc_request(card->sdhc, &cmd, NULL); if (ret) { @@ -410,6 +414,7 @@ int sdmmc_request_rca(struct sd_card *card) cmd.opcode = SD_SEND_RELATIVE_ADDR; cmd.arg = 0; cmd.response_type = SD_RSP_TYPE_R6; + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; /* Issue CMD3 until card responds with nonzero RCA */ do { @@ -436,6 +441,7 @@ int sdmmc_select_card(struct sd_card *card) cmd.opcode = SD_SELECT_CARD; cmd.arg = ((card->relative_addr) << 16U); cmd.response_type = SD_RSP_TYPE_R1; + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; ret = sdhc_request(card->sdhc, &cmd, NULL); @@ -460,6 +466,7 @@ int card_app_command(struct sd_card *card, int relative_card_address) cmd.opcode = SD_APP_CMD; cmd.arg = relative_card_address << 16U; cmd.response_type = (SD_RSP_TYPE_R1 | SD_SPI_RSP_TYPE_R1); + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; ret = sdhc_request(card->sdhc, &cmd, NULL); if (ret) { @@ -505,8 +512,8 @@ static int card_read(struct sd_card *card, uint8_t *rbuf, uint32_t start_block, cmd.arg = start_block; } cmd.response_type = (SD_RSP_TYPE_R1 | SD_SPI_RSP_TYPE_R1); - cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; cmd.retries = CONFIG_SD_DATA_RETRIES; + cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; data.block_addr = start_block; data.block_size = card->block_size; @@ -617,6 +624,7 @@ static int card_query_written(struct sd_card *card, uint32_t *num_written) cmd.opcode = SD_APP_SEND_NUM_WRITTEN_BLK; cmd.arg = 0; cmd.response_type = (SD_RSP_TYPE_R1 | SD_SPI_RSP_TYPE_R1); + cmd.retries = CONFIG_SD_CMD_RETRIES; cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; data.block_size = 4U; @@ -660,8 +668,8 @@ static int card_write(struct sd_card *card, const uint8_t *wbuf, uint32_t start_ cmd.arg = start_block; } cmd.response_type = (SD_RSP_TYPE_R1 | SD_SPI_RSP_TYPE_R1); - cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; cmd.retries = CONFIG_SD_DATA_RETRIES; + cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT; data.block_addr = start_block; data.block_size = card->block_size;