|
|
@@ -34,6 +34,7 @@
|
|
|
#include "soc/dport_reg.h"
|
|
|
#include "soc/rtc_wdt.h"
|
|
|
#include "driver/rtc_io.h"
|
|
|
+#include "driver/uart.h"
|
|
|
#include "freertos/FreeRTOS.h"
|
|
|
#include "freertos/task.h"
|
|
|
#include "sdkconfig.h"
|
|
|
@@ -363,19 +364,20 @@ esp_err_t esp_sleep_disable_wakeup_source(esp_sleep_source_t source)
|
|
|
if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_TIMER, RTC_TIMER_TRIG_EN)) {
|
|
|
s_config.wakeup_triggers &= ~RTC_TIMER_TRIG_EN;
|
|
|
s_config.sleep_duration = 0;
|
|
|
- }
|
|
|
- else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_EXT0, RTC_EXT0_TRIG_EN)) {
|
|
|
+ } else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_EXT0, RTC_EXT0_TRIG_EN)) {
|
|
|
s_config.ext0_rtc_gpio_num = 0;
|
|
|
s_config.ext0_trigger_level = 0;
|
|
|
s_config.wakeup_triggers &= ~RTC_EXT0_TRIG_EN;
|
|
|
- }
|
|
|
- else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_EXT1, RTC_EXT1_TRIG_EN)) {
|
|
|
+ } else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_EXT1, RTC_EXT1_TRIG_EN)) {
|
|
|
s_config.ext1_rtc_gpio_mask = 0;
|
|
|
s_config.ext1_trigger_mode = 0;
|
|
|
s_config.wakeup_triggers &= ~RTC_EXT1_TRIG_EN;
|
|
|
- }
|
|
|
- else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_TOUCHPAD, RTC_TOUCH_TRIG_EN)) {
|
|
|
+ } else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_TOUCHPAD, RTC_TOUCH_TRIG_EN)) {
|
|
|
s_config.wakeup_triggers &= ~RTC_TOUCH_TRIG_EN;
|
|
|
+ } else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_GPIO, RTC_GPIO_TRIG_EN)) {
|
|
|
+ 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);
|
|
|
}
|
|
|
#ifdef CONFIG_ULP_COPROC_ENABLED
|
|
|
else if (CHECK_SOURCE(source, ESP_SLEEP_WAKEUP_ULP, RTC_ULP_TRIG_EN)) {
|
|
|
@@ -561,6 +563,29 @@ uint64_t esp_sleep_get_ext1_wakeup_status()
|
|
|
return gpio_mask;
|
|
|
}
|
|
|
|
|
|
+esp_err_t esp_sleep_enable_gpio_wakeup()
|
|
|
+{
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ s_config.wakeup_triggers |= RTC_GPIO_TRIG_EN;
|
|
|
+ return ESP_OK;
|
|
|
+}
|
|
|
+
|
|
|
+esp_err_t esp_sleep_enable_uart_wakeup(int uart_num)
|
|
|
+{
|
|
|
+ if (uart_num == UART_NUM_0) {
|
|
|
+ s_config.wakeup_triggers |= RTC_UART0_TRIG_EN;
|
|
|
+ } else if (uart_num == UART_NUM_1) {
|
|
|
+ s_config.wakeup_triggers |= RTC_UART1_TRIG_EN;
|
|
|
+ } else {
|
|
|
+ return ESP_ERR_INVALID_ARG;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ESP_OK;
|
|
|
+}
|
|
|
+
|
|
|
esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause()
|
|
|
{
|
|
|
if (rtc_get_reset_reason(0) != DEEPSLEEP_RESET) {
|
|
|
@@ -578,6 +603,10 @@ esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause()
|
|
|
return ESP_SLEEP_WAKEUP_TOUCHPAD;
|
|
|
} else if (wakeup_cause & RTC_ULP_TRIG_EN) {
|
|
|
return ESP_SLEEP_WAKEUP_ULP;
|
|
|
+ } else if (wakeup_cause & RTC_GPIO_TRIG_EN) {
|
|
|
+ return ESP_SLEEP_WAKEUP_GPIO;
|
|
|
+ } else if (wakeup_cause & (RTC_UART0_TRIG_EN | RTC_UART1_TRIG_EN)) {
|
|
|
+ return ESP_SLEEP_WAKEUP_UART;
|
|
|
} else {
|
|
|
return ESP_SLEEP_WAKEUP_UNDEFINED;
|
|
|
}
|
|
|
@@ -620,10 +649,10 @@ static uint32_t get_power_down_flags()
|
|
|
s_config.pd_options[ESP_PD_DOMAIN_RTC_FAST_MEM] = ESP_PD_OPTION_ON;
|
|
|
}
|
|
|
|
|
|
- // RTC_PERIPH is needed for EXT0 wakeup.
|
|
|
- // If RTC_PERIPH is auto, and EXT0 isn't enabled, power down RTC_PERIPH.
|
|
|
+ // 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 (s_config.pd_options[ESP_PD_DOMAIN_RTC_PERIPH] == ESP_PD_OPTION_AUTO) {
|
|
|
- if (s_config.wakeup_triggers & RTC_EXT0_TRIG_EN) {
|
|
|
+ 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 & (RTC_TOUCH_TRIG_EN | RTC_ULP_TRIG_EN)) {
|
|
|
// In both rev. 0 and rev. 1 of ESP32, forcing power up of RTC_PERIPH
|