openthread: support automatic RCP update upon boot in border router

This commit is contained in:
Jiacheng Guo 2022-03-02 18:04:38 +08:00
parent 92b6fc5d1f
commit a080a41b41
7 changed files with 156 additions and 99 deletions

View File

@ -131,6 +131,10 @@ execute_process(
OUTPUT_VARIABLE OPENTHREAD_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(TIMESTAMP OT_BUILD_TIMESTAMP " %Y-%m-%d %H:%M:%S UTC" UTC)
set(OT_FULL_VERSION_STRING
"openthread-esp32/${IDF_VERSION_FOR_OPENTHREAD_PACKAGE}-${OPENTHREAD_VERSION}\; ${CONFIG_IDF_TARGET}\; ${OT_BUILD_TIMESTAMP}")
idf_component_register(SRC_DIRS "${src_dirs}"
EXCLUDE_SRCS "${exclude_srcs}"
INCLUDE_DIRS "${public_include_dirs}"
@ -152,7 +156,12 @@ if(CONFIG_OPENTHREAD_ENABLED)
"OPENTHREAD_CONFIG_FILE=\"openthread-core-esp32x-${CONFIG_FILE_TYPE}-config.h\""
"${device_type}"
PRIVATE
"PACKAGE_VERSION=\"${IDF_VERSION_FOR_OPENTHREAD_PACKAGE}-${OPENTHREAD_VERSION}\"")
"PACKAGE_VERSION=\"${IDF_VERSION_FOR_OPENTHREAD_PACKAGE}-${OPENTHREAD_VERSION}\""
"OPENTHREAD_BUILD_DATETIME=\"${OT_BUILD_TIMESTAMP}\""
)
if (CONFIG_OPENTHREAD_RADIO)
file(WRITE ${CMAKE_BINARY_DIR}/rcp_version ${OT_FULL_VERSION_STRING})
endif()
if(CONFIG_OPENTHREAD_ESP_LIB_FROM_INTERNAL_SRC)
idf_component_get_property(openthread_port_lib openthread_port COMPONENT_LIB)

View File

@ -60,6 +60,18 @@ esp_err_t esp_openthread_border_router_deinit(void);
*/
esp_netif_t *esp_openthread_get_backbone_netif(void);
/**
* @brief Registers the callback for RCP failure.
*
*/
void esp_openthread_register_rcp_failure_handler(esp_openthread_rcp_failure_handler handler);
/**
* @brief Deinitializes the conneciton to RCP.
*
*/
void esp_openthread_rcp_deinit();
#ifdef __cplusplus
}
#endif

View File

@ -39,7 +39,6 @@ esp_err_t esp_openthread_cli_input(const char *line);
*/
void esp_openthread_cli_create_task(void);
#ifdef __cplusplus
}
#endif

View File

@ -1,50 +0,0 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "esp_openthread.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief This function triggers an RCP firmware update.
*
* @return
* - ESP_OK
* - ESP_FAIL
*
*/
esp_err_t esp_openthread_rcp_update_start(void);
/**
* @brief This function writes sequential firmware update data to the RCP.
*
* @param[in] data The firmware data slice
* @param[in] size The data slice size
*
* @return
* - ESP_OK
* - ESP_FAIL
*
*/
esp_err_t esp_openthread_rcp_update_write(uint8_t *data, size_t size);
/**
* @brief This function commits the firmware update and reboots the RCP.
*
* @return
* - ESP_OK
* - ESP_FAIL
*
*/
esp_err_t esp_openthread_rcp_update_commit(void);
#ifdef __cplusplus
}
#endif

View File

