Merge branch 'bugfix/bod_glitch_reset_c6_v5.0' into 'release/v5.0'

bootloader: fix BOD and glitch reset on C6 and H2 (v5.0)

See merge request espressif/esp-idf!23407
This commit is contained in:
Jiang Jiang Jian
2023-06-13 10:25:47 +08:00
11 changed files with 54 additions and 41 deletions

View File

@@ -3,18 +3,10 @@
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <stdbool.h> #include <stdbool.h>
void bootloader_ana_super_wdt_reset_config(bool enable) //Not supported but common bootloader calls the function. Do nothing
{
(void)enable;
}
void bootloader_ana_bod_reset_config(bool enable)
{
(void)enable;
}
void bootloader_ana_clock_glitch_reset_config(bool enable) void bootloader_ana_clock_glitch_reset_config(bool enable)
{ {
(void)enable; (void)enable;

View File

@@ -34,6 +34,7 @@
#include "bootloader_mem.h" #include "bootloader_mem.h"
#include "bootloader_console.h" #include "bootloader_console.h"
#include "bootloader_flash_priv.h" #include "bootloader_flash_priv.h"
#include "bootloader_soc.h"
#include "esp_efuse.h" #include "esp_efuse.h"
#include "hal/mmu_hal.h" #include "hal/mmu_hal.h"
#include "hal/cache_hal.h" #include "hal/cache_hal.h"
@@ -240,10 +241,19 @@ static void bootloader_super_wdt_auto_feed(void)
REG_WRITE(RTC_CNTL_SWD_WPROTECT_REG, 0); REG_WRITE(RTC_CNTL_SWD_WPROTECT_REG, 0);
} }
static inline void bootloader_ana_reset_config(void)
{
//Enable super WDT reset.
bootloader_ana_super_wdt_reset_config(true);
//Enable BOD reset
bootloader_ana_bod_reset_config(true);
}
esp_err_t bootloader_init(void) esp_err_t bootloader_init(void)
{ {
esp_err_t ret = ESP_OK; esp_err_t ret = ESP_OK;
bootloader_ana_reset_config();
bootloader_super_wdt_auto_feed(); bootloader_super_wdt_auto_feed();
// protect memory region // protect memory region
bootloader_init_mem(); bootloader_init_mem();

View File

@@ -3,19 +3,34 @@
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <stdbool.h> #include <stdbool.h>
#include "soc/rtc_cntl_reg.h"
void bootloader_ana_super_wdt_reset_config(bool enable) void bootloader_ana_super_wdt_reset_config(bool enable)
{ {
(void)enable; // ESP32-C2 has none of these features. REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST);
if (enable) {
REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} else {
REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
}
} }
void bootloader_ana_bod_reset_config(bool enable) void bootloader_ana_bod_reset_config(bool enable)
{ {
(void)enable; // ESP32-C2 has none of these features. REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOD_RST);
if (enable) {
REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);
} else {
REG_CLR_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);
}
} }
//Not supported but common bootloader calls the function. Do nothing
void bootloader_ana_clock_glitch_reset_config(bool enable) void bootloader_ana_clock_glitch_reset_config(bool enable)
{ {
(void)enable; // ESP32-C2 has none of these features. (void)enable;
} }

View File

@@ -261,29 +261,29 @@ static inline void bootloader_hardware_init(void)
static inline void bootloader_ana_reset_config(void) static inline void bootloader_ana_reset_config(void)
{ {
//Enable super WDT reset.
bootloader_ana_super_wdt_reset_config(true);
/* /*
For origin chip & ECO1: only support swt reset; For origin chip & ECO1: brownout & clock glitch reset not available
For ECO2: fix brownout reset bug, support swt & brownout reset; For ECO2: fix brownout reset bug
For ECO3: fix clock glitch reset bug, support all reset, include: swt & brownout & clock glitch reset. For ECO3: fix clock glitch reset bug
*/ */
switch (efuse_hal_chip_revision()) { switch (efuse_hal_chip_revision()) {
case 0: case 0:
case 1: case 1:
//Enable WDT reset. Disable BOR and GLITCH reset //Disable BOD and GLITCH reset
bootloader_ana_super_wdt_reset_config(true);
bootloader_ana_bod_reset_config(false); bootloader_ana_bod_reset_config(false);
bootloader_ana_clock_glitch_reset_config(false); bootloader_ana_clock_glitch_reset_config(false);
break; break;
case 2: case 2:
//Enable WDT and BOR reset. Disable GLITCH reset //Enable BOD reset. Disable GLITCH reset
bootloader_ana_super_wdt_reset_config(true);
bootloader_ana_bod_reset_config(true); bootloader_ana_bod_reset_config(true);
bootloader_ana_clock_glitch_reset_config(false); bootloader_ana_clock_glitch_reset_config(false);
break; break;
case 3: case 3:
default: default:
//Enable WDT, BOR, and GLITCH reset //Enable BOD, and GLITCH reset
bootloader_ana_super_wdt_reset_config(true);
bootloader_ana_bod_reset_config(true); bootloader_ana_bod_reset_config(true);
bootloader_ana_clock_glitch_reset_config(true); bootloader_ana_clock_glitch_reset_config(true);
break; break;

View File

@@ -12,15 +12,15 @@ void bootloader_ana_super_wdt_reset_config(bool enable)
REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST); REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST);
if (enable) { if (enable) {
REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} else {
REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST); REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} else {
REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} }
} }
void bootloader_ana_bod_reset_config(bool enable) void bootloader_ana_bod_reset_config(bool enable)
{ {
REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOR_RST); REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOD_RST);
if (enable) { if (enable) {
REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN); REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);

