mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 03:07:21 +02:00
Merge branch 'feat/example_connect_thread_v5_2' into 'release/v5.2'
feat(protocol_examples_common): Add Thread connect to support Thread for the protocol examples(v5.2) See merge request espressif/esp-idf!36092
This commit is contained in:
@ -22,6 +22,9 @@ if(CONFIG_EXAMPLE_CONNECT_ETHERNET)
|
|||||||
list(APPEND srcs "eth_connect.c")
|
list(APPEND srcs "eth_connect.c")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_EXAMPLE_CONNECT_THREAD)
|
||||||
|
list(APPEND srcs "thread_connect.c")
|
||||||
|
endif()
|
||||||
|
|
||||||
idf_component_register(SRCS "${srcs}"
|
idf_component_register(SRCS "${srcs}"
|
||||||
INCLUDE_DIRS "include"
|
INCLUDE_DIRS "include"
|
||||||
@ -34,3 +37,7 @@ endif()
|
|||||||
if(CONFIG_EXAMPLE_CONNECT_ETHERNET)
|
if(CONFIG_EXAMPLE_CONNECT_ETHERNET)
|
||||||
idf_component_optional_requires(PRIVATE esp_eth)
|
idf_component_optional_requires(PRIVATE esp_eth)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_EXAMPLE_CONNECT_THREAD)
|
||||||
|
idf_component_optional_requires(PRIVATE openthread)
|
||||||
|
endif()
|
||||||
|
@ -7,7 +7,7 @@ menu "Example Connection Configuration"
|
|||||||
depends on !IDF_TARGET_LINUX && SOC_WIFI_SUPPORTED
|
depends on !IDF_TARGET_LINUX && SOC_WIFI_SUPPORTED
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Protocol examples can use Wi-Fi and/or Ethernet to connect to the network.
|
Protocol examples can use Wi-Fi, Ethernet and/or Thread to connect to the network.
|
||||||
Choose this option to connect with WiFi
|
Choose this option to connect with WiFi
|
||||||
|
|
||||||
if EXAMPLE_CONNECT_WIFI
|
if EXAMPLE_CONNECT_WIFI
|
||||||
@ -121,7 +121,7 @@ menu "Example Connection Configuration"
|
|||||||
depends on !IDF_TARGET_LINUX
|
depends on !IDF_TARGET_LINUX
|
||||||
default y if !SOC_WIFI_SUPPORTED
|
default y if !SOC_WIFI_SUPPORTED
|
||||||
help
|
help
|
||||||
Protocol examples can use Wi-Fi and/or Ethernet to connect to the network.
|
Protocol examples can use Wi-Fi, Ethernet and/or Thread to connect to the network.
|
||||||
Choose this option to connect with Ethernet
|
Choose this option to connect with Ethernet
|
||||||
|
|
||||||
if EXAMPLE_CONNECT_ETHERNET
|
if EXAMPLE_CONNECT_ETHERNET
|
||||||
@ -306,13 +306,83 @@ menu "Example Connection Configuration"
|
|||||||
Set PHY address according your board schematic.
|
Set PHY address according your board schematic.
|
||||||
endif # EXAMPLE_CONNECT_ETHERNET
|
endif # EXAMPLE_CONNECT_ETHERNET
|
||||||
|
|
||||||
|
config EXAMPLE_CONNECT_THREAD
|
||||||
|
bool "Connect using Thread interface"
|
||||||
|
depends on !IDF_TARGET_LINUX && OPENTHREAD_ENABLED
|
||||||
|
default y if SOC_IEEE802154_SUPPORTED
|
||||||
|
select EXAMPLE_CONNECT_IPV6
|
||||||
|
help
|
||||||
|
Protocol examples can use Wi-Fi, Ethernet and/or Thread to connect to the network.
|
||||||
|
Choose this option to connect with Thread.
|
||||||
|
The operational active dataset of the Thread network can be configured in openthread
|
||||||
|
component at '->Components->OpenThread->Thread Core Features->Thread Operational Dataset'
|
||||||
|
|
||||||
|
if EXAMPLE_CONNECT_THREAD
|
||||||
|
config EXAMPLE_THREAD_TASK_STACK_SIZE
|
||||||
|
int "Example Thread task stack size"
|
||||||
|
default 8192
|
||||||
|
help
|
||||||
|
Thread task stack size
|
||||||
|
|
||||||
|
menu "Radio Spinel Options"
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_UART || OPENTHREAD_RADIO_SPINEL_SPI
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_UART_RX_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_UART
|
||||||
|
int "Uart Rx Pin"
|
||||||
|
default 17
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_UART_TX_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_UART
|
||||||
|
int "Uart Tx pin"
|
||||||
|
default 18
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_UART_BAUD
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_UART
|
||||||
|
int "Uart baud rate"
|
||||||
|
default 460800
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_UART_PORT
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_UART
|
||||||
|
int "Uart port"
|
||||||
|
default 1
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_SPI_CS_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_SPI
|
||||||
|
int "SPI CS Pin"
|
||||||
|
default 10
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_SPI_SCLK_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_SPI
|
||||||
|
int "SPI SCLK Pin"
|
||||||
|
default 12
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_SPI_MISO_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_SPI
|
||||||
|
int "SPI MISO Pin"
|
||||||
|
default 13
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_SPI_MOSI_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_SPI
|
||||||
|
int "SPI MOSI Pin"
|
||||||
|
default 11
|
||||||
|
|
||||||
|
config EXAMPLE_THREAD_SPI_INTR_PIN
|
||||||
|
depends on OPENTHREAD_RADIO_SPINEL_SPI
|
||||||
|
int "SPI Interrupt Pin"
|
||||||
|
default 8
|
||||||
|
endmenu
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
config EXAMPLE_CONNECT_IPV4
|
config EXAMPLE_CONNECT_IPV4
|
||||||
bool
|
bool
|
||||||
depends on LWIP_IPV4
|
depends on LWIP_IPV4
|
||||||
|
default n if EXAMPLE_CONNECT_THREAD
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config EXAMPLE_CONNECT_IPV6
|
config EXAMPLE_CONNECT_IPV6
|
||||||
depends on EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET
|
depends on EXAMPLE_CONNECT_WIFI || EXAMPLE_CONNECT_ETHERNET || EXAMPLE_CONNECT_THREAD
|
||||||
bool "Obtain IPv6 address"
|
bool "Obtain IPv6 address"
|
||||||
default y
|
default y
|
||||||
select LWIP_IPV6
|
select LWIP_IPV6
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@ -35,7 +35,7 @@ const char *example_ipv6_addr_types_to_str[6] = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks the netif description if it contains specified prefix.
|
* @brief Checks the netif description if it contains specified prefix.
|
||||||
* All netifs created withing common connect component are prefixed with the module TAG,
|
* All netifs created within common connect component are prefixed with the module TAG,
|
||||||
* so it returns true if the specified netif is owned by this module
|
* so it returns true if the specified netif is owned by this module
|
||||||
*/
|
*/
|
||||||
bool example_is_our_netif(const char *prefix, esp_netif_t *netif)
|
bool example_is_our_netif(const char *prefix, esp_netif_t *netif)
|
||||||
@ -61,7 +61,7 @@ static esp_err_t print_all_ips_tcpip(void* ctx)
|
|||||||
while ((netif = esp_netif_next_unsafe(netif)) != NULL) {
|
while ((netif = esp_netif_next_unsafe(netif)) != NULL) {
|
||||||
if (example_is_our_netif(prefix, netif)) {
|
if (example_is_our_netif(prefix, netif)) {
|
||||||
ESP_LOGI(TAG, "Connected to %s", esp_netif_get_desc(netif));
|
ESP_LOGI(TAG, "Connected to %s", esp_netif_get_desc(netif));
|
||||||
#if CONFIG_LWIP_IPV4
|
#if CONFIG_EXAMPLE_CONNECT_IPV4
|
||||||
esp_netif_ip_info_t ip;
|
esp_netif_ip_info_t ip;
|
||||||
ESP_ERROR_CHECK(esp_netif_get_ip_info(netif, &ip));
|
ESP_ERROR_CHECK(esp_netif_get_ip_info(netif, &ip));
|
||||||
|
|
||||||
@ -101,6 +101,12 @@ esp_err_t example_connect(void)
|
|||||||
}
|
}
|
||||||
ESP_ERROR_CHECK(esp_register_shutdown_handler(&example_wifi_shutdown));
|
ESP_ERROR_CHECK(esp_register_shutdown_handler(&example_wifi_shutdown));
|
||||||
#endif
|
#endif
|
||||||
|
#if CONFIG_EXAMPLE_CONNECT_THREAD
|
||||||
|
if (example_thread_connect() != ESP_OK) {
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
ESP_ERROR_CHECK(esp_register_shutdown_handler(&example_thread_shutdown));
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_EXAMPLE_CONNECT_ETHERNET
|
#if CONFIG_EXAMPLE_CONNECT_ETHERNET
|
||||||
example_print_all_netif_ips(EXAMPLE_NETIF_DESC_ETH);
|
example_print_all_netif_ips(EXAMPLE_NETIF_DESC_ETH);
|
||||||
@ -110,6 +116,10 @@ esp_err_t example_connect(void)
|
|||||||
example_print_all_netif_ips(EXAMPLE_NETIF_DESC_STA);
|
example_print_all_netif_ips(EXAMPLE_NETIF_DESC_STA);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_CONNECT_THREAD
|
||||||
|
example_print_all_netif_ips(EXAMPLE_NETIF_DESC_THREAD);
|
||||||
|
#endif
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
/* Private Funtions of protocol example common */
|
/* Private Functions of protocol example common */
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
@ -45,6 +45,8 @@ void example_wifi_shutdown(void);
|
|||||||
esp_err_t example_wifi_connect(void);
|
esp_err_t example_wifi_connect(void);
|
||||||
void example_ethernet_shutdown(void);
|
void example_ethernet_shutdown(void);
|
||||||
esp_err_t example_ethernet_connect(void);
|
esp_err_t example_ethernet_connect(void);
|
||||||
|
void example_thread_shutdown(void);
|
||||||
|
esp_err_t example_thread_connect(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,6 +31,10 @@ extern "C" {
|
|||||||
#define EXAMPLE_NETIF_DESC_ETH "example_netif_eth"
|
#define EXAMPLE_NETIF_DESC_ETH "example_netif_eth"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_EXAMPLE_CONNECT_THREAD
|
||||||
|
#define EXAMPLE_NETIF_DESC_THREAD "example_netif_thread"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if CONFIG_EXAMPLE_CONNECT_PPP
|
#if CONFIG_EXAMPLE_CONNECT_PPP
|
||||||
#define EXAMPLE_NETIF_DESC_PPP "example_netif_ppp"
|
#define EXAMPLE_NETIF_DESC_PPP "example_netif_ppp"
|
||||||
#endif
|
#endif
|
||||||
@ -74,6 +78,9 @@ extern "C" {
|
|||||||
#elif CONFIG_EXAMPLE_CONNECT_WIFI
|
#elif CONFIG_EXAMPLE_CONNECT_WIFI
|
||||||
#define EXAMPLE_INTERFACE get_example_netif_from_desc(EXAMPLE_NETIF_DESC_STA)
|
#define EXAMPLE_INTERFACE get_example_netif_from_desc(EXAMPLE_NETIF_DESC_STA)
|
||||||
#define get_example_netif() get_example_netif_from_desc(EXAMPLE_NETIF_DESC_STA)
|
#define get_example_netif() get_example_netif_from_desc(EXAMPLE_NETIF_DESC_STA)
|
||||||
|
#elif CONFIG_EXAMPLE_CONNECT_THREAD
|
||||||
|
#define EXAMPLE_INTERFACE get_example_netif_from_desc(EXAMPLE_NETIF_DESC_THREAD)
|
||||||
|
#define get_example_netif() get_example_netif_from_desc(EXAMPLE_NETIF_DESC_THREAD)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Thread configurations for protocol examples
|
||||||
|
*
|
||||||
|
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <sdkconfig.h>
|
||||||
|
|
||||||
|
#include <esp_openthread_types.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_OPENTHREAD_RADIO_NATIVE
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.radio_mode = RADIO_MODE_NATIVE, \
|
||||||
|
}
|
||||||
|
|
||||||
|
#elif defined(CONFIG_OPENTHREAD_RADIO_SPINEL_UART)
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.radio_mode = RADIO_MODE_UART_RCP, \
|
||||||
|
.radio_uart_config = \
|
||||||
|
{ \
|
||||||
|
.port = CONFIG_EXAMPLE_THREAD_UART_PORT, \
|
||||||
|
.uart_config = \
|
||||||
|
{ \
|
||||||
|
.baud_rate = CONFIG_EXAMPLE_THREAD_UART_BAUD, \
|
||||||
|
.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 = CONFIG_EXAMPLE_THREAD_UART_RX_PIN, \
|
||||||
|
.tx_pin = CONFIG_EXAMPLE_THREAD_UART_TX_PIN, \
|
||||||
|
}, \
|
||||||
|
}
|
||||||
|
#elif defined(CONFIG_OPENTHREAD_RADIO_SPINEL_SPI)
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.radio_mode = RADIO_MODE_SPI_RCP, \
|
||||||
|
.radio_spi_config = \
|
||||||
|
{ \
|
||||||
|
.host_device = SPI2_HOST, \
|
||||||
|
.dma_channel = 2, \
|
||||||
|
.spi_interface = \
|
||||||
|
{ \
|
||||||
|
.mosi_io_num = CONFIG_EXAMPLE_THREAD_SPI_MOSI_PIN, \
|
||||||
|
.miso_io_num = CONFIG_EXAMPLE_THREAD_SPI_MISO_PIN, \
|
||||||
|
.sclk_io_num = CONFIG_EXAMPLE_THREAD_SPI_SCLK_PIN, \
|
||||||
|
.quadwp_io_num = -1, \
|
||||||
|
.quadhd_io_num = -1, \
|
||||||
|
}, \
|
||||||
|
.spi_device = \
|
||||||
|
{ \
|
||||||
|
.cs_ena_pretrans = 2, \
|
||||||
|
.input_delay_ns = 100, \
|
||||||
|
.mode = 0, \
|
||||||
|
.clock_speed_hz = 2500 * 1000, \
|
||||||
|
.spics_io_num = CONFIG_EXAMPLE_THREAD_SPI_CS_PIN, \
|
||||||
|
.queue_size = 5, \
|
||||||
|
}, \
|
||||||
|
.intr_pin = CONFIG_EXAMPLE_THREAD_SPI_INTR_PIN, \
|
||||||
|
}, \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_RADIO_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.radio_mode = RADIO_MODE_TREL, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_OPENTHREAD_CONSOLE_TYPE_UART
|
||||||
|
#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, \
|
||||||
|
}, \
|
||||||
|
}
|
||||||
|
#elif CONFIG_OPENTHREAD_CONSOLE_TYPE_USB_SERIAL_JTAG
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.host_connection_mode = HOST_CONNECTION_MODE_CLI_USB, \
|
||||||
|
.host_usb_config = USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(), \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_HOST_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.host_connection_mode = HOST_CONNECTION_MODE_NONE, \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ESP_OPENTHREAD_DEFAULT_PORT_CONFIG() \
|
||||||
|
{ \
|
||||||
|
.storage_partition_name = "nvs", \
|
||||||
|
.netif_queue_size = 10, \
|
||||||
|
.task_queue_size = 10, \
|
||||||
|
}
|
@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "esp_err.h"
|
||||||
|
#include "esp_event.h"
|
||||||
|
#include "esp_event_base.h"
|
||||||
|
#include "esp_vfs_eventfd.h"
|
||||||
|
#include "example_common_private.h"
|
||||||
|
#include "protocol_examples_common.h"
|
||||||
|
#include "protocol_examples_thread_config.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <esp_openthread_cli.h>
|
||||||
|
#include <esp_openthread_lock.h>
|
||||||
|
#include <esp_openthread_netif_glue.h>
|
||||||
|
#include <esp_openthread_types.h>
|
||||||
|
#include <esp_openthread.h>
|
||||||
|
#include <openthread/dataset.h>
|
||||||
|
#include <openthread/logging.h>
|
||||||
|
|
||||||
|
static TaskHandle_t s_ot_task_handle = NULL;
|
||||||
|
static esp_netif_t *s_openthread_netif = NULL;
|
||||||
|
static SemaphoreHandle_t s_semph_thread_attached = NULL;
|
||||||
|
static SemaphoreHandle_t s_semph_thread_set_dns_server = NULL;
|
||||||
|
static const char *TAG = "example_connect";
|
||||||
|
|
||||||
|
static void thread_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id,
|
||||||
|
void* event_data)
|
||||||
|
{
|
||||||
|
if (event_base == OPENTHREAD_EVENT) {
|
||||||
|
if (event_id == OPENTHREAD_EVENT_ATTACHED) {
|
||||||
|
xSemaphoreGive(s_semph_thread_attached);
|
||||||
|
} else if (event_id == OPENTHREAD_EVENT_SET_DNS_SERVER) {
|
||||||
|
xSemaphoreGive(s_semph_thread_set_dns_server);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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(),
|
||||||
|
};
|
||||||
|
|
||||||
|
esp_netif_inherent_config_t esp_netif_config = ESP_NETIF_INHERENT_DEFAULT_OPENTHREAD();
|
||||||
|
esp_netif_config.if_desc = EXAMPLE_NETIF_DESC_THREAD;
|
||||||
|
esp_netif_config_t cfg = {
|
||||||
|
.base = &esp_netif_config,
|
||||||
|
.stack = &g_esp_netif_netstack_default_openthread,
|
||||||
|
};
|
||||||
|
s_openthread_netif = esp_netif_new(&cfg);
|
||||||
|
assert(s_openthread_netif != NULL);
|
||||||
|
|
||||||
|
// Initialize the OpenThread stack
|
||||||
|
ESP_ERROR_CHECK(esp_openthread_init(&config));
|
||||||
|
ESP_ERROR_CHECK(esp_netif_attach(s_openthread_netif, esp_openthread_netif_glue_init(&config)));
|
||||||
|
esp_openthread_lock_acquire(portMAX_DELAY);
|
||||||
|
(void)otLoggingSetLevel(CONFIG_LOG_DEFAULT_LEVEL);
|
||||||
|
esp_openthread_cli_init();
|
||||||
|
esp_openthread_cli_create_task();
|
||||||
|
otOperationalDatasetTlvs dataset;
|
||||||
|
otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset);
|
||||||
|
if (error != OT_ERROR_NONE) {
|
||||||
|
ESP_ERROR_CHECK(esp_openthread_auto_start(NULL));
|
||||||
|
} else {
|
||||||
|
ESP_ERROR_CHECK(esp_openthread_auto_start(&dataset));
|
||||||
|
}
|
||||||
|
esp_openthread_lock_release();
|
||||||
|
|
||||||
|
// Run the main loop
|
||||||
|
esp_openthread_launch_mainloop();
|
||||||
|
|
||||||
|
// Clean up
|
||||||
|
esp_openthread_netif_glue_deinit();
|
||||||
|
esp_netif_destroy(s_openthread_netif);
|
||||||
|
esp_vfs_eventfd_unregister();
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tear down connection, release resources */
|
||||||
|
void example_thread_shutdown(void)
|
||||||
|
{
|
||||||
|
vTaskDelete(s_ot_task_handle);
|
||||||
|
esp_openthread_netif_glue_deinit();
|
||||||
|
esp_netif_destroy(s_openthread_netif);
|
||||||
|
esp_vfs_eventfd_unregister();
|
||||||
|
vSemaphoreDelete(s_semph_thread_set_dns_server);
|
||||||
|
vSemaphoreDelete(s_semph_thread_attached);
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t example_thread_connect(void)
|
||||||
|
{
|
||||||
|
s_semph_thread_attached = xSemaphoreCreateBinary();
|
||||||
|
if (s_semph_thread_attached == NULL) {
|
||||||
|
return ESP_ERR_NO_MEM;
|
||||||
|
}
|
||||||
|
s_semph_thread_set_dns_server = xSemaphoreCreateBinary();
|
||||||
|
if (s_semph_thread_set_dns_server == NULL) {
|
||||||
|
vSemaphoreDelete(s_semph_thread_attached);
|
||||||
|
return ESP_ERR_NO_MEM;
|
||||||
|
}
|
||||||
|
// 4 eventfds might be used for Thread
|
||||||
|
// * netif
|
||||||
|
// * ot task queue
|
||||||
|
// * radio driver
|
||||||
|
// * border router
|
||||||
|
esp_vfs_eventfd_config_t eventfd_config = {
|
||||||
|
.max_fds = 4,
|
||||||
|
};
|
||||||
|
esp_vfs_eventfd_register(&eventfd_config);
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_register(OPENTHREAD_EVENT, ESP_EVENT_ANY_ID, thread_event_handler, NULL));
|
||||||
|
if (xTaskCreate(ot_task_worker, "ot_br_main", CONFIG_EXAMPLE_THREAD_TASK_STACK_SIZE, NULL, 5, &s_ot_task_handle) != pdPASS) {
|
||||||
|
vSemaphoreDelete(s_semph_thread_attached);
|
||||||
|
vSemaphoreDelete(s_semph_thread_set_dns_server);
|
||||||
|
ESP_LOGE(TAG, "Failed to create openthread task");
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
xSemaphoreTake(s_semph_thread_attached, portMAX_DELAY);
|
||||||
|
// Wait 1s for the Thread device to set its DNS server with the NAT64 prefix.
|
||||||
|
if (xSemaphoreTake(s_semph_thread_set_dns_server, 1000 / portTICK_PERIOD_MS) != pdPASS) {
|
||||||
|
ESP_LOGW(TAG, "DNS server is not set for the Thread device, might be unable to access the Internet");
|
||||||
|
}
|
||||||
|
return ESP_OK;
|
||||||
|
}
|
@ -13,6 +13,8 @@
|
|||||||
depends_filepatterns:
|
depends_filepatterns:
|
||||||
- examples/common_components/iperf/*
|
- examples/common_components/iperf/*
|
||||||
- examples/common_components/iperf/**/*
|
- examples/common_components/iperf/**/*
|
||||||
|
- examples/common_components/protocol_examples_common/*
|
||||||
|
- examples/common_components/protocol_examples_common/**/*
|
||||||
- examples/openthread/*
|
- examples/openthread/*
|
||||||
- examples/openthread/**/*
|
- examples/openthread/**/*
|
||||||
|
|
||||||
|
@ -47,6 +47,9 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y
|
|||||||
CONFIG_MDNS_MULTIPLE_INSTANCE=y
|
CONFIG_MDNS_MULTIPLE_INSTANCE=y
|
||||||
# end of mDNS
|
# end of mDNS
|
||||||
|
|
||||||
|
# Example connect
|
||||||
|
CONFIG_EXAMPLE_CONNECT_THREAD=n
|
||||||
|
|
||||||
#
|
#
|
||||||
# ESP System Settings
|
# ESP System Settings
|
||||||
#
|
#
|
||||||
|
@ -41,3 +41,6 @@ CONFIG_LWIP_IPV6_AUTOCONFIG=y
|
|||||||
# Configurations for optimizing the size of firmware
|
# Configurations for optimizing the size of firmware
|
||||||
#
|
#
|
||||||
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
|
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
|
||||||
|
|
||||||
|
# Example connect
|
||||||
|
CONFIG_EXAMPLE_CONNECT_THREAD=n
|
||||||
|
4
examples/protocols/sntp/sdkconfig.defaults.esp32h2
Normal file
4
examples/protocols/sntp/sdkconfig.defaults.esp32h2
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_IDF_TARGET="esp32h2"
|
||||||
|
CONFIG_MBEDTLS_CMAC_C=y
|
||||||
|
CONFIG_OPENTHREAD_ENABLED=y
|
||||||
|
CONFIG_OPENTHREAD_DNS64_CLIENT=y
|
Reference in New Issue
Block a user