From f91cb280eb4fd89d940a0218270489dbe590ed90 Mon Sep 17 00:00:00 2001 From: jingli Date: Sun, 9 Oct 2022 17:15:21 +0800 Subject: [PATCH] esp_hw_support/sleep: fix light sleep wakeup flag light sleep wakeup flag is true to indicate the most recent successful wakeup from light sleep, which means the most recent light sleep occurred successfully and then wakes up by wakeup source --- components/esp_hw_support/sleep_modes.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index e329f93a047a..c827dc21c79b 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -796,15 +796,20 @@ esp_err_t esp_light_sleep_start(void) int64_t final_sleep_duration_us = (int64_t)s_config.sleep_duration - (int64_t)s_config.sleep_time_adjustment; int64_t min_sleep_duration_us = rtc_time_slowclk_to_us(RTC_CNTL_MIN_SLP_VAL_MIN, s_config.rtc_clk_cal_period); + // reset light sleep wakeup flag before a new light sleep + s_light_sleep_wakeup = false; + // if rtc timer wakeup source is enabled, need to compare final sleep duration and min sleep duration to avoid late wakeup if ((s_config.wakeup_triggers & RTC_TIMER_TRIG_EN) && (final_sleep_duration_us <= min_sleep_duration_us)) { err = ESP_ERR_SLEEP_TOO_SHORT_SLEEP_DURATION; } else { // Enter sleep, then wait for flash to be ready on wakeup err = esp_light_sleep_inner(pd_flags, flash_enable_time_us, vddsdio_config); - s_light_sleep_wakeup = true; } + // light sleep wakeup flag only makes sense after a successful light sleep + s_light_sleep_wakeup = (err == ESP_OK); + // System timer has been stopped for the duration of the sleep, correct for that. uint64_t rtc_ticks_at_end = rtc_time_get(); uint64_t rtc_time_diff = rtc_time_slowclk_to_us(rtc_ticks_at_end - s_config.rtc_ticks_at_sleep_start, s_config.rtc_clk_cal_period);