1 /*
2 * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #include <stdbool.h>
7 #include "soc_init.h"
8 #include "soc/rtc_cntl_reg.h"
9 #include "esp_private/regi2c_ctrl.h"
10 #include "soc/regi2c_lp_bias.h"
11 #include "soc/regi2c_bias.h"
12 #include "hal/efuse_hal.h"
13 #include "soc/chip_revision.h"
14 #include "soc/system_reg.h"
15 #include "soc/assist_debug_reg.h"
16 #include "soc/reset_reasons.h"
17 #include "esp_log.h"
18
19 const static char *TAG = "soc_init";
20
soc_hw_init(void)21 void soc_hw_init(void)
22 {
23 if (!ESP_CHIP_REV_ABOVE(efuse_hal_chip_revision(), 3)) {
24 REGI2C_WRITE_MASK(I2C_ULP, I2C_ULP_IR_FORCE_XPD_IPH, 1);
25 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_DREG_1P1_PVT, 12);
26 }
27 }
28
ana_super_wdt_reset_config(bool enable)29 void ana_super_wdt_reset_config(bool enable)
30 {
31 REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST);
32
33 if (enable) {
34 REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
35 } else {
36 REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
37 }
38 }
39
ana_bod_reset_config(bool enable)40 void ana_bod_reset_config(bool enable)
41 {
42 REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOD_RST);
43
44 if (enable) {
45 REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);
46 } else {
47 REG_CLR_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);
48 }
49 }
50
ana_clock_glitch_reset_config(bool enable)51 void ana_clock_glitch_reset_config(bool enable)
52 {
53 REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_GLITCH_RST);
54
55 if (enable) {
56 REG_SET_BIT(RTC_CNTL_ANA_CONF_REG, RTC_CNTL_GLITCH_RST_EN);
57 } else {
58 REG_CLR_BIT(RTC_CNTL_ANA_CONF_REG, RTC_CNTL_GLITCH_RST_EN);
59 }
60 }
61
ana_reset_config(void)62 void ana_reset_config(void)
63 {
64 ana_super_wdt_reset_config(true);
65
66 /* For origin chip & ECO1: brownout & clock glitch reset not available
67 * For ECO2: fix brownout reset bug
68 * For ECO3: fix clock glitch reset bug
69 */
70 switch (efuse_hal_chip_revision()) {
71 case 0:
72 case 1:
73 /* Disable BOD and GLITCH reset */
74 ana_bod_reset_config(false);
75 ana_clock_glitch_reset_config(false);
76 break;
77 case 2:
78 /* Enable BOD reset. Disable GLITCH reset */
79 ana_bod_reset_config(true);
80 ana_clock_glitch_reset_config(false);
81 break;
82 case 3:
83 default:
84 /* Enable BOD, and GLITCH reset */
85 ana_bod_reset_config(true);
86 ana_clock_glitch_reset_config(true);
87 break;
88 }
89 }
90
super_wdt_auto_feed(void)91 void super_wdt_auto_feed(void)
92
93 {
94 REG_WRITE(RTC_CNTL_SWD_WPROTECT_REG, RTC_CNTL_SWD_WKEY_VALUE);
95 REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_AUTO_FEED_EN);
96 REG_WRITE(RTC_CNTL_SWD_WPROTECT_REG, 0);
97 }
98
wdt_reset_cpu0_info_enable(void)99 void wdt_reset_cpu0_info_enable(void)
100 {
101 REG_SET_BIT(SYSTEM_CPU_PERI_CLK_EN_REG, SYSTEM_CLK_EN_ASSIST_DEBUG);
102 REG_CLR_BIT(SYSTEM_CPU_PERI_RST_EN_REG, SYSTEM_RST_EN_ASSIST_DEBUG);
103 REG_WRITE(ASSIST_DEBUG_CORE_0_RCD_EN_REG,
104 ASSIST_DEBUG_CORE_0_RCD_PDEBUGEN | ASSIST_DEBUG_CORE_0_RCD_RECORDEN);
105 }
106
check_wdt_reset(void)107 void check_wdt_reset(void)
108 {
109 int wdt_rst = 0;
110 soc_reset_reason_t rst_reas;
111
112 rst_reas = esp_rom_get_reset_reason(0);
113 if (rst_reas == RESET_REASON_CORE_RTC_WDT || rst_reas == RESET_REASON_CORE_MWDT0 ||
114 rst_reas == RESET_REASON_CORE_MWDT1 || rst_reas == RESET_REASON_CPU0_MWDT0 ||
115 rst_reas == RESET_REASON_CPU0_MWDT1 || rst_reas == RESET_REASON_CPU0_RTC_WDT) {
116 ESP_EARLY_LOGW(TAG, "PRO CPU has been reset by WDT.");
117 wdt_rst = 1;
118 }
119
120 wdt_reset_cpu0_info_enable();
121 }
122