]> granicus.if.org Git - esp-idf/commitdiff
esp32: fix RTC watchdog configuration in esp_restart
authorIvan Grokhotkov <ivan@espressif.com>
Mon, 10 Jul 2017 08:36:56 +0000 (16:36 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Mon, 10 Jul 2017 09:21:49 +0000 (17:21 +0800)
RTC watchdog didn’t have any actions configured for any of the stages.
This change configures it to use SW_SYSTEM_RESET at stage 0 and a
full reset at stage 1. The timeout is now calculated based on
RTC_SLOW_CLK frequency.

components/esp32/system_api.c
components/soc/esp32/include/soc/rtc_cntl_reg.h

index c79761fd7d1394e74e26aafa605d614ff057801e..29a050bf9a5a083d83ac7918d0b9e777f3bff7e7 100644 (file)
@@ -264,13 +264,15 @@ void IRAM_ATTR esp_restart_noos()
     esp_dport_access_int_deinit();
 
     // We need to disable TG0/TG1 watchdogs
-    // First enable RTC watchdog to be on the safe side
+    // First enable RTC watchdog for 1 second
     REG_WRITE(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);
     REG_WRITE(RTC_CNTL_WDTCONFIG0_REG,
             RTC_CNTL_WDT_FLASHBOOT_MOD_EN_M |
+            (RTC_WDT_STG_SEL_RESET_SYSTEM << RTC_CNTL_WDT_STG0_S) |
+            (RTC_WDT_STG_SEL_RESET_RTC << RTC_CNTL_WDT_STG1_S) |
             (1 << RTC_CNTL_WDT_SYS_RESET_LENGTH_S) |
             (1 << RTC_CNTL_WDT_CPU_RESET_LENGTH_S) );
-    REG_WRITE(RTC_CNTL_WDTCONFIG1_REG, 128000);
+    REG_WRITE(RTC_CNTL_WDTCONFIG1_REG, rtc_clk_slow_freq_get_hz() * 1);
 
     // Disable TG0/TG1 watchdogs
     TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE;
index 02f8dff2c42218b447a3080b9a3edc897545a9f2..ffcbb3c0338294b4ffd074e2456238b7eaf120d9 100644 (file)
 #define RTC_WDT_STG_SEL_INT             1
 #define RTC_WDT_STG_SEL_RESET_CPU       2
 #define RTC_WDT_STG_SEL_RESET_SYSTEM    3
+#define RTC_WDT_STG_SEL_RESET_RTC       4
 
 #define RTC_CNTL_WDTCONFIG1_REG          (DR_REG_RTCCNTL_BASE + 0x90)
 /* RTC_CNTL_WDT_STG0_HOLD : R/W ;bitpos:[31:0] ;default: 32'd128000 ; */