فهرست منبع

openthread: support automatic RCP update upon boot in border router

Jiacheng Guo 3 سال پیش
والد
کامیت
a080a41b41

+ 10 - 1
components/openthread/CMakeLists.txt

@@ -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)

+ 12 - 0
components/openthread/include/esp_openthread_border_router.h

@@ -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

+ 0 - 1
components/openthread/include/esp_openthread_cli.h

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

+ 0 - 50
components/openthread/include/esp_openthread_rcp_update.h

@@ -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

+ 52 - 43
components/openthread/include/esp_openthread_types.h

@@ -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

+ 68 - 0
components/openthread/openthread-spinel-config.h

@@ -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_

+ 14 - 4
components/openthread/private_include/openthread-core-esp32x-ftd-config.h

@@ -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
 
 /**