]> granicus.if.org Git - esp-idf/commitdiff
bootloader: don’t reload RTC_FAST DRAM after deep sleep
authorIvan Grokhotkov <ivan@espressif.com>
Sat, 29 Sep 2018 02:54:06 +0000 (10:54 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Sat, 29 Sep 2018 06:02:16 +0000 (14:02 +0800)
When CONFIG_ESP32_RTCDATA_IN_FAST_MEM is enabled, RTC data is placed
into RTC_FAST memory region, viewed from the data bus. However the
bootloader was missing a check that this region should not be
overwritten after deep sleep, which caused .rtc.bss segment to loose
its contents after wakeup.

components/bootloader_support/src/esp_image_format.c
components/soc/esp32/include/soc/soc.h

index 3cce3286548ff2cc7642d4596dc5f2946c3626a9..98d5a341b2ac8f26f150b60dbc77e454c4f7c9b7 100644 (file)
@@ -468,11 +468,15 @@ static bool should_load(uint32_t load_addr)
 
     if (!load_rtc_memory) {
         if (load_addr >= SOC_RTC_IRAM_LOW && load_addr < SOC_RTC_IRAM_HIGH) {
-            ESP_LOGD(TAG, "Skipping RTC code segment at 0x%08x\n", load_addr);
+            ESP_LOGD(TAG, "Skipping RTC fast memory segment at 0x%08x\n", load_addr);
+            return false;
+        }
+        if (load_addr >= SOC_RTC_DRAM_LOW && load_addr < SOC_RTC_DRAM_HIGH) {
+            ESP_LOGD(TAG, "Skipping RTC fast memory segment at 0x%08x\n", load_addr);
             return false;
         }
         if (load_addr >= SOC_RTC_DATA_LOW && load_addr < SOC_RTC_DATA_HIGH) {
-            ESP_LOGD(TAG, "Skipping RTC data segment at 0x%08x\n", load_addr);
+            ESP_LOGD(TAG, "Skipping RTC slow memory segment at 0x%08x\n", load_addr);
             return false;
         }
     }
index 59d171f3bcd4ef2eb2b87a5880386b9d45dc56b3..ff90df542010c2ad136c5b8199db80f670a8c11c 100644 (file)
 #define SOC_IRAM_HIGH   0x400A0000
 #define SOC_RTC_IRAM_LOW  0x400C0000
 #define SOC_RTC_IRAM_HIGH 0x400C2000
+#define SOC_RTC_DRAM_LOW  0x3FF80000
+#define SOC_RTC_DRAM_HIGH 0x3FF82000
 #define SOC_RTC_DATA_LOW  0x50000000
 #define SOC_RTC_DATA_HIGH 0x50002000