1
2 /*
3 * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <stdbool.h>
9 #include "soc_init.h"
10 #include "soc/rtc_cntl_reg.h"
11 #include "soc/system_reg.h"
12 #include "soc/assist_debug_reg.h"
13 #include "soc/reset_reasons.h"
14 #include "esp_rom_sys.h"
15 #include "esp_log.h"
16
17 static const char *TAG = "soc_init";
18
ana_super_wdt_reset_config(bool enable)19 void ana_super_wdt_reset_config(bool enable)
20 {
21 REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST);
22
23 if (enable) {
24 REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
25 } else {
26 REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
27 }
28 }
29
ana_bod_reset_config(bool enable)30 void ana_bod_reset_config(bool enable)
31 {
32 REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOD_RST);
33
34 if (enable) {
35 REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);
36 } else {
37 REG_CLR_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);
38 }
39 }
40
ana_reset_config(void)41 void ana_reset_config(void)
42 {
43 ana_super_wdt_reset_config(true);
44 ana_bod_reset_config(true);
45 }
46
super_wdt_auto_feed(void)47 void super_wdt_auto_feed(void)
48 {
49 REG_WRITE(RTC_CNTL_SWD_WPROTECT_REG, RTC_CNTL_SWD_WKEY_VALUE);
50 REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_AUTO_FEED_EN);
51 REG_WRITE(RTC_CNTL_SWD_WPROTECT_REG, 0);
52 }
53
wdt_reset_cpu0_info_enable(void)54 void wdt_reset_cpu0_info_enable(void)
55 {
56 REG_SET_BIT(SYSTEM_CPU_PERI_CLK_EN_REG, SYSTEM_CLK_EN_ASSIST_DEBUG);
57 REG_CLR_BIT(SYSTEM_CPU_PERI_RST_EN_REG, SYSTEM_RST_EN_ASSIST_DEBUG);
58 REG_WRITE(ASSIST_DEBUG_CORE_0_RCD_EN_REG,
59 ASSIST_DEBUG_CORE_0_RCD_PDEBUGEN | ASSIST_DEBUG_CORE_0_RCD_RECORDEN);
60 }
61
check_wdt_reset(void)62 void check_wdt_reset(void)
63 {
64 int wdt_rst = 0;
65 soc_reset_reason_t rst_reas;
66
67 rst_reas = esp_rom_get_reset_reason(0);
68 if (rst_reas == RESET_REASON_CORE_RTC_WDT || rst_reas == RESET_REASON_CORE_MWDT0 ||
69 rst_reas == RESET_REASON_CPU0_MWDT0 || rst_reas == RESET_REASON_CPU0_RTC_WDT) {
70 ESP_EARLY_LOGW(TAG, "PRO CPU has been reset by WDT.");
71 wdt_rst = 1;
72 }
73
74 wdt_reset_cpu0_info_enable();
75 }
76
77 /* Not supported but common bootloader calls the function. Do nothing */
ana_clock_glitch_reset_config(bool enable)78 void ana_clock_glitch_reset_config(bool enable)
79 {
80 (void)enable;
81 }
82