Просмотр исходного кода

light sleep: fix SPIRAM leakage when its CS pin has no hardware pullup

Li Shuai 4 лет назад
Родитель
Сommit
acdf49a5ac
2 измененных файлов с 15 добавлено и 0 удалено
  1. 9 0
      components/esp_system/Kconfig
  2. 6 0
      components/esp_system/sleep_modes.c

+ 9 - 0
components/esp_system/Kconfig

@@ -100,6 +100,15 @@ menu "ESP System Settings"
             If enabled, the CPU will be powered down in light sleep. Enabling this option will consume
             1.68 KB of internal RAM and will reduce sleep current consumption by about 100 uA.
 
+    config ESP_SYSTEM_PSRAM_LEAKAGE_WORKAROUND
+        bool "PSRAM leakage current workaround in light sleep"
+        depends on SPIRAM
+        help
+            When the CS pin of SPIRAM is not pulled up, the sleep current will
+            increase during light sleep. If the CS pin of SPIRAM has an external
+            pull-up, you do not need to select this option, otherwise, you
+            should enable this option.
+
     menu "Memory protection"
 
         config ESP_SYSTEM_MEMPROT_FEATURE

+ 6 - 0
components/esp_system/sleep_modes.c

@@ -53,6 +53,7 @@
 #include "esp32/clk.h"
 #include "esp32/rom/rtc.h"
 #include "esp_private/gpio.h"
+#include "esp32/spiram.h"
 #elif CONFIG_IDF_TARGET_ESP32S2
 #include "esp32s2/clk.h"
 #include "esp32s2/rom/cache.h"
@@ -60,11 +61,13 @@
 #include "esp32s2/brownout.h"
 #include "soc/extmem_reg.h"
 #include "esp_private/gpio.h"
+#include "esp32s2/spiram.h"
 #elif CONFIG_IDF_TARGET_ESP32S3
 #include "esp32s3/clk.h"
 #include "esp32s3/rom/cache.h"
 #include "esp32s3/rom/rtc.h"
 #include "soc/extmem_reg.h"
+#include "esp32s3/spiram.h"
 #elif CONFIG_IDF_TARGET_ESP32C3
 #include "esp32c3/clk.h"
 #include "esp32c3/rom/cache.h"
@@ -418,6 +421,9 @@ void esp_sleep_config_gpio_isolate(void)
             gpio_sleep_set_pull_mode(gpio_num, GPIO_FLOATING);
         }
     }
+#if CONFIG_ESP_SYSTEM_PSRAM_LEAKAGE_WORKAROUND && CONFIG_SPIRAM
+    gpio_sleep_set_pull_mode(esp_spiram_get_cs_io(), GPIO_PULLUP_ONLY);
+#endif
 }
 
 void esp_sleep_enable_gpio_switch(bool enable)