]> granicus.if.org Git - esp-idf/commitdiff
esp32: disable DPORT access protection when doing esp_restart
authorIvan Grokhotkov <ivan@espressif.com>
Wed, 14 Jun 2017 10:00:26 +0000 (18:00 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Thu, 15 Jun 2017 10:15:35 +0000 (18:15 +0800)
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.

components/esp32/dport_access.c
components/esp32/include/esp_dport_access.h
components/esp32/system_api.c

index aa4bdbea0a022f585c305f90f315992f715f7b05..dbb956e8209732aa6c0b9842a1dced71edc05005 100644 (file)
@@ -193,3 +193,13 @@ void esp_dport_access_int_init(void)
         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);
+}
index 7e6f73247312795a645335d086296cdb215a3994..8b081c5ae3fb94de19112ad2ec1176e923827f3e 100644 (file)
@@ -22,6 +22,7 @@ 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);
 
 #if defined(BOOTLOADER_BUILD) || defined(CONFIG_FREERTOS_UNICORE) || !defined(ESP_PLATFORM)
 #define DPORT_STALL_OTHER_CPU_START()
index a7193548bb0a9d81d16dd53d27d26b24171687c0..942807600c21e6dc4f47d01c9104807573b83cf6 100644 (file)
@@ -246,11 +246,13 @@ void IRAM_ATTR esp_restart(void)
 */
 void IRAM_ATTR esp_restart_noos()
 {
-
     const uint32_t core_id = xPortGetCoreID();
     const uint32_t other_core_id = core_id == 0 ? 1 : 0;
     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
     // First enable RTC watchdog to be on the safe side
     REG_WRITE(RTC_CNTL_WDTWPROTECT_REG, RTC_CNTL_WDT_WKEY_VALUE);