Explorar el Código

sleep: enable sleep reject when entering light sleep

Ivan Grokhotkov hace 5 años
padre
commit
0dea1b38cb

+ 9 - 1
components/esp32/sleep_modes.c

@@ -202,6 +202,14 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags)
         SET_PERI_REG_MASK(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_WAKEUP_FORCE_EN);
     }
 
+    uint32_t reject_triggers = 0;
+    if ((pd_flags & RTC_SLEEP_PD_DIG) == 0 && (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN)) {
+        /* Light sleep, enable sleep reject for faster return from this function,
+         * in case the wakeup is already triggerred.
+         */
+        reject_triggers = RTC_CNTL_LIGHT_SLP_REJECT_EN_M | RTC_CNTL_GPIO_REJECT_EN_M;
+    }
+
     // Enter sleep
     rtc_sleep_config_t config = RTC_SLEEP_CONFIG_DEFAULT(pd_flags);
     rtc_sleep_init(config);
@@ -211,7 +219,7 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags)
         s_config.sleep_duration > 0) {
         timer_wakeup_prepare();
     }
-    uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, 0);
+    uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, reject_triggers);
 
     // Restore CPU frequency
     rtc_clk_cpu_freq_set_config(&cpu_freq_config);

+ 10 - 1
components/esp32s2beta/sleep_modes.c

@@ -187,6 +187,14 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags)
         // no-op for esp32s2beta
     }
 
+    uint32_t reject_triggers = 0;
+    if ((pd_flags & RTC_SLEEP_PD_DIG) == 0) {
+        /* Light sleep, enable sleep reject for faster return from this function,
+         * in case the wakeup is already triggerred.
+         */
+        reject_triggers = s_config.wakeup_triggers;
+    }
+
     // Enter sleep
     rtc_sleep_config_t config = RTC_SLEEP_CONFIG_DEFAULT(pd_flags);
     rtc_sleep_init(config);
@@ -196,7 +204,8 @@ static uint32_t IRAM_ATTR esp_sleep_start(uint32_t pd_flags)
         s_config.sleep_duration > 0) {
         timer_wakeup_prepare();
     }
-    uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, 0, 0);
+
+    uint32_t result = rtc_sleep_start(s_config.wakeup_triggers, reject_triggers, 0);
 
     // Restore CPU frequency
     rtc_clk_cpu_freq_set(cpu_freq);

+ 3 - 0
components/soc/esp32s2beta/rtc_sleep.c

@@ -170,6 +170,9 @@ uint32_t rtc_sleep_start(uint32_t wakeup_opt, uint32_t reject_opt, uint32_t lslp
 {
     REG_SET_FIELD(RTC_CNTL_WAKEUP_STATE_REG, RTC_CNTL_WAKEUP_ENA, wakeup_opt);
     REG_SET_FIELD(RTC_CNTL_SLP_REJECT_CONF_REG, RTC_CNTL_SLEEP_REJECT_ENA, reject_opt);
+    if (reject_opt != 0) {
+        REG_SET_BIT(RTC_CNTL_SLP_REJECT_CONF_REG, RTC_CNTL_LIGHT_SLP_REJECT_EN);
+    }
 
     /* Start entry into sleep mode */
     SET_PERI_REG_MASK(RTC_CNTL_STATE0_REG, RTC_CNTL_SLEEP_EN);