View File

@@ -3,18 +3,10 @@
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <stdbool.h> #include <stdbool.h>
void bootloader_ana_super_wdt_reset_config(bool enable) //Not supported but common bootloader calls the function. Do nothing
{
(void)enable;
}
void bootloader_ana_bod_reset_config(bool enable)
{
(void)enable;
}
void bootloader_ana_clock_glitch_reset_config(bool enable) void bootloader_ana_clock_glitch_reset_config(bool enable)
{ {
(void)enable; (void)enable;

View File

@@ -314,7 +314,7 @@ static void bootloader_super_wdt_auto_feed(void)
static inline void bootloader_ana_reset_config(void) static inline void bootloader_ana_reset_config(void)
{ {
//Enable WDT, BOR, and GLITCH reset //Enable WDT, BOD, and GLITCH reset
bootloader_ana_super_wdt_reset_config(true); bootloader_ana_super_wdt_reset_config(true);
bootloader_ana_bod_reset_config(true); bootloader_ana_bod_reset_config(true);
bootloader_ana_clock_glitch_reset_config(true); bootloader_ana_clock_glitch_reset_config(true);

View File

@@ -12,15 +12,15 @@ void bootloader_ana_super_wdt_reset_config(bool enable)
REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST); REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_SUPER_WDT_RST);
if (enable) { if (enable) {
REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} else {
REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST); REG_CLR_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} else {
REG_SET_BIT(RTC_CNTL_SWD_CONF_REG, RTC_CNTL_SWD_BYPASS_RST);
} }
} }
void bootloader_ana_bod_reset_config(bool enable) void bootloader_ana_bod_reset_config(bool enable)
{ {
REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOR_RST); REG_CLR_BIT(RTC_CNTL_FIB_SEL_REG, RTC_CNTL_FIB_BOD_RST);
if (enable) { if (enable) {
REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN); REG_SET_BIT(RTC_CNTL_BROWN_OUT_REG, RTC_CNTL_BROWN_OUT_ANA_RST_EN);

View File

@@ -1678,6 +1678,10 @@ RO CPU.*/
#define RTC_CNTL_FIB_SEL_V 0x7 #define RTC_CNTL_FIB_SEL_V 0x7
#define RTC_CNTL_FIB_SEL_S 0 #define RTC_CNTL_FIB_SEL_S 0
#define RTC_CNTL_FIB_GLITCH_RST BIT(0)
#define RTC_CNTL_FIB_BOD_RST BIT(1)
#define RTC_CNTL_FIB_SUPER_WDT_RST BIT(2)
#define RTC_CNTL_GPIO_WAKEUP_REG (DR_REG_RTCCNTL_BASE + 0xFC) #define RTC_CNTL_GPIO_WAKEUP_REG (DR_REG_RTCCNTL_BASE + 0xFC)
/* RTC_CNTL_GPIO_PIN0_WAKEUP_ENABLE : ;bitpos:[31] ;default: 1'b0 ; */ /* RTC_CNTL_GPIO_PIN0_WAKEUP_ENABLE : ;bitpos:[31] ;default: 1'b0 ; */
/*description: Need add desc.*/ /*description: Need add desc.*/

View File

@@ -2353,7 +2353,7 @@ extern "C" {
#define RTC_CNTL_FIB_SEL_S 0 #define RTC_CNTL_FIB_SEL_S 0
#define RTC_CNTL_FIB_GLITCH_RST BIT(0) #define RTC_CNTL_FIB_GLITCH_RST BIT(0)
#define RTC_CNTL_FIB_BOR_RST BIT(1) #define RTC_CNTL_FIB_BOD_RST BIT(1)
#define RTC_CNTL_FIB_SUPER_WDT_RST BIT(2) #define RTC_CNTL_FIB_SUPER_WDT_RST BIT(2)
#define RTC_CNTL_GPIO_WAKEUP_REG (DR_REG_RTCCNTL_BASE + 0x0110) #define RTC_CNTL_GPIO_WAKEUP_REG (DR_REG_RTCCNTL_BASE + 0x0110)

View File

@@ -3571,7 +3571,7 @@ ork.*/
#define RTC_CNTL_FIB_SEL_S 0 #define RTC_CNTL_FIB_SEL_S 0
#define RTC_CNTL_FIB_GLITCH_RST BIT(0) #define RTC_CNTL_FIB_GLITCH_RST BIT(0)
#define RTC_CNTL_FIB_BOR_RST BIT(1) #define RTC_CNTL_FIB_BOD_RST BIT(1)
#define RTC_CNTL_FIB_SUPER_WDT_RST BIT(2) #define RTC_CNTL_FIB_SUPER_WDT_RST BIT(2)
#define RTC_CNTL_TOUCH_DAC_REG (DR_REG_RTCCNTL_BASE + 0x14C) #define RTC_CNTL_TOUCH_DAC_REG (DR_REG_RTCCNTL_BASE + 0x14C)