From 18d0ba010d3af04a19f3b298d2894ee859f9c66d Mon Sep 17 00:00:00 2001 From: zwj Date: Tue, 20 Dec 2022 15:41:26 +0800 Subject: [PATCH] Update bt lib for ESP32 - Add config to set duplicate scan list refresh period - overwrite the oldest device infor if the list is full - Fixed duplicate scan period is not accurate - Change default TX power to 9 dBm - Fixed disconnect reason 0x1f (unspecified error) - Fixed connection timeout due to terminate ind has not been acknowledged - Fixed some memory was not released after bluetooth controller initialization failed on ESP32 --- components/bt/Kconfig | 16 ++++++++++++ components/bt/controller/bt.c | 45 +++++++++++++++------------------- components/bt/controller/lib | 2 +- components/bt/include/esp_bt.h | 10 +++++++- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/components/bt/Kconfig b/components/bt/Kconfig index 0fada3f157..fd552dee27 100644 --- a/components/bt/Kconfig +++ b/components/bt/Kconfig @@ -370,6 +370,22 @@ menu "Bluetooth" Maximum number of devices which can be recorded in scan duplicate filter. When the maximum amount of device in the filter is reached, the cache will be refreshed. + config BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD + int "Duplicate scan list refresh period (seconds)" + depends on BTDM_BLE_SCAN_DUPL + range 0 1000 + default 0 + help + If the period value is non-zero, the controller will periodically clear the device information + stored in the scan duuplicate filter. If it is 0, the scan duuplicate filter will not be cleared + until the scanning is disabled. Duplicate advertisements for this period should not be sent to the + Host in advertising report events. + There are two scenarios where the ADV packet will be repeatedly reported: + 1. The duplicate scan cache is full, the controller will delete the oldest device information and + add new device information. + 2. When the refresh period is up, the controller will clear all device information and start filtering + again. + config BTDM_BLE_MESH_SCAN_DUPL_EN bool "Special duplicate scan mechanism for BLE Mesh scan" depends on BTDM_BLE_SCAN_DUPL diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index 6a8091111c..20f279efe9 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -310,6 +310,7 @@ static uint8_t coex_schm_curr_period_get_wrapper(void); static void * coex_schm_curr_phase_get_wrapper(void); static int coex_wifi_channel_get_wrapper(uint8_t *primary, uint8_t *secondary); static int coex_register_wifi_channel_change_callback_wrapper(void *cb); +static void bt_controller_deinit_internal(void); /* Local variable definition *************************************************************************** @@ -1303,26 +1304,9 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) return ESP_OK; error: -#ifdef CONFIG_PM_ENABLE - if (!s_btdm_allow_light_sleep) { - if (s_light_sleep_pm_lock != NULL) { - esp_pm_lock_delete(s_light_sleep_pm_lock); - s_light_sleep_pm_lock = NULL; - } - } - if (s_pm_lock != NULL) { - esp_pm_lock_delete(s_pm_lock); - s_pm_lock = NULL; - } - if (s_btdm_slp_tmr != NULL) { - esp_timer_delete(s_btdm_slp_tmr); - s_btdm_slp_tmr = NULL; - } -#endif - if (s_wakeup_req_sem) { - semphr_delete_wrapper(s_wakeup_req_sem); - s_wakeup_req_sem = NULL; - } + + bt_controller_deinit_internal(); + return err; } @@ -1334,6 +1318,13 @@ esp_err_t esp_bt_controller_deinit(void) btdm_controller_deinit(); + bt_controller_deinit_internal(); + + return ESP_OK; +} + +static void bt_controller_deinit_internal(void) +{ periph_module_disable(PERIPH_BT_MODULE); #ifdef CONFIG_PM_ENABLE @@ -1355,18 +1346,22 @@ esp_err_t esp_bt_controller_deinit(void) s_pm_lock_acquired = false; #endif - semphr_delete_wrapper(s_wakeup_req_sem); - s_wakeup_req_sem = NULL; - free(osi_funcs_p); - osi_funcs_p = NULL; + if (s_wakeup_req_sem) { + semphr_delete_wrapper(s_wakeup_req_sem); + s_wakeup_req_sem = NULL; + } + + if (osi_funcs_p) { + free(osi_funcs_p); + osi_funcs_p = NULL; + } btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE; btdm_lpcycle_us = 0; btdm_controller_set_sleep_mode(BTDM_MODEM_SLEEP_MODE_NONE); - return ESP_OK; } static void bt_shutdown(void) diff --git a/components/bt/controller/lib b/components/bt/controller/lib index dbaeb136ca..d4a224c5d6 160000 --- a/components/bt/controller/lib +++ b/components/bt/controller/lib @@ -1 +1 @@ -Subproject commit dbaeb136cacf8c7d071f838c1053f90299f57720 +Subproject commit d4a224c5d682d6b5a76542c6918b6a59dd0b2f8c diff --git a/components/bt/include/esp_bt.h b/components/bt/include/esp_bt.h index 8fa490740e..84df66b7d0 100644 --- a/components/bt/include/esp_bt.h +++ b/components/bt/include/esp_bt.h @@ -25,7 +25,7 @@ extern "C" { #endif -#define ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL 0x20200622 +#define ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL 0x20221207 /** * @brief Bluetooth mode for controller enable/disable @@ -103,6 +103,12 @@ the adv packet will be discarded until the memory is restored. */ #define MESH_DUPLICATE_SCAN_CACHE_SIZE 0 #endif +#ifdef CONFIG_BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD +#define SCAN_DUPL_CACHE_REFRESH_PERIOD CONFIG_BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD +#else +#define SCAN_DUPL_CACHE_REFRESH_PERIOD 0 +#endif + #if defined(CONFIG_BTDM_CTRL_MODE_BLE_ONLY) #define BTDM_CONTROLLER_MODE_EFF ESP_BT_MODE_BLE #elif defined(CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY) @@ -154,6 +160,7 @@ the adv packet will be discarded until the memory is restored. */ .pcm_role = CONFIG_BTDM_CTRL_PCM_ROLE_EFF, \ .pcm_polar = CONFIG_BTDM_CTRL_PCM_POLAR_EFF, \ .hli = BTDM_CTRL_HLI, \ + .dup_list_refresh_period = SCAN_DUPL_CACHE_REFRESH_PERIOD, \ .magic = ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL, \ } @@ -196,6 +203,7 @@ typedef struct { uint8_t pcm_role; /*!< PCM role (master & slave)*/ uint8_t pcm_polar; /*!< PCM polar trig (falling clk edge & rising clk edge) */ bool hli; /*!< Using high level interrupt or not */ + uint16_t dup_list_refresh_period; /*!< Duplicate scan list refresh period */ uint32_t magic; /*!< Magic number */ } esp_bt_controller_config_t;