From 674f322b8709a953e04085c0b03cb307debab6b5 Mon Sep 17 00:00:00 2001 From: InfiniteYuan Date: Fri, 27 May 2022 13:07:29 +0800 Subject: [PATCH] feat: ble mesh: improve ble mesh deinit when nimble enable --- .../api/core/esp_ble_mesh_common_api.c | 29 +++++++++++++++-- .../bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c | 2 ++ .../btc/include/btc_ble_mesh_prov.h | 1 + .../bluedroid_host/mesh_bearer_adapt.c | 5 +++ .../mesh_core/include/mesh_bearer_adapt.h | 1 + .../mesh_core/nimble_host/mesh_bearer_adapt.c | 32 ++++++++++++++++--- 6 files changed, 64 insertions(+), 6 deletions(-) diff --git a/components/bt/esp_ble_mesh/api/core/esp_ble_mesh_common_api.c b/components/bt/esp_ble_mesh/api/core/esp_ble_mesh_common_api.c index a469452f00..9a12de1710 100644 --- a/components/bt/esp_ble_mesh/api/core/esp_ble_mesh_common_api.c +++ b/components/bt/esp_ble_mesh/api/core/esp_ble_mesh_common_api.c @@ -65,7 +65,9 @@ esp_err_t esp_ble_mesh_init(esp_ble_mesh_prov_t *prov, esp_ble_mesh_comp_t *comp esp_err_t esp_ble_mesh_deinit(esp_ble_mesh_deinit_param_t *param) { btc_ble_mesh_prov_args_t arg = {0}; + SemaphoreHandle_t semaphore = NULL; btc_msg_t msg = {0}; + esp_err_t ret = ESP_OK; if (param == NULL) { return ESP_ERR_INVALID_ARG; @@ -73,13 +75,36 @@ esp_err_t esp_ble_mesh_deinit(esp_ble_mesh_deinit_param_t *param) ESP_BLE_HOST_STATUS_CHECK(ESP_BLE_HOST_STATUS_ENABLED); + // Create a semaphore + if ((semaphore = xSemaphoreCreateCounting(1, 0)) == NULL) { + BT_ERR("Failed to create semaphore"); + return ESP_ERR_NO_MEM; + } + arg.mesh_deinit.param.erase_flash = param->erase_flash; + /* Transport semaphore pointer to BTC layer, and will give the semaphore in the BTC task */ + arg.mesh_deinit.semaphore = semaphore; msg.sig = BTC_SIG_API_CALL; msg.pid = BTC_PID_PROV; msg.act = BTC_BLE_MESH_ACT_DEINIT_MESH; - return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_mesh_prov_args_t), NULL, NULL) - == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL); + if (btc_transfer_context(&msg, &arg, sizeof(btc_ble_mesh_prov_args_t), NULL, NULL) != BT_STATUS_SUCCESS) { + vSemaphoreDelete(semaphore); + BT_ERR("Failed to start mesh deinit"); + return ESP_FAIL; + } + + /* Take the Semaphore, wait BLE Mesh de-initialization to finish. */ + xSemaphoreTake(semaphore, portMAX_DELAY); + /* Don't forget to delete the semaphore at the end. */ + vSemaphoreDelete(semaphore); + + ret = bt_mesh_host_deinit(); + if (ret != ESP_OK) { + return ret; + } + + return ESP_OK; } #endif /* CONFIG_BLE_MESH_DEINIT */ diff --git a/components/bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c b/components/bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c index 3b4de44a7e..24d2104162 100644 --- a/components/bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c +++ b/components/bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c @@ -2268,6 +2268,8 @@ void btc_ble_mesh_prov_call_handler(btc_msg_t *msg) case BTC_BLE_MESH_ACT_DEINIT_MESH: act = ESP_BLE_MESH_DEINIT_MESH_COMP_EVT; param.deinit_mesh_comp.err_code = bt_mesh_deinit((struct bt_mesh_deinit_param *)&arg->mesh_deinit.param); + /* Give the semaphore when BLE Mesh de-initialization is finished. */ + xSemaphoreGive(arg->mesh_deinit.semaphore); break; #endif /* CONFIG_BLE_MESH_DEINIT */ default: diff --git a/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_prov.h b/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_prov.h index b9cd0156d5..c61159bcea 100644 --- a/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_prov.h +++ b/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_prov.h @@ -309,6 +309,7 @@ typedef union { } model_unsub_group_addr; struct ble_mesh_deinit_args { esp_ble_mesh_deinit_param_t param; + SemaphoreHandle_t semaphore; } mesh_deinit; } btc_ble_mesh_prov_args_t; diff --git a/components/bt/esp_ble_mesh/mesh_core/bluedroid_host/mesh_bearer_adapt.c b/components/bt/esp_ble_mesh/mesh_core/bluedroid_host/mesh_bearer_adapt.c index e93b228143..1b0972c73f 100644 --- a/components/bt/esp_ble_mesh/mesh_core/bluedroid_host/mesh_bearer_adapt.c +++ b/components/bt/esp_ble_mesh/mesh_core/bluedroid_host/mesh_bearer_adapt.c @@ -99,6 +99,11 @@ int bt_mesh_host_init(void) return 0; } +int bt_mesh_host_deinit(void) +{ + return 0; +} + void bt_mesh_hci_init(void) { const uint8_t *features = controller_get_interface()->get_features_ble()->as_array; diff --git a/components/bt/esp_ble_mesh/mesh_core/include/mesh_bearer_adapt.h b/components/bt/esp_ble_mesh/mesh_core/include/mesh_bearer_adapt.h index 7bd95c78e0..63ca8c3864 100644 --- a/components/bt/esp_ble_mesh/mesh_core/include/mesh_bearer_adapt.h +++ b/components/bt/esp_ble_mesh/mesh_core/include/mesh_bearer_adapt.h @@ -659,6 +659,7 @@ struct bt_mesh_gatt_attr { } int bt_mesh_host_init(void); +int bt_mesh_host_deinit(void); int bt_le_adv_start(const struct bt_mesh_adv_param *param, const struct bt_mesh_adv_data *ad, size_t ad_len, diff --git a/components/bt/esp_ble_mesh/mesh_core/nimble_host/mesh_bearer_adapt.c b/components/bt/esp_ble_mesh/mesh_core/nimble_host/mesh_bearer_adapt.c index f59feddac7..367e57c0e9 100644 --- a/components/bt/esp_ble_mesh/mesh_core/nimble_host/mesh_bearer_adapt.c +++ b/components/bt/esp_ble_mesh/mesh_core/nimble_host/mesh_bearer_adapt.c @@ -82,14 +82,15 @@ static uint8_t bt_mesh_gatts_addr[6]; #endif /* defined(CONFIG_BLE_MESH_NODE) && CONFIG_BLE_MESH_NODE */ +static bool g_host_init = false; + int bt_mesh_host_init(void) { - static bool init = false; int rc; - if (init == true) { + if (g_host_init == true) { BT_WARN("Already initialized host for mesh!"); - return 0; + return -EALREADY; } rc = btc_init(); @@ -103,7 +104,30 @@ int bt_mesh_host_init(void) } osi_alarm_init(); - init = true; + g_host_init = true; + + return 0; +} + +int bt_mesh_host_deinit(void) +{ + int rc; + + if (g_host_init == false) { + return -EALREADY; + } + + osi_alarm_deinit(); + + rc = osi_alarm_delete_mux(); + if (rc != 0) { + return -1; + } + + btc_deinit(); + + g_host_init = false; + return 0; }