@ -6,37 +6,42 @@
#pragma once
#include "hal/uart_types.h"
#include "sys/_stdint.h"
#include "sys/select.h"
#include <stdint.h>
#include <sys/select.h>
#include "esp_event_base.h"
#include "hal/uart_types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define RCP_FIRMWARE_DIR_SIZE 20
/**
* @brief OpenThread event declarations
*
*/
typedef enum {
OPENTHREAD_EVENT_START, /*!< OpenThread stack start */
OPENTHREAD_EVENT_STOP, /*!< OpenThread stack stop */
OPENTHREAD_EVENT_IF_UP, /*!< OpenThread network interface up */
OPENTHREAD_EVENT_IF_DOWN, /*!< OpenThread network interface down */
OPENTHREAD_EVENT_GOT_IP6, /*!< OpenThread stack added IPv6 address */
OPENTHREAD_EVENT_LOST_IP6, /*!< OpenThread stack removed IPv6 address */
OPENTHREAD_EVENT_MULTICAST_GROUP_JOIN, /*!< OpenThread stack joined IPv6 multicast group */
OPENTHREAD_EVENT_MULTICAST_GROUP_LEAVE, /*!< OpenThread stack left IPv6 multicast group */
OPENTHREAD_EVENT_TREL_ADD_IP6, /*!< OpenThread stack added TREL IPv6 address */
OPENTHREAD_EVENT_TREL_REMOVE_IP6, /*!< OpenThread stack removed TREL IPv6 address */
OPENTHREAD_EVENT_TREL_MULTICAST_GROUP_JOIN, /*!< OpenThread stack joined TREL IPv6 multicast group */
* @brief OpenThread event declarations
*
*/
typedef enum
{
OPENTHREAD_EVENT_START, /*!< OpenThread stack start */
OPENTHREAD_EVENT_STOP, /*!< OpenThread stack stop */
OPENTHREAD_EVENT_IF_UP, /*!< OpenThread network interface up */
OPENTHREAD_EVENT_IF_DOWN, /*!< OpenThread network interface down */
OPENTHREAD_EVENT_GOT_IP6, /*!< OpenThread stack added IPv6 address */
OPENTHREAD_EVENT_LOST_IP6, /*!< OpenThread stack removed IPv6 address */
OPENTHREAD_EVENT_MULTICAST_GROUP_JOIN, /*!< OpenThread stack joined IPv6 multicast group */
OPENTHREAD_EVENT_MULTICAST_GROUP_LEAVE, /*!< OpenThread stack left IPv6 multicast group */
OPENTHREAD_EVENT_TREL_ADD_IP6, /*!< OpenThread stack added TREL IPv6 address */
OPENTHREAD_EVENT_TREL_REMOVE_IP6, /*!< OpenThread stack removed TREL IPv6 address */
OPENTHREAD_EVENT_TREL_MULTICAST_GROUP_JOIN, /*!< OpenThread stack joined TREL IPv6 multicast group */
} esp_openthread_event_t;
/**
* @brief OpenThread event base declaration
*
*/
* @brief OpenThread event base declaration
*
*/
ESP_EVENT_DECLARE_BASE(OPENTHREAD_EVENT);
/**
@ -44,11 +49,11 @@ ESP_EVENT_DECLARE_BASE(OPENTHREAD_EVENT);
*
*/
typedef struct {
fd_set read_fds; /*!< The read file descriptors */
fd_set write_fds; /*!< The write file descriptors */
fd_set error_fds; /*!< The error file descriptors */
int max_fd; /*!< The max file descriptor */
struct timeval timeout; /*!< The timeout */
fd_set read_fds; /*!< The read file descriptors */
fd_set write_fds; /*!< The write file descriptors */
fd_set error_fds; /*!< The error file descriptors */
int max_fd; /*!< The max file descriptor */
struct timeval timeout; /*!< The timeout */
} esp_openthread_mainloop_context_t;
/**
@ -56,28 +61,30 @@ typedef struct {
*
*/
typedef struct {
uart_port_t port; /*!< UART port number */
uart_config_t uart_config; /*!< UART configuration, see uart_config_t docs */
int rx_pin; /*!< UART RX pin */
int tx_pin; /*!< UART TX pin */
uart_port_t port; /*!< UART port number */
uart_config_t uart_config; /*!< UART configuration, see uart_config_t docs */
int rx_pin; /*!< UART RX pin */
int tx_pin; /*!< UART TX pin */
} esp_openthread_uart_config_t;
/**
* @brief The radio mode of OpenThread.
*
*/
typedef enum {
RADIO_MODE_NATIVE = 0x0, /*!< Use the native 15.4 radio */
RADIO_MODE_UART_RCP = 0x1, /*!< UART connection to a 15.4 capable radio co-processor (RCP) */
RADIO_MODE_SPI_RCP = 0x2, /*!< SPI connection to a 15.4 capable radio co-processor (RCP) */
typedef enum
{
RADIO_MODE_NATIVE = 0x0, /*!< Use the native 15.4 radio */
RADIO_MODE_UART_RCP = 0x1, /*!< UART connection to a 15.4 capable radio co-processor (RCP) */
RADIO_MODE_SPI_RCP = 0x2, /*!< SPI connection to a 15.4 capable radio co-processor (RCP) */
} esp_openthread_radio_mode_t;
/**
* @brief How OpenThread connects to the host.
*
*/
typedef enum {
HOST_CONNECTION_MODE_NONE = 0x0, /*!< Disable host connection */
typedef enum
{
HOST_CONNECTION_MODE_NONE = 0x0, /*!< Disable host connection */
HOST_CONNECTION_MODE_CLI_UART = 0x1, /*!< CLI UART connection to the host */
HOST_CONNECTION_MODE_RCP_UART = 0x2, /*!< RCP UART connection to the host */
} esp_openthread_host_connection_mode_t;
@ -87,8 +94,8 @@ typedef enum {
*
*/
typedef struct {
esp_openthread_radio_mode_t radio_mode; /*!< The radio mode */
esp_openthread_uart_config_t radio_uart_config; /*!< The uart configuration to RCP */
esp_openthread_radio_mode_t radio_mode; /*!< The radio mode */
esp_openthread_uart_config_t radio_uart_config; /*!< The uart configuration to RCP */
} esp_openthread_radio_config_t;
/**
@ -96,8 +103,8 @@ typedef struct {
*
*/
typedef struct {
esp_openthread_host_connection_mode_t host_connection_mode; /*!< The host connection mode */
esp_openthread_uart_config_t host_uart_config; /*!< The uart configuration to host */
esp_openthread_host_connection_mode_t host_connection_mode; /*!< The host connection mode */
esp_openthread_uart_config_t host_uart_config; /*!< The uart configuration to host */
} esp_openthread_host_connection_config_t;
/**
@ -115,11 +122,13 @@ typedef struct {
*
*/
typedef struct {
esp_openthread_radio_config_t radio_config; /*!< The radio configuration */
esp_openthread_host_connection_config_t host_config; /*!< The host connection configuration */
esp_openthread_port_config_t port_config; /*!< The port configuration */
esp_openthread_radio_config_t radio_config; /*!< The radio configuration */
esp_openthread_host_connection_config_t host_config; /*!< The host connection configuration */
esp_openthread_port_config_t port_config; /*!< The port configuration */
} esp_openthread_platform_config_t;
typedef void (*esp_openthread_rcp_failure_handler)(void);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,68 @@
/*
* Copyright (c) 2020, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes compile-time configuration constants for OpenThread.
*/
#ifndef OPENTHREAD_SPINEL_CONFIG_H_
#define OPENTHREAD_SPINEL_CONFIG_H_
/**
* @def OPENTHREAD_SPINEL_CONFIG_OPENTHREAD_MESSAGE_ENABLE
*
* Define 1 to enable feeding an OpenThread message to encoder/decoder.
*
*/
#ifndef OPENTHREAD_SPINEL_CONFIG_OPENTHREAD_MESSAGE_ENABLE
#define OPENTHREAD_SPINEL_CONFIG_OPENTHREAD_MESSAGE_ENABLE 0
#endif
/**
* @def OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT
*
* Defines the max count of RCP failures allowed to be recovered.
* 0 means to disable RCP failure recovering.
*
*/
#ifndef OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT
#define OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT 0
#endif
/**
* @def OPENTHREAD_SPINEL_CONFIG_RCP_CUSTOM_RESTORATION
*
* Define 1 to call the custom RCP failure handler on RCP failure.
*
*/
#ifndef OPENTHREAD_SPINEL_CONFIG_RCP_CUSTOM_RESTORATION
#define OPENTHREAD_SPINEL_CONFIG_RCP_CUSTOM_RESTORATION 0
#endif
#endif // OPENTHREAD_SPINEL_CONFIG_H_

View File

@ -77,7 +77,6 @@
*/
#define OPENTHREAD_CONFIG_COAP_API_ENABLE 1
/**
* @def OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
*
@ -191,7 +190,7 @@
#endif
/**
* @def OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
* @def oPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
*
* Define to 1 to enable Backbone Router support.
*
@ -200,6 +199,17 @@
#define OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE 1
#endif
/**
* @def OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT
*
* Defines the max count of RCP failures allowed to be recovered.
* 0 means to disable RCP failure recovering.
*
*/
#ifndef OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT
#define OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT 1
#endif
#endif // CONFIG_OPENTHREAD_BORDER_ROUTER
/**
@ -227,7 +237,7 @@
*
*/
#ifndef OPENTHREAD_CONFIG_DHCP6_CLIENT_ENABLE
#define OPENTHREAD_CONFIG_DHCP6_CLIENT_ENABLE 1
#define OPENTHREAD_CONFIG_DHCP6_CLIENT_ENABLE 0
#endif
/**
@ -237,7 +247,7 @@
*
*/
#ifndef OPENTHREAD_CONFIG_DHCP6_SERVER_ENABLE
#define OPENTHREAD_CONFIG_DHCP6_SERVER_ENABLE 1
#define OPENTHREAD_CONFIG_DHCP6_SERVER_ENABLE 0
#endif
/**