Skip to content

Commit cd74716

Browse files
committed
Merge branch 'fix/sdmmc_cmd_sector_count_shouldnt_be_zero' into 'master'
sdmmc: read/write/erase return early on sector count == 0 Closes IDFGH-9203 See merge request espressif/esp-idf!22440
2 parents 80be82e + 415e785 commit cd74716

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

components/sdmmc/include/sdmmc_cmd.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ esp_err_t sdmmc_get_status(sdmmc_card_t* card);
5858
* @param start_sector sector where to start writing
5959
* @param sector_count number of sectors to write
6060
* @return
61-
* - ESP_OK on success
61+
* - ESP_OK on success or sector_count equal to 0
6262
* - One of the error codes from SDMMC host controller
6363
*/
6464
esp_err_t sdmmc_write_sectors(sdmmc_card_t* card, const void* src,
@@ -74,7 +74,7 @@ esp_err_t sdmmc_write_sectors(sdmmc_card_t* card, const void* src,
7474
* @param start_sector sector where to start reading
7575
* @param sector_count number of sectors to read
7676
* @return
77-
* - ESP_OK on success
77+
* - ESP_OK on success or sector_count equal to 0
7878
* - One of the error codes from SDMMC host controller
7979
*/
8080
esp_err_t sdmmc_read_sectors(sdmmc_card_t* card, void* dst,
@@ -92,7 +92,7 @@ esp_err_t sdmmc_read_sectors(sdmmc_card_t* card, void* dst,
9292
* @param sector_count number of sectors to erase
9393
* @param arg erase command (CMD38) argument
9494
* @return
95-
* - ESP_OK on success
95+
* - ESP_OK on success or sector_count equal to 0
9696
* - One of the error codes from SDMMC host controller
9797
*/
9898
esp_err_t sdmmc_erase_sectors(sdmmc_card_t* card, size_t start_sector,

components/sdmmc/sdmmc_cmd.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ esp_err_t sdmmc_send_cmd_send_status(sdmmc_card_t* card, uint32_t* out_status)
359359
esp_err_t sdmmc_write_sectors(sdmmc_card_t* card, const void* src,
360360
size_t start_block, size_t block_count)
361361
{
362+
if (block_count == 0) {
363+
return ESP_OK;
364+
}
365+
362366
esp_err_t err = ESP_OK;
363367
size_t block_size = card->csd.sector_size;
364368
if (esp_ptr_dma_capable(src) && (intptr_t)src % 4 == 0) {
@@ -456,6 +460,10 @@ esp_err_t sdmmc_write_sectors_dma(sdmmc_card_t* card, const void* src,
456460
esp_err_t sdmmc_read_sectors(sdmmc_card_t* card, void* dst,
457461
size_t start_block, size_t block_count)
458462
{
463+
if (block_count == 0) {
464+
return ESP_OK;
465+
}
466+
459467
esp_err_t err = ESP_OK;
460468
size_t block_size = card->csd.sector_size;
461469
if (esp_ptr_dma_capable(dst) && (intptr_t)dst % 4 == 0) {
@@ -530,6 +538,10 @@ esp_err_t sdmmc_read_sectors_dma(sdmmc_card_t* card, void* dst,
530538
esp_err_t sdmmc_erase_sectors(sdmmc_card_t* card, size_t start_sector,
531539
size_t sector_count, sdmmc_erase_arg_t arg)
532540
{
541+
if (sector_count == 0) {
542+
return ESP_OK;
543+
}
544+
533545
if (start_sector + sector_count > card->csd.capacity) {
534546
return ESP_ERR_INVALID_SIZE;
535547
}

components/sdmmc/test/test_sd.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,29 @@ TEST_CASE("SDMMC discard test (SD slot 1, 4 line)", "[sd][test_env=UT_T1_SDMODE]
10351035
}
10361036
#endif //WITH_SD_TEST
10371037

1038+
#if WITH_SD_TEST
1039+
TEST_CASE("sdmmc read/write/erase sector shoud return ESP_OK with sector count == 0", "[sd][test_env=UT_T1_SDMODE]")
1040+
{
1041+
sd_test_board_power_on();
1042+
sdmmc_host_t config = SDMMC_HOST_DEFAULT();
1043+
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
1044+
TEST_ESP_OK(sdmmc_host_init());
1045+
1046+
TEST_ESP_OK(sdmmc_host_init_slot(SDMMC_HOST_SLOT_1, &slot_config));
1047+
sdmmc_card_t* card = malloc(sizeof(sdmmc_card_t));
1048+
TEST_ASSERT_NOT_NULL(card);
1049+
TEST_ESP_OK(sdmmc_card_init(&config, card));
1050+
1051+
TEST_ESP_OK(sdmmc_write_sectors(card, NULL, 0, 0));
1052+
TEST_ESP_OK(sdmmc_read_sectors(card, NULL, 0, 0));
1053+
TEST_ESP_OK(sdmmc_erase_sectors(card, 0, 0, SDMMC_ERASE_ARG));
1054+
1055+
free(card);
1056+
TEST_ESP_OK(sdmmc_host_deinit());
1057+
sd_test_board_power_off();
1058+
}
1059+
#endif //WITH_SD_TEST
1060+
10381061
#if WITH_EMMC_TEST
10391062
static void test_mmc_sanitize_blocks(sdmmc_card_t* card)
10401063
{

0 commit comments

Comments
 (0)