From 37cd3769579dd2fd6214424764a14eee7d34b903 Mon Sep 17 00:00:00 2001 From: "Michael (XIAO Xufeng)" Date: Mon, 25 Jul 2022 14:38:00 +0800 Subject: [PATCH] sleep_modes: allow using touch/ULP with RTC_PERIPH domain (including EXT0 wakeup source) --- components/esp_hw_support/sleep_modes.c | 29 ++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 3fced84a8d..36faab7b2f 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -940,6 +940,7 @@ static void touch_wakeup_prepare(void) esp_err_t esp_sleep_enable_touchpad_wakeup(void) { +#if CONFIG_IDF_TARGET_ESP32 #if ((defined CONFIG_ESP32_RTC_EXT_CRYST_ADDIT_CURRENT) || (defined CONFIG_ESP32_RTC_EXT_CRYST_ADDIT_CURRENT_V2)) ESP_LOGE(TAG, "Failed to enable wakeup when provide current to external 32kHz crystal"); return ESP_ERR_NOT_SUPPORTED; @@ -948,6 +949,8 @@ esp_err_t esp_sleep_enable_touchpad_wakeup(void) ESP_LOGE(TAG, "Conflicting wake-up trigger: ext0"); return ESP_ERR_INVALID_STATE; } +#endif //CONFIG_IDF_TARGET_ESP32 + s_config.wakeup_triggers |= RTC_TOUCH_TRIG_EN; return ESP_OK; } @@ -984,10 +987,13 @@ esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level) if (!esp_sleep_is_valid_wakeup_gpio(gpio_num)) { return ESP_ERR_INVALID_ARG; } +#if CONFIG_IDF_TARGET_ESP32 if (s_config.wakeup_triggers & (RTC_TOUCH_TRIG_EN | RTC_ULP_TRIG_EN)) { ESP_LOGE(TAG, "Conflicting wake-up triggers: touch / ULP"); return ESP_ERR_INVALID_STATE; } +#endif //CONFIG_IDF_TARGET_ESP32 + s_config.ext0_rtc_gpio_num = rtc_io_number_get(gpio_num); s_config.ext0_trigger_level = level; s_config.wakeup_triggers |= RTC_EXT0_TRIG_EN; @@ -1287,29 +1293,22 @@ static uint32_t get_power_down_flags(void) s_config.pd_options[ESP_PD_DOMAIN_RTC_FAST_MEM] = ESP_PD_OPTION_ON; #endif +#if SOC_PM_SUPPORT_RTC_PERIPH_PD // RTC_PERIPH is needed for EXT0 wakeup and GPIO wakeup. - // If RTC_PERIPH is auto, and EXT0/GPIO aren't enabled, power down RTC_PERIPH. + // If RTC_PERIPH is left auto (EXT0/GPIO aren't enabled), RTC_PERIPH will be powered off by default. if (s_config.pd_options[ESP_PD_DOMAIN_RTC_PERIPH] == ESP_PD_OPTION_AUTO) { -#if SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP - uint32_t wakeup_source = RTC_TOUCH_TRIG_EN; -#if SOC_ULP_SUPPORTED - wakeup_source |= RTC_ULP_TRIG_EN; -#endif if (s_config.wakeup_triggers & (RTC_EXT0_TRIG_EN | RTC_GPIO_TRIG_EN)) { s_config.pd_options[ESP_PD_DOMAIN_RTC_PERIPH] = ESP_PD_OPTION_ON; - } else if (s_config.wakeup_triggers & wakeup_source) { - // In both rev. 0 and rev. 1 of ESP32, forcing power up of RTC_PERIPH + } +#if CONFIG_IDF_TARGET_ESP32 + else if (s_config.wakeup_triggers & (RTC_TOUCH_TRIG_EN | RTC_ULP_TRIG_EN)) { + // On ESP32, forcing power up of RTC_PERIPH // prevents ULP timer and touch FSMs from working correctly. s_config.pd_options[ESP_PD_DOMAIN_RTC_PERIPH] = ESP_PD_OPTION_OFF; } -#else - if (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN) { - s_config.pd_options[ESP_PD_DOMAIN_RTC_PERIPH] = ESP_PD_OPTION_ON; - } else { - s_config.pd_options[ESP_PD_DOMAIN_RTC_PERIPH] = ESP_PD_OPTION_OFF; - } -#endif // SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP +#endif //CONFIG_IDF_TARGET_ESP32 } +#endif //SOC_PM_SUPPORT_RTC_PERIPH_PD #if SOC_PM_SUPPORT_CPU_PD if (!cpu_domain_pd_allowed()) {