From 2558760224c33d260ff0a48c98bdff62ce0de125 Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Thu, 31 Oct 2024 20:13:53 +0800 Subject: [PATCH 1/2] fix(esp_hw_support): fix writeback cache to psram after vo2 powerdown --- .../esp_hw_support/port/esp32p4/pmu_sleep.c | 18 ++++++++++++++++++ .../port/esp32p4/private_include/pmu_param.h | 2 +- components/esp_hw_support/sleep_modes.c | 12 ------------ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/components/esp_hw_support/port/esp32p4/pmu_sleep.c b/components/esp_hw_support/port/esp32p4/pmu_sleep.c index 07ca2b5461..64ea630d32 100644 --- a/components/esp_hw_support/port/esp32p4/pmu_sleep.c +++ b/components/esp_hw_support/port/esp32p4/pmu_sleep.c @@ -35,6 +35,9 @@ #include "esp_rom_sys.h" #include "esp_rom_uart.h" #include "hal/efuse_hal.h" +#if CONFIG_SPIRAM +#include "hal/ldo_ll.h" +#endif #define HP(state) (PMU_MODE_HP_ ## state) #define LP(state) (PMU_MODE_LP_ ## state) @@ -365,6 +368,14 @@ TCM_IRAM_ATTR uint32_t pmu_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, rtc_clk_mpll_disable(); } + +#if CONFIG_SPIRAM && CONFIG_ESP_LDO_RESERVE_PSRAM + // Disable PSRAM chip power supply + if (dslp) { + ldo_ll_enable(LDO_ID2UNIT(CONFIG_ESP_LDO_CHAN_PSRAM_DOMAIN), false); + } +#endif + /* Start entry into sleep mode */ pmu_ll_hp_set_sleep_enable(PMU_instance()->hal->dev); @@ -373,6 +384,13 @@ TCM_IRAM_ATTR uint32_t pmu_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, ; } +#if CONFIG_SPIRAM && CONFIG_ESP_LDO_RESERVE_PSRAM + // Enable PSRAM chip power supply after deepsleep request rejected + if (dslp) { + ldo_ll_enable(LDO_ID2UNIT(CONFIG_ESP_LDO_CHAN_PSRAM_DOMAIN), true); + } +#endif + return pmu_sleep_finish(dslp); } diff --git a/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h b/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h index f43ee528a2..4ad678bd33 100644 --- a/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h +++ b/components/esp_hw_support/port/esp32p4/private_include/pmu_param.h @@ -325,7 +325,7 @@ typedef struct { #define PMU_SLEEP_DIGITAL_DSLP_CONFIG_DEFAULT(pd_flags) { \ .syscntl = { \ .dig_pad_slp_sel = 0, \ - .lp_pad_hold_all = 0, \ + .lp_pad_hold_all = (pd_flags & PMU_SLEEP_PD_LP_PERIPH) ? 1 : 0, \ } \ } diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 5bd82fdd36..b5d4866319 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -64,10 +64,6 @@ #include "hal/touch_sensor_hal.h" #endif -#if CONFIG_SPIRAM && CONFIG_ESP_LDO_RESERVE_PSRAM -#include "hal/ldo_ll.h" -#endif - #include "sdkconfig.h" #include "esp_rom_uart.h" #include "esp_rom_sys.h" @@ -1180,10 +1176,6 @@ static esp_err_t IRAM_ATTR deep_sleep_start(bool allow_sleep_rejection) portENTER_CRITICAL(&spinlock_rtc_deep_sleep); esp_ipc_isr_stall_other_cpu(); esp_ipc_isr_stall_pause(); -#if CONFIG_SPIRAM && CONFIG_ESP_LDO_RESERVE_PSRAM - // Disable PSRAM chip power supply - ldo_ll_enable(LDO_ID2UNIT(CONFIG_ESP_LDO_CHAN_PSRAM_DOMAIN), false); -#endif // record current RTC time s_config.rtc_ticks_at_sleep_start = rtc_time_get(); @@ -1247,10 +1239,6 @@ static esp_err_t IRAM_ATTR deep_sleep_start(bool allow_sleep_rejection) // can take several CPU cycles for the sleep mode to start. ESP_INFINITE_LOOP(); } -#if CONFIG_SPIRAM && CONFIG_ESP_LDO_RESERVE_PSRAM - // Enable PSRAM chip power supply - ldo_ll_enable(LDO_ID2UNIT(CONFIG_ESP_LDO_CHAN_PSRAM_DOMAIN), true); -#endif // Never returns here, except that the sleep is rejected. esp_ipc_isr_stall_resume(); esp_ipc_isr_release_other_cpu(); From 651e5adbda2f20238e1bbe6534e3cde1e1b8a55c Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Fri, 1 Nov 2024 16:08:03 +0800 Subject: [PATCH 2/2] fix(esp_hw_support): only support power down flash after revison v1.0 on esp32p4 --- components/esp_hw_support/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/esp_hw_support/Kconfig b/components/esp_hw_support/Kconfig index 06c595ccab..e29c37b242 100644 --- a/components/esp_hw_support/Kconfig +++ b/components/esp_hw_support/Kconfig @@ -71,7 +71,7 @@ menu "Hardware Settings" config ESP_SLEEP_POWER_DOWN_FLASH bool "Power down flash in light sleep when there is no SPIRAM or SPIRAM has independent power supply" depends on !SPIRAM || ESP_LDO_RESERVE_PSRAM - depends on !(IDF_TARGET_ESP32P4 && (ESP32P4_REV_MIN_FULL >= 100)) + depends on !(IDF_TARGET_ESP32P4 && (ESP32P4_REV_MIN_FULL < 100)) default n help If enabled, chip will try to power down flash as part of esp_light_sleep_start(), which costs