Skip to content

Commit e89eafd

Browse files
committed
feat(openthread): add a callback to handle rcp reset failure
1 parent dc91d32 commit e89eafd

File tree

7 files changed

+81
-18
lines changed

7 files changed

+81
-18
lines changed

components/openthread/include/esp_openthread_spinel.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ void esp_openthread_register_rcp_failure_handler(esp_openthread_rcp_failure_hand
2929
*/
3030
void esp_openthread_set_compatibility_error_callback(esp_openthread_compatibility_error_callback callback);
3131

32+
/**
33+
* @brief Registers the callback for co-processor reset failure.
34+
*
35+
* @note This function should be called before esp_openthread_init.
36+
*
37+
* @param[in] callback The callback.
38+
*
39+
*/
40+
void esp_openthread_set_coprocessor_reset_failure_callback(esp_openthread_coprocessor_reset_failure_callback callback);
41+
3242
/**
3343
* @brief Deinitializes the connection to RCP.
3444
*

components/openthread/include/esp_openthread_types.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@ typedef void (*esp_openthread_rcp_failure_handler)(void);
210210
*/
211211
typedef void (*esp_openthread_compatibility_error_callback)(void);
212212

213+
/**
214+
* @brief The OpenThread co-processor reset failure callback
215+
*
216+
*/
217+
typedef void (*esp_openthread_coprocessor_reset_failure_callback)(void);
218+
213219
#ifdef __cplusplus
214220
}
215221
#endif

components/openthread/include/esp_radio_spinel.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -47,6 +47,7 @@ typedef void (*esp_radio_spinel_rcp_failure_handler)(void);
4747
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.*/
4848
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.*/
4949
typedef void (*esp_radio_spinel_compatibility_error_callback)(void);
50+
typedef void (*esp_radio_spinel_coprocessor_reset_failure_callback)(void);
5051

