From 9f8655cdefc60702c6960cd51263de2736a53d66 Mon Sep 17 00:00:00 2001 From: zwx Date: Mon, 23 Oct 2023 17:27:16 +0800 Subject: [PATCH] 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