1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #18405 from gschorcht/cpu/esp32/periph_gpio_wakeup_extemsion

cpu/esp32: extend GPIO wake-up from deep sleep
This commit is contained in:
benpicco 2022-08-12 15:41:46 +02:00 committed by GitHub
commit 4ab7ba6758
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 1 deletions

View File

@ -1235,14 +1235,24 @@ ESP_PM_WUP_UART1 | disabled | Light | Positive UART1 RxD signal
- If `ESP_PM_GPIO_HOLD` is defined, GPIOs hold their last output level
when entering _Deep-sleep_ mode. Please note that only RTC GPIOs
can hold their output value in _Deep-sleep_ mode.
When restarting after a deep sleep, the GPIOs are reset to their default
configuration, which is usually the input-only mode. This means that the
output level of the GPIOs in output mode may change for up to 150 ms until
the GPIOs are reconfigured by the application in output mode. If a continuous
output level for such GPIOs is important, external pullups/pulldowns should
be used for these GPIOs to pull them to a specific level during deep sleep
and restart instead of defining `ESP_PM_GPIO_HOLD`.
- `ESP_PM_WUP_PINS` specifies either a single RTC GPIO or a comma separated
list of RTC GPIOs that are used as wake-up source in _Deep-sleep_ mode.
- `ESP_PM_WUP_LEVEL` specifies the level for the wake-up pins in _Deep-sleep_
mode:
- `ESP_PM_WUP_PINS_ANY_HIGH` (default) - The system is woken up when any of
the GPIOs specified in `ESP_PM_WUP_PINS` becomes HIGH.
- `ESP_PM_WUP_PINS_ANY_LOW` - The system is woken up when any of
the GPIOs specified in `ESP_PM_WUP_PINS` becomes LOW
(only available with the ESP32-C3 variant).
- `ESP_PM_WUP_PINS_ALL_LOW` - The system is woken up when all GPIOs specified
in `ESP_PM_WUP_PINS` become LOW.
in `ESP_PM_WUP_PINS` become LOW (not available with the ESP32-C3 variant).
- `ESP_PM_WUP_UART0` and `ESP_PM_WUP_UART1` define the number of positive
edges of the RxD signal of the respective UART that are necessary to wake
up the system in the _Light-sleep_ mode. The value must be greater than 2,

View File

@ -54,13 +54,26 @@
#define ENABLE_DEBUG 0
#include "debug.h"
#if SOC_PM_SUPPORT_EXT_WAKEUP
#define ESP_PM_WUP_PINS_ANY_HIGH ESP_EXT1_WAKEUP_ANY_HIGH
#define ESP_PM_WUP_PINS_ALL_LOW ESP_EXT1_WAKEUP_ALL_LOW
#define ESP_PM_WUP_PINS_ANY_LOW -1
#endif
#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP
#define ESP_PM_WUP_PINS_ANY_HIGH ESP_GPIO_WAKEUP_GPIO_HIGH
#define ESP_PM_WUP_PINS_ANY_LOW ESP_GPIO_WAKEUP_GPIO_LOW
#define ESP_PM_WUP_PINS_ALL_LOW -1
#endif
#ifndef ESP_PM_WUP_LEVEL
#define ESP_PM_WUP_LEVEL ESP_PM_WUP_PINS_ANY_HIGH
#endif
#if ESP_PM_WUP_LEVEL == -1
#error "ESP32x SoC does not support this ESP_PM_WUP_LEVEL"
#endif
#define GPIO_PRO_CPU_INTR_ENA (BIT(2))
/* architecture specific tables */
@ -452,7 +465,15 @@ void gpio_pm_sleep_enter(unsigned mode)
}
#endif /* SOC_RTCIO_INPUT_OUTPUT_SUPPORTED */
}
#if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP
/* ESP_PM_WUP_PINS_ANY_LOW or ESP_PM_WUP_PINS_ANY_HIGH */
esp_deep_sleep_enable_gpio_wakeup(wup_pin_mask, ESP_PM_WUP_LEVEL);
#elif SOC_PM_SUPPORT_EXT_WAKEUP
/* ESP_PM_WUP_PINS_ALL_LOW or ESP_PM_WUP_PINS_ANY_HIGH */
esp_sleep_enable_ext1_wakeup(wup_pin_mask, ESP_PM_WUP_LEVEL);
#else
#error "ESP32x SoC variant doesn't allow to define GPIOs for wake-up from deep sleep"
#endif
#endif /* ESP_PM_WUP_PINS */
}
else {