Skip to content

Commit

Permalink
Merge branch 'bugfix/ble_mesh_deinit_reinit_v5.0' into 'release/v5.0'
Browse files Browse the repository at this point in the history
feat: ble mesh: improve ble mesh deinit when nimble enable(backport v5.0)

See merge request espressif/esp-idf!28924
  • Loading branch information
jack0c committed Feb 23, 2024
2 parents 1cc35f0 + dae3035 commit 48570f5
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 6 deletions.
29 changes: 27 additions & 2 deletions components/bt/esp_ble_mesh/api/core/esp_ble_mesh_common_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,21 +65,46 @@ 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;
}

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 */
2 changes: 2 additions & 0 deletions components/bt/esp_ble_mesh/btc/btc_ble_mesh_prov.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_prov.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
}

Expand Down

0 comments on commit 48570f5

Please sign in to comment.