diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index 6ee34c3272..26b9ea2f18 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -318,7 +318,7 @@ static esp_err_t timer_wakeup_prepare(int64_t sleep_duration); #if SOC_TOUCH_SENSOR_SUPPORTED && SOC_TOUCH_SENSOR_VERSION != 1 static void touch_wakeup_prepare(void); #endif -#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP && SOC_DEEP_SLEEP_SUPPORTED +#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP static void gpio_deep_sleep_wakeup_prepare(void); #endif @@ -872,8 +872,8 @@ static esp_err_t IRAM_ATTR esp_sleep_start(uint32_t sleep_flags, esp_sleep_mode_ // for !(s_config.wakeup_triggers & RTC_EXT1_TRIG_EN), ext1 wakeup will be turned off in hardware in the real call to sleep #endif -#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP && SOC_DEEP_SLEEP_SUPPORTED - if (deep_sleep && (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN)) { +#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + if ((sleep_flags & RTC_SLEEP_PD_DIG) && (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN)) { gpio_deep_sleep_wakeup_prepare(); } #endif @@ -1623,6 +1623,10 @@ esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source) s_config.wakeup_triggers &= ~RTC_TOUCH_TRIG_EN; #endif } else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_GPIO, RTC_GPIO_TRIG_EN)) { +#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP + s_config.gpio_wakeup_mask = 0; + s_config.gpio_trigger_mode = 0; +#endif s_config.wakeup_triggers &= ~RTC_GPIO_TRIG_EN; } else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_UART, (RTC_UART0_TRIG_EN | RTC_UART1_TRIG_EN))) { s_config.wakeup_triggers &= ~(RTC_UART0_TRIG_EN | RTC_UART1_TRIG_EN); @@ -2028,7 +2032,7 @@ uint64_t esp_sleep_get_ext1_wakeup_status(void) #endif // SOC_PM_SUPPORT_EXT1_WAKEUP && SOC_RTCIO_PIN_COUNT > 0 -#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP && SOC_DEEP_SLEEP_SUPPORTED +#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP uint64_t esp_sleep_get_gpio_wakeup_status(void) { if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_GPIO) { @@ -2088,12 +2092,12 @@ esp_err_t esp_deep_sleep_enable_gpio_wakeup(uint64_t gpio_pin_mask, esp_deepslee continue; } err = gpio_deep_sleep_wakeup_enable(gpio_idx, intr_type); - + if (err != ESP_OK) return err; s_config.gpio_wakeup_mask |= BIT(gpio_idx); if (mode == ESP_GPIO_WAKEUP_GPIO_HIGH) { - s_config.gpio_trigger_mode |= (mode << gpio_idx); + s_config.gpio_trigger_mode |= BIT(gpio_idx); } else { - s_config.gpio_trigger_mode &= ~(mode << gpio_idx); + s_config.gpio_trigger_mode &= ~BIT(gpio_idx); } } s_config.wakeup_triggers |= RTC_GPIO_TRIG_EN; diff --git a/examples/system/deep_sleep/main/ext_wakeup.c b/examples/system/deep_sleep/main/ext_wakeup.c index 35dcaf4b94..305542a5bd 100644 --- a/examples/system/deep_sleep/main/ext_wakeup.c +++ b/examples/system/deep_sleep/main/ext_wakeup.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Unlicense OR CC0-1.0 */ @@ -7,6 +7,7 @@ #include #include "esp_sleep.h" #include "sdkconfig.h" +#include "driver/gpio.h" #include "driver/rtc_io.h" @@ -25,6 +26,7 @@ void example_deep_sleep_register_ext0_wakeup(void) // Configure pullup/downs via RTCIO to tie wakeup pins to inactive level during deepsleep. // EXT0 resides in the same power domain (RTC_PERIPH) as the RTC IO pullup/downs. // No need to keep that power domain explicitly, unlike EXT1. + ESP_ERROR_CHECK(rtc_gpio_init(ext_wakeup_pin_0)); ESP_ERROR_CHECK(rtc_gpio_pullup_dis(ext_wakeup_pin_0)); ESP_ERROR_CHECK(rtc_gpio_pulldown_en(ext_wakeup_pin_0)); } @@ -48,10 +50,12 @@ void example_deep_sleep_register_ext1_wakeup(void) /* If there are no external pull-up/downs, tie wakeup pins to inactive level with internal pull-up/downs via RTC IO * during deepsleep. However, RTC IO relies on the RTC_PERIPH power domain. Keeping this power domain on will - * increase some power comsumption. However, if we turn off the RTC_PERIPH domain or if certain chips lack the RTC_PERIPH + * increase some power consumption. However, if we turn off the RTC_PERIPH domain or if certain chips lack the RTC_PERIPH * domain, we will use the HOLD feature to maintain the pull-up and pull-down on the pins during sleep.*/ #if CONFIG_EXAMPLE_EXT1_USE_INTERNAL_PULLUPS #if SOC_RTCIO_INPUT_OUTPUT_SUPPORTED + ESP_ERROR_CHECK(rtc_gpio_init(ext_wakeup_pin_1)); + ESP_ERROR_CHECK(rtc_gpio_init(ext_wakeup_pin_2)); #if SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN if (CONFIG_EXAMPLE_EXT1_WAKEUP_MODE_PIN_1) { ESP_ERROR_CHECK(rtc_gpio_pullup_dis(ext_wakeup_pin_1)); @@ -81,6 +85,11 @@ void example_deep_sleep_register_ext1_wakeup(void) } #endif #else // ! SOC_RTCIO_INPUT_OUTPUT_SUPPORTED + const gpio_config_t config = { + .pin_bit_mask = BIT(ext_wakeup_pin_1) | BIT(ext_wakeup_pin_2), + .mode = GPIO_MODE_INPUT, + }; + ESP_ERROR_CHECK(gpio_config(&config)); #if SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN if (CONFIG_EXAMPLE_EXT1_WAKEUP_MODE_PIN_1) { gpio_pullup_dis(ext_wakeup_pin_1);