5152
typedef struct
5253
{
@@ -402,6 +403,16 @@ esp_err_t esp_radio_spinel_rcp_version_get(char *running_rcp_version, esp_radio_
402403
*/
403404
void esp_radio_spinel_set_compatibility_error_callback(esp_radio_spinel_compatibility_error_callback callback);
404405

406+
/**
407+
* @brief Registers the callback for co-processor reset failure.
408+
*
409+
* @note This function should be called before esp_radio_spinel_init.
410+
*
411+
* @param[in] callback The callback.
412+
*
413+
*/
414+
void esp_radio_spinel_set_coprocessor_reset_failure_callback(esp_radio_spinel_coprocessor_reset_failure_callback callback);
415+
405416
#ifdef __cplusplus
406417
}
407418
#endif

components/openthread/private_include/openthread-core-esp32x-ftd-config.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,15 @@
504504
#define OPENTHREAD_POSIX_CONFIG_RCP_TIME_SYNC_INTERVAL (60 * 1000 * 1000)
505505
#endif
506506

507+
/**
508+
* @def OPENTHREAD_SPINEL_CONFIG_COPROCESSOR_RESET_FAILURE_CALLBACK_ENABLE
509+
*
510+
* Enables co-processor reset failure callback in Spinel driver
511+
*/
512+
#ifndef OPENTHREAD_SPINEL_CONFIG_COPROCESSOR_RESET_FAILURE_CALLBACK_ENABLE
513+
#define OPENTHREAD_SPINEL_CONFIG_COPROCESSOR_RESET_FAILURE_CALLBACK_ENABLE 1
514+
#endif
515+
507516
#endif // CONFIG_OPENTHREAD_RADIO_SPINEL_UART || CONFIG_OPENTHREAD_RADIO_SPINEL_SPI
508517

509518
#if CONFIG_OPENTHREAD_LINK_METRICS

components/openthread/private_include/openthread-core-esp32x-spinel-config.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -67,3 +67,12 @@
6767
#ifndef OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE
6868
#define OPENTHREAD_SPINEL_CONFIG_COMPATIBILITY_ERROR_CALLBACK_ENABLE 1
6969
#endif
70+
71+
/**
72+
* @def OPENTHREAD_SPINEL_CONFIG_COPROCESSOR_RESET_FAILURE_CALLBACK_ENABLE
73+
*
74+
* Enables co-processor reset failure callback in Spinel driver
75+
*/
76+
#ifndef OPENTHREAD_SPINEL_CONFIG_COPROCESSOR_RESET_FAILURE_CALLBACK_ENABLE
77+
#define OPENTHREAD_SPINEL_CONFIG_COPROCESSOR_RESET_FAILURE_CALLBACK_ENABLE 1
78+
#endif

components/openthread/src/port/esp_openthread_radio_spinel.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,9 @@ static otRadioCaps s_radio_caps = (OT_RADIO_CAPS_ENERGY_SCAN |
5454
OT_RADIO_CAPS_SLEEP_TO_TX);
5555

5656
static const char *radiospinel_workflow = "radio_spinel";
57-
5857
static const esp_openthread_radio_config_t *s_esp_openthread_radio_config = NULL;
59-
6058
static esp_openthread_compatibility_error_callback s_compatibility_error_callback = NULL;
61-
59+
static esp_openthread_coprocessor_reset_failure_callback s_coprocessor_reset_failure_callback = NULL;
6260
static char s_internal_rcp_version[OT_SPINEL_RCP_VERSION_MAX_SIZE] = {'\0'};
6361

6462
static void esp_openthread_radio_config_set(const esp_openthread_radio_config_t *config)
@@ -74,19 +72,27 @@ static const esp_openthread_radio_config_t *esp_openthread_radio_config_get(void
7472
static void ot_spinel_compatibility_error_callback(void *context)
7573
{
7674
OT_UNUSED_VARIABLE(context);
77-
if (s_compatibility_error_callback) {
78-
s_compatibility_error_callback();
79-
} else {
80-
ESP_LOGE(OT_PLAT_LOG_TAG, "None callback to handle compatibility error of openthread spinel");
81-
assert(false);
82-
}
75+
assert(s_compatibility_error_callback);
76+
s_compatibility_error_callback();
77+
}
78+
79+
static void ot_spinel_coprocessor_reset_failure_callback(void *context)
80+
{
81+
OT_UNUSED_VARIABLE(context);
82+
assert(s_coprocessor_reset_failure_callback);
83+
s_coprocessor_reset_failure_callback();
8384
}
8485

8586
void esp_openthread_set_compatibility_error_callback(esp_openthread_compatibility_error_callback callback)
8687
{
8788
s_compatibility_error_callback = callback;
8889
}
8990

91+
void esp_openthread_set_coprocessor_reset_failure_callback(esp_openthread_coprocessor_reset_failure_callback callback)
92+
{
93+
s_coprocessor_reset_failure_callback = callback;
94+
}
95+
9096
esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *config)
9197
{
9298
spinel_iid_t iidList[ot::Spinel::kSpinelHeaderMaxNumIid];
@@ -112,6 +118,7 @@ esp_err_t esp_openthread_radio_init(const esp_openthread_platform_config_t *conf
112118
ESP_RETURN_ON_ERROR(s_spinel_interface.GetSpinelInterface().Enable(config->radio_config.radio_spi_config), OT_PLAT_LOG_TAG,
113119
"Spinel interface init failed");
114120
#endif
121+
s_spinel_driver.SetCoprocessorResetFailureCallback(ot_spinel_coprocessor_reset_failure_callback, esp_openthread_get_instance());
115122
s_spinel_driver.Init(s_spinel_interface.GetSpinelInterface(), true, iidList, ot::Spinel::kSpinelHeaderMaxNumIid);
116123
if (strlen(s_internal_rcp_version) > 0) {
117124
const char *running_rcp_version = s_spinel_driver.GetVersion();

components/openthread/src/spinel/esp_radio_spinel.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -42,6 +42,7 @@ static otRadioCaps s_radio_caps = (OT_RADIO_CAPS_ENERGY_SCAN |
4242
OT_RADIO_CAPS_SLEEP_TO_TX);
4343

4444
static esp_radio_spinel_compatibility_error_callback s_radio_spinel_compatibility_error_callback = NULL;
45+
static esp_radio_spinel_coprocessor_reset_failure_callback s_radio_spinel_coprocessor_reset_failure_callback = NULL;
4546

4647
static esp_radio_spinel_idx_t get_index_from_instance(otInstance *instance)
4748
{
@@ -74,19 +75,27 @@ static void esp_radio_spinel_restore_vendor_properities(void *context)
7475
static void radio_spinel_compatibility_error_callback(void *context)
7576
{
7677
OT_UNUSED_VARIABLE(context);
77-
if (s_radio_spinel_compatibility_error_callback) {
78-
s_radio_spinel_compatibility_error_callback();
79-
} else {
80-
ESP_LOGE(ESP_SPINEL_LOG_TAG, "None callback to handle compatibility error of openthread spinel");
81-
assert(false);
82-
}
78+
assert(s_radio_spinel_compatibility_error_callback);
79+
s_radio_spinel_compatibility_error_callback();
80+
}
81+
82+
static void radio_spinel_coprocessor_reset_failure_callback(void *context)
83+
{
84+
OT_UNUSED_VARIABLE(context);
85+
assert(s_radio_spinel_coprocessor_reset_failure_callback);
86+
s_radio_spinel_coprocessor_reset_failure_callback();
8387
}
8488

8589
void esp_radio_spinel_set_compatibility_error_callback(esp_radio_spinel_compatibility_error_callback callback)
8690
{
8791
s_radio_spinel_compatibility_error_callback = callback;
8892
}
8993

94+
void esp_radio_spinel_set_coprocessor_reset_failure_callback(esp_radio_spinel_coprocessor_reset_failure_callback callback)
95+
{
96+
s_radio_spinel_coprocessor_reset_failure_callback = callback;
97+
}
98+
9099
void ReceiveDone(otInstance *aInstance, otRadioFrame *aFrame, otError aError)
91100
{
92101
esp_radio_spinel_idx_t idx = get_index_from_instance(aInstance);
@@ -232,6 +241,7 @@ void esp_radio_spinel_set_callbacks(const esp_radio_spinel_callbacks_t aCallback
232241
{
233242
s_esp_radio_spinel_callbacks[idx] = aCallbacks;
234243
RadioSpinelCallbacks Callbacks;
244+
memset(&Callbacks, 0, sizeof(Callbacks));
235245
Callbacks.mReceiveDone = ReceiveDone;
236246
Callbacks.mTransmitDone = TransmitDone;
237247
Callbacks.mEnergyScanDone = EnergyScanDone;
@@ -266,6 +276,7 @@ void esp_radio_spinel_init(esp_radio_spinel_idx_t idx)
266276

267277
// Multipan is not currently supported
268278
iidList[0] = 0;
279+
s_spinel_driver[idx].SetCoprocessorResetFailureCallback(radio_spinel_coprocessor_reset_failure_callback, instance);
269280
s_spinel_driver[idx].Init(s_spinel_interface[idx].GetSpinelInterface(), true, iidList, ot::Spinel::kSpinelHeaderMaxNumIid);
270281
s_radio[idx].SetCompatibilityErrorCallback(radio_spinel_compatibility_error_callback, instance);
271282
s_radio[idx].Init(/*skip_rcp_compatibility_check=*/false, /*reset_radio=*/true, &s_spinel_driver[idx], s_radio_caps, false);

0 commit comments

Comments
 (0)