diff --git a/components/esp_hw_support/port/esp32/rtc_clk.c b/components/esp_hw_support/port/esp32/rtc_clk.c index 63ac7ce3a1..b552519016 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 2f1948dc11..14787fdf33 100644 --- a/components/esp_hw_support/port/esp32c2/rtc_clk.c +++ b/components/esp_hw_support/port/esp32c2/rtc_clk.c @@ -73,12 +73,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 d7fd3600c1..aaa391d0ac 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 e79ee6272b..e65c1cf588 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 bfe7b665b6..2840d87db5 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 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 f5eaa90da1..893d00ade9 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 @@ -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);