From 1e979793b4d53483d8bbf00c57c5587eba2d9dcd Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Wed, 6 Aug 2025 14:13:58 +0800 Subject: [PATCH] fix(esp_hw_support): fix ESP_SLEEP_RTC_USE_RC_FAST_MODE sub_mode lost after cpu/sys reset Closes https://github.com/espressif/esp-idf/issues/16243 --- components/esp_hw_support/port/esp32/rtc_clk.c | 8 ++++---- components/esp_hw_support/port/esp32c2/rtc_clk.c | 8 ++++---- components/esp_hw_support/port/esp32c3/rtc_clk.c | 8 ++++---- components/esp_hw_support/port/esp32s2/rtc_clk.c | 8 ++++---- components/esp_hw_support/port/esp32s3/rtc_clk.c | 8 ++++---- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/components/esp_hw_support/port/esp32/rtc_clk.c b/components/esp_hw_support/port/esp32/rtc_clk.c index f13a8a870f..18c28f390b 100644 --- a/components/esp_hw_support/port/esp32/rtc_clk.c +++ b/components/esp_hw_support/port/esp32/rtc_clk.c @@ -284,12 +284,12 @@ void rtc_clk_apll_coeff_set(uint32_t o_div, uint32_t sdm0, uint32_t sdm1, uint32 void rtc_clk_slow_src_set(soc_rtc_slow_clk_src_t clk_src) { #ifndef BOOTLOADER_BUILD - soc_rtc_slow_clk_src_t clk_src_before_switch = clk_ll_rtc_slow_get_src(); // Keep the RTC8M_CLK on in sleep if RTC clock is rc_fast_d256. - if (clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch to RC_FAST_D256 + if ((clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) && (esp_sleep_sub_mode_dump_config(NULL)[ESP_SLEEP_RTC_USE_RC_FAST_MODE] == 0)) { // Switch to RC_FAST_D256 esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, true); - } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch away from RC_FAST_D256 - esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, false); + } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { + // This is the only user of ESP_SLEEP_RTC_USE_RC_FAST_MODE submode, so force disable it. + esp_sleep_sub_mode_force_disable(ESP_SLEEP_RTC_USE_RC_FAST_MODE); } #endif diff --git a/components/esp_hw_support/port/esp32c2/rtc_clk.c b/components/esp_hw_support/port/esp32c2/rtc_clk.c index 044f3a4ed5..e0dcfb9540 100644 --- a/components/esp_hw_support/port/esp32c2/rtc_clk.c +++ b/components/esp_hw_support/port/esp32c2/rtc_clk.c @@ -74,12 +74,12 @@ bool rtc_clk_8md256_enabled(void) void rtc_clk_slow_src_set(soc_rtc_slow_clk_src_t clk_src) { #ifndef BOOTLOADER_BUILD - soc_rtc_slow_clk_src_t clk_src_before_switch = clk_ll_rtc_slow_get_src(); // Keep the RTC8M_CLK on in sleep if RTC clock is rc_fast_d256. - if (clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch to RC_FAST_D256 + if ((clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) && (esp_sleep_sub_mode_dump_config(NULL)[ESP_SLEEP_RTC_USE_RC_FAST_MODE] == 0)) { // Switch to RC_FAST_D256 esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, true); - } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch away from RC_FAST_D256 - esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, false); + } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { + // This is the only user of ESP_SLEEP_RTC_USE_RC_FAST_MODE submode, so force disable it. + esp_sleep_sub_mode_force_disable(ESP_SLEEP_RTC_USE_RC_FAST_MODE); } #endif diff --git a/components/esp_hw_support/port/esp32c3/rtc_clk.c b/components/esp_hw_support/port/esp32c3/rtc_clk.c index 4328ab28d5..d1a2217fb1 100644 --- a/components/esp_hw_support/port/esp32c3/rtc_clk.c +++ b/components/esp_hw_support/port/esp32c3/rtc_clk.c @@ -108,12 +108,12 @@ bool rtc_clk_8md256_enabled(void) void rtc_clk_slow_src_set(soc_rtc_slow_clk_src_t clk_src) { #ifndef BOOTLOADER_BUILD - soc_rtc_slow_clk_src_t clk_src_before_switch = clk_ll_rtc_slow_get_src(); // Keep the RTC8M_CLK on in sleep if RTC clock is rc_fast_d256. - if (clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch to RC_FAST_D256 + if ((clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) && (esp_sleep_sub_mode_dump_config(NULL)[ESP_SLEEP_RTC_USE_RC_FAST_MODE] == 0)) { // Switch to RC_FAST_D256 esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, true); - } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch away from RC_FAST_D256 - esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, false); + } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { + // This is the only user of ESP_SLEEP_RTC_USE_RC_FAST_MODE submode, so force disable it. + esp_sleep_sub_mode_force_disable(ESP_SLEEP_RTC_USE_RC_FAST_MODE); } #endif diff --git a/components/esp_hw_support/port/esp32s2/rtc_clk.c b/components/esp_hw_support/port/esp32s2/rtc_clk.c index 47f2e47c80..6b06d139bf 100644 --- a/components/esp_hw_support/port/esp32s2/rtc_clk.c +++ b/components/esp_hw_support/port/esp32s2/rtc_clk.c @@ -187,12 +187,12 @@ void rtc_clk_apll_coeff_set(uint32_t o_div, uint32_t sdm0, uint32_t sdm1, uint32 void rtc_clk_slow_src_set(soc_rtc_slow_clk_src_t clk_src) { #ifndef BOOTLOADER_BUILD - soc_rtc_slow_clk_src_t clk_src_before_switch = clk_ll_rtc_slow_get_src(); // Keep the RTC8M_CLK on in sleep if RTC clock is rc_fast_d256. - if (clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch to RC_FAST_D256 + if ((clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) && (esp_sleep_sub_mode_dump_config(NULL)[ESP_SLEEP_RTC_USE_RC_FAST_MODE] == 0)) { // Switch to RC_FAST_D256 esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, true); - } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch away from RC_FAST_D256 - esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, false); + } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { + // This is the only user of ESP_SLEEP_RTC_USE_RC_FAST_MODE submode, so force disable it. + esp_sleep_sub_mode_force_disable(ESP_SLEEP_RTC_USE_RC_FAST_MODE); } #endif diff --git a/components/esp_hw_support/port/esp32s3/rtc_clk.c b/components/esp_hw_support/port/esp32s3/rtc_clk.c index ba9986d3cc..0df4ef98c1 100644 --- a/components/esp_hw_support/port/esp32s3/rtc_clk.c +++ b/components/esp_hw_support/port/esp32s3/rtc_clk.c @@ -124,12 +124,12 @@ bool rtc_clk_8md256_enabled(void) void rtc_clk_slow_src_set(soc_rtc_slow_clk_src_t clk_src) { #ifndef BOOTLOADER_BUILD - soc_rtc_slow_clk_src_t clk_src_before_switch = clk_ll_rtc_slow_get_src(); // Keep the RTC8M_CLK on in sleep if RTC clock is rc_fast_d256. - if (clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch to RC_FAST_D256 + if ((clk_src == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) && (esp_sleep_sub_mode_dump_config(NULL)[ESP_SLEEP_RTC_USE_RC_FAST_MODE] == 0)) { // Switch to RC_FAST_D256 esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, true); - } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256 && clk_src_before_switch == SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { // Switch away from RC_FAST_D256 - esp_sleep_sub_mode_config(ESP_SLEEP_RTC_USE_RC_FAST_MODE, false); + } else if (clk_src != SOC_RTC_SLOW_CLK_SRC_RC_FAST_D256) { + // This is the only user of ESP_SLEEP_RTC_USE_RC_FAST_MODE submode, so force disable it. + esp_sleep_sub_mode_force_disable(ESP_SLEEP_RTC_USE_RC_FAST_MODE); } #endif