From 4a6d2da2092187e0d669a2e941e38447f4faf347 Mon Sep 17 00:00:00 2001 From: wangmengyang Date: Sun, 5 May 2019 11:42:27 +0800 Subject: [PATCH 1/4] component/bt: fix some performance issues in A2DP source data flow control 1. modify the limit of frames to send to avoid dropping packet on A2DP source due to TX data queue overflow 2. reduce the A2DP source data queue size in order to achieve faster control respnonse --- .../btc/profile/std/a2dp/btc_a2dp_source.c | 14 ++++++++++---- components/bt/bluedroid/osi/include/osi/thread.h | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c b/components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c index a4697bc26e..5afbd37226 100644 --- a/components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c +++ b/components/bt/bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c @@ -1156,10 +1156,16 @@ static UINT8 btc_get_num_aa_frame(void) /* calculate nbr of frames pending for this media tick */ result = btc_aa_src_cb.media_feeding_state.pcm.counter / pcm_bytes_per_frame; - if (result > MAX_PCM_FRAME_NUM_PER_TICK) { - APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d" - , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK); - result = MAX_PCM_FRAME_NUM_PER_TICK; + + /* limit the frames to be sent */ + UINT32 frm_nb_threshold = MAX_OUTPUT_A2DP_SRC_FRAME_QUEUE_SZ - fixed_queue_length(btc_aa_src_cb.TxAaQ); + if (frm_nb_threshold > MAX_PCM_FRAME_NUM_PER_TICK) { + frm_nb_threshold = MAX_PCM_FRAME_NUM_PER_TICK; + } + + if (result > frm_nb_threshold) { + APPL_TRACE_EVENT("Limit frms to send from %d to %d", result, frm_nb_threshold); + result = frm_nb_threshold; } btc_aa_src_cb.media_feeding_state.pcm.counter -= result * pcm_bytes_per_frame; diff --git a/components/bt/bluedroid/osi/include/osi/thread.h b/components/bt/bluedroid/osi/include/osi/thread.h index 1aa773c018..cd08e8f9ca 100644 --- a/components/bt/bluedroid/osi/include/osi/thread.h +++ b/components/bt/bluedroid/osi/include/osi/thread.h @@ -95,7 +95,7 @@ typedef enum { #define BTC_A2DP_SOURCE_TASK_STACK_SIZE (CONFIG_A2DP_SOURCE_TASK_STACK_SIZE + BT_TASK_EXTRA_STACK_SIZE) // by menuconfig #define BTC_A2DP_SOURCE_TASK_NAME "BtA2dSourceT" #define BTC_A2DP_SOURCE_TASK_PRIO (configMAX_PRIORITIES - 3) -#define BTC_A2DP_SOURCE_DATA_QUEUE_LEN (3) +#define BTC_A2DP_SOURCE_DATA_QUEUE_LEN (1) #define BTC_A2DP_SOURCE_CTRL_QUEUE_LEN (5) #define BTC_A2DP_SOURCE_TASK_QUEUE_SET_LEN (BTC_A2DP_SOURCE_DATA_QUEUE_LEN + BTC_A2DP_SOURCE_CTRL_QUEUE_LEN) From a19c901e998396728a2fcb66c862ca178301d1fa Mon Sep 17 00:00:00 2001 From: baohongde Date: Mon, 10 Jun 2019 19:17:34 +0800 Subject: [PATCH 2/4] add missing source files to CMakeLists for HFP --- components/bt/CMakeLists.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/components/bt/CMakeLists.txt b/components/bt/CMakeLists.txt index df6fa250d4..e7d1d6d34f 100644 --- a/components/bt/CMakeLists.txt +++ b/components/bt/CMakeLists.txt @@ -11,6 +11,7 @@ if(CONFIG_BT_ENABLED) bluedroid/bta/av/include bluedroid/bta/dm/include bluedroid/bta/gatt/include + bluedroid/bta/hf_client/include bluedroid/bta/hh/include bluedroid/bta/jv/include bluedroid/bta/sdp/include @@ -93,6 +94,14 @@ if(CONFIG_BT_ENABLED) "bluedroid/bta/jv/bta_jv_api.c" "bluedroid/bta/jv/bta_jv_cfg.c" "bluedroid/bta/jv/bta_jv_main.c" + "bluedroid/bta/hf_client/bta_hf_client_act.c" + "bluedroid/bta/hf_client/bta_hf_client_api.c" + "bluedroid/bta/hf_client/bta_hf_client_at.c" + "bluedroid/bta/hf_client/bta_hf_client_cmd.c" + "bluedroid/bta/hf_client/bta_hf_client_main.c" + "bluedroid/bta/hf_client/bta_hf_client_rfc.c" + "bluedroid/bta/hf_client/bta_hf_client_sco.c" + "bluedroid/bta/hf_client/bta_hf_client_sdp.c" "bluedroid/bta/sdp/bta_sdp.c" "bluedroid/bta/sdp/bta_sdp_act.c" "bluedroid/bta/sdp/bta_sdp_api.c" @@ -122,6 +131,8 @@ if(CONFIG_BT_ENABLED) "bluedroid/btc/profile/std/a2dp/btc_a2dp_source.c" "bluedroid/btc/profile/std/a2dp/btc_av.c" "bluedroid/btc/profile/std/avrc/btc_avrc.c" + "bluedroid/btc/profile/std/hf_client/btc_hf_client.c" + "bluedroid/btc/profile/std/hf_client/bta_hf_client_co.c" "bluedroid/btc/profile/std/gap/btc_gap_ble.c" "bluedroid/btc/profile/std/gap/btc_gap_bt.c" "bluedroid/btc/profile/std/gatt/btc_gatt_common.c" From c9694d400437216ef9714fbbd7ffb84f0fa991ce Mon Sep 17 00:00:00 2001 From: baohongde Date: Mon, 10 Jun 2019 17:46:37 +0800 Subject: [PATCH 3/4] component/bt: Allow configuration of default SCO_DATA_PATH in bluetooth controller --- components/bt/Kconfig | 36 +++++++++++++++++++++++++------- components/bt/include/esp_bt.h | 2 ++ components/bt/lib | 2 +- components/esp32/ld/esp32.rom.ld | 1 + 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/components/bt/Kconfig b/components/bt/Kconfig index 346055c11c..2167d5563c 100644 --- a/components/bt/Kconfig +++ b/components/bt/Kconfig @@ -6,6 +6,29 @@ config BT_ENABLED help Select this option to enable Bluetooth and show the submenu with Bluetooth configuration choices. +choice BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH + prompt "BR/EDR Sync(SCO/eSCO) default data path" + depends on BT_ENABLED + default BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_PCM + help + SCO data path, i.e. HCI or PCM. + SCO data can be sent/received through HCI synchronous packets, or the data + can be routed to on-chip PCM module on ESP32. PCM input/output signals can + be "matrixed" to GPIOs. The default data path can also be set using API + "esp_bredr_sco_datapath_set" + + config BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_HCI + bool "HCI" + config BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_PCM + bool "PCM" +endchoice + +config BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_EFF + int + default 0 if BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_HCI + default 1 if BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_PCM + default 0 + choice BTDM_CONTROLLER_PINNED_TO_CORE_CHOICE prompt "The cpu core which bluetooth controller run" depends on BT_ENABLED && !FREERTOS_UNICORE @@ -109,7 +132,6 @@ config BTDM_LPCLK_SEL_EXT_32K_XTAL bool "External 32kHz crystal" depends on ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL endchoice - endmenu menuconfig BLUEDROID_ENABLED @@ -201,15 +223,15 @@ endchoice choice HFP_AUDIO_DATA_PATH prompt "audio(SCO) data path" depends on HFP_ENABLE + help + SCO data path, i.e. HCI or PCM. This option is set using API + "esp_bredr_sco_datapath_set" in Bluetooth host. Default SCO data + path can also be set in Bluetooth Controller. config HFP_AUDIO_DATA_PATH_PCM bool "PCM" - help - This enables the Serial Port Profile config HFP_AUDIO_DATA_PATH_HCI bool "HCI" - help - This enables the Serial Port Profile endchoice config GATTS_ENABLE @@ -1022,8 +1044,8 @@ config BLE_HOST_QUEUE_CONGESTION_CHECK depends on BLUEDROID_ENABLED default n help - When scanning and scan duplicate is not enabled, if there are a lot of adv packets around or application layer - handling adv packets is slow, it will cause the controller memory to run out. if enabled, adv packets will be + When scanning and scan duplicate is not enabled, if there are a lot of adv packets around or application layer + handling adv packets is slow, it will cause the controller memory to run out. if enabled, adv packets will be lost when host queue is congested. config BLE_SCAN_DUPLICATE diff --git a/components/bt/include/esp_bt.h b/components/bt/include/esp_bt.h index c3c1cb020a..dcb5d9015d 100644 --- a/components/bt/include/esp_bt.h +++ b/components/bt/include/esp_bt.h @@ -40,6 +40,7 @@ typedef struct { uint16_t mesh_adv_size; /*!< Mesh adv size for scan duplicate */ uint16_t send_adv_reserved_size; /*!< Controller minimum memory value */ uint32_t controller_debug_flag; /*!< Controller debug log flag */ + uint8_t bt_sco_datapath; /*!< SCO data path, i.e. HCI or PCM module */ } esp_bt_controller_config_t; #ifdef CONFIG_BT_ENABLED @@ -97,6 +98,7 @@ the adv packet will be discarded until the memory is restored. */ .mesh_adv_size = MESH_DUPLICATE_SCAN_CACHE_SIZE, \ .send_adv_reserved_size = SCAN_SEND_ADV_RESERVED_SIZE, \ .controller_debug_flag = CONTROLLER_ADV_LOST_DEBUG_BIT, \ + .bt_sco_datapath = CONFIG_BTDM_CONTROLLER_BR_EDR_SCO_DATA_PATH_EFF, \ }; #else diff --git a/components/bt/lib b/components/bt/lib index caa305942b..8f15bbf191 160000 --- a/components/bt/lib +++ b/components/bt/lib @@ -1 +1 @@ -Subproject commit caa305942b66cafaacaf0ed23acbd71d1f327dfd +Subproject commit 8f15bbf191025c577d8dd65832a14d4231e45a7e diff --git a/components/esp32/ld/esp32.rom.ld b/components/esp32/ld/esp32.rom.ld index 6058a9e610..7526e7dee1 100644 --- a/components/esp32/ld/esp32.rom.ld +++ b/components/esp32/ld/esp32.rom.ld @@ -1591,6 +1591,7 @@ PROVIDE ( ets_update_cpu_frequency_rom = 0x40008550 ); /* Updates g_ticks_per_u PROVIDE ( hci_tl_env = 0x3ffb8154 ); PROVIDE ( ld_acl_env = 0x3ffb8258 ); PROVIDE ( ea_env = 0x3ffb80ec ); +PROVIDE ( lc_sco_env = 0x3ffb81fc ); PROVIDE ( lc_sco_data_path_config = 0x3ffb81f8 ); PROVIDE ( ld_active_ch_map = 0x3ffb8334 ); PROVIDE ( ld_bcst_acl_env = 0x3ffb8274 ); From 3a8fbb7be4cc8d068a5b1300b12a47d53f5a41a5 Mon Sep 17 00:00:00 2001 From: baohongde Date: Mon, 10 Jun 2019 17:50:54 +0800 Subject: [PATCH 4/4] components/bt: Fix assert due to alloc LMP TX buffer failed --- components/bt/lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/lib b/components/bt/lib index 8f15bbf191..b09b0d1119 160000 --- a/components/bt/lib +++ b/components/bt/lib @@ -1 +1 @@ -Subproject commit 8f15bbf191025c577d8dd65832a14d4231e45a7e +Subproject commit b09b0d11195b2ec49e3cb9fdbba63349c362823d