vfs_fat_sdmmc: if card init fails, fail cleanly

This fixes the issue with sdmmc_host not returned to clean state after
a failed attempt to mount the card, with no SD card in the slot.
pull/394/head
Ivan Grokhotkov 2017-02-24 21:04:22 +08:00
rodzic 63e0140ae6
commit c17e05040a
2 zmienionych plików z 28 dodań i 3 usunięć

Wyświetl plik

@ -39,14 +39,19 @@ esp_err_t esp_vfs_fat_sdmmc_mount(const char* base_path,
sdmmc_host_init(); sdmmc_host_init();
// enable card slot // enable card slot
sdmmc_host_init_slot(host_config->slot, slot_config); esp_err_t err = sdmmc_host_init_slot(host_config->slot, slot_config);
if (err != ESP_OK) {
return err;
}
s_card = malloc(sizeof(sdmmc_card_t)); s_card = malloc(sizeof(sdmmc_card_t));
if (s_card == NULL) { if (s_card == NULL) {
return ESP_ERR_NO_MEM; err = ESP_ERR_NO_MEM;
goto fail;
} }
// probe and initialize card // probe and initialize card
esp_err_t err = sdmmc_card_init(host_config, s_card); err = sdmmc_card_init(host_config, s_card);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGD(TAG, "sdmmc_card_init failed 0x(%x)", err); ESP_LOGD(TAG, "sdmmc_card_init failed 0x(%x)", err);
goto fail; goto fail;
@ -104,6 +109,7 @@ esp_err_t esp_vfs_fat_sdmmc_mount(const char* base_path,
return ESP_OK; return ESP_OK;
fail: fail:
sdmmc_host_deinit();
free(workbuf); free(workbuf);
esp_vfs_unregister(base_path); esp_vfs_unregister(base_path);
free(s_card); free(s_card);

Wyświetl plik

@ -52,6 +52,25 @@ static void create_file_with_text(const char* name, const char* text)
TEST_ASSERT_EQUAL(0, fclose(f)); TEST_ASSERT_EQUAL(0, fclose(f));
} }
TEST_CASE("Mount fails cleanly without card inserted", "[fatfs][ignore]")
{
HEAP_SIZE_CAPTURE();
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
.format_if_mount_failed = false,
.max_files = 5
};
for (int i = 0; i < 3; ++i) {
printf("Initializing card, attempt %d ", i);
esp_err_t err = esp_vfs_fat_sdmmc_mount("/sdcard", &host, &slot_config, &mount_config, NULL);
printf(" err=%d\n", err);
TEST_ESP_ERR(ESP_FAIL, err);
}
HEAP_SIZE_CHECK(0);
}
TEST_CASE("can create and write file on sd card", "[fatfs][ignore]") TEST_CASE("can create and write file on sd card", "[fatfs][ignore]")
{ {
HEAP_SIZE_CAPTURE(); HEAP_SIZE_CAPTURE();