esp32: disable DPORT access protection when doing esp_restart
DPORT access protection can not work when the other CPU is stalled. Writes to DPORT registers in esp_restart caused the program to hang due to access protection, and the reset happened due to RTC_WDT, not SW_RST. This change adds esp_dport_access_int_deinit function and calls it from esp_restart once the other core is stalled.
This commit is contained in:
parent
75658ee29b
commit
a72b1abc51
3 changed files with 14 additions and 1 deletions
|
@ -193,3 +193,13 @@ void esp_dport_access_int_init(void)
|
||||||
xTaskCreatePinnedToCore(&dport_access_init_core1, "dport1", 512, NULL, 5, NULL, 1);
|
xTaskCreatePinnedToCore(&dport_access_init_core1, "dport1", 512, NULL, 5, NULL, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void esp_dport_access_int_deinit(void)
|
||||||
|
{
|
||||||
|
portENTER_CRITICAL_ISR(&g_dport_mux);
|
||||||
|
dport_core_state[0] = DPORT_CORE_STATE_IDLE;
|
||||||
|
#ifndef CONFIG_FREERTOS_UNICORE
|
||||||
|
dport_core_state[1] = DPORT_CORE_STATE_IDLE;
|
||||||
|
#endif
|
||||||
|
portEXIT_CRITICAL_ISR(&g_dport_mux);
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ extern "C" {
|
||||||
void esp_dport_access_stall_other_cpu_start(void);
|
void esp_dport_access_stall_other_cpu_start(void);
|
||||||
void esp_dport_access_stall_other_cpu_end(void);
|
void esp_dport_access_stall_other_cpu_end(void);
|
||||||
void esp_dport_access_int_init(void);
|
void esp_dport_access_int_init(void);
|
||||||
|
void esp_dport_access_int_deinit(void);
|
||||||
|
|
||||||
#if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !defined(ESP_PLATFORM)
|
#if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !defined(ESP_PLATFORM)
|
||||||
#define DPORT_STALL_OTHER_CPU_START()
|
#define DPORT_STALL_OTHER_CPU_START()
|
||||||
|
|
|
@ -246,11 +246,13 @@ void IRAM_ATTR esp_restart(void)
|
||||||
*/
|
*/
|
||||||
void IRAM_ATTR esp_restart_noos()
|
void IRAM_ATTR esp_restart_noos()
|
||||||
{
|
{
|
||||||
|
|
||||||
const uint32_t core_id = xPortGetCoreID();
|
const uint32_t core_id = xPortGetCoreID();
|
||||||
const uint32_t other_core_id = core_id == 0 ? 1 : 0;
|
const uint32_t other_core_id = core_id == 0 ? 1 : 0;
|
||||||
esp_cpu_stall(other_core_id);
|
esp_cpu_stall(other_core_id);
|
||||||
|
|
||||||
|
// other core is now stalled, can access DPORT registers directly
|
||||||
|
esp_dport_access_int_deinit();
|
||||||
|
|
||||||
// We need to disable TG0/TG1 watchdogs
|
// We need to disable TG0/TG1 watchdogs
|
||||||
// First enable RTC watchdog to be on the safe side
|
// First enable RTC watchdog to be on the safe side
|
||||||
REG_WRITE(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);
|
REG_WRITE(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);
|
||||||
|
|
Loading…
Reference in a new issue