From 1e979793b4d53483d8bbf00c57c5587eba2d9dcd Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Wed, 6 Aug 2025 14:13:58 +0800 Subject: [PATCH 1/2] 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 From 9298596ea7535120824774aea05d0c243229592e Mon Sep 17 00:00:00 2001 From: wuzhenghui Date: Wed, 6 Aug 2025 16:45:04 +0800 Subject: [PATCH 2/2] fix(esp_hw_support): test ESP_SLEEP_RTC_USE_RC_FAST_MODE sleep submode after reset --- .../rtc_8md256/main/test_rtc_8md256.c | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c b/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c index 220a65a5c0..481ea57cbf 100644 --- a/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c +++ b/components/esp_hw_support/test_apps/rtc_8md256/main/test_rtc_8md256.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -63,6 +63,29 @@ TEST_CASE_MULTIPLE_STAGES("Can use 8MD256 as RTC clock source in deepsleep (ente request_core1_do_deepsleep, check_reset_reason_deep_sleep); +static void do_cpu_reset(void) +{ + esp_restart(); +} + +static void check_cpu_reset_and_do_system_reset(void) +{ + TEST_ASSERT_EQUAL(ESP_RST_SW, esp_reset_reason()); + esp_rom_software_reset_system(); +} + +static void check_system_reset_and_do_deepsleep(void) +{ + TEST_ASSERT_EQUAL(ESP_RST_SW, esp_reset_reason()); + test_deepsleep(false); +} + +TEST_CASE_MULTIPLE_STAGES("Can use 8MD256 as RTC clock source in deepsleep after reset", "[pm]", + do_cpu_reset, + check_cpu_reset_and_do_system_reset, + check_system_reset_and_do_deepsleep, + check_reset_reason_deep_sleep); + static void test_lightsleep(bool force_rtc_periph) { esp_sleep_enable_timer_wakeup(2000000);