Skip to content

Commit a23a2d4

Browse files
committed
target/esp32p4: implement wdt disable function
1 parent 677ccfb commit a23a2d4

File tree

2 files changed

+59
-5
lines changed

2 files changed

+59
-5
lines changed

src/target/espressif/esp32p4.c

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@
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

6071
static 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

101112
static 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

tcl/target/esp32p4.cfg

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,29 @@ set _FLASH_SIZE 0
2222
set _RTOS "hwthread"
2323

2424
proc esp32p4_wdt_disable { } {
25-
echo "esp32p4_wdt_disable is not implemented yet"
25+
global _RISCV_DMCONTROL _RISCV_SB_CS _RISCV_SB_ADDR0 _RISCV_SB_DATA0
26+
27+
# Disable TG0 watchdog
28+
riscv dmi_write $_RISCV_DMCONTROL 0x80000001
29+
riscv dmi_write $_RISCV_SB_CS 0x40000
30+
riscv dmi_write $_RISCV_SB_ADDR0 0x500c2064
31+
riscv dmi_write $_RISCV_SB_DATA0 0x50D83AA1
32+
33+
riscv dmi_write $_RISCV_DMCONTROL 0x80000001
34+
riscv dmi_write $_RISCV_SB_CS 0x40000
35+
riscv dmi_write $_RISCV_SB_ADDR0 0x500c2048
36+
riscv dmi_write $_RISCV_SB_DATA0 0
37+
38+
# Disable TG1 watchdog
39+
riscv dmi_write $_RISCV_DMCONTROL 0x80000001
40+
riscv dmi_write $_RISCV_SB_CS 0x40000
41+
riscv dmi_write $_RISCV_SB_ADDR0 0x500c3064
42+
riscv dmi_write $_RISCV_SB_DATA0 0x50D83AA1
43+
44+
riscv dmi_write $_RISCV_DMCONTROL 0x80000001
45+
riscv dmi_write $_RISCV_SB_CS 0x40000
46+
riscv dmi_write $_RISCV_SB_ADDR0 0x500c3048
47+
riscv dmi_write $_RISCV_SB_DATA0 0
2648
}
2749

2850
proc esp32p4_soc_reset { } {

0 commit comments

Comments
 (0)