Merge branch 'fix/usb_device_msc_storage_example' into 'master'

fix(tusb_msc): Added SD power supply configuration for p4

See merge request espressif/esp-idf!33455
This commit is contained in:
Roman Leonov 2024-11-14 17:18:39 +08:00
commit 7ff774905a
2 changed files with 42 additions and 0 deletions

View File

@ -78,6 +78,23 @@ menu "TinyUSB MSC Example Configuration"
endif # SOC_SDMMC_USE_GPIO_MATRIX
config EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
depends on SOC_SDMMC_IO_POWER_EXTERNAL
bool "SDMMC powered by internal LDO"
default y
help
Enable when internal LDO of ESP32-P4 is used as a power supply for SD card. Specify the LDO IO.
Disable when external power supply is used as a power supply for SD card.
config EXAMPLE_SD_PWR_CTRL_LDO_IO_ID
depends on SOC_SDMMC_IO_POWER_EXTERNAL && EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
int "LDO IO"
default 4 if IDF_TARGET_ESP32P4
help
There are several IOs in ESP32-P4 which are in "SD card IO" power domain.
Power has to be supplied to this power domain externally (from outside the chip) via one of the pins.
Based on the schematic, specify the LDO IO pin.
endif # EXAMPLE_STORAGE_MEDIA_SDMMC
endmenu

View File

@ -14,6 +14,7 @@
#include <errno.h>
#include <dirent.h>
#include <stdlib.h>
#include "sdkconfig.h"
#include "esp_console.h"
#include "esp_check.h"
#include "esp_partition.h"
@ -23,6 +24,9 @@
#ifdef CONFIG_EXAMPLE_STORAGE_MEDIA_SDMMC
#include "diskio_impl.h"
#include "diskio_sdmmc.h"
#if CONFIG_EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
#include "sd_pwr_ctrl_by_on_chip_ldo.h"
#endif // CONFIG_EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
#endif
/*
@ -307,6 +311,23 @@ static esp_err_t storage_init_sdmmc(sdmmc_card_t **card)
// Example: for fixed frequency of 10MHz, use host.max_freq_khz = 10000;
sdmmc_host_t host = SDMMC_HOST_DEFAULT();
// For SoCs where the SD power can be supplied both via an internal or external (e.g. on-board LDO) power supply.
// When using specific IO pins (which can be used for ultra high-speed SDMMC) to connect to the SD card
// and the internal LDO power supply, we need to initialize the power supply first.
#if CONFIG_EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
sd_pwr_ctrl_ldo_config_t ldo_config = {
.ldo_chan_id = CONFIG_EXAMPLE_SD_PWR_CTRL_LDO_IO_ID,
};
sd_pwr_ctrl_handle_t pwr_ctrl_handle = NULL;
ret = sd_pwr_ctrl_new_on_chip_ldo(&ldo_config, &pwr_ctrl_handle);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Failed to create a new on-chip LDO power control driver");
return ret;
}
host.pwr_ctrl_handle = pwr_ctrl_handle;
#endif
// This initializes the slot without card detect (CD) and write protect (WP) signals.
// Modify slot_config.gpio_cd and slot_config.gpio_wp if your board has these signals.
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
@ -369,6 +390,10 @@ clean:
free(sd_card);
sd_card = NULL;
}
#if CONFIG_EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
// We don't need to duplicate error here as all error messages are handled via sd_pwr_* call
sd_pwr_ctrl_del_on_chip_ldo(pwr_ctrl_handle);
#endif // CONFIG_EXAMPLE_SD_PWR_CTRL_LDO_INTERNAL_IO
return ret;
}
#endif // CONFIG_EXAMPLE_STORAGE_MEDIA_SPIFLASH