From e11820cd5bc138eea83131e513101db85dc57de2 Mon Sep 17 00:00:00 2001 From: wangcheng Date: Thu, 26 Nov 2020 19:49:29 +0800 Subject: [PATCH 1/7] components/bt: Fixed the problem of early release of pointer(p_ccb) in funcion --- components/bt/host/bluedroid/stack/l2cap/l2c_utils.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c b/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c index c31c3c28f1..dcf3317c7d 100644 --- a/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c +++ b/components/bt/host/bluedroid/stack/l2cap/l2c_utils.c @@ -3493,13 +3493,12 @@ BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb) L2CAP_TRACE_ERROR("l2cu_get_buffer_to_send: No data to be sent"); return (NULL); } + l2cu_check_channel_congestion (p_ccb); + l2cu_set_acl_hci_header (p_buf, p_ccb); /* send tx complete */ if (l2cb.fixed_reg[xx].pL2CA_FixedTxComplete_Cb) { (*l2cb.fixed_reg[xx].pL2CA_FixedTxComplete_Cb)(p_ccb->local_cid, 1); } - - l2cu_check_channel_congestion (p_ccb); - l2cu_set_acl_hci_header (p_buf, p_ccb); return (p_buf); } } From ca66b5048163c40f506bbcfd82d179090f3ed574 Mon Sep 17 00:00:00 2001 From: weitianhua Date: Tue, 22 Dec 2020 16:00:26 +0800 Subject: [PATCH 2/7] collection of bugfix backport for release/v4.0 --- components/bt/controller/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib b/components/bt/controller/lib index a8fe3aa2ea..5fe7e61394 160000 --- a/components/bt/controller/lib +++ b/components/bt/controller/lib @@ -1 +1 @@ -Subproject commit a8fe3aa2ea21ee8e53bde132d977ac44159af3da +Subproject commit 5fe7e613946e79f070161f4841b7c771ec2cfc25 From 16ff064f685ba632572fd5c92aecc541acecd2f2 Mon Sep 17 00:00:00 2001 From: gengyuchao Date: Thu, 9 Jan 2020 20:44:37 +0800 Subject: [PATCH 3/7] btdm: Add comments to clarify the two different device names of GAP and ADV in the ble_spp_server_demo example, as the old example might confuse users. --- .../ble/ble_spp_server/main/ble_spp_server_demo.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/examples/bluetooth/bluedroid/ble/ble_spp_server/main/ble_spp_server_demo.c b/examples/bluetooth/bluedroid/ble/ble_spp_server/main/ble_spp_server_demo.c index 999b047e78..2f1b5ac095 100644 --- a/examples/bluetooth/bluedroid/ble/ble_spp_server/main/ble_spp_server_demo.c +++ b/examples/bluetooth/bluedroid/ble/ble_spp_server/main/ble_spp_server_demo.c @@ -28,7 +28,7 @@ #define SPP_PROFILE_NUM 1 #define SPP_PROFILE_APP_IDX 0 #define ESP_SPP_APP_ID 0x56 -#define SAMPLE_DEVICE_NAME "ESP_SPP_SERVER" +#define SAMPLE_DEVICE_NAME "ESP_SPP_SERVER" //The Device Name Characteristics in GAP #define SPP_SVC_INST_ID 0 /// SPP Service @@ -44,9 +44,12 @@ static const uint16_t spp_service_uuid = 0xABF0; #endif static const uint8_t spp_adv_data[23] = { + /* Flags */ 0x02,0x01,0x06, + /* Complete List of 16-bit Service Class UUIDs */ 0x03,0x03,0xF0,0xAB, - 0x0F,0x09,0x45,0x53,0x50,0x5f,0x53,0x50,0x50,0x5f,0x53,0x45,0x52,0x56,0x45,0x52 + /* Complete Local Name in advertising */ + 0x0F,0x09, 'E', 'S', 'P', '_', 'S', 'P', 'P', '_', 'S', 'E', 'R','V', 'E', 'R' }; static uint16_t spp_mtu_size = 23; From 0f4592eea07631fc9f92afdc542b5940964ce4c3 Mon Sep 17 00:00:00 2001 From: wangcheng Date: Mon, 26 Oct 2020 15:56:55 +0800 Subject: [PATCH 4/7] components/bt: fixed memory damage caused by bluetooth memory release --- components/bt/controller/bt.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index afe994fd3e..fe9c29ab8d 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -1143,6 +1143,11 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) esp_err_t err; uint32_t btdm_cfg_mask = 0; + //if all the bt available memory was already released, cannot initialize bluetooth controller + if (btdm_dram_available_region[0].mode == ESP_BT_MODE_IDLE) { + return ESP_ERR_INVALID_STATE; + } + osi_funcs_p = (struct osi_funcs_t *)malloc_internal_wrapper(sizeof(struct osi_funcs_t)); if (osi_funcs_p == NULL) { return ESP_ERR_NO_MEM; @@ -1157,11 +1162,6 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) return ESP_ERR_INVALID_STATE; } - //if all the bt available memory was already released, cannot initialize bluetooth controller - if (btdm_dram_available_region[0].mode == ESP_BT_MODE_IDLE) { - return ESP_ERR_INVALID_STATE; - } - if (cfg == NULL) { return ESP_ERR_INVALID_ARG; } From b9f79249b82c530b8cbed09d3562b0c5415fee15 Mon Sep 17 00:00:00 2001 From: wangcheng Date: Tue, 22 Dec 2020 17:37:59 +0800 Subject: [PATCH 5/7] components/bt: backport need commit to release/v4.0 --- components/bt/controller/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib b/components/bt/controller/lib index 5fe7e61394..dc7a5ca889 160000 --- a/components/bt/controller/lib +++ b/components/bt/controller/lib @@ -1 +1 @@ -Subproject commit 5fe7e613946e79f070161f4841b7c771ec2cfc25 +Subproject commit dc7a5ca88989a98d39269c9cc2122964062b7f26 From 998a1f9ebbb773c4f0a260f4e5d38f79c309237d Mon Sep 17 00:00:00 2001 From: baohongde Date: Tue, 22 Dec 2020 21:23:09 +0800 Subject: [PATCH 6/7] components/bt: Make sleep avaliable in hli(for future use) --- components/bt/controller/bt.c | 156 ++++++++++++++++++--------------- components/bt/include/esp_bt.h | 22 ----- 2 files changed, 87 insertions(+), 91 deletions(-) diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index fe9c29ab8d..d715f1de7f 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -177,6 +177,7 @@ struct osi_funcs_t { uint32_t _magic; }; +typedef void (*workitem_handler_t)(void* arg); /* External functions or values ************************************************************************ @@ -193,13 +194,14 @@ extern void btdm_controller_disable(void); extern uint8_t btdm_controller_get_mode(void); extern const char *btdm_controller_get_compile_version(void); extern void btdm_rf_bb_init_phase2(void); // shall be called after PHY/RF is enabled +extern int btdm_dispatch_work_to_controller(workitem_handler_t callback, void *arg, bool blocking); /* Sleep */ extern void btdm_controller_enable_sleep(bool enable); extern void btdm_controller_set_sleep_mode(uint8_t mode); extern uint8_t btdm_controller_get_sleep_mode(void); extern bool btdm_power_state_active(void); -extern void btdm_wakeup_request(bool request_lock); -extern void btdm_wakeup_request_end(void); +extern void btdm_wakeup_request(void); +extern void btdm_in_wakeup_requesting_set(bool in_wakeup_requesting); /* Low Power Clock */ extern bool btdm_lpclk_select_src(uint32_t sel); extern bool btdm_lpclk_set_div(uint32_t div); @@ -282,7 +284,6 @@ static uint32_t IRAM_ATTR btdm_us_2_lpcycles(uint32_t us); static bool IRAM_ATTR btdm_sleep_check_duration(uint32_t *slot_cnt); static void btdm_sleep_enter_phase1_wrapper(uint32_t lpcycles); static void btdm_sleep_enter_phase2_wrapper(void); -static void IRAM_ATTR btdm_sleep_exit_phase1_wrapper(void); static void btdm_sleep_exit_phase3_wrapper(void); static bool coex_bt_wakeup_request(void); static void coex_bt_wakeup_request_end(void); @@ -330,7 +331,7 @@ static const struct osi_funcs_t osi_funcs_ro = { ._btdm_sleep_check_duration = btdm_sleep_check_duration, ._btdm_sleep_enter_phase1 = btdm_sleep_enter_phase1_wrapper, ._btdm_sleep_enter_phase2 = btdm_sleep_enter_phase2_wrapper, - ._btdm_sleep_exit_phase1 = btdm_sleep_exit_phase1_wrapper, + ._btdm_sleep_exit_phase1 = NULL, ._btdm_sleep_exit_phase2 = NULL, ._btdm_sleep_exit_phase3 = btdm_sleep_exit_phase3_wrapper, ._coex_bt_wakeup_request = coex_bt_wakeup_request, @@ -387,10 +388,11 @@ static DRAM_ATTR uint8_t btdm_lpcycle_us_frac = 0; // number of fractional bit f static DRAM_ATTR uint8_t btdm_lpclk_sel; #endif /* #ifdef CONFIG_BTDM_MODEM_SLEEP_MODE_ORIG */ +static DRAM_ATTR QueueHandle_t s_wakeup_req_sem = NULL; #ifdef CONFIG_PM_ENABLE static DRAM_ATTR esp_timer_handle_t s_btdm_slp_tmr; static DRAM_ATTR esp_pm_lock_handle_t s_pm_lock; -static DRAM_ATTR QueueHandle_t s_pm_lock_sem = NULL; +static bool s_pm_lock_acquired = true; static DRAM_ATTR bool s_btdm_allow_light_sleep; // pm_lock to prevent light sleep when using main crystal as Bluetooth low power clock static DRAM_ATTR esp_pm_lock_handle_t s_light_sleep_pm_lock; @@ -851,8 +853,10 @@ static void btdm_sleep_enter_phase2_wrapper(void) esp_modem_sleep_enter(MODEM_BLE_MODULE); esp_modem_sleep_enter(MODEM_CLASSIC_BT_MODULE); #ifdef CONFIG_PM_ENABLE - esp_pm_lock_release(s_pm_lock); - semphr_give_wrapper(s_pm_lock_sem); + if (s_pm_lock_acquired) { + esp_pm_lock_release(s_pm_lock); + s_pm_lock_acquired = false; + } #endif } else if (btdm_controller_get_sleep_mode() == BTDM_MODEM_SLEEP_MODE_EVED) { esp_modem_sleep_enter(MODEM_BLE_MODULE); @@ -861,17 +865,15 @@ static void btdm_sleep_enter_phase2_wrapper(void) } } -static void IRAM_ATTR btdm_sleep_exit_phase1_wrapper(void) +static void btdm_sleep_exit_phase3_wrapper(void) { #ifdef CONFIG_PM_ENABLE - if (semphr_take_from_isr_wrapper(s_pm_lock_sem, NULL) == pdTRUE) { + if (!s_pm_lock_acquired) { + s_pm_lock_acquired = true; esp_pm_lock_acquire(s_pm_lock); } #endif -} -static void btdm_sleep_exit_phase3_wrapper(void) -{ if (btdm_controller_get_sleep_mode() == BTDM_MODEM_SLEEP_MODE_ORIG) { esp_modem_sleep_exit(MODEM_BLE_MODULE); esp_modem_sleep_exit(MODEM_CLASSIC_BT_MODULE); @@ -887,45 +889,81 @@ static void btdm_sleep_exit_phase3_wrapper(void) } #ifdef CONFIG_PM_ENABLE -static void IRAM_ATTR btdm_slp_tmr_callback(void *arg) +static void btdm_slp_tmr_customer_callback(void * arg) { - if (semphr_take_wrapper(s_pm_lock_sem, 0) == pdTRUE) { + (void)(arg); + + if (!s_pm_lock_acquired) { + s_pm_lock_acquired = true; esp_pm_lock_acquire(s_pm_lock); } } + +static void IRAM_ATTR btdm_slp_tmr_callback(void *arg) +{ + (void)(arg); + btdm_dispatch_work_to_controller(btdm_slp_tmr_customer_callback, NULL, true); +} #endif -#define BTDM_ASYNC_WAKEUP_REQ_HCI 0 -#define BTDM_ASYNC_WAKEUP_REQ_COEX 1 -#define BTDM_ASYNC_WAKEUP_REQMAX 2 +#define BTDM_ASYNC_WAKEUP_REQ_HCI 0 +#define BTDM_ASYNC_WAKEUP_REQ_COEX 1 +#define BTDM_ASYNC_WAKEUP_REQ_CTRL_DISA 2 +#define BTDM_ASYNC_WAKEUP_REQMAX 3 + +static void btdm_wakeup_request_callback(void * arg) +{ + (void)(arg); + +#if CONFIG_PM_ENABLE + if (!s_pm_lock_acquired) { + s_pm_lock_acquired = true; + esp_pm_lock_acquire(s_pm_lock); + } + esp_timer_stop(s_btdm_slp_tmr); +#endif + btdm_wakeup_request(); + + semphr_give_wrapper(s_wakeup_req_sem); +} static bool async_wakeup_request(int event) { bool request_lock = false; + bool do_wakeup_request = false; + switch (event) { case BTDM_ASYNC_WAKEUP_REQ_HCI: request_lock = true; + // NO break + case BTDM_ASYNC_WAKEUP_REQ_CTRL_DISA: + if (!btdm_power_state_active()) { + do_wakeup_request = true; + if (request_lock) { + btdm_in_wakeup_requesting_set(true); + } + + btdm_dispatch_work_to_controller(btdm_wakeup_request_callback, NULL, true); + semphr_take_wrapper(s_wakeup_req_sem, OSI_FUNCS_TIME_BLOCKING); + } break; case BTDM_ASYNC_WAKEUP_REQ_COEX: - request_lock = false; + if (!btdm_power_state_active()) { + do_wakeup_request = true; +#if CONFIG_PM_ENABLE + if (!s_pm_lock_acquired) { + s_pm_lock_acquired = true; + esp_pm_lock_acquire(s_pm_lock); + } + esp_timer_stop(s_btdm_slp_tmr); +#endif + btdm_wakeup_request(); + } break; default: return false; } - bool do_wakeup_request = false; - - if (!btdm_power_state_active()) { -#if CONFIG_PM_ENABLE - if (semphr_take_wrapper(s_pm_lock_sem, 0)) { - esp_pm_lock_acquire(s_pm_lock); - } - esp_timer_stop(s_btdm_slp_tmr); -#endif - do_wakeup_request = true; - btdm_wakeup_request(request_lock); - } - return do_wakeup_request; } @@ -937,6 +975,7 @@ static void async_wakeup_request_end(int event) request_lock = true; break; case BTDM_ASYNC_WAKEUP_REQ_COEX: + case BTDM_ASYNC_WAKEUP_REQ_CTRL_DISA: request_lock = false; break; default: @@ -944,7 +983,7 @@ static void async_wakeup_request_end(int event) } if (request_lock) { - btdm_wakeup_request_end(); + btdm_in_wakeup_requesting_set(false); } return; @@ -1147,7 +1186,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) if (btdm_dram_available_region[0].mode == ESP_BT_MODE_IDLE) { return ESP_ERR_INVALID_STATE; } - + osi_funcs_p = (struct osi_funcs_t *)malloc_internal_wrapper(sizeof(struct osi_funcs_t)); if (osi_funcs_p == NULL) { return ESP_ERR_NO_MEM; @@ -1191,6 +1230,12 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) memset(btdm_queue_table, 0, sizeof(btdm_queue_item_t) * BTDM_MAX_QUEUE_NUM); #endif + s_wakeup_req_sem = semphr_create_wrapper(1, 0); + if (s_wakeup_req_sem == NULL) { + err = ESP_ERR_NO_MEM; + goto error; + } + btdm_controller_mem_init(); periph_module_enable(PERIPH_BT_MODULE); @@ -1264,11 +1309,7 @@ esp_err_t esp_bt_controller_init(esp_bt_controller_config_t *cfg) goto error; } - s_pm_lock_sem = semphr_create_wrapper(1, 0); - if (s_pm_lock_sem == NULL) { - err = ESP_ERR_NO_MEM; - goto error; - } + s_pm_lock_acquired = true; #endif btdm_cfg_mask = btdm_config_mask_load(); @@ -1304,11 +1345,11 @@ error: esp_timer_delete(s_btdm_slp_tmr); s_btdm_slp_tmr = NULL; } - if (s_pm_lock_sem) { - semphr_delete_wrapper(s_pm_lock_sem); - s_pm_lock_sem = NULL; - } #endif + if (s_wakeup_req_sem) { + semphr_delete_wrapper(s_wakeup_req_sem); + s_wakeup_req_sem = NULL; + } return err; } @@ -1327,14 +1368,13 @@ esp_err_t esp_bt_controller_deinit(void) esp_pm_lock_delete(s_light_sleep_pm_lock); s_light_sleep_pm_lock = NULL; } - esp_pm_lock_delete(s_pm_lock); - s_pm_lock = NULL; esp_timer_stop(s_btdm_slp_tmr); esp_timer_delete(s_btdm_slp_tmr); s_btdm_slp_tmr = NULL; - semphr_delete_wrapper(s_pm_lock_sem); - s_pm_lock_sem = NULL; + s_pm_lock_acquired = false; #endif + semphr_delete_wrapper(s_wakeup_req_sem); + s_wakeup_req_sem = NULL; #if CONFIG_SPIRAM_USE_MALLOC vSemaphoreDelete(btdm_queue_table_mux); @@ -1429,9 +1469,7 @@ esp_err_t esp_bt_controller_disable(void) // disable modem sleep and wake up from sleep mode if (btdm_controller_get_sleep_mode() == BTDM_MODEM_SLEEP_MODE_ORIG) { btdm_controller_enable_sleep(false); - if (!btdm_power_state_active()) { - btdm_wakeup_request(false); - } + async_wakeup_request(BTDM_ASYNC_WAKEUP_REQ_CTRL_DISA); while (!btdm_power_state_active()) { ets_delay_us(1000); } @@ -1551,26 +1589,6 @@ esp_err_t esp_bt_sleep_disable (void) return status; } -bool esp_bt_controller_is_sleeping(void) -{ - if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED || - btdm_controller_get_sleep_mode() != BTDM_MODEM_SLEEP_MODE_ORIG) { - return false; - } - - return !btdm_power_state_active(); -} - -void esp_bt_controller_wakeup_request(void) -{ - if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED || - btdm_controller_get_sleep_mode() != BTDM_MODEM_SLEEP_MODE_ORIG) { - return; - } - - btdm_wakeup_request(false); -} - esp_err_t esp_bredr_sco_datapath_set(esp_sco_data_path_t data_path) { if (btdm_controller_status != ESP_BT_CONTROLLER_STATUS_ENABLED) { diff --git a/components/bt/include/esp_bt.h b/components/bt/include/esp_bt.h index de8b04239f..c06ab4e802 100644 --- a/components/bt/include/esp_bt.h +++ b/components/bt/include/esp_bt.h @@ -476,28 +476,6 @@ esp_err_t esp_bt_sleep_enable(void); */ esp_err_t esp_bt_sleep_disable(void); -/** - * @brief to check whether bluetooth controller is sleeping at the instant, if modem sleep is enabled - * - * Note that this function shall not be invoked before esp_bt_controller_enable() - * This function is supposed to be used ORIG mode of modem sleep - * - * @return true if in modem sleep state, false otherwise - */ -bool esp_bt_controller_is_sleeping(void); - -/** - * @brief request controller to wakeup from sleeping state during sleep mode - * - * Note that this function shall not be invoked before esp_bt_controller_enable() - * Note that this function is supposed to be used ORIG mode of modem sleep - * Note that after this request, bluetooth controller may again enter sleep as long as the modem sleep is enabled - * - * Profiling shows that it takes several milliseconds to wakeup from modem sleep after this request. - * Generally it takes longer if 32kHz XTAL is used than the main XTAL, due to the lower frequency of the former as the bluetooth low power clock source. - */ -void esp_bt_controller_wakeup_request(void); - /** * @brief Manually clear scan duplicate list * From 711184762bbf1c6b883342d369838d32e1ae9b3e Mon Sep 17 00:00:00 2001 From: baohongde Date: Tue, 22 Dec 2020 21:28:44 +0800 Subject: [PATCH 7/7] components/bt: Fix waking up fail while sleeping --- components/bt/controller/bt.c | 12 +++--------- components/bt/controller/lib | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/components/bt/controller/bt.c b/components/bt/controller/bt.c index d715f1de7f..a7097f5485 100644 --- a/components/bt/controller/bt.c +++ b/components/bt/controller/bt.c @@ -929,19 +929,15 @@ static void btdm_wakeup_request_callback(void * arg) static bool async_wakeup_request(int event) { - bool request_lock = false; bool do_wakeup_request = false; switch (event) { case BTDM_ASYNC_WAKEUP_REQ_HCI: - request_lock = true; + btdm_in_wakeup_requesting_set(true); // NO break case BTDM_ASYNC_WAKEUP_REQ_CTRL_DISA: if (!btdm_power_state_active()) { do_wakeup_request = true; - if (request_lock) { - btdm_in_wakeup_requesting_set(true); - } btdm_dispatch_work_to_controller(btdm_wakeup_request_callback, NULL, true); semphr_take_wrapper(s_wakeup_req_sem, OSI_FUNCS_TIME_BLOCKING); @@ -1007,13 +1003,11 @@ bool esp_vhci_host_check_send_available(void) void esp_vhci_host_send_packet(uint8_t *data, uint16_t len) { - bool do_wakeup_request = async_wakeup_request(BTDM_ASYNC_WAKEUP_REQ_HCI); + async_wakeup_request(BTDM_ASYNC_WAKEUP_REQ_HCI); API_vhci_host_send_packet(data, len); - if (do_wakeup_request) { - async_wakeup_request_end(BTDM_ASYNC_WAKEUP_REQ_HCI); - } + async_wakeup_request_end(BTDM_ASYNC_WAKEUP_REQ_HCI); } esp_err_t esp_vhci_host_register_callback(const esp_vhci_host_callback_t *callback) diff --git a/components/bt/controller/lib b/components/bt/controller/lib index dc7a5ca889..9e45a98d91 160000 --- a/components/bt/controller/lib +++ b/components/bt/controller/lib @@ -1 +1 @@ -Subproject commit dc7a5ca88989a98d39269c9cc2122964062b7f26 +Subproject commit 9e45a98d91c55c8a0628b598b2fe0d8874e6c262