change(esp_hw_support): support optional delay for DPD entry and exit

This commit is contained in:
hebinglin
2026-06-25 16:00:49 +08:00
parent 673d6955cc
commit fba19e1d9a
3 changed files with 30 additions and 29 deletions
+3 -3
View File
@@ -856,7 +856,7 @@ static esp_err_t FORCE_IRAM_ATTR esp_sleep_start_safe(uint32_t sleep_flags, uint
if ((sleep_flags & RTC_SLEEP_FLASH_DPD) && (!ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 300))) {
/* Switch Flash from standby mode to deep powerdown mode */
/* During bootloader phase following wakeup from deepsleep, flash will exit dpd mode */
spi_flash_enable_deep_power_down_mode(true);
spi_flash_enable_deep_power_down_mode(true, false);
}
#endif
@@ -900,7 +900,7 @@ static esp_err_t FORCE_IRAM_ATTR esp_sleep_start_safe(uint32_t sleep_flags, uint
#if CONFIG_ESP_SLEEP_SET_FLASH_DPD
if (sleep_flags & RTC_SLEEP_FLASH_DPD) {
/* Switch Flash from standby mode to deep powerdown mode */
spi_flash_enable_deep_power_down_mode(true);
spi_flash_enable_deep_power_down_mode(true, false);
}
#endif
#if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
@@ -988,7 +988,7 @@ static esp_err_t FORCE_IRAM_ATTR esp_sleep_start_safe(uint32_t sleep_flags, uint
#if CONFIG_ESP_SLEEP_SET_FLASH_DPD
if (sleep_flags & RTC_SLEEP_FLASH_DPD) {
//Release Flash out from deep powerdown mode
spi_flash_enable_deep_power_down_mode(false);
spi_flash_enable_deep_power_down_mode(false, true);
}
#endif
#if CONFIG_PM_SLP_SPIRAM_HALFSLEEP_ENABLED && (CONFIG_SPIRAM_XIP_FROM_PSRAM || !CONFIG_PM_SLP_IRAM_OPT)
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -178,13 +178,15 @@ uint32_t spi_flash_dpd_get_exit_duration(void);
/**
* @brief Enable or disable SPI flash deep power-down mode.
*
* @param bool status. True: flash enable deep power-down mode. False: flash disable deep power-down mode.
* @param enable True to enter deep power-down mode, false to exit.
* @param wait_delay If true, wait tDP (enter) or tRES1 (exit) after the command.
* If false, skip the delay; the caller must ensure timing is met elsewhere
*
* @note If using self-provided flash (not the chip’s factory-default flash), consult its datasheet to use this API safely.
*
* @return ESP_OK if success.
*/
esp_err_t spi_flash_enable_deep_power_down_mode(bool enable);
esp_err_t spi_flash_enable_deep_power_down_mode(bool enable, bool wait_delay);
#endif
#if SOC_SPI_MEM_SUPPORT_WRAP
+22 -23
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -62,31 +62,30 @@ uint32_t spi_flash_dpd_get_exit_duration(void)
return SPI_FLASH_TRES1_SAFE_VAL_US;
}
static esp_err_t spi_flash_enter_dpd(void)
static esp_err_t spi_flash_enter_dpd(bool wait_delay)
{
esp_err_t ret = spi_flash_hal_enter_dpd_mode(esp_flash_default_chip->host);
esp_rom_delay_us(spi_flash_dpd_get_enter_duration());
return ret;
}
static esp_err_t spi_flash_exit_dpd(void)
{
esp_err_t ret = spi_flash_hal_exit_dpd_mode(esp_flash_default_chip->host);
esp_rom_delay_us(spi_flash_dpd_get_exit_duration());
return ret;
}
esp_err_t spi_flash_enable_deep_power_down_mode(bool enable)
{
esp_err_t ret = ESP_OK;
if (enable) {
ret = spi_flash_enter_dpd();
} else {
ret = spi_flash_exit_dpd();
if (wait_delay) {
esp_rom_delay_us(spi_flash_dpd_get_enter_duration());
}
return ret;
}
static esp_err_t spi_flash_exit_dpd(bool wait_delay)
{
esp_err_t ret = spi_flash_hal_exit_dpd_mode(esp_flash_default_chip->host);
if (wait_delay) {
esp_rom_delay_us(spi_flash_dpd_get_exit_duration());
}
return ret;
}
esp_err_t spi_flash_enable_deep_power_down_mode(bool enable, bool wait_delay)
{
if (enable) {
return spi_flash_enter_dpd(wait_delay);
}
return spi_flash_exit_dpd(wait_delay);
}