diff --git a/components/esp32/sleep_modes.c b/components/esp32/sleep_modes.c index f280396b05..b3fefd3b84 100644 --- a/components/esp32/sleep_modes.c +++ b/components/esp32/sleep_modes.c @@ -202,6 +202,14 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) SET_PERI_REG_MASK(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN); } + uint32_t reject_triggers = 0; + if ((pd_flags & RTC_SLEEP_PD_DIG) == 0 && (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN)) { + /* Light sleep, enable sleep reject for faster return from this function, + * in case the wakeup is already triggerred. + */ + reject_triggers = RTC_CNTL_LIGHT_SLP_REJECT_EN_M | RTC_CNTL_GPIO_REJECT_EN_M; + } + // Enter sleep rtc_sleep_config_t config = RTC_SLEEP_CONFIG_DEFAULT(pd_flags); rtc_sleep_init(config); @@ -211,7 +219,7 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) s_config.sleep_duration > 0) { timer_wakeup_prepare(); } - uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, 0); + uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, reject_triggers); // Restore CPU frequency rtc_clk_cpu_freq_set_config(&cpu_freq_config); diff --git a/components/esp32s2beta/sleep_modes.c b/components/esp32s2beta/sleep_modes.c index 8bae117841..3c25a2c5d6 100644 --- a/components/esp32s2beta/sleep_modes.c +++ b/components/esp32s2beta/sleep_modes.c @@ -187,6 +187,14 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) // no-op for esp32s2beta } + uint32_t reject_triggers = 0; + if ((pd_flags & RTC_SLEEP_PD_DIG) == 0) { + /* Light sleep, enable sleep reject for faster return from this function, + * in case the wakeup is already triggerred. + */ + reject_triggers = s_config.wakeup_triggers; + } + // Enter sleep rtc_sleep_config_t config = RTC_SLEEP_CONFIG_DEFAULT(pd_flags); rtc_sleep_init(config); @@ -196,7 +204,8 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags) s_config.sleep_duration > 0) { timer_wakeup_prepare(); } - uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, 0, 0); + + uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, reject_triggers, 0); // Restore CPU frequency rtc_clk_cpu_freq_set(cpu_freq); diff --git a/components/soc/esp32s2beta/rtc_sleep.c b/components/soc/esp32s2beta/rtc_sleep.c index 56865ce74c..c26dea3627 100644 --- a/components/soc/esp32s2beta/rtc_sleep.c +++ b/components/soc/esp32s2beta/rtc_sleep.c @@ -170,6 +170,9 @@ uint32_t rtc_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, uint32_t lslp { REG_SET_FIELD(RTC_CNTL_WAKEUP_STATE_REG, RTC_CNTL_WAKEUP_ENA, wakeup_opt); REG_SET_FIELD(RTC_CNTL_SLP_REJECT_CONF_REG, RTC_CNTL_SLEEP_REJECT_ENA, reject_opt); + if (reject_opt != 0) { + REG_SET_BIT(RTC_CNTL_SLP_REJECT_CONF_REG, RTC_CNTL_LIGHT_SLP_REJECT_EN); + } /* Start entry into sleep mode */ SET_PERI_REG_MASK(RTC_CNTL_STATE0_REG, RTC_CNTL_SLEEP_EN);