2121#include "esp_riscv_apptrace.h"
2222#include "esp_riscv.h"
2323
24+ /* ESP32-P4 WDT */
25+ #define ESP32P4_WDT_WKEY_VALUE 0x50d83aa1
26+ #define ESP32P4_TIMG0_BASE 0x500C2000
27+ #define ESP32P4_TIMG1_BASE 0x500C3000
28+ #define ESP32P4_TIMGWDT_CFG_OFF 0x48
29+ #define ESP32P4_TIMGWDT_PROTECT_OFF 0x64
30+ #define ESP32P4_TIMG0WDT_CFG0 (ESP32P4_TIMG0_BASE + ESP32P4_TIMGWDT_CFG_OFF)
31+ #define ESP32P4_TIMG1WDT_CFG0 (ESP32P4_TIMG1_BASE + ESP32P4_TIMGWDT_CFG_OFF)
32+ #define ESP32P4_TIMG0WDT_PROTECT (ESP32P4_TIMG0_BASE + ESP32P4_TIMGWDT_PROTECT_OFF)
33+ #define ESP32P4_TIMG1WDT_PROTECT (ESP32P4_TIMG1_BASE + ESP32P4_TIMGWDT_PROTECT_OFF)
34+
2435/* boot mode */
2536#define ESP32P4_GPIO_BASE (0x500C0000 + 0x20000)
2637#define ESP32P4_GPIO_STRAP_REG_OFF 0x0038
@@ -41,7 +52,6 @@ enum esp32p4_reset_reason {
4152 ESP32P4_CHIP_POWER_ON_RESET = 0x01 , /* Power on reset */
4253 ESP32P4_CORE_SW_RESET = 0x03 , /* Software resets the digital core */
4354 ESP32P4_SYS_PMU_PWR_DOWN_RESET = 0x05 , /* PMU HP power down system reset */
44- ESP32P4_CPU_PMU_PWR_DOWN_RESET = 0x06 , /* PMU HP power down CPU reset */
4555 ESP32P4_SYS_HP_WDT_RESET = 0x07 , /* HP WDT resets system */
4656 ESP32P4_SYS_LP_WDT_RESET = 0x09 , /* LP WDT resets system */
4757 ESP32P4_CORE_HP_WDT_RESET = 0x0B , /* HP WDT resets digital core */
@@ -55,6 +65,7 @@ enum esp32p4_reset_reason {
5565 ESP32P4_CORE_USB_JTAG_RESET = 0x16 , /* USB JTAG resets the digital core */
5666 ESP32P4_CORE_USB_UART_RESET = 0x17 , /* UART resets the digital core */
5767 ESP32P4_CPU_JTAG_RESET = 0x18 , /* JTAG resets the digital core */
68+ ESP32P4_CPU_LOCKUP_RESET = 0x1A , /* Cpu lockup resets the chip */
5869};
5970
6071static const char * esp32p4_get_reset_reason (int reset_number )
@@ -66,8 +77,6 @@ static const char *esp32p4_get_reset_reason(int reset_number)
6677 return "Software core reset" ;
6778 case ESP32P4_SYS_PMU_PWR_DOWN_RESET :
6879 return "PMU HP power down system reset" ;
69- case ESP32P4_CPU_PMU_PWR_DOWN_RESET :
70- return "PMU HP power down CPU reset" ;
7180 case ESP32P4_SYS_HP_WDT_RESET :
7281 return "HP WDT resets system" ;
7382 case ESP32P4_SYS_LP_WDT_RESET :
@@ -94,13 +103,36 @@ static const char *esp32p4_get_reset_reason(int reset_number)
94103 return "UART resets the digital core" ;
95104 case ESP32P4_CPU_JTAG_RESET :
96105 return "JTAG CPU reset" ;
106+ case ESP32P4_CPU_LOCKUP_RESET :
107+ return "CPU Lockup reset" ;
97108 }
98109 return "Unknown reset cause" ;
99110}
100111
101112static int esp32p4_wdt_disable (struct target * target )
102113{
103- /* TODO: not implemented yet */
114+ /* TIMG0 WDT */
115+ int res = target_write_u32 (target , ESP32P4_TIMG0WDT_PROTECT , ESP32P4_WDT_WKEY_VALUE );
116+ if (res != ERROR_OK ) {
117+ LOG_ERROR ("Failed to write ESP32P4_TIMG0WDT_PROTECT (%d)!" , res );
118+ return res ;
119+ }
120+ res = target_write_u32 (target , ESP32P4_TIMG0WDT_CFG0 , 0 );
121+ if (res != ERROR_OK ) {
122+ LOG_ERROR ("Failed to write ESP32P4_TIMG0WDT_CFG0 (%d)!" , res );
123+ return res ;
124+ }
125+ /* TIMG1 WDT */
126+ res = target_write_u32 (target , ESP32P4_TIMG1WDT_PROTECT , ESP32P4_WDT_WKEY_VALUE );
127+ if (res != ERROR_OK ) {
128+ LOG_ERROR ("Failed to write ESP32P4_TIMG1WDT_PROTECT (%d)!" , res );
129+ return res ;
130+ }
131+ res = target_write_u32 (target , ESP32P4_TIMG1WDT_CFG0 , 0 );
132+ if (res != ERROR_OK ) {
133+ LOG_ERROR ("Failed to write ESP32P4_TIMG1WDT_CFG0 (%d)!" , res );
134+ return res ;
135+ }
104136 return ERROR_OK ;
105137}
106138
0 commit comments