diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 0d01745b341..0bdba38d37d 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -852,7 +852,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 @@ -896,7 +896,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 @@ -984,7 +984,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) diff --git a/components/spi_flash/include/esp_private/spi_flash_os.h b/components/spi_flash/include/esp_private/spi_flash_os.h index fddf2e96637..4100f862998 100644 --- a/components/spi_flash/include/esp_private/spi_flash_os.h +++ b/components/spi_flash/include/esp_private/spi_flash_os.h @@ -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 diff --git a/components/spi_flash/linker.lf b/components/spi_flash/linker.lf index f78ffbbedb0..0135f8ec3a1 100644 --- a/components/spi_flash/linker.lf +++ b/components/spi_flash/linker.lf @@ -96,3 +96,7 @@ entries: if SOC_GPSPI_SUPPORTED = y && IDF_TARGET_ESP32 = n: spi_flash_hal_gpspi (noflash) + if SPI_FLASH_ROM_IMPL = n && APP_BUILD_TYPE_PURE_RAM_APP = n: + spi_flash_hal_iram: spi_flash_hal_enter_dpd_mode (noflash) + spi_flash_hal_iram: spi_flash_hal_exit_dpd_mode (noflash) + spi_flash_hal_iram: spi_flash_hal_poll_cmd_done (noflash) diff --git a/components/spi_flash/spi_flash_dpd_enable.c b/components/spi_flash/spi_flash_dpd_enable.c index f6314a7e236..d4448fe6e2b 100644 --- a/components/spi_flash/spi_flash_dpd_enable.c +++ b/components/spi_flash/spi_flash_dpd_enable.c @@ -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); +}