From f8f40ad94fab2bda9d3383b023e3fcc5b1749fd0 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Tue, 4 Feb 2025 11:59:59 +0100 Subject: [PATCH] fix(sdmmc): fix reset of pins above slot width Closes https://github.com/espressif/esp-idf/issues/15328 --- components/esp_driver_sdmmc/src/sdmmc_host.c | 26 +++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/components/esp_driver_sdmmc/src/sdmmc_host.c b/components/esp_driver_sdmmc/src/sdmmc_host.c index e306e231c7..04c645574d 100644 --- a/components/esp_driver_sdmmc/src/sdmmc_host.c +++ b/components/esp_driver_sdmmc/src/sdmmc_host.c @@ -851,16 +851,30 @@ static int sdmmc_host_decrease_init_slot_num(void) #endif } +static void reset_pin_if_valid(gpio_num_t gpio_num) +{ + if (gpio_num != GPIO_NUM_NC && GPIO_IS_VALID_GPIO(gpio_num)) { + gpio_reset_pin(gpio_num); + } +} + static void sdmmc_host_deinit_slot_internal(int slot) { - int8_t gpio_pin_num; sdmmc_slot_io_info_t* gpio = &s_host_ctx.slot_ctx[slot].slot_gpio_num; // Disconnect signals and reset used GPIO pins - for (size_t i = 0; i < (sizeof(gpio->val) / (sizeof(gpio->val[0]))); i++) { - gpio_pin_num = gpio->val[i]; - if (gpio_pin_num != GPIO_NUM_NC && GPIO_IS_VALID_GPIO(gpio_pin_num)) { - gpio_reset_pin(gpio_pin_num); - } + reset_pin_if_valid(gpio->clk); + reset_pin_if_valid(gpio->cmd); + reset_pin_if_valid(gpio->d0); + if (s_host_ctx.slot_ctx[slot].slot_width >= 4) { + reset_pin_if_valid(gpio->d1); + reset_pin_if_valid(gpio->d2); + reset_pin_if_valid(gpio->d3); + } + if (s_host_ctx.slot_ctx[slot].slot_width == 8) { + reset_pin_if_valid(gpio->d4); + reset_pin_if_valid(gpio->d5); + reset_pin_if_valid(gpio->d6); + reset_pin_if_valid(gpio->d7); } // Reset the slot context memset(&(s_host_ctx.slot_ctx[slot]), 0, sizeof(slot_ctx_t));