mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-01 10:40:47 +03:00
feat(esp_system): add CPU lockup debug support for esp32h4 and esp32s31
This commit is contained in:
@@ -44,43 +44,54 @@
|
||||
|
||||
ESP_LOG_ATTR_TAG(TAG, "boot.esp32h4");
|
||||
|
||||
#if SOC_RTC_WDT_SUPPORTED
|
||||
static void wdt_reset_cpu0_info_enable(void)
|
||||
#if SOC_RTC_WDT_SUPPORTED || SOC_CPU_LOCKUP_DEBUG_SUPPORTED
|
||||
void bootloader_enable_cpu_reset_info(void)
|
||||
{
|
||||
assist_debug_ll_enable_bus_clock(0, true);
|
||||
assist_debug_ll_enable_pc_recording(0, true);
|
||||
assist_debug_ll_lockup_monitor_enable(0, true);
|
||||
assist_debug_ll_lockup_reset_enable(0);
|
||||
#if !CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
||||
assist_debug_ll_enable_bus_clock(1, true);
|
||||
assist_debug_ll_enable_pc_recording(1, true);
|
||||
assist_debug_ll_lockup_monitor_enable(1, true);
|
||||
assist_debug_ll_lockup_reset_enable(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void wdt_reset_info_dump(int cpu)
|
||||
void bootloader_dump_wdt_reset_info(int cpu)
|
||||
{
|
||||
(void) cpu;
|
||||
// saved PC was already printed by the ROM bootloader.
|
||||
// nothing to do here.
|
||||
}
|
||||
|
||||
static void bootloader_check_wdt_reset(void)
|
||||
bool bootloader_check_if_wdt_reset(int cpu, soc_reset_reason_t reset_reason)
|
||||
{
|
||||
int wdt_rst = 0;
|
||||
soc_reset_reason_t rst_reason = esp_rom_get_reset_reason(0);
|
||||
if (rst_reason == RESET_REASON_CORE_RTC_WDT || rst_reason == RESET_REASON_CORE_MWDT0 || rst_reason == RESET_REASON_CORE_MWDT1 ||
|
||||
rst_reason == RESET_REASON_CPU0_MWDT0 || rst_reason == RESET_REASON_CPU0_MWDT1 || rst_reason == RESET_REASON_CPU0_RTC_WDT) {
|
||||
if (cpu == 0 && (reset_reason == RESET_REASON_CORE_RTC_WDT || reset_reason == RESET_REASON_CORE_MWDT0 ||
|
||||
reset_reason == RESET_REASON_CORE_MWDT1 || reset_reason == RESET_REASON_CPU0_MWDT0 ||
|
||||
reset_reason == RESET_REASON_CPU0_MWDT1 || reset_reason == RESET_REASON_CPU0_RTC_WDT)) {
|
||||
ESP_LOGW(TAG, "PRO CPU has been reset by WDT.");
|
||||
wdt_rst = 1;
|
||||
return true;
|
||||
}
|
||||
if (wdt_rst) {
|
||||
// if reset by WDT dump info from trace port
|
||||
wdt_reset_info_dump(0);
|
||||
if (cpu == 1 && (reset_reason == RESET_REASON_CORE_RTC_WDT || reset_reason == RESET_REASON_CORE_MWDT0 ||
|
||||
reset_reason == RESET_REASON_CORE_MWDT1 || reset_reason == RESET_REASON_CPU0_MWDT0 ||
|
||||
reset_reason == RESET_REASON_CPU0_MWDT1 || reset_reason == RESET_REASON_CPU0_RTC_WDT)) {
|
||||
ESP_LOGW(TAG, "APP CPU has been reset by WDT.");
|
||||
return true;
|
||||
}
|
||||
wdt_reset_cpu0_info_enable();
|
||||
return false;
|
||||
}
|
||||
|
||||
#if SOC_RTC_WDT_SUPPORTED
|
||||
static void bootloader_super_wdt_auto_feed(void)
|
||||
{
|
||||
REG_WRITE(LP_WDT_SWD_WPROTECT_REG, LP_WDT_SWD_WKEY_VALUE);
|
||||
REG_SET_BIT(LP_WDT_SWD_CONFIG_REG, LP_WDT_SWD_AUTO_FEED_EN);
|
||||
REG_WRITE(LP_WDT_SWD_WPROTECT_REG, 0);
|
||||
}
|
||||
#endif // SOC_RTC_WDT_SUPPORTED
|
||||
#endif
|
||||
#endif // SOC_RTC_WDT_SUPPORTED || SOC_CPU_LOCKUP_DEBUG_SUPPORTED
|
||||
|
||||
static inline void bootloader_hardware_init(void)
|
||||
{
|
||||
@@ -178,10 +189,8 @@ esp_err_t bootloader_init(void)
|
||||
#endif // !CONFIG_APP_BUILD_TYPE_RAM
|
||||
bootloader_config_dcache();
|
||||
bootloader_config_icache1();
|
||||
#if SOC_RTC_WDT_SUPPORTED
|
||||
// check whether a WDT reset happened
|
||||
bootloader_check_wdt_reset();
|
||||
#endif
|
||||
// check reset reason and dump diagnostic info
|
||||
bootloader_check_reset();
|
||||
#if SOC_RTC_WDT_SUPPORTED || SOC_WDT_SUPPORTED
|
||||
// config WDT
|
||||
bootloader_config_wdt();
|
||||
|
||||
Reference in New Issue
Block a user