From 9b3e40c9d1e1dd30102edf0e655a4b9d7efe8211 Mon Sep 17 00:00:00 2001 From: Lou Tianhao Date: Thu, 13 Jul 2023 14:06:10 +0800 Subject: [PATCH 1/4] feat(pm/deepsleep): Support EXT1_WAKEUP_MODE_PER_PIN --- components/esp_hw_support/include/esp_sleep.h | 74 ++++++++++++++----- components/esp_hw_support/sleep_modes.c | 47 ++++++++++-- .../hal/esp32/include/hal/rtc_cntl_ll.h | 18 +++-- .../hal/esp32c6/include/hal/lp_aon_hal.h | 12 +-- .../hal/esp32c6/include/hal/lp_aon_ll.h | 20 ++--- .../hal/esp32h2/include/hal/lp_aon_hal.h | 12 +-- .../hal/esp32h2/include/hal/lp_aon_ll.h | 20 ++--- .../hal/esp32s2/include/hal/rtc_cntl_ll.h | 18 +++-- .../hal/esp32s3/include/hal/rtc_cntl_ll.h | 18 +++-- components/hal/include/hal/rtc_hal.h | 12 +-- .../esp32c6/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32c6/include/soc/soc_caps.h | 1 + .../esp32h2/include/soc/Kconfig.soc_caps.in | 4 + components/soc/esp32h2/include/soc/soc_caps.h | 1 + .../system/deep_sleep/main/Kconfig.projbuild | 34 +++++++++ examples/system/deep_sleep/main/ext_wakeup.c | 51 +++++++++++-- 16 files changed, 263 insertions(+), 83 deletions(-) diff --git a/components/esp_hw_support/include/esp_sleep.h b/components/esp_hw_support/include/esp_sleep.h index 169a3b2fbf..1adfe8b458 100644 --- a/components/esp_hw_support/include/esp_sleep.h +++ b/components/esp_hw_support/include/esp_sleep.h @@ -251,7 +251,7 @@ esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level); * It will work even if RTC peripherals are shut down during sleep. * * This feature can monitor any number of pins which are in RTC IOs. - * Once any of the selected pins goes into the state given by mode argument, + * Once selected pins go into the state given by level_mode argument, * the chip will be woken up. * * @note This function does not modify pin configuration. The pins are @@ -267,28 +267,68 @@ esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level); * the pins during sleep. HOLD feature will be acted on the pin internally * before the system entering sleep, and this can further reduce power consumption. * - * @param mask bit mask of GPIO numbers which will cause wakeup. Only GPIOs - * which have RTC functionality can be used in this bit map. - * For different SoCs, the related GPIOs are: - * - ESP32: 0, 2, 4, 12-15, 25-27, 32-39 - * - ESP32-S2: 0-21 - * - ESP32-S3: 0-21 - * - ESP32-C6: 0-7 - * - ESP32-H2: 7-14 - * @param mode select logic function used to determine wakeup condition: - * When target chip is ESP32: - * - ESP_EXT1_WAKEUP_ALL_LOW: wake up when all selected GPIOs are low - * - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high - * When target chip is ESP32-S2, ESP32-S3, ESP32-C6 or ESP32-H2: - * - ESP_EXT1_WAKEUP_ANY_LOW: wake up when any of the selected GPIOs is low - * - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high + * @param io_mask Bit mask of GPIO numbers which will cause wakeup. Only GPIOs + * which have RTC functionality can be used in this bit map. + * For different SoCs, the related GPIOs are: + * - ESP32: 0, 2, 4, 12-15, 25-27, 32-39 + * - ESP32-S2: 0-21 + * - ESP32-S3: 0-21 + * - ESP32-C6: 0-7 + * - ESP32-H2: 7-14 + * @param level_mode Select logic function used to determine wakeup condition: + * When target chip is ESP32: + * - ESP_EXT1_WAKEUP_ALL_LOW: wake up when all selected GPIOs are low + * - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high + * When target chip is ESP32-S2, ESP32-S3, ESP32-C6 or ESP32-H2: + * - ESP_EXT1_WAKEUP_ANY_LOW: wake up when any of the selected GPIOs is low + * - ESP_EXT1_WAKEUP_ANY_HIGH: wake up when any of the selected GPIOs is high * @return * - ESP_OK on success * - ESP_ERR_INVALID_ARG if any of the selected GPIOs is not an RTC GPIO, * or mode is invalid */ -esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t mask, esp_sleep_ext1_wakeup_mode_t mode); +esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t io_mask, esp_sleep_ext1_wakeup_mode_t level_mode); +#if SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN +/** + * @brief Enable wakeup using multiple pins, allows different trigger mode per pin + * + * This function uses external wakeup feature of RTC controller. + * It will work even if RTC peripherals are shut down during sleep. + * + * This feature can monitor any number of pins which are in RTC IOs. + * Once selected pins go into the state given by level_mode argument, + * the chip will be woken up. + * + * @note This function does not modify pin configuration. The pins are + * configured in esp_deep_sleep_start/esp_light_sleep_start, + * immediately before entering sleep mode. + * + * @note Internal pullups and pulldowns don't work when RTC peripherals are + * shut down. In this case, external resistors need to be added. + * Alternatively, RTC peripherals (and pullups/pulldowns) may be + * kept enabled using esp_sleep_pd_config function. If we turn off the + * ``RTC_PERIPH`` domain or 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. HOLD feature will be acted on the pin internally + * before the system entering sleep, and this can further reduce power consumption. + * + * @param io_mask Bit mask of GPIO numbers which will cause wakeup. Only GPIOs + * which have RTC functionality can be used in this bit map. + * For different SoCs, the related GPIOs are: + * - ESP32-C6: 0-7. + * - ESP32-H2: 7-14. + * @param level_mask Select logic function used to determine wakeup condition per pin. + * Each bit of the level_mask corresponds to the respective GPIO. Each bit's corresponding + * position is set to 0, the wakeup level will be low, on the contrary, + * each bit's corresponding position is set to 1, the wakeup level will be high. + * @return + * - ESP_OK on success + * - ESP_ERR_INVALID_ARG if any of the selected GPIOs is not an RTC GPIO, + * or mode is invalid + */ +esp_err_t esp_sleep_enable_ext1_wakeup_with_level_mask(uint64_t io_mask, uint64_t level_mask); +#endif // SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN #endif // SOC_PM_SUPPORT_EXT1_WAKEUP #if SOC_GPIO_SUPPORT_DEEPSLEEP_WAKEUP diff --git a/components/esp_hw_support/sleep_modes.c b/components/esp_hw_support/sleep_modes.c index f6121e12fc..cbcba00cdf 100644 --- a/components/esp_hw_support/sleep_modes.c +++ b/components/esp_hw_support/sleep_modes.c @@ -193,8 +193,8 @@ typedef struct { uint64_t sleep_duration; uint32_t wakeup_triggers : 15; #if SOC_PM_SUPPORT_EXT1_WAKEUP - uint32_t ext1_trigger_mode : 1; - uint32_t ext1_rtc_gpio_mask : 22; // 22 is the maximum RTCIO number in all chips + uint32_t ext1_trigger_mode : 22; // 22 is the maximum RTCIO number in all chips + uint32_t ext1_rtc_gpio_mask : 22; #endif #if SOC_PM_SUPPORT_EXT0_WAKEUP uint32_t ext0_trigger_level : 1; @@ -1369,15 +1369,15 @@ static void ext0_wakeup_prepare(void) #endif // SOC_PM_SUPPORT_EXT0_WAKEUP #if SOC_PM_SUPPORT_EXT1_WAKEUP -esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t mask, esp_sleep_ext1_wakeup_mode_t mode) +esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t io_mask, esp_sleep_ext1_wakeup_mode_t level_mode) { - if (mode > ESP_EXT1_WAKEUP_ANY_HIGH) { + if (level_mode > ESP_EXT1_WAKEUP_ANY_HIGH) { return ESP_ERR_INVALID_ARG; } // Translate bit map of GPIO numbers into the bit map of RTC IO numbers uint32_t rtc_gpio_mask = 0; - for (int gpio = 0; mask; ++gpio, mask >>= 1) { - if ((mask & 1) == 0) { + for (int gpio = 0; io_mask; ++gpio, io_mask >>= 1) { + if ((io_mask & 1) == 0) { continue; } if (!esp_sleep_is_valid_wakeup_gpio(gpio)) { @@ -1387,11 +1387,44 @@ esp_err_t esp_sleep_enable_ext1_wakeup(uint64_t mask, esp_sleep_ext1_wakeup_mode rtc_gpio_mask |= BIT(rtc_io_number_get(gpio)); } s_config.ext1_rtc_gpio_mask = rtc_gpio_mask; - s_config.ext1_trigger_mode = mode; + if (level_mode) { + s_config.ext1_trigger_mode = io_mask; + } else { + s_config.ext1_trigger_mode = 0; + } s_config.wakeup_triggers |= RTC_EXT1_TRIG_EN; return ESP_OK; } +#if SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN +esp_err_t esp_sleep_enable_ext1_wakeup_with_level_mask(uint64_t io_mask, uint64_t level_mask) +{ + if ((level_mask & io_mask) != level_mask) { + return ESP_ERR_INVALID_ARG; + } + // Translate bit map of GPIO numbers into the bit map of RTC IO numbers + // Translate bit map of GPIO wakeup mode into the bit map of RTC IO wakeup mode + uint32_t rtc_gpio_mask = 0, rtc_gpio_wakeup_mode_mask = 0; + for (int gpio = 0; io_mask; ++gpio, io_mask >>= 1, level_mask >>= 1) { + if ((io_mask & 1) == 0) { + continue; + } + if (!esp_sleep_is_valid_wakeup_gpio(gpio)) { + ESP_LOGE(TAG, "Not an RTC IO Considering io_mask: GPIO%d", gpio); + return ESP_ERR_INVALID_ARG; + } + rtc_gpio_mask |= BIT(rtc_io_number_get(gpio)); + if ((level_mask & 1) == 1) { + rtc_gpio_wakeup_mode_mask |= BIT(rtc_io_number_get(gpio)); + } + } + s_config.ext1_rtc_gpio_mask = rtc_gpio_mask; + s_config.ext1_trigger_mode = rtc_gpio_wakeup_mode_mask; + s_config.wakeup_triggers |= RTC_EXT1_TRIG_EN; + return ESP_OK; +} +#endif + static void ext1_wakeup_prepare(void) { // Configure all RTC IOs selected as ext1 wakeup inputs diff --git a/components/hal/esp32/include/hal/rtc_cntl_ll.h b/components/hal/esp32/include/hal/rtc_cntl_ll.h index 7e87d1d2ab..3c495752d3 100644 --- a/components/hal/esp32/include/hal/rtc_cntl_ll.h +++ b/components/hal/esp32/include/hal/rtc_cntl_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -11,6 +11,7 @@ #include "esp_attr.h" #include "clk_tree_ll.h" #include "esp_rom_sys.h" +#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -32,11 +33,18 @@ FORCE_INLINE_ATTR uint32_t rtc_cntl_ll_ext1_get_wakeup_status(void) return REG_GET_FIELD(RTC_CNTL_EXT_WAKEUP1_STATUS_REG, RTC_CNTL_EXT_WAKEUP1_STATUS); } -FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_set_wakeup_pins(uint32_t mask, int mode) +FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_set_wakeup_pins(uint32_t io_mask, uint32_t mode_mask) { - REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, mask); - SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, - mode, RTC_CNTL_EXT_WAKEUP1_LV_S); + // The target only supports a unified trigger mode among all EXT1 wakeup IOs + HAL_ASSERT((io_mask & mode_mask) == io_mask || (io_mask & mode_mask) == 0); + REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, io_mask); + if ((io_mask & mode_mask) == io_mask) { + SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, + 1, RTC_CNTL_EXT_WAKEUP1_LV_S); + } else { + SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, + 0, RTC_CNTL_EXT_WAKEUP1_LV_S); + } } FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_clear_wakeup_pins(void) diff --git a/components/hal/esp32c6/include/hal/lp_aon_hal.h b/components/hal/esp32c6/include/hal/lp_aon_hal.h index f3cd9e6b85..c38f6da831 100644 --- a/components/hal/esp32c6/include/hal/lp_aon_hal.h +++ b/components/hal/esp32c6/include/hal/lp_aon_hal.h @@ -8,10 +8,10 @@ #include "hal/lp_aon_ll.h" -#define rtc_hal_ext1_get_wakeup_status() lp_aon_ll_ext1_get_wakeup_status() -#define rtc_hal_ext1_clear_wakeup_status() lp_aon_ll_ext1_clear_wakeup_status() -#define rtc_hal_ext1_set_wakeup_pins(mask, mode) lp_aon_ll_ext1_set_wakeup_pins(mask, mode) -#define rtc_hal_ext1_clear_wakeup_pins() lp_aon_ll_ext1_clear_wakeup_pins() -#define rtc_hal_ext1_get_wakeup_pins() lp_aon_ll_ext1_get_wakeup_pins() +#define rtc_hal_ext1_get_wakeup_status() lp_aon_ll_ext1_get_wakeup_status() +#define rtc_hal_ext1_clear_wakeup_status() lp_aon_ll_ext1_clear_wakeup_status() +#define rtc_hal_ext1_set_wakeup_pins(io_mask, mode_mask) lp_aon_ll_ext1_set_wakeup_pins(io_mask, mode_mask) +#define rtc_hal_ext1_clear_wakeup_pins() lp_aon_ll_ext1_clear_wakeup_pins() +#define rtc_hal_ext1_get_wakeup_pins() lp_aon_ll_ext1_get_wakeup_pins() -#define lp_aon_hal_inform_wakeup_type(dslp) lp_aon_ll_inform_wakeup_type(dslp) +#define lp_aon_hal_inform_wakeup_type(dslp) lp_aon_ll_inform_wakeup_type(dslp) diff --git a/components/hal/esp32c6/include/hal/lp_aon_ll.h b/components/hal/esp32c6/include/hal/lp_aon_ll.h index 22ae12dbf6..ef77b7561d 100644 --- a/components/hal/esp32c6/include/hal/lp_aon_ll.h +++ b/components/hal/esp32c6/include/hal/lp_aon_ll.h @@ -39,22 +39,22 @@ static inline void lp_aon_ll_ext1_clear_wakeup_status(void) /** * @brief Set the wake-up LP_IO of the ext1 wake-up source - * @param mask wakeup LP_IO bitmap, bit 0~7 corresponds to LP_IO 0~7 - * @param mode 0: Wake the chip when any of the selected GPIOs go low - * 1: Wake the chip when any of the selected GPIOs go high + * @param io_mask wakeup LP_IO bitmap, bit 0~7 corresponds to LP_IO 0~7 + * @param level_mask LP_IO wakeup level bitmap, bit 0~7 corresponds to LP_IO 0~7 wakeup level + * each bit's corresponding position is set to 0, the wakeup level will be low + * on the contrary, each bit's corresponding position is set to 1, the wakeup + * level will be high */ -static inline void lp_aon_ll_ext1_set_wakeup_pins(uint32_t mask, int mode) +static inline void lp_aon_ll_ext1_set_wakeup_pins(uint32_t io_mask, uint32_t level_mask) { uint32_t wakeup_sel_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_sel); - wakeup_sel_mask |= mask; + wakeup_sel_mask |= io_mask; HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_sel, wakeup_sel_mask); uint32_t wakeup_level_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_lv); - if (mode) { - wakeup_level_mask |= mask; - } else { - wakeup_level_mask &= ~mask; - } + wakeup_level_mask |= io_mask & level_mask; + wakeup_level_mask &= ~(io_mask & ~level_mask); + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_lv, wakeup_level_mask); } diff --git a/components/hal/esp32h2/include/hal/lp_aon_hal.h b/components/hal/esp32h2/include/hal/lp_aon_hal.h index f3cd9e6b85..c38f6da831 100644 --- a/components/hal/esp32h2/include/hal/lp_aon_hal.h +++ b/components/hal/esp32h2/include/hal/lp_aon_hal.h @@ -8,10 +8,10 @@ #include "hal/lp_aon_ll.h" -#define rtc_hal_ext1_get_wakeup_status() lp_aon_ll_ext1_get_wakeup_status() -#define rtc_hal_ext1_clear_wakeup_status() lp_aon_ll_ext1_clear_wakeup_status() -#define rtc_hal_ext1_set_wakeup_pins(mask, mode) lp_aon_ll_ext1_set_wakeup_pins(mask, mode) -#define rtc_hal_ext1_clear_wakeup_pins() lp_aon_ll_ext1_clear_wakeup_pins() -#define rtc_hal_ext1_get_wakeup_pins() lp_aon_ll_ext1_get_wakeup_pins() +#define rtc_hal_ext1_get_wakeup_status() lp_aon_ll_ext1_get_wakeup_status() +#define rtc_hal_ext1_clear_wakeup_status() lp_aon_ll_ext1_clear_wakeup_status() +#define rtc_hal_ext1_set_wakeup_pins(io_mask, mode_mask) lp_aon_ll_ext1_set_wakeup_pins(io_mask, mode_mask) +#define rtc_hal_ext1_clear_wakeup_pins() lp_aon_ll_ext1_clear_wakeup_pins() +#define rtc_hal_ext1_get_wakeup_pins() lp_aon_ll_ext1_get_wakeup_pins() -#define lp_aon_hal_inform_wakeup_type(dslp) lp_aon_ll_inform_wakeup_type(dslp) +#define lp_aon_hal_inform_wakeup_type(dslp) lp_aon_ll_inform_wakeup_type(dslp) diff --git a/components/hal/esp32h2/include/hal/lp_aon_ll.h b/components/hal/esp32h2/include/hal/lp_aon_ll.h index f556def282..38492a1728 100644 --- a/components/hal/esp32h2/include/hal/lp_aon_ll.h +++ b/components/hal/esp32h2/include/hal/lp_aon_ll.h @@ -39,22 +39,22 @@ static inline void lp_aon_ll_ext1_clear_wakeup_status(void) /** * @brief Set the wake-up LP_IO of the ext1 wake-up source - * @param mask wakeup LP_IO bitmap, bit 0~7 corresponds to LP_IO 0~7 - * @param mode 0: Wake the chip when any of the selected GPIOs go low - * 1: Wake the chip when any of the selected GPIOs go high + * @param io_mask wakeup LP_IO bitmap, bit 0~7 corresponds to LP_IO 0~7 + * @param level_mask LP_IO wakeup level bitmap, bit 0~7 corresponds to LP_IO 0~7 wakeup level + * each bit's corresponding position is set to 0, the wakeup level will be low + * on the contrary, each bit's corresponding position is set to 1, the wakeup + * level will be high */ -static inline void lp_aon_ll_ext1_set_wakeup_pins(uint32_t mask, int mode) +static inline void lp_aon_ll_ext1_set_wakeup_pins(uint32_t io_mask, uint32_t level_mask) { uint32_t wakeup_sel_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_sel); - wakeup_sel_mask |= mask; + wakeup_sel_mask |= io_mask; HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_sel, wakeup_sel_mask); uint32_t wakeup_level_mask = HAL_FORCE_READ_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_lv); - if (mode) { - wakeup_level_mask |= mask; - } else { - wakeup_level_mask &= ~mask; - } + wakeup_level_mask |= io_mask & level_mask; + wakeup_level_mask &= ~(io_mask & ~level_mask); + HAL_FORCE_MODIFY_U32_REG_FIELD(LP_AON.ext_wakeup_cntl, ext_wakeup_lv, wakeup_level_mask); } diff --git a/components/hal/esp32s2/include/hal/rtc_cntl_ll.h b/components/hal/esp32s2/include/hal/rtc_cntl_ll.h index 0ccdedc879..754e9bcf11 100644 --- a/components/hal/esp32s2/include/hal/rtc_cntl_ll.h +++ b/components/hal/esp32s2/include/hal/rtc_cntl_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -10,6 +10,7 @@ #include "soc/rtc.h" #include "soc/rtc_cntl_reg.h" #include "esp_attr.h" +#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -34,11 +35,18 @@ FORCE_INLINE_ATTR uint32_t rtc_cntl_ll_ext1_get_wakeup_status(void) return REG_GET_FIELD(RTC_CNTL_EXT_WAKEUP1_STATUS_REG, RTC_CNTL_EXT_WAKEUP1_STATUS); } -FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_set_wakeup_pins(uint32_t mask, int mode) +FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_set_wakeup_pins(uint32_t io_mask, uint32_t mode_mask) { - REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, mask); - SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, - mode, RTC_CNTL_EXT_WAKEUP1_LV_S); + // The target only supports a unified trigger mode among all EXT1 wakeup IOs + HAL_ASSERT((io_mask & mode_mask) == io_mask || (io_mask & mode_mask) == 0); + REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, io_mask); + if ((io_mask & mode_mask) == io_mask) { + SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, + 1, RTC_CNTL_EXT_WAKEUP1_LV_S); + } else { + SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, + 0, RTC_CNTL_EXT_WAKEUP1_LV_S); + } } FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_clear_wakeup_pins(void) diff --git a/components/hal/esp32s3/include/hal/rtc_cntl_ll.h b/components/hal/esp32s3/include/hal/rtc_cntl_ll.h index 464aa99cd6..34d4cb8e34 100644 --- a/components/hal/esp32s3/include/hal/rtc_cntl_ll.h +++ b/components/hal/esp32s3/include/hal/rtc_cntl_ll.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -11,6 +11,7 @@ #include "soc/rtc_cntl_reg.h" #include "soc/apb_ctrl_reg.h" #include "esp_attr.h" +#include "hal/assert.h" #ifdef __cplusplus extern "C" { @@ -38,11 +39,18 @@ FORCE_INLINE_ATTR uint32_t rtc_cntl_ll_ext1_get_wakeup_status(void) return REG_GET_FIELD(RTC_CNTL_EXT_WAKEUP1_STATUS_REG, RTC_CNTL_EXT_WAKEUP1_STATUS); } -FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_set_wakeup_pins(uint32_t mask, int mode) +FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_set_wakeup_pins(uint32_t io_mask, uint32_t mode_mask) { - REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, mask); - SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, - mode, RTC_CNTL_EXT_WAKEUP1_LV_S); + // The target only supports a unified trigger mode among all EXT1 wakeup IOs + HAL_ASSERT((io_mask & mode_mask) == io_mask || (io_mask & mode_mask) == 0); + REG_SET_FIELD(RTC_CNTL_EXT_WAKEUP1_REG, RTC_CNTL_EXT_WAKEUP1_SEL, io_mask); + if ((io_mask & mode_mask) == io_mask) { + SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, + 1, RTC_CNTL_EXT_WAKEUP1_LV_S); + } else { + SET_PERI_REG_BITS(RTC_CNTL_EXT_WAKEUP_CONF_REG, 0x1, + 0, RTC_CNTL_EXT_WAKEUP1_LV_S); + } } FORCE_INLINE_ATTR void rtc_cntl_ll_ext1_clear_wakeup_pins(void) diff --git a/components/hal/include/hal/rtc_hal.h b/components/hal/include/hal/rtc_hal.h index 6848d559d8..c889a2ad07 100644 --- a/components/hal/include/hal/rtc_hal.h +++ b/components/hal/include/hal/rtc_hal.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -41,15 +41,15 @@ typedef struct rtc_cntl_sleep_retent { #if SOC_PM_SUPPORT_EXT1_WAKEUP -#define rtc_hal_ext1_get_wakeup_status() rtc_cntl_ll_ext1_get_wakeup_status() +#define rtc_hal_ext1_get_wakeup_status() rtc_cntl_ll_ext1_get_wakeup_status() -#define rtc_hal_ext1_clear_wakeup_status() rtc_cntl_ll_ext1_clear_wakeup_status() +#define rtc_hal_ext1_clear_wakeup_status() rtc_cntl_ll_ext1_clear_wakeup_status() -#define rtc_hal_ext1_set_wakeup_pins(mask, mode) rtc_cntl_ll_ext1_set_wakeup_pins(mask, mode) +#define rtc_hal_ext1_set_wakeup_pins(io_mask, mode_mask) rtc_cntl_ll_ext1_set_wakeup_pins(io_mask, mode_mask) -#define rtc_hal_ext1_clear_wakeup_pins() rtc_cntl_ll_ext1_clear_wakeup_pins() +#define rtc_hal_ext1_clear_wakeup_pins() rtc_cntl_ll_ext1_clear_wakeup_pins() -#define rtc_hal_ext1_get_wakeup_pins() rtc_cntl_ll_ext1_get_wakeup_pins() +#define rtc_hal_ext1_get_wakeup_pins() rtc_cntl_ll_ext1_get_wakeup_pins() #endif // SOC_PM_SUPPORT_EXT1_WAKEUP diff --git a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in index 3bd19bcd5a..5ca2b6fb28 100644 --- a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in @@ -1123,6 +1123,10 @@ config SOC_PM_SUPPORT_EXT1_WAKEUP bool default y +config SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN + bool + default y + config SOC_PM_SUPPORT_CPU_PD bool default y diff --git a/components/soc/esp32c6/include/soc/soc_caps.h b/components/soc/esp32c6/include/soc/soc_caps.h index 5081a69a4c..0c317d21f7 100644 --- a/components/soc/esp32c6/include/soc/soc_caps.h +++ b/components/soc/esp32c6/include/soc/soc_caps.h @@ -472,6 +472,7 @@ #define SOC_PM_SUPPORT_BEACON_WAKEUP (1) #define SOC_PM_SUPPORT_BT_WAKEUP (1) #define SOC_PM_SUPPORT_EXT1_WAKEUP (1) +#define SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN (1) /*! Date: Tue, 5 Sep 2023 12:03:01 +0800 Subject: [PATCH 2/4] docs(pm): add ext1 wakeup per pin description --- docs/en/api-reference/system/sleep_modes.rst | 10 +++++++--- docs/zh_CN/api-reference/system/sleep_modes.rst | 12 ++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/en/api-reference/system/sleep_modes.rst b/docs/en/api-reference/system/sleep_modes.rst index 5a5320c70b..6249822a52 100644 --- a/docs/en/api-reference/system/sleep_modes.rst +++ b/docs/en/api-reference/system/sleep_modes.rst @@ -95,7 +95,7 @@ RTC peripherals or RTC memories don't need to be powered on during sleep in this External Wakeup (ext1) ^^^^^^^^^^^^^^^^^^^^^^ - The RTC controller contains the logic to trigger wakeup using multiple RTC GPIOs. One of the following two logic functions can be used to trigger wakeup: + The RTC controller contains the logic to trigger wakeup using multiple RTC GPIOs. One of the following two logic functions can be used to trigger general ext1 wakeup: .. only:: esp32 @@ -123,13 +123,17 @@ RTC peripherals or RTC memories don't need to be powered on during sleep in this gpio_pullup_dis(gpio_num); gpio_pulldown_en(gpio_num); + :cpp:func:`esp_sleep_enable_ext1_wakeup` function can be used to enable this wakeup source for general ext1 wakeup. + + .. only:: SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN + + Besides the above mentioned general ext1 wakeup, the RTC controller also contains a more powerful logic to trigger wakeup using multiple RTC GPIOs with a customized RTC IO wakeup level bitmap. This can be configured with :cpp:func`esp_sleep_enable_ext1_wakeup_with_level_mask`. + .. warning:: - To use the EXT1 wakeup, the IO pad(s) are configured as RTC IO. Therefore, before using these pads as digital GPIOs, users need to reconfigure them by calling the :cpp:func:`rtc_gpio_deinit` function. - If the RTC peripherals are configured to be powered down (which is by default), the wakeup IOs will be set to the holding state before entering sleep. Therefore, after the chip wakes up from Light-sleep, please call `rtc_gpio_hold_dis` to disable the hold function to perform any pin re-configuration. For Deep-sleep wakeup, this is already being handled at the application startup stage. - :cpp:func:`esp_sleep_enable_ext1_wakeup` function can be used to enable this wakeup source. - .. only:: SOC_ULP_SUPPORTED ULP Coprocessor Wakeup diff --git a/docs/zh_CN/api-reference/system/sleep_modes.rst b/docs/zh_CN/api-reference/system/sleep_modes.rst index 3465bccf0f..49aafaffb8 100644 --- a/docs/zh_CN/api-reference/system/sleep_modes.rst +++ b/docs/zh_CN/api-reference/system/sleep_modes.rst @@ -92,10 +92,10 @@ RTC 控制器中内嵌定时器,可用于在预定义的时间到达后唤醒 .. only:: SOC_PM_SUPPORT_EXT1_WAKEUP - 外部唤醒 (ext1) + 外部唤醒 (``ext1``) ^^^^^^^^^^^^^^^^^^^^^^ - RTC 控制器中包含使用多个 RTC GPIO 触发唤醒的逻辑。您可以从以下两个逻辑函数中选择其一,用于触发唤醒: + RTC 控制器中包含使用多个 RTC GPIO 触发唤醒的逻辑。从以下两个逻辑函数中任选其一,均可触发普通 ext1 唤醒: .. only:: esp32 @@ -123,13 +123,17 @@ RTC 控制器中内嵌定时器,可用于在预定义的时间到达后唤醒 gpio_pullup_dis(gpio_num); gpio_pulldown_en(gpio_num); + 可调用 :cpp:func:`esp_sleep_enable_ext1_wakeup` 函数来启用普通 ext1 唤醒。 + + .. only:: SOC_PM_SUPPORT_EXT1_WAKEUP_MODE_PER_PIN + + 除了上述提到的普通 ext1 唤醒之外,当前的 RTC 控制器也包含更强大的逻辑,可以使用多个 RTC GPIO 并根据自定义的 RTC IO 唤醒电平位图来唤醒。这可以通过:cpp:func:`esp_sleep_enable_ext1_wakeup_with_level_mask` 函数来进行配置。 + .. warning:: - 使用 EXT1 唤醒源时,用于唤醒的 IO pad 将被配置为 RTC IO。因此,在将该 pad 用作数字 GPIO 之前,请调用 :cpp:func:`rtc_gpio_deinit` 函数对其进行重新配置。 - RTC 外设在默认情况下配置为断电,此时,唤醒 IO 在进入睡眠状态前将被设置为保持状态。因此,从 Light-sleep 状态唤醒芯片后,请调用 `rtc_gpio_hold_dis` 来禁用保持功能,以便对管脚进行重新配置。对于 Deep-sleep 唤醒,此问题已经在应用启动阶段解决。 - 可调用 :cpp:func:`esp_sleep_enable_ext1_wakeup` 函数来启用此唤醒源。 - .. only:: SOC_ULP_SUPPORTED ULP 协处理器唤醒 From a1ceb251a0f2087f5d61e2f2ec667308abc7bb40 Mon Sep 17 00:00:00 2001 From: zwx Date: Mon, 16 Oct 2023 17:35:52 +0800 Subject: [PATCH 3/4] feat(openthread): add config for radio statistic feature --- components/openthread/Kconfig | 8 ++++++++ .../openthread-core-esp32x-ftd-config.h | 11 +++++++++++ .../openthread-core-esp32x-mtd-config.h | 11 +++++++++++ 3 files changed, 30 insertions(+) diff --git a/components/openthread/Kconfig b/components/openthread/Kconfig index 3f0300f07c..d18ec6b892 100644 --- a/components/openthread/Kconfig +++ b/components/openthread/Kconfig @@ -353,4 +353,12 @@ menu "OpenThread" Select this option to enable time synchronization feature, the devices in the same Thread network could sync to the same network time. + config OPENTHREAD_RADIO_STATS_ENABLE + bool "Enable Radio Statistics feature" + depends on OPENTHREAD_FTD || OPENTHREAD_MTD + default n + help + Select this option to enable the radio statistics feature, you can use radio command to print some radio + Statistics informations. + endmenu diff --git a/components/openthread/private_include/openthread-core-esp32x-ftd-config.h b/components/openthread/private_include/openthread-core-esp32x-ftd-config.h index 0da476f5e1..b27bc53963 100644 --- a/components/openthread/private_include/openthread-core-esp32x-ftd-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-ftd-config.h @@ -579,4 +579,15 @@ #define OPENTHREAD_CONFIG_TIME_SYNC_ENABLE 1 #endif +/** + * @def OPENTHREAD_CONFIG_RADIO_STATS_ENABLE + * + * Set to 1 to enable support for Radio Statistics. Note that this option only works for OPENTHREAD_FTD and + * OPENTHREAD_MTD. + * + */ +#if CONFIG_OPENTHREAD_RADIO_STATS_ENABLE +#define OPENTHREAD_CONFIG_RADIO_STATS_ENABLE 1 +#endif + #define OPENTHREAD_FTD 1 diff --git a/components/openthread/private_include/openthread-core-esp32x-mtd-config.h b/components/openthread/private_include/openthread-core-esp32x-mtd-config.h index e5980244b7..f706d364e2 100644 --- a/components/openthread/private_include/openthread-core-esp32x-mtd-config.h +++ b/components/openthread/private_include/openthread-core-esp32x-mtd-config.h @@ -263,4 +263,15 @@ #define OPENTHREAD_CONFIG_TIME_SYNC_ENABLE 1 #endif +/** + * @def OPENTHREAD_CONFIG_RADIO_STATS_ENABLE + * + * Set to 1 to enable support for Radio Statistics. Note that this option only works for OPENTHREAD_FTD and + * OPENTHREAD_MTD. + * + */ +#if CONFIG_OPENTHREAD_RADIO_STATS_ENABLE +#define OPENTHREAD_CONFIG_RADIO_STATS_ENABLE 1 +#endif + #define OPENTHREAD_MTD 1 From 9f8655cdefc60702c6960cd51263de2736a53d66 Mon Sep 17 00:00:00 2001 From: zwx Date: Mon, 23 Oct 2023 17:27:16 +0800 Subject: [PATCH 4/4] feat(openthread): Add deep sleep support for SED --- .../{ => deep_sleep}/CMakeLists.txt | 0 .../ot_sleepy_device/deep_sleep/README.md | 64 +++++ .../image/H2-deep-sleep-power-consumption.png | Bin 0 -> 92589 bytes .../{ => deep_sleep}/main/CMakeLists.txt | 0 .../deep_sleep/main/esp_ot_sleepy_device.c | 220 ++++++++++++++++++ .../main/esp_ot_sleepy_device_config.h | 53 +++++ .../{ => deep_sleep}/partitions.csv | 0 .../deep_sleep/sdkconfig.defaults | 54 +++++ .../light_sleep/CMakeLists.txt | 6 + .../{ => light_sleep}/README.md | 4 +- .../light_sleep/main/CMakeLists.txt | 2 + .../main/esp_ot_sleepy_device.c | 0 .../main/esp_ot_sleepy_device_config.h | 0 .../light_sleep/partitions.csv | 5 + .../light_sleep/sdkconfig.ci.sleepy_c6 | 6 + .../light_sleep/sdkconfig.ci.sleepy_h2 | 6 + .../{ => light_sleep}/sdkconfig.defaults | 0 17 files changed, 418 insertions(+), 2 deletions(-) rename examples/openthread/ot_sleepy_device/{ => deep_sleep}/CMakeLists.txt (100%) create mode 100644 examples/openthread/ot_sleepy_device/deep_sleep/README.md create mode 100644 examples/openthread/ot_sleepy_device/deep_sleep/image/H2-deep-sleep-power-consumption.png rename examples/openthread/ot_sleepy_device/{ => deep_sleep}/main/CMakeLists.txt (100%) create mode 100644 examples/openthread/ot_sleepy_device/deep_sleep/main/esp_ot_sleepy_device.c create mode 100644 examples/openthread/ot_sleepy_device/deep_sleep/main/esp_ot_sleepy_device_config.h rename examples/openthread/ot_sleepy_device/{ => deep_sleep}/partitions.csv (100%) create mode 100644 examples/openthread/ot_sleepy_device/deep_sleep/sdkconfig.defaults create mode 100644 examples/openthread/ot_sleepy_device/light_sleep/CMakeLists.txt rename examples/openthread/ot_sleepy_device/{ => light_sleep}/README.md (89%) create mode 100644 examples/openthread/ot_sleepy_device/light_sleep/main/CMakeLists.txt rename examples/openthread/ot_sleepy_device/{ => light_sleep}/main/esp_ot_sleepy_device.c (100%) rename examples/openthread/ot_sleepy_device/{ => light_sleep}/main/esp_ot_sleepy_device_config.h (100%) create mode 100644 examples/openthread/ot_sleepy_device/light_sleep/partitions.csv create mode 100644 examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_c6 create mode 100644 examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_h2 rename examples/openthread/ot_sleepy_device/{ => light_sleep}/sdkconfig.defaults (100%) diff --git a/examples/openthread/ot_sleepy_device/CMakeLists.txt b/examples/openthread/ot_sleepy_device/deep_sleep/CMakeLists.txt similarity index 100% rename from examples/openthread/ot_sleepy_device/CMakeLists.txt rename to examples/openthread/ot_sleepy_device/deep_sleep/CMakeLists.txt diff --git a/examples/openthread/ot_sleepy_device/deep_sleep/README.md b/examples/openthread/ot_sleepy_device/deep_sleep/README.md new file mode 100644 index 0000000000..5ee3f7d9b2 --- /dev/null +++ b/examples/openthread/ot_sleepy_device/deep_sleep/README.md @@ -0,0 +1,64 @@ +| Supported Targets | ESP32-H2 | +| ----------------- | -------- | + +# OpenThread Sleepy Device Example + +The example demonstrates the Thread Sleepy End Device (SED), the device will enter [Deep Sleep mode](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/api-reference/system/sleep_modes.html#sleep-modes) during idle state. + +This example is designed to address a specific deep sleep application scenario. First, it connects to the Thread network, and after 5 seconds when the state changes to CHILD, it enters deep sleep mode. There are two ways to wake up in this example: one is by using a 20-second periodic RTC timer, and the other is through GPIO input. Deep sleep is part of the upper-layer logic, and it's the user's responsibility to manage it in their own applications. If you need more wake-up methods, you can refer to the [Exapmle deep sleep](../../../system/deep_sleep/). Additionally, Espressif provides a stub for handling wake-ups, which allows for a quick check, and the user can decide whether to wake up or continue deep sleep in this stub, as explained in the [Example deep sleep stub](../../../system/deep_sleep_wake_stub). + +Note: Implementing a standard Thread Sleepy Device is recommended using the [Light Sleep example](../light_sleep). Deep sleep triggers a reboot, and the device needs to undergo a re-attach process to rejoin the network. This means additional packet interactions are necessary after each wake-up from deep sleep. It can be advantageous in reducing power consumption, especially when the device remains in a sleep state for extended periods, such as more than 30 minutes. +## How to use example + +### Hardware Required + +* Prepare two 802.15.4 SoC development boards, one for an OpenThread Leader and the other one for an OpenThread Sleepy End Device (SED). +* Connect the board using a USB cable for power supply and programming. + +## Configure the Openthread Dataset + +* Run [ot_cli](../../ot_cli/) on another 802.15.4 SoC device to create openthread dataset configuration and start an openthread network as the Leader. +* Configure the Openthread dataset using `idf.py menuconfig` in `Component config ---> Openthread ---> Thread Operation Dataset`, ensuring that the openthread sleepy device's dataset matches the dataset of the Leader device. + +### Build and Flash + +Build the project and flash it to the board. Use the following command: `idf.py -p erase-flash flash monitor`. + +### Example Output + +As the example runs, you will see the log output indicating the initialization and operation of OpenThread, including the device joining the OpenThread network as a Sleepy End Device (SED). + +``` +I(281) OPENTHREAD:[I] Settings------: Read NetworkInfo {rloc:0x4001, extaddr:623954c9725869e6, role:child, mode:0x04, version:4, keyseq:0x0, ... +I(291) OPENTHREAD:[I] Settings------: ... pid:0x3b33d767, mlecntr:0x3ba17, maccntr:0x3baa8, mliid:868f19ce8c3f6207} +I(301) OPENTHREAD:[I] Settings------: Read ParentInfo {extaddr:3afe8db4802dc1aa, version:4} +I (311) ot_esp_power_save: Wake up from timer. Time spent in deep sleep and boot: 20321ms +I (331) ot_esp_power_save: Enabling timer wakeup, 20s +I (331) OPENTHREAD: OpenThread attached to netif +I(341) OPENTHREAD:[N] Mle-----------: Role disabled -> detached +I (291) main_task: Returned from app_main() +I (371) OT_STATE: netif up +I(511) OPENTHREAD:[N] Mle-----------: Role detached -> child +I (531) ot_esp_power_save: Start one-shot timer for 5s to enter the deep sleep +I (5531) ot_esp_power_save: Enter deep sleep +``` + +When the device enter deep sleep, GPIO9 also can wake up the device, you can push down the BOOT button then you can see the device wakes up: + +``` +I(281) OPENTHREAD:[I] Settings------: Read NetworkInfo {rloc:0x4001, extaddr:623954c9725869e6, role:child, mode:0x04, version:4, keyseq:0x0, ... +I(291) OPENTHREAD:[I] Settings------: ... pid:0x3b33d767, mlecntr:0x3d576, maccntr:0x3d609, mliid:868f19ce8c3f6207} +I(301) OPENTHREAD:[I] Settings------: Read ParentInfo {extaddr:3afe8db4802dc1aa, version:4} +I (321) ot_esp_power_save: Wake up from GPIO. Time spent in deep sleep and boot: 8470ms +I (331) ot_esp_power_save: Enabling timer wakeup, 20s +I (331) OPENTHREAD: OpenThread attached to netif +I(341) OPENTHREAD:[N] Mle-----------: Role disabled -> detached +I (291) main_task: Returned from app_main() +I (371) OT_STATE: netif up +I(511) OPENTHREAD:[N] Mle-----------: Role detached -> child +I (531) ot_esp_power_save: Start one-shot timer for 5s to enter the deep sleep +I (5531) ot_esp_power_save: Enter deep sleep +``` + +During the deep sleep, a typical power consumption is shown below: +![H2-deep-sleep-power-consumption](image/H2-deep-sleep-power-consumption.png) \ No newline at end of file diff --git a/examples/openthread/ot_sleepy_device/deep_sleep/image/H2-deep-sleep-power-consumption.png b/examples/openthread/ot_sleepy_device/deep_sleep/image/H2-deep-sleep-power-consumption.png new file mode 100644 index 0000000000000000000000000000000000000000..26df54501537fff4471feb405301f85736cd3e43 GIT binary patch literal 92589 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 h2hJc1n +#include +#include +#include +#include "esp_err.h" +#include "esp_event.h" +#include "esp_log.h" +#include "esp_sleep.h" +#include "esp_timer.h" +#include "esp_openthread.h" +#include "esp_openthread_netif_glue.h" +#include "esp_ot_sleepy_device_config.h" +#include "esp_vfs_eventfd.h" +#include "nvs_flash.h" +#include "driver/rtc_io.h" +#include "driver/uart.h" +#include "openthread/logging.h" +#include "openthread/thread.h" + +#if !SOC_IEEE802154_SUPPORTED +#error "Openthread sleepy device is only supported for the SoCs which have IEEE 802.15.4 module" +#endif + +#define TAG "ot_esp_power_save" + +static RTC_DATA_ATTR struct timeval s_sleep_enter_time; +static esp_timer_handle_t s_oneshot_timer; + +static void create_config_network(otInstance *instance) +{ + otLinkModeConfig linkMode = { 0 }; + + linkMode.mRxOnWhenIdle = false; + linkMode.mDeviceType = false; + linkMode.mNetworkData = false; + + if (otLinkSetPollPeriod(instance, CONFIG_OPENTHREAD_NETWORK_POLLPERIOD_TIME) != OT_ERROR_NONE) { + ESP_LOGE(TAG, "Failed to set OpenThread pollperiod."); + abort(); + } + + if (otThreadSetLinkMode(instance, linkMode) != OT_ERROR_NONE) { + ESP_LOGE(TAG, "Failed to set OpenThread linkmode."); + abort(); + } + ESP_ERROR_CHECK(esp_openthread_auto_start(NULL)); +} + +static esp_netif_t *init_openthread_netif(const esp_openthread_platform_config_t *config) +{ + esp_netif_config_t cfg = ESP_NETIF_DEFAULT_OPENTHREAD(); + esp_netif_t *netif = esp_netif_new(&cfg); + assert(netif != NULL); + ESP_ERROR_CHECK(esp_netif_attach(netif, esp_openthread_netif_glue_init(config))); + + return netif; +} + +static void ot_state_change_callback(otChangedFlags changed_flags, void* ctx) +{ + OT_UNUSED_VARIABLE(ctx); + static otDeviceRole s_previous_role = OT_DEVICE_ROLE_DISABLED; + otInstance* instance = esp_openthread_get_instance(); + if (!instance) { + return; + } + otDeviceRole role = otThreadGetDeviceRole(instance); + if (role == OT_DEVICE_ROLE_CHILD && s_previous_role != OT_DEVICE_ROLE_CHILD) { + // Start the one-shot timer + const int before_deep_sleep_time_sec = 5; + ESP_LOGI(TAG, "Start one-shot timer for %ds to enter the deep sleep", before_deep_sleep_time_sec); + ESP_ERROR_CHECK(esp_timer_start_once(s_oneshot_timer, before_deep_sleep_time_sec * 1000000)); + } + s_previous_role = role; +} + +static void s_oneshot_timer_callback(void* arg) +{ + // Enter deep sleep + ESP_LOGI(TAG, "Enter deep sleep"); + gettimeofday(&s_sleep_enter_time, NULL); + esp_deep_sleep_start(); +} + +static void ot_deep_sleep_init(void) +{ + // Within this function, we print the reason for the wake-up and configure the method of waking up from deep sleep. + // This example provides support for two wake-up sources from deep sleep: RTC timer and GPIO. + + // The one-shot timer will start when the device transitions to the CHILD state for the first time. + // After a 5-second delay, the device will enter deep sleep. + + const esp_timer_create_args_t s_oneshot_timer_args = { + .callback = &s_oneshot_timer_callback, + .name = "one-shot" + }; + + ESP_ERROR_CHECK(esp_timer_create(&s_oneshot_timer_args, &s_oneshot_timer)); + + // Print the wake-up reason: + struct timeval now; + gettimeofday(&now, NULL); + int sleep_time_ms = (now.tv_sec - s_sleep_enter_time.tv_sec) * 1000 + (now.tv_usec - s_sleep_enter_time.tv_usec) / 1000; + esp_sleep_wakeup_cause_t wake_up_cause = esp_sleep_get_wakeup_cause(); + switch (wake_up_cause) { + case ESP_SLEEP_WAKEUP_TIMER: { + ESP_LOGI(TAG, "Wake up from timer. Time spent in deep sleep and boot: %dms", sleep_time_ms); + break; + } + case ESP_SLEEP_WAKEUP_EXT1: { + ESP_LOGI(TAG, "Wake up from GPIO. Time spent in deep sleep and boot: %dms", sleep_time_ms); + break; + } + case ESP_SLEEP_WAKEUP_UNDEFINED: + default: + ESP_LOGI(TAG, "Not a deep sleep reset"); + break; + } + + // Set the methods of how to wake up: + // 1. RTC timer waking-up + const int wakeup_time_sec = 20; + ESP_LOGI(TAG, "Enabling timer wakeup, %ds\n", wakeup_time_sec); + ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(wakeup_time_sec * 1000000)); + + // 2. GPIO waking-up +#if CONFIG_IDF_TARGET_ESP32C6 + // For ESP32C6 boards, RTCIO only supports GPIO0~GPIO7 + // GPIO7 pull down to wake up + const int gpio_wakeup_pin = 7; +#elif CONFIG_IDF_TARGET_ESP32H2 + // You can wake up by pulling down GPIO9. On ESP32H2 development boards, the BOOT button is connected to GPIO9. + // You can use the BOOT button to wake up the boards directly. + const int gpio_wakeup_pin = 9; +#endif + const uint64_t gpio_wakeup_pin_mask = 1ULL << gpio_wakeup_pin; + // The configuration mode depends on your hardware design. + // Since the BOOT button is connected to a pull-up resistor, the wake-up mode is configured as LOW. + const uint64_t ext_wakeup_mode = 0 << gpio_wakeup_pin; + ESP_ERROR_CHECK(esp_sleep_enable_ext1_wakeup_with_level_mask(gpio_wakeup_pin_mask, ext_wakeup_mode)); + + // Also these two GPIO configurations are also depended on the hardware design. + // The BOOT button is connected to the pull-up resistor, so enable the pull-up mode and disable the pull-down mode. + + // Notice: if these GPIO configurations do not match the hardware design, the deep sleep module will enable the GPIO hold + // feature to hold the GPIO voltage when enter the sleep, which will ensure the board be waked up by GPIO. But it will cause + // 3~4 times power consumption increasing during sleep. + ESP_ERROR_CHECK(gpio_pullup_en(gpio_wakeup_pin)); + ESP_ERROR_CHECK(gpio_pulldown_dis(gpio_wakeup_pin)); +} + + +static void ot_task_worker(void *aContext) +{ + esp_openthread_platform_config_t config = { + .radio_config = ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG(), + .host_config = ESP_OPENTHREAD_DEFAULT_HOST_CONFIG(), + .port_config = ESP_OPENTHREAD_DEFAULT_PORT_CONFIG(), + }; + + // Initialize the OpenThread stack + ESP_ERROR_CHECK(esp_openthread_init(&config)); + + ot_deep_sleep_init(); + +#if CONFIG_OPENTHREAD_LOG_LEVEL_DYNAMIC + // The OpenThread log level directly matches ESP log level + (void)otLoggingSetLevel(CONFIG_LOG_DEFAULT_LEVEL); +#endif + esp_netif_t *openthread_netif; + // Initialize the esp_netif bindings + openthread_netif = init_openthread_netif(&config); + esp_netif_set_default_netif(openthread_netif); + otSetStateChangedCallback(esp_openthread_get_instance(), ot_state_change_callback, NULL); + + create_config_network(esp_openthread_get_instance()); + + // Run the main loop + esp_openthread_launch_mainloop(); + + // Clean up + esp_netif_destroy(openthread_netif); + esp_openthread_netif_glue_deinit(); + + esp_vfs_eventfd_unregister(); + vTaskDelete(NULL); +} + + +void app_main(void) +{ + // Used eventfds: + // * netif + // * ot task queue + // * radio driver + esp_vfs_eventfd_config_t eventfd_config = { + .max_fds = 3, + }; + + ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_vfs_eventfd_register(&eventfd_config)); + + xTaskCreate(ot_task_worker, "ot_power_save_main", 4096, NULL, 5, NULL); +} diff --git a/examples/openthread/ot_sleepy_device/deep_sleep/main/esp_ot_sleepy_device_config.h b/examples/openthread/ot_sleepy_device/deep_sleep/main/esp_ot_sleepy_device_config.h new file mode 100644 index 0000000000..145bb245cc --- /dev/null +++ b/examples/openthread/ot_sleepy_device/deep_sleep/main/esp_ot_sleepy_device_config.h @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + * + * OpenThread Command Line Example + * + * This example code is in the Public Domain (or CC0 licensed, at your option.) + * + * Unless required by applicable law or agreed to in writing, this + * software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. + */ + +#pragma once + +#include "esp_openthread_types.h" + +# define CONFIG_OPENTHREAD_NETWORK_POLLPERIOD_TIME 30000 + +#if SOC_IEEE802154_SUPPORTED +#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \ + { \ + .radio_mode = RADIO_MODE_NATIVE, \ + } +#endif + +#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \ + { \ + .host_connection_mode = HOST_CONNECTION_MODE_CLI_UART, \ + .host_uart_config = { \ + .port = 0, \ + .uart_config = \ + { \ + .baud_rate = 115200, \ + .data_bits = UART_DATA_8_BITS, \ + .parity = UART_PARITY_DISABLE, \ + .stop_bits = UART_STOP_BITS_1, \ + .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, \ + .rx_flow_ctrl_thresh = 0, \ + .source_clk = UART_SCLK_DEFAULT, \ + }, \ + .rx_pin = UART_PIN_NO_CHANGE, \ + .tx_pin = UART_PIN_NO_CHANGE, \ + }, \ + } + +#define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \ + { \ + .storage_partition_name = "nvs", \ + .netif_queue_size = 10, \ + .task_queue_size = 10, \ + } diff --git a/examples/openthread/ot_sleepy_device/partitions.csv b/examples/openthread/ot_sleepy_device/deep_sleep/partitions.csv similarity index 100% rename from examples/openthread/ot_sleepy_device/partitions.csv rename to examples/openthread/ot_sleepy_device/deep_sleep/partitions.csv diff --git a/examples/openthread/ot_sleepy_device/deep_sleep/sdkconfig.defaults b/examples/openthread/ot_sleepy_device/deep_sleep/sdkconfig.defaults new file mode 100644 index 0000000000..00774aa81d --- /dev/null +++ b/examples/openthread/ot_sleepy_device/deep_sleep/sdkconfig.defaults @@ -0,0 +1,54 @@ +# +# Partition Table +# +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions.csv" +# end of Partition Table + +# +# mbedTLS +# +# TODO: Re-enable HW acceleration when HW AES support pm_lock (IDF-7704) +CONFIG_MBEDTLS_HARDWARE_AES=n +CONFIG_MBEDTLS_HARDWARE_MPI=n +CONFIG_MBEDTLS_HARDWARE_SHA=n +CONFIG_MBEDTLS_CMAC_C=y +CONFIG_MBEDTLS_SSL_PROTO_DTLS=y +CONFIG_MBEDTLS_KEY_EXCHANGE_ECJPAKE=y +CONFIG_MBEDTLS_ECJPAKE_C=y +# end of mbedTLS + +# +# OpenThread +# +CONFIG_OPENTHREAD_ENABLED=y +CONFIG_OPENTHREAD_BORDER_ROUTER=n +CONFIG_OPENTHREAD_DNS64_CLIENT=y +# end of OpenThread + +# +# lwIP +# +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096 +CONFIG_LWIP_IPV6_NUM_ADDRESSES=8 +CONFIG_LWIP_IPV4=n +CONFIG_LWIP_ND6=n +# end of lwIP + +# +# IEEE 802.15.4 +# +CONFIG_IEEE802154_ENABLED=y +# end of IEEE 802.15.4 + +# +# deep sleep +# +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=80 +CONFIG_ULP_COPROC_ENABLED=y +CONFIG_ULP_COPROC_RESERVE_MEM=512 +CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y +CONFIG_RTC_CLK_SRC_INT_RC=y +CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y diff --git a/examples/openthread/ot_sleepy_device/light_sleep/CMakeLists.txt b/examples/openthread/ot_sleepy_device/light_sleep/CMakeLists.txt new file mode 100644 index 0000000000..876f5798c5 --- /dev/null +++ b/examples/openthread/ot_sleepy_device/light_sleep/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ot_sleepy_device) diff --git a/examples/openthread/ot_sleepy_device/README.md b/examples/openthread/ot_sleepy_device/light_sleep/README.md similarity index 89% rename from examples/openthread/ot_sleepy_device/README.md rename to examples/openthread/ot_sleepy_device/light_sleep/README.md index 5c832db28d..ebcf8eae27 100644 --- a/examples/openthread/ot_sleepy_device/README.md +++ b/examples/openthread/ot_sleepy_device/light_sleep/README.md @@ -3,7 +3,7 @@ # OpenThread Sleepy Device Example -The example demonstrates the Thread Sleepy End Device (SED), the device will enter [Light Sleep mode](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/api-reference/system/sleep_modes.html#sleep-modes) during idle state. +The example demonstrates the Thread Sleepy End Device (SED), the device will enter [Light Sleep mode](https://docs.espressif.com/projects/esp-idf/en/latest/esp32h2/api-reference/system/sleep_modes.html#sleep-modes) during idle state. ## How to use example ### Hardware Required @@ -14,7 +14,7 @@ The example demonstrates the Thread Sleepy End Device (SED), the device will ent ## Configure the Openthread Dataset -* Run [ot_cli](../ot_cli/) on another 802.15.4 SoC device to create openthread dataset configuration and start an openthread network as the leader. +* Run [ot_cli](../../ot_cli/) on another 802.15.4 SoC device to create openthread dataset configuration and start an openthread network as the leader. * Configure the Openthread dataset using `idf.py menuconfig` in `Component config ---> Openthread ---> Thread Operation Dataset`, ensuring that the openthread sleepy device's dataset matches the dataset of the leader. ### Build and Flash diff --git a/examples/openthread/ot_sleepy_device/light_sleep/main/CMakeLists.txt b/examples/openthread/ot_sleepy_device/light_sleep/main/CMakeLists.txt new file mode 100644 index 0000000000..a7cde9d16a --- /dev/null +++ b/examples/openthread/ot_sleepy_device/light_sleep/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "esp_ot_sleepy_device.c" + INCLUDE_DIRS ".") diff --git a/examples/openthread/ot_sleepy_device/main/esp_ot_sleepy_device.c b/examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device.c similarity index 100% rename from examples/openthread/ot_sleepy_device/main/esp_ot_sleepy_device.c rename to examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device.c diff --git a/examples/openthread/ot_sleepy_device/main/esp_ot_sleepy_device_config.h b/examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device_config.h similarity index 100% rename from examples/openthread/ot_sleepy_device/main/esp_ot_sleepy_device_config.h rename to examples/openthread/ot_sleepy_device/light_sleep/main/esp_ot_sleepy_device_config.h diff --git a/examples/openthread/ot_sleepy_device/light_sleep/partitions.csv b/examples/openthread/ot_sleepy_device/light_sleep/partitions.csv new file mode 100644 index 0000000000..6c0e048dba --- /dev/null +++ b/examples/openthread/ot_sleepy_device/light_sleep/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 0x120000, diff --git a/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_c6 b/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_c6 new file mode 100644 index 0000000000..80eea90801 --- /dev/null +++ b/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_c6 @@ -0,0 +1,6 @@ +CONFIG_IDF_TARGET="esp32c6" +CONFIG_IDF_TARGET_ESP32C6=y +CONFIG_OPENTHREAD_NETWORK_CHANNEL=12 +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="aabbccddeeff00112233445566778899" +CONFIG_ESP_SLEEP_DEBUG=y +CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y diff --git a/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_h2 b/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_h2 new file mode 100644 index 0000000000..4afe327821 --- /dev/null +++ b/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.ci.sleepy_h2 @@ -0,0 +1,6 @@ +CONFIG_IDF_TARGET="esp32h2" +CONFIG_IDF_TARGET_ESP32H2=y +CONFIG_OPENTHREAD_NETWORK_CHANNEL=12 +CONFIG_OPENTHREAD_NETWORK_MASTERKEY="aabbccddeeff00112233445566778899" +CONFIG_ESP_SLEEP_DEBUG=y +CONFIG_LOG_MAXIMUM_LEVEL_DEBUG=y diff --git a/examples/openthread/ot_sleepy_device/sdkconfig.defaults b/examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.defaults similarity index 100% rename from examples/openthread/ot_sleepy_device/sdkconfig.defaults rename to examples/openthread/ot_sleepy_device/light_sleep/sdkconfig.defaults