mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
fix(nimble): Reset HID service during deinit
This commit is contained in:
Submodule components/bt/host/nimble/nimble updated: 883c9ebed0...039d2d62ed
@@ -35,6 +35,11 @@ static const char *TAG = "NIMBLE_HIDD";
|
||||
typedef struct esp_ble_hidd_dev_s esp_ble_hidd_dev_t;
|
||||
// there can be only one BLE HID device
|
||||
static esp_ble_hidd_dev_t *s_dev = NULL;
|
||||
/** service index is used to identify the hid service instance
|
||||
of the registered characteristic.
|
||||
Assuming the first instance of the hid service is registered first.
|
||||
Increment service index as the hid services get registered */
|
||||
static int service_index = -1;
|
||||
|
||||
typedef hidd_report_item_t hidd_le_report_item_t;
|
||||
|
||||
@@ -183,6 +188,15 @@ static int nimble_hid_stop_gatts(esp_ble_hidd_dev_t *dev)
|
||||
|
||||
/* stop gatt database */
|
||||
ble_gatts_stop();
|
||||
|
||||
ble_svc_hid_deinit();
|
||||
ble_svc_hid_reset();
|
||||
ble_svc_dis_deinit();
|
||||
ble_svc_bas_deinit();
|
||||
ble_svc_sps_deinit();
|
||||
ble_svc_gatt_deinit();
|
||||
ble_svc_gap_deinit();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -283,6 +297,7 @@ static int nimble_hidd_dev_deinit(void *devp)
|
||||
return ESP_FAIL;
|
||||
}
|
||||
s_dev = NULL;
|
||||
service_index = -1; // resetting the value
|
||||
|
||||
nimble_hid_stop_gatts(dev);
|
||||
esp_event_post_to(dev->event_loop_handle, ESP_HIDD_EVENTS, ESP_HIDD_STOP_EVENT, NULL, 0, portMAX_DELAY);
|
||||
@@ -521,11 +536,6 @@ static int nimble_hid_gap_event(struct ble_gap_event *event, void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** service index is used to identify the hid service instance
|
||||
of the registered characteristic.
|
||||
Assuming the first instance of the hid service is registered first.
|
||||
Increment service index as the hid services get registered */
|
||||
static int service_index = -1;
|
||||
static void nimble_gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg)
|
||||
{
|
||||
char buf[BLE_UUID_STR_LEN];
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
|
||||
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||
*/
|
||||
@@ -1021,6 +1021,44 @@ static esp_err_t init_low_level(uint8_t mode)
|
||||
#endif /* CONFIG_BT_BLE_ENABLED */
|
||||
return ret;
|
||||
}
|
||||
|
||||
static esp_err_t deinit_low_level(void)
|
||||
{
|
||||
esp_err_t ret;
|
||||
|
||||
if (bt_scan_results) {
|
||||
esp_hid_scan_results_free(bt_scan_results);
|
||||
bt_scan_results = NULL;
|
||||
num_bt_scan_results = 0;
|
||||
}
|
||||
if (ble_scan_results) {
|
||||
esp_hid_scan_results_free(ble_scan_results);
|
||||
ble_scan_results = NULL;
|
||||
num_ble_scan_results = 0;
|
||||
}
|
||||
|
||||
ret = esp_bluedroid_disable();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_bluedroid_disable failed: %d", ret);
|
||||
}
|
||||
|
||||
ret = esp_bluedroid_deinit();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_bluedroid_deinit failed: %d", ret);
|
||||
}
|
||||
|
||||
ret = esp_bt_controller_disable();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_bt_controller_disable failed: %d", ret);
|
||||
}
|
||||
|
||||
ret = esp_bt_controller_deinit();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_bt_controller_deinit failed: %d", ret);
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_BT_NIMBLE_ENABLED
|
||||
@@ -1057,8 +1095,52 @@ static esp_err_t init_low_level(uint8_t mode)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static esp_err_t deinit_low_level(void)
|
||||
{
|
||||
esp_err_t ret;
|
||||
|
||||
ret = esp_nimble_deinit();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_nimble_deinit failed: %d", ret);
|
||||
}
|
||||
|
||||
ret = esp_bt_controller_disable();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_bt_controller_disable failed: %d", ret);
|
||||
}
|
||||
|
||||
ret = esp_bt_controller_deinit();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "esp_bt_controller_deinit failed: %d", ret);
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
esp_err_t esp_hid_gap_deinit(void)
|
||||
{
|
||||
esp_err_t ret;
|
||||
|
||||
ret = deinit_low_level();
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "deinit_low_level failed: %d", ret);
|
||||
}
|
||||
|
||||
if (bt_hidh_cb_semaphore != NULL) {
|
||||
vSemaphoreDelete(bt_hidh_cb_semaphore);
|
||||
bt_hidh_cb_semaphore = NULL;
|
||||
}
|
||||
|
||||
if (ble_hidh_cb_semaphore != NULL) {
|
||||
vSemaphoreDelete(ble_hidh_cb_semaphore);
|
||||
ble_hidh_cb_semaphore = NULL;
|
||||
}
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t esp_hid_gap_init(uint8_t mode)
|
||||
{
|
||||
esp_err_t ret;
|
||||
|
||||
@@ -74,6 +74,7 @@ void print_uuid(esp_bt_uuid_t *uuid);
|
||||
#endif
|
||||
|
||||
esp_err_t esp_hid_gap_init(uint8_t mode);
|
||||
esp_err_t esp_hid_gap_deinit(void);
|
||||
|
||||
esp_err_t esp_hid_ble_gap_adv_init(uint16_t appearance, const char *device_name);
|
||||
esp_err_t esp_hid_ble_gap_adv_start(void);
|
||||
|
||||
@@ -83,6 +83,8 @@ typedef struct esp_hidh_scan_result_s {
|
||||
} esp_hid_scan_result_t;
|
||||
|
||||
esp_err_t esp_hid_gap_init(uint8_t mode);
|
||||
esp_err_t esp_hid_gap_deinit(void);
|
||||
|
||||
esp_err_t esp_hid_scan(uint32_t seconds, size_t *num_results, esp_hid_scan_result_t **results);
|
||||
void esp_hid_scan_results_free(esp_hid_scan_result_t *results);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user