fix(esp_hw_support): restore brownout after deep sleep rejection on ESP32-S2

ESP32-S2 disables the brownout detector before deep sleep; if sleep is
rejected, re-init it so BOD is not left disabled (PM-519).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wuzhenghui
2026-09-14 11:38:32 +08:00
co-authored by Cursor
parent e6b4309966
commit eece49afa0
+8 -2
View File
@@ -1148,11 +1148,11 @@ inline static uint32_t IRAM_ATTR call_rtc_sleep_start(uint32_t reject_triggers,
static esp_err_t IRAM_ATTR deep_sleep_start(bool allow_sleep_rejection)
{
#if CONFIG_IDF_TARGET_ESP32S2
#if CONFIG_IDF_TARGET_ESP32S2 && CONFIG_ESP_BROWNOUT_DET
/* Due to hardware limitations, on S2 the brownout detector sometimes trigger during deep sleep
to circumvent this we disable the brownout detector before sleeping */
esp_brownout_disable();
#endif //CONFIG_IDF_TARGET_ESP32S2
#endif //CONFIG_IDF_TARGET_ESP32S2 && CONFIG_ESP_BROWNOUT_DET
esp_sync_timekeeping_timers();
@@ -1248,6 +1248,12 @@ static esp_err_t IRAM_ATTR deep_sleep_start(bool allow_sleep_rejection)
esp_clk_private_unlock();
#endif
portEXIT_CRITICAL(&s_config.lock);
#if CONFIG_IDF_TARGET_ESP32S2 && CONFIG_ESP_BROWNOUT_DET
/* Brownout was disabled before attempting deep sleep; restore it after rejection. */
esp_brownout_init();
#endif //CONFIG_IDF_TARGET_ESP32S2 && CONFIG_ESP_BROWNOUT_DET
return err;
}