|
|
@@ -470,32 +470,6 @@ static inline void disableAllWdts(void)
|
|
|
TIMERG1.wdt_wprotect = 0;
|
|
|
}
|
|
|
|
|
|
-static void esp_panic_wdt_start(void)
|
|
|
-{
|
|
|
- if (REG_GET_BIT(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_EN)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTFEED_REG, 1);
|
|
|
- REG_SET_FIELD(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_SYS_RESET_LENGTH, 7);
|
|
|
- REG_SET_FIELD(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_CPU_RESET_LENGTH, 7);
|
|
|
- REG_SET_FIELD(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_STG0, RTC_WDT_STG_SEL_RESET_SYSTEM);
|
|
|
- // 64KB of core dump data (stacks of about 30 tasks) will produce ~85KB base64 data.
|
|
|
- // @ 115200 UART speed it will take more than 6 sec to print them out.
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTCONFIG1_REG, rtc_clk_slow_freq_get_hz() * 7);
|
|
|
- REG_SET_BIT(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_EN);
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTWPROTECT_REG, 0);
|
|
|
-}
|
|
|
-
|
|
|
-void esp_panic_wdt_stop(void)
|
|
|
-{
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTFEED_REG, 1);
|
|
|
- REG_SET_FIELD(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_STG0, RTC_WDT_STG_SEL_OFF);
|
|
|
- REG_CLR_BIT(RTC_CNTL_WDTCONFIG0_REG, RTC_CNTL_WDT_EN);
|
|
|
- WRITE_PERI_REG(RTC_CNTL_WDTWPROTECT_REG, 0);
|
|
|
-}
|
|
|
-
|
|
|
#if CONFIG_ESP32S2_PANIC_PRINT_REBOOT || CONFIG_ESP32S2_PANIC_SILENT_REBOOT
|
|
|
|
|
|
static void esp_panic_dig_reset(void) __attribute__((noreturn));
|
|
|
@@ -628,7 +602,18 @@ static __attribute__((noreturn)) void commonErrorHandler(XtExcFrame *frame)
|
|
|
|
|
|
int core_id = xPortGetCoreID();
|
|
|
// start panic WDT to restart system if we hang in this handler
|
|
|
- esp_panic_wdt_start();
|
|
|
+ if (!rtc_wdt_is_on()) {
|
|
|
+ rtc_wdt_protect_off();
|
|
|
+ rtc_wdt_disable();
|
|
|
+ rtc_wdt_set_length_of_reset_signal(RTC_WDT_SYS_RESET_SIG, RTC_WDT_LENGTH_3_2us);
|
|
|
+ rtc_wdt_set_length_of_reset_signal(RTC_WDT_CPU_RESET_SIG, RTC_WDT_LENGTH_3_2us);
|
|
|
+ rtc_wdt_set_stage(RTC_WDT_STAGE0, RTC_WDT_STAGE_ACTION_RESET_SYSTEM);
|
|
|
+ // 64KB of core dump data (stacks of about 30 tasks) will produce ~85KB base64 data.
|
|
|
+ // @ 115200 UART speed it will take more than 6 sec to print them out.
|
|
|
+ rtc_wdt_set_time(RTC_WDT_STAGE0, 7000);
|
|
|
+ rtc_wdt_enable();
|
|
|
+ rtc_wdt_protect_on();
|
|
|
+ }
|
|
|
|
|
|
//Feed the watchdogs, so they will give us time to print out debug info
|
|
|
reconfigureAllWdts();
|
|
|
@@ -653,7 +638,7 @@ static __attribute__((noreturn)) void commonErrorHandler(XtExcFrame *frame)
|
|
|
|
|
|
#if CONFIG_ESP32S2_PANIC_GDBSTUB
|
|
|
disableAllWdts();
|
|
|
- esp_panic_wdt_stop();
|
|
|
+ rtc_wdt_disable();
|
|
|
panicPutStr("Entering gdb stub now.\r\n");
|
|
|
esp_gdbstub_panic_handler(frame);
|
|
|
#else
|
|
|
@@ -674,7 +659,7 @@ static __attribute__((noreturn)) void commonErrorHandler(XtExcFrame *frame)
|
|
|
reconfigureAllWdts();
|
|
|
}
|
|
|
#endif /* CONFIG_ESP32_ENABLE_COREDUMP */
|
|
|
- esp_panic_wdt_stop();
|
|
|
+ rtc_wdt_disable();
|
|
|
#if CONFIG_ESP32S2_PANIC_PRINT_REBOOT || CONFIG_ESP32S2_PANIC_SILENT_REBOOT
|
|
|
panicPutStr("Rebooting...\r\n");
|
|
|
if (frame->exccause != PANIC_RSN_CACHEERR) {
|