mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 19:24:33 +02:00
Merge branch 'backport/openthread_related_feature_v54_20241112' into 'release/v5.4'
Backport openthread related features to 5.4 See merge request espressif/esp-idf!34834
This commit is contained in:
@@ -18,6 +18,8 @@ typedef enum {
|
||||
void esp_coex_ieee802154_txrx_pti_set(ieee802154_coex_event_t event);
|
||||
void esp_coex_ieee802154_ack_pti_set(ieee802154_coex_event_t event);
|
||||
void esp_coex_ieee802154_coex_break_notify(void);
|
||||
void esp_coex_ieee802154_extcoex_tx_stage(void);
|
||||
void esp_coex_ieee802154_extcoex_rx_stage(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
Submodule components/esp_coex/lib updated: 9baa4202b6...ad30777643
@@ -341,8 +341,23 @@ IEEE802154_NOINLINE IEEE802154_STATIC bool stop_current_operation(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
FORCE_INLINE_ATTR void extcoex_tx_stage_start(void)
|
||||
{
|
||||
#if CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE
|
||||
esp_coex_ieee802154_extcoex_tx_stage();
|
||||
#endif
|
||||
}
|
||||
|
||||
FORCE_INLINE_ATTR void extcoex_rx_stage_start(void)
|
||||
{
|
||||
#if CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE
|
||||
esp_coex_ieee802154_extcoex_rx_stage();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void enable_rx(void)
|
||||
{
|
||||
extcoex_rx_stage_start();
|
||||
set_next_rx_buffer();
|
||||
IEEE802154_SET_TXRX_PTI(IEEE802154_SCENE_RX);
|
||||
|
||||
@@ -403,6 +418,7 @@ static IRAM_ATTR void isr_handle_tx_done(void)
|
||||
NEEDS_NEXT_OPT(true);
|
||||
} else if (s_ieee802154_state == IEEE802154_STATE_TX || s_ieee802154_state == IEEE802154_STATE_TX_CCA) {
|
||||
if (ieee802154_frame_is_ack_required(s_tx_frame) && ieee802154_ll_get_rx_auto_ack()) {
|
||||
extcoex_rx_stage_start();
|
||||
ieee802154_set_state(IEEE802154_STATE_RX_ACK);
|
||||
#if !CONFIG_IEEE802154_TEST
|
||||
receive_ack_timeout_timer_start(200000); // 200ms for receive ack timeout
|
||||
@@ -423,6 +439,7 @@ static IRAM_ATTR void isr_handle_rx_done(void)
|
||||
if (s_ieee802154_state == IEEE802154_STATE_RX) {
|
||||
if (ieee802154_frame_is_ack_required(s_rx_frame[s_rx_index]) && ieee802154_frame_get_version(s_rx_frame[s_rx_index]) <= IEEE802154_FRAME_VERSION_1
|
||||
&& ieee802154_ll_get_tx_auto_ack()) {
|
||||
extcoex_tx_stage_start();
|
||||
// auto tx ack only works for the frame with version 0b00 and 0b01
|
||||
s_rx_frame_info[s_rx_index].pending = ieee802154_ack_config_pending_bit(s_rx_frame[s_rx_index]);
|
||||
ieee802154_set_state(IEEE802154_STATE_TX_ACK);
|
||||
@@ -432,6 +449,7 @@ static IRAM_ATTR void isr_handle_rx_done(void)
|
||||
s_rx_frame_info[s_rx_index].pending = ieee802154_ack_config_pending_bit(s_rx_frame[s_rx_index]);
|
||||
// For 2015 enh-ack, SW should generate an enh-ack then send it manually
|
||||
if (esp_ieee802154_enh_ack_generator(s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index], s_enh_ack_frame) == ESP_OK) {
|
||||
extcoex_tx_stage_start();
|
||||
#if !CONFIG_IEEE802154_TEST
|
||||
// Send the Enh-Ack frame if generator succeeds.
|
||||
ieee802154_ll_set_tx_addr(s_enh_ack_frame);
|
||||
@@ -456,6 +474,7 @@ static IRAM_ATTR void isr_handle_rx_done(void)
|
||||
|
||||
static IRAM_ATTR void isr_handle_ack_tx_done(void)
|
||||
{
|
||||
extcoex_rx_stage_start();
|
||||
ieee802154_receive_done((uint8_t *)s_rx_frame[s_rx_index], &s_rx_frame_info[s_rx_index]);
|
||||
NEEDS_NEXT_OPT(true);
|
||||
}
|
||||
@@ -832,6 +851,7 @@ IEEE802154_STATIC void tx_init(const uint8_t *frame)
|
||||
// set rx pointer for ack frame
|
||||
set_next_rx_buffer();
|
||||
}
|
||||
extcoex_tx_stage_start();
|
||||
}
|
||||
|
||||
static inline esp_err_t ieee802154_transmit_internal(const uint8_t *frame, bool cca)
|
||||
|
@@ -278,12 +278,20 @@ menu "OpenThread"
|
||||
help
|
||||
Select this option to enable border router features in OpenThread.
|
||||
|
||||
config OPENTHREAD_PLATFORM_MSGPOOL_MANAGEMENT
|
||||
bool 'Allocate message pool buffer from PSRAM'
|
||||
menu "Thread Memory Allocation Config"
|
||||
depends on OPENTHREAD_ENABLED && (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC)
|
||||
default n
|
||||
help
|
||||
If enabled, the message pool is managed by platform defined logic.
|
||||
config OPENTHREAD_MEM_ALLOC_EXTERNAL
|
||||
bool 'Allocate memory from PSRAM'
|
||||
default y
|
||||
help
|
||||
Select this option to allocate buffer from PSRAM for Thread
|
||||
|
||||
config OPENTHREAD_PLATFORM_MSGPOOL_MANAGEMENT
|
||||
bool 'Allocate message pool buffer from PSRAM'
|
||||
default n
|
||||
help
|
||||
If enabled, the message pool is managed by platform defined logic.
|
||||
endmenu
|
||||
|
||||
config OPENTHREAD_NUM_MESSAGE_BUFFERS
|
||||
int "The number of openthread message buffers"
|
||||
|
@@ -66,6 +66,16 @@ esp_netif_t *esp_openthread_get_backbone_netif(void);
|
||||
*/
|
||||
void esp_openthread_register_rcp_failure_handler(esp_openthread_rcp_failure_handler handler);
|
||||
|
||||
/**
|
||||
* @brief Registers the callback for spinel compatibility error.
|
||||
*
|
||||
* @note This function must be called before esp_openthread_init.
|
||||
*
|
||||
* @param[in] callback The callback.
|
||||
*
|
||||
*/
|
||||
void esp_openthread_set_compatibility_error_callback(esp_openthread_compatibility_error_callback callback);
|
||||
|
||||
/**
|
||||
* @brief Deinitializes the connection to RCP.
|
||||
*
|
||||
|
@@ -200,6 +200,8 @@ typedef struct {
|
||||
|
||||
typedef void (*esp_openthread_rcp_failure_handler)(void);
|
||||
|
||||
typedef void (*esp_openthread_compatibility_error_callback)(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -46,6 +46,7 @@ typedef struct {
|
||||
typedef void (*esp_radio_spinel_rcp_failure_handler)(void); /* The handler for rcp failure.*/
|
||||
typedef esp_err_t (*esp_radio_spinel_uart_init_handler)(const esp_radio_spinel_uart_config_t *uart_config_t, int *uart_fd); /* The handler for UART initialization.*/
|
||||
typedef esp_err_t (*esp_radio_spinel_uart_deinit_handler)(const esp_radio_spinel_uart_config_t *uart_config_t, int *uart_fd); /* The handler for UART deinitialization.*/
|
||||
typedef void (*esp_radio_spinel_compatibility_error_callback)(void);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -391,6 +392,16 @@ esp_err_t esp_radio_spinel_rcp_deinit(esp_radio_spinel_idx_t idx);
|
||||
*/
|
||||
esp_err_t esp_radio_spinel_rcp_version_get(char *running_rcp_version, esp_radio_spinel_idx_t idx);
|
||||
|
||||
/**
|
||||
* @brief Registers the callback for spinel compatibility error.
|
||||
*
|
||||
* @note This function must be called before esp_radio_spinel_init.
|
||||
*
|
||||
* @param[in] callback The callback.
|
||||
*
|
||||
*/
|
||||
void esp_radio_spinel_set_compatibility_error_callback(esp_radio_spinel_compatibility_error_callback callback);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
28
components/openthread/include/esp_radio_spinel_platform.h
Normal file
28
components/openthread/include/esp_radio_spinel_platform.h
Normal file
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get frame counter.
|
||||
*
|
||||
* @param[in] idx The index of 802.15.4 related protocol stack.
|
||||
*
|
||||
* @return
|
||||
* - The frame counter
|
||||
*
|
||||
*/
|
||||
uint32_t esp_radio_spinel_extern_get_frame_counter(esp_radio_spinel_idx_t idx);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
Submodule components/openthread/lib updated: 56af58057c...55f18e4cc6
Submodule components/openthread/openthread updated: f32c18bc08...005c5cefc2
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "esp_heap_caps.h"
|
||||
#include <utility>
|
||||
#include "common/new.hpp"
|
||||
|
||||
template <typename T, typename... Args>
|
||||
inline T *New(uint32_t alloc_caps, Args &&...args)
|
||||
{
|
||||
void *p = heap_caps_calloc(1, sizeof(T), alloc_caps);
|
||||
if (p != nullptr) {
|
||||
return new (p) T(std::forward<Args>(args)...);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
@@ -84,7 +84,7 @@ void esp_openthread_platform_workflow_unregister(const char *name);
|
||||
* @brief Initializes the platform-specific support for the OpenThread stack.
|
||||
*
|
||||
* @note This function is not called by and will not call the OpenThread library.
|
||||
* The user needs to call otInstanceInitSingle to intialize the OpenThread
|
||||
* The user needs to call otInstanceInitSingle to initialize the OpenThread
|
||||
* stack after calling this function.
|
||||
*
|
||||
* @param[in] init_config The initialization configuration.
|
||||
@@ -146,6 +146,15 @@ esp_err_t esp_openthread_platform_process(otInstance *instance, const esp_openth
|
||||
*
|
||||
*/
|
||||
void esp_openthread_set_storage_name(const char *name);
|
||||
|
||||
/**
|
||||
* @brief Gets the caps of memory allocation.
|
||||
*
|
||||
* @return
|
||||
* - The caps of the memory.
|
||||
*/
|
||||
uint32_t esp_openthread_get_alloc_caps(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // end of extern "C"
|
||||
#endif
|
||||
|
@@ -261,6 +261,16 @@
|
||||
#define OPENTHREAD_POSIX_CONFIG_RCP_TIME_SYNC_INTERVAL (60 * 1000 * 1000)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE
|
||||
*
|
||||
* Enables compatibility error callback in Spinel
|
||||
*/
|
||||
#ifndef OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE
|
||||
#define OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE 1
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@@ -73,6 +73,24 @@
|
||||
*/
|
||||
#define OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_CONFIG_COAP_API_ENABLE
|
||||
*
|
||||
* Define to 1 to enable the CoAP API.
|
||||
*
|
||||
*/
|
||||
#define OPENTHREAD_CONFIG_COAP_API_ENABLE 1
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
|
||||
*
|
||||
* Define to 1 to enable platform NETIF support.
|
||||
*
|
||||
*/
|
||||
#ifndef OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
|
||||
#define OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
|
||||
*
|
||||
|
@@ -41,7 +41,6 @@
|
||||
*
|
||||
*/
|
||||
#ifndef OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT
|
||||
// TZ-567: Set OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT to 3 after adding rcp failure notification mechanism
|
||||
#define OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT 3
|
||||
#endif
|
||||
|
||||
@@ -77,3 +76,23 @@
|
||||
#ifndef OPENTHREAD_CONFIG_MAC_MAX_CSMA_BACKOFFS_DIRECT
|
||||
#define OPENTHREAD_CONFIG_MAC_MAX_CSMA_BACKOFFS_DIRECT CONFIG_OPENTHREAD_MAC_MAX_CSMA_BACKOFFS_DIRECT
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE
|
||||
*
|
||||
* Enables compatibility error callback in Spinel
|
||||
*/
|
||||
#ifndef OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE
|
||||
#define OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE 1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @def OPENTHREAD_SPINEL_CONFIG_MAX_SRC_MATCH_ENTRIES
|
||||
*
|
||||
* Defines size of the local source match table used by RadioSpinel
|
||||
* when OPENTHREAD_SPINEL_CONFIG_RCP_RESTORATION_MAX_COUNT is used.
|
||||
*/
|
||||
#ifndef OPENTHREAD_SPINEL_CONFIG_MAX_SRC_MATCH_ENTRIES
|
||||
#define OPENTHREAD_SPINEL_CONFIG_MAX_SRC_MATCH_ENTRIES 12
|
||||
#endif
|
||||
|
@@ -5,4 +5,4 @@ supplier: 'Organization: Espressif Systems (Shanghai) CO LTD'
|
||||
originator: 'Organization: Google LLC'
|
||||
description: OpenThread released by Google is an open-source implementation of the Thread networking
|
||||
url: https://github.com/espressif/openthread
|
||||
hash: f32c18bc0840f400182456e58ae3900fc2fb4af7
|
||||
hash: 005c5cefc22aaf0396e4327ee7f2e0ad32a7733b
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include "esp_log.h"
|
||||
#include "esp_netif.h"
|
||||
#include "esp_openthread.h"
|
||||
#include "esp_openthread_border_router.h"
|
||||
#include "esp_openthread_common_macro.h"
|
||||
#include "esp_openthread_lock.h"
|
||||
#include "esp_openthread_netif_glue_priv.h"
|
||||
@@ -33,6 +34,7 @@
|
||||
#include "openthread/ip6.h"
|
||||
#include "openthread/link.h"
|
||||
#include "openthread/message.h"
|
||||
#include "openthread/platform/infra_if.h"
|
||||
#include "openthread/thread.h"
|
||||
|
||||
typedef struct {
|
||||
@@ -381,3 +383,16 @@ esp_netif_t *esp_openthread_get_netif(void)
|
||||
{
|
||||
return s_openthread_netif;
|
||||
}
|
||||
|
||||
otError otPlatGetInfraIfLinkLayerAddress(otInstance *aInstance, uint32_t aIfIndex, otPlatInfraIfLinkLayerAddress *aInfraIfLinkLayerAddress)
|
||||
{
|
||||
esp_netif_t *backbone_netif = esp_openthread_get_backbone_netif();
|
||||
if (esp_netif_get_netif_impl_index(backbone_netif) != aIfIndex) {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "Failed to get LL address, error: Invalid If index");
|
||||
return OT_ERROR_FAILED;
|
||||
} else {
|
||||
esp_netif_get_mac(backbone_netif, aInfraIfLinkLayerAddress->mAddress);
|
||||
aInfraIfLinkLayerAddress->mLength = 6;
|
||||
return OT_ERROR_NONE;
|
||||
}
|
||||
}
|
||||
|
@@ -204,3 +204,13 @@ esp_err_t esp_openthread_platform_process(otInstance *instance, const esp_openth
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
uint32_t esp_openthread_get_alloc_caps(void)
|
||||
{
|
||||
return
|
||||
#if CONFIG_OPENTHREAD_PLATFORM_MALLOC_CAP_SPIRAM
|
||||
(MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
|
||||
#else
|
||||
(MALLOC_CAP_DEFAULT | MALLOC_CAP_8BIT);
|
||||
#endif
|
||||
}
|
||||
|
@@ -54,6 +54,8 @@ static const char *radiospinel_workflow = "radio_spinel";
|
||||
|
||||
static const esp_openthread_radio_config_t *s_esp_openthread_radio_config = NULL;
|
||||
|
||||
static esp_openthread_compatibility_error_callback s_compatibility_error_callback = NULL;
|
||||
|
||||
static void esp_openthread_radio_config_set(const esp_openthread_radio_config_t *config)
|
||||
{
|
||||
s_esp_openthread_radio_config = config;
|
||||
@@ -64,6 +66,22 @@ static const esp_openthread_radio_config_t *esp_openthread_radio_config_get(void
|
||||
return s_esp_openthread_radio_config;
|
||||
}
|
||||
|
||||
static void ot_spinel_compatibility_error_callback(void *context)
|
||||
{
|
||||
OT_UNUSED_VARIABLE(context);
|
||||
if (s_compatibility_error_callback) {
|
||||
s_compatibility_error_callback();
|
||||
} else {
|
||||
ESP_LOGE(OT_PLAT_LOG_TAG, "None callback to handle compatibility error of openthread spinel");
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
void esp_openthread_set_compatibility_error_callback(esp_openthread_compatibility_error_callback callback)
|
||||
{
|
||||
s_compatibility_error_callback = callback;
|
||||
}
|
||||
|
||||
esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *config)
|
||||
{
|
||||
spinel_iid_t iidList[ot::Spinel::kSpinelHeaderMaxNumIid];
|
||||
@@ -89,7 +107,8 @@ esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *conf
|
||||
"Spinel interface init failed");
|
||||
#endif
|
||||
s_spinel_driver.Init(s_spinel_interface.GetSpinelInterface(), true, iidList, ot::Spinel::kSpinelHeaderMaxNumIid);
|
||||
s_radio.Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver, s_radio_caps);
|
||||
s_radio.SetCompatibilityErrorCallback(ot_spinel_compatibility_error_callback, esp_openthread_get_instance());
|
||||
s_radio.Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver, s_radio_caps, /*RCP_time_sync=*/true);
|
||||
#if CONFIG_OPENTHREAD_RADIO_SPINEL_SPI // CONFIG_OPENTHREAD_RADIO_SPINEL_SPI
|
||||
ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().AfterRadioInit(), OT_PLAT_LOG_TAG, "Spinel interface init failed");
|
||||
#endif
|
||||
@@ -336,15 +355,15 @@ void otPlatRadioSetMacFrameCounter(otInstance *aInstance, uint32_t aMacFrameCoun
|
||||
}
|
||||
|
||||
#if CONFIG_OPENTHREAD_DIAG
|
||||
otError otPlatDiagProcess(otInstance *instance, int argc, char *argv[], char *output, size_t output_max_len)
|
||||
otError otPlatDiagProcess(otInstance *aInstance, uint8_t aArgsLength, char *aArgs[])
|
||||
{
|
||||
// deliver the platform specific diags commands to radio only ncp.
|
||||
char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE] = {'\0'};
|
||||
char *cur = cmd;
|
||||
char *end = cmd + sizeof(cmd);
|
||||
|
||||
for (int index = 0; index < argc; index++) {
|
||||
cur += snprintf(cur, static_cast<size_t>(end - cur), "%s ", argv[index]);
|
||||
for (int index = 0; index < aArgsLength; index++) {
|
||||
cur += snprintf(cur, static_cast<size_t>(end - cur), "%s ", aArgs[index]);
|
||||
}
|
||||
|
||||
return s_radio.PlatDiagProcess(cmd);
|
||||
|
@@ -10,9 +10,11 @@
|
||||
#include "platform/exit_code.h"
|
||||
#include "radio_spinel.hpp"
|
||||
#include "esp_radio_spinel.h"
|
||||
#include "esp_radio_spinel_platform.h"
|
||||
#include "esp_radio_spinel_adapter.hpp"
|
||||
#include "esp_radio_spinel_uart_interface.hpp"
|
||||
#include "spinel_driver.hpp"
|
||||
#include "openthread/link.h"
|
||||
|
||||
#define SPINEL_VENDOR_PROPERTY_BIT_PENDINGMODE BIT(0)
|
||||
#define SPINEL_VENDOR_PROPERTY_BIT_COORDINATOR BIT(1)
|
||||
@@ -39,6 +41,8 @@ static otRadioCaps s_radio_caps = (OT_RADIO_CAPS_ENERGY_SCAN |
|
||||
OT_RADIO_CAPS_ACK_TIMEOUT |
|
||||
OT_RADIO_CAPS_SLEEP_TO_TX);
|
||||
|
||||
static esp_radio_spinel_compatibility_error_callback s_radio_spinel_compatibility_error_callback = NULL;
|
||||
|
||||
static esp_radio_spinel_idx_t get_index_from_instance(otInstance *instance)
|
||||
{
|
||||
// TZ-563: Implement the function to get the esp radio spinel idx from otInstance for multipan rcp
|
||||
@@ -67,6 +71,22 @@ static void esp_radio_spinel_restore_vendor_properities(void *context)
|
||||
}
|
||||
}
|
||||
|
||||
static void radio_spinel_compatibility_error_callback(void *context)
|
||||
{
|
||||
OT_UNUSED_VARIABLE(context);
|
||||
if (s_radio_spinel_compatibility_error_callback) {
|
||||
s_radio_spinel_compatibility_error_callback();
|
||||
} else {
|
||||
ESP_LOGE(ESP_SPINEL_LOG_TAG, "None callback to handle compatibility error of openthread spinel");
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
void esp_openthread_set_compatibility_error_callback(esp_radio_spinel_compatibility_error_callback callback)
|
||||
{
|
||||
s_radio_spinel_compatibility_error_callback = callback;
|
||||
}
|
||||
|
||||
void ReceiveDone(otInstance *aInstance, otRadioFrame *aFrame, otError aError)
|
||||
{
|
||||
esp_radio_spinel_idx_t idx = get_index_from_instance(aInstance);
|
||||
@@ -242,12 +262,13 @@ esp_err_t esp_radio_spinel_uart_interface_enable(const esp_radio_spinel_uart_con
|
||||
void esp_radio_spinel_init(esp_radio_spinel_idx_t idx)
|
||||
{
|
||||
spinel_iid_t iidList[ot::Spinel::kSpinelHeaderMaxNumIid];
|
||||
otInstance *instance = get_instance_from_index(idx);
|
||||
|
||||
// Multipan is not currently supported
|
||||
iidList[0] = 0;
|
||||
s_spinel_driver[idx].Init(s_spinel_interface[idx].GetSpinelInterface(), true, iidList, ot::Spinel::kSpinelHeaderMaxNumIid);
|
||||
s_radio[idx].Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver[idx], s_radio_caps);
|
||||
otInstance *instance = get_instance_from_index(idx);
|
||||
s_radio[idx].SetCompatibilityErrorCallback(radio_spinel_compatibility_error_callback, instance);
|
||||
s_radio[idx].Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver[idx], s_radio_caps, false);
|
||||
s_radio[idx].SetVendorRestorePropertiesCallback(esp_radio_spinel_restore_vendor_properities, instance);
|
||||
}
|
||||
|
||||
@@ -405,6 +426,19 @@ esp_err_t esp_radio_spinel_set_rcp_ready(esp_radio_spinel_idx_t idx)
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// TZ-1261
|
||||
uint32_t otLinkGetFrameCounter(otInstance *aInstance)
|
||||
{
|
||||
esp_radio_spinel_idx_t idx = get_index_from_instance(aInstance);
|
||||
return esp_radio_spinel_extern_get_frame_counter(idx);
|
||||
}
|
||||
|
||||
__attribute__((weak)) uint32_t esp_radio_spinel_extern_get_frame_counter(esp_radio_spinel_idx_t idx)
|
||||
{
|
||||
ESP_LOGW(ESP_SPINEL_LOG_TAG, "None function to get frame counter");
|
||||
return 0;
|
||||
}
|
||||
|
||||
namespace ot {
|
||||
namespace Spinel {
|
||||
|
||||
|
@@ -144,7 +144,7 @@ def changeDeviceRole(dut:IdfDut, role:str) -> None:
|
||||
def getDataset(dut:IdfDut) -> str:
|
||||
clean_buffer(dut)
|
||||
execute_command(dut, 'dataset active -x')
|
||||
dut_data = dut.expect(r'\n(\w{212})\r', timeout=5)[1].decode()
|
||||
dut_data = dut.expect(r'\n(\w+)\r', timeout=5)[1].decode()
|
||||
return str(dut_data)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user