mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-02 11:10:54 +03:00
Merge branch 'fix/fix_io_wakeup_issues_v5.5' into 'release/v5.5'
fix(esp_hw_support): make esp_deep_sleep_enable_gpio_wakeup available to PD_TOP lightsleep (v5.5) See merge request espressif/esp-idf!45871
This commit is contained in:
@@ -358,7 +358,7 @@ static void touch_wakeup_prepare(void);
|
|||||||
#if SOC_VBAT_SUPPORTED
|
#if SOC_VBAT_SUPPORTED
|
||||||
static void vbat_under_volt_wakeup_prepare(void);
|
static void vbat_under_volt_wakeup_prepare(void);
|
||||||
#endif
|
#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);
|
static void gpio_deep_sleep_wakeup_prepare(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1043,8 +1043,8 @@ static esp_err_t SLEEP_FN_ATTR esp_sleep_start(uint32_t sleep_flags, uint32_t cl
|
|||||||
// for !(s_config.wakeup_triggers & RTC_EXT1_TRIG_EN), ext1 wakeup will be turned off in hardware in the real call to sleep
|
// for !(s_config.wakeup_triggers & RTC_EXT1_TRIG_EN), ext1 wakeup will be turned off in hardware in the real call to sleep
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP && SOC_DEEP_SLEEP_SUPPORTED
|
#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP
|
||||||
if (deep_sleep && (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN)) {
|
if ((sleep_flags & RTC_SLEEP_PD_DIG) && (s_config.wakeup_triggers & RTC_GPIO_TRIG_EN)) {
|
||||||
gpio_deep_sleep_wakeup_prepare();
|
gpio_deep_sleep_wakeup_prepare();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -1684,6 +1684,10 @@ esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source)
|
|||||||
s_config.wakeup_triggers &= ~RTC_TOUCH_TRIG_EN;
|
s_config.wakeup_triggers &= ~RTC_TOUCH_TRIG_EN;
|
||||||
#endif
|
#endif
|
||||||
} else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_GPIO, RTC_GPIO_TRIG_EN)) {
|
} 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;
|
s_config.wakeup_triggers &= ~RTC_GPIO_TRIG_EN;
|
||||||
#if SOC_PMU_SUPPORTED && (SOC_UART_HP_NUM > 2)
|
#if SOC_PMU_SUPPORTED && (SOC_UART_HP_NUM > 2)
|
||||||
} else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_UART, (RTC_UART0_TRIG_EN | RTC_UART1_TRIG_EN | RTC_UART2_TRIG_EN))) {
|
} else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_UART, (RTC_UART0_TRIG_EN | RTC_UART1_TRIG_EN | RTC_UART2_TRIG_EN))) {
|
||||||
@@ -2102,7 +2106,7 @@ uint64_t esp_sleep_get_ext1_wakeup_status(void)
|
|||||||
|
|
||||||
#endif // SOC_PM_SUPPORT_EXT1_WAKEUP && SOC_RTCIO_PIN_COUNT > 0
|
#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)
|
uint64_t esp_sleep_get_gpio_wakeup_status(void)
|
||||||
{
|
{
|
||||||
if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_GPIO) {
|
if (esp_sleep_get_wakeup_cause() != ESP_SLEEP_WAKEUP_GPIO) {
|
||||||
@@ -2162,12 +2166,12 @@ esp_err_t esp_deep_sleep_enable_gpio_wakeup(uint64_t gpio_pin_mask, esp_deepslee
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
err = gpio_deep_sleep_wakeup_enable(gpio_idx, intr_type);
|
err = gpio_deep_sleep_wakeup_enable(gpio_idx, intr_type);
|
||||||
|
if (err != ESP_OK) return err;
|
||||||
s_config.gpio_wakeup_mask |= BIT(gpio_idx);
|
s_config.gpio_wakeup_mask |= BIT(gpio_idx);
|
||||||
if (mode == ESP_GPIO_WAKEUP_GPIO_HIGH) {
|
if (mode == ESP_GPIO_WAKEUP_GPIO_HIGH) {
|
||||||
s_config.gpio_trigger_mode |= (mode << gpio_idx);
|
s_config.gpio_trigger_mode |= BIT(gpio_idx);
|
||||||
} else {
|
} 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;
|
s_config.wakeup_triggers |= RTC_GPIO_TRIG_EN;
|
||||||
|
|||||||
@@ -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
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "esp_sleep.h"
|
#include "esp_sleep.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
|
#include "driver/gpio.h"
|
||||||
#include "driver/rtc_io.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.
|
// 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.
|
// 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.
|
// 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_pullup_dis(ext_wakeup_pin_0));
|
||||||
ESP_ERROR_CHECK(rtc_gpio_pulldown_en(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
|
/* 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
|
* 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.*/
|
* 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 CONFIG_EXAMPLE_EXT1_USE_INTERNAL_PULLUPS
|
||||||
#if SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
|
#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 SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN
|
||||||
if (CONFIG_EXAMPLE_EXT1_WAKEUP_MODE_PIN_1) {
|
if (CONFIG_EXAMPLE_EXT1_WAKEUP_MODE_PIN_1) {
|
||||||
ESP_ERROR_CHECK(rtc_gpio_pullup_dis(ext_wakeup_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
|
#endif
|
||||||
#else // ! SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
|
#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 SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN
|
||||||
if (CONFIG_EXAMPLE_EXT1_WAKEUP_MODE_PIN_1) {
|
if (CONFIG_EXAMPLE_EXT1_WAKEUP_MODE_PIN_1) {
|
||||||
gpio_pullup_dis(ext_wakeup_pin_1);
|
gpio_pullup_dis(ext_wakeup_pin_1);
|
||||||
|
|||||||
Reference in New Issue
Block a user