Skip to content

Commit 87178c7

Browse files
committed
target/esp32: Handles cores resets independently
1 parent 3b13cbc commit 87178c7

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

src/target/esp108_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ enum FlashBootstrap {
6969
#define ESP108_COMMON_FIELDS enum xtensa_state state;\
7070
struct reg_cache *core_cache;\
7171
struct target *target;\
72-
uint8_t prevpwrstat;\
7372
int resetAsserted;\
7473
int traceActive;\
7574
/* Number of breakpoints available */\
@@ -83,6 +82,7 @@ enum FlashBootstrap {
8382
struct esp108_common {
8483
// struct jtag_tap *tap;
8584
ESP108_COMMON_FIELDS;
85+
uint8_t prevpwrstat;
8686
};
8787

8888
/* Only supported in cores with in-CPU MMU. None of Espressif chips as of now. */

src/target/esp32.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,7 +1602,7 @@ static int xtensa_poll(struct target *target)
16021602
LOG_INFO("%s: Target offline", __func__);
16031603
target->state = TARGET_UNKNOWN;
16041604
}
1605-
esp32->prevpwrstat = 0;
1605+
memset(esp32->prevpwrstat, 0, sizeof(esp32->prevpwrstat));
16061606
esp32->core_poweron_mask = 0;
16071607
return ERROR_TARGET_FAILURE;
16081608
}
@@ -1611,16 +1611,23 @@ static int xtensa_poll(struct target *target)
16111611
if (cores_came_online != 0) {
16121612
LOG_DEBUG("%s: core_poweron_mask=%x", __func__, core_poweron_mask);
16131613
}
1614-
1615-
if (!(esp32->prevpwrstat&PWRSTAT_DEBUGWASRESET) && pwrstat[ESP32_PRO_CPU_ID] & PWRSTAT_DEBUGWASRESET) {
1616-
LOG_INFO("%s: Debug controller was reset (pwrstat=0x%02X, after clear 0x%02X).", target->cmd_name, pwrstat[ESP32_PRO_CPU_ID], pwrstath[ESP32_PRO_CPU_ID]);
1617-
}
1618-
if (!(esp32->prevpwrstat&PWRSTAT_COREWASRESET) && pwrstat[ESP32_PRO_CPU_ID] & PWRSTAT_COREWASRESET) {
1619-
LOG_INFO("%s: Core was reset (pwrstat=0x%02X, after clear 0x%02X).", target->cmd_name, pwrstat[ESP32_PRO_CPU_ID], pwrstath[ESP32_PRO_CPU_ID]);
1620-
esp32->cores_num = 0; // unknown
1621-
memset(&esp32->dbg_stubs, 0, sizeof(struct esp32_dbg_stubs));
1614+
1615+
for (size_t i = 0; i < ESP32_CPU_COUNT; i++)
1616+
{
1617+
if (!(esp32->prevpwrstat[i]&PWRSTAT_DEBUGWASRESET) && pwrstat[i] & PWRSTAT_DEBUGWASRESET) {
1618+
LOG_INFO("%s: Debug controller %d was reset (pwrstat=0x%02X, after clear 0x%02X).", target->cmd_name, (int)i, pwrstat[i], pwrstath[i]);
1619+
esp32->core_poweron_mask &= ~(1 << i);
1620+
//esp32->core_poweron_mask = 0;
1621+
}
1622+
if (!(esp32->prevpwrstat[i]&PWRSTAT_COREWASRESET) && pwrstat[i] & PWRSTAT_COREWASRESET) {
1623+
LOG_INFO("%s: Core %d was reset (pwrstat=0x%02X, after clear 0x%02X).", target->cmd_name, (int)i, pwrstat[i], pwrstath[i]);
1624+
if (esp32->cores_num > 0) {
1625+
esp32->cores_num = 0; // unknown
1626+
memset(&esp32->dbg_stubs, 0, sizeof(struct esp32_dbg_stubs));
1627+
}
1628+
}
1629+
esp32->prevpwrstat[i] = pwrstath[i];
16221630
}
1623-
esp32->prevpwrstat = pwrstath[ESP32_PRO_CPU_ID];
16241631

16251632
//Enable JTAG, set reset if needed
16261633
cmd=PWRCTL_DEBUGWAKEUP|PWRCTL_MEMWAKEUP|PWRCTL_COREWAKEUP;

src/target/esp32.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ struct esp32_common {
110110
// Common fields definition for all esp108 targets
111111
ESP108_COMMON_FIELDS;
112112

113+
uint8_t prevpwrstat[ESP32_CPU_COUNT];
113114
struct target* esp32_targets[ESP32_CPU_COUNT];
114115
size_t active_cpu;
115116
struct reg_cache * core_caches[ESP32_CPU_COUNT];

0 commit comments

Comments
 (0)