From 65b046f17f040004fdd321e98fe77d95249cc458 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 24 Aug 2017 17:48:40 +0800 Subject: [PATCH] dport access: introduce pause/resume instead of deinit --- components/esp32/dport_access.c | 13 ++++++++++++- components/esp32/include/esp_dport_access.h | 3 ++- components/esp32/panic.c | 4 ++-- components/esp32/system_api.c | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/components/esp32/dport_access.c b/components/esp32/dport_access.c index 29ddad8b5..8cafeb456 100644 --- a/components/esp32/dport_access.c +++ b/components/esp32/dport_access.c @@ -184,7 +184,7 @@ void esp_dport_access_int_init(void) assert(res == pdTRUE); } -void esp_dport_access_int_deinit(void) +void esp_dport_access_int_pause(void) { portENTER_CRITICAL_ISR(&g_dport_mux); dport_core_state[0] = DPORT_CORE_STATE_IDLE; @@ -193,3 +193,14 @@ void esp_dport_access_int_deinit(void) #endif portEXIT_CRITICAL_ISR(&g_dport_mux); } + +void esp_dport_access_int_resume(void) +{ + portENTER_CRITICAL_ISR(&g_dport_mux); + dport_core_state[0] = DPORT_CORE_STATE_RUNNING; +#ifndef CONFIG_FREERTOS_UNICORE + dport_core_state[1] = DPORT_CORE_STATE_RUNNING; +#endif + portEXIT_CRITICAL_ISR(&g_dport_mux); +} + diff --git a/components/esp32/include/esp_dport_access.h b/components/esp32/include/esp_dport_access.h index d66b119bc..49e15f697 100644 --- a/components/esp32/include/esp_dport_access.h +++ b/components/esp32/include/esp_dport_access.h @@ -24,7 +24,8 @@ extern "C" { void esp_dport_access_stall_other_cpu_start(void); void esp_dport_access_stall_other_cpu_end(void); void esp_dport_access_int_init(void); -void esp_dport_access_int_deinit(void); +void esp_dport_access_int_pause(void); +void esp_dport_access_int_resume(void); #if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !defined(ESP_PLATFORM) #define DPORT_STALL_OTHER_CPU_START() diff --git a/components/esp32/panic.c b/components/esp32/panic.c index 6318ca39d..89b429983 100644 --- a/components/esp32/panic.c +++ b/components/esp32/panic.c @@ -211,7 +211,7 @@ void panicHandler(XtExcFrame *frame) return; } haltOtherCore(); - esp_dport_access_int_deinit(); + esp_dport_access_int_pause(); panicPutStr("Guru Meditation Error: Core "); panicPutDec(core_id); panicPutStr(" panic'ed ("); @@ -264,7 +264,7 @@ void panicHandler(XtExcFrame *frame) void xt_unhandled_exception(XtExcFrame *frame) { haltOtherCore(); - esp_dport_access_int_deinit(); + esp_dport_access_int_pause(); if (!abort_called) { panicPutStr("Guru Meditation Error of type "); int exccause = frame->exccause; diff --git a/components/esp32/system_api.c b/components/esp32/system_api.c index 145b0532a..d88b1a1d0 100644 --- a/components/esp32/system_api.c +++ b/components/esp32/system_api.c @@ -270,7 +270,7 @@ void IRAM_ATTR esp_restart_noos() esp_cpu_stall(other_core_id); // other core is now stalled, can access DPORT registers directly - esp_dport_access_int_deinit(); + esp_dport_access_int_pause(); // We need to disable TG0/TG1 watchdogs // First enable RTC watchdog for 1 second