From 74ceb6bebccb5669412280fb4cc4ef108abb068d Mon Sep 17 00:00:00 2001 From: chenqingqing Date: Mon, 22 Jul 2024 12:32:12 +0800 Subject: [PATCH 1/2] fix(bt/bluedroid): Add PCM configuration about pcm frame sync signal shape --- components/bt/controller/lib_esp32 | 2 +- components/bt/include/esp32/include/esp_bt.h | 4 +++- .../bluedroid/classic_bt/hfp_ag/README.md | 15 ++++++++++++- .../classic_bt/hfp_ag/image/Channel_Mode.png | Bin 0 -> 37072 bytes .../bluedroid/classic_bt/hfp_hf/README.md | 21 ++++++++++++++---- 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 examples/bluetooth/bluedroid/classic_bt/hfp_ag/image/Channel_Mode.png diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index b814f26bbb..ad0d5df0b9 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit b814f26bbb3d726418c0f80f9f91153dfd978f85 +Subproject commit ad0d5df0b9890c783c02da126df8a979e5ca1cf9 diff --git a/components/bt/include/esp32/include/esp_bt.h b/components/bt/include/esp32/include/esp_bt.h index 47d078c296..a0897e57ee 100644 --- a/components/bt/include/esp32/include/esp_bt.h +++ b/components/bt/include/esp32/include/esp_bt.h @@ -55,7 +55,7 @@ extern "C" { * * @note Please do not modify this value. */ -#define ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL 0x20240315 +#define ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL 0x20240722 /** * @brief Bluetooth Controller mode @@ -202,6 +202,7 @@ the adv packet will be discarded until the memory is restored. */ .ble_sca = CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF, \ .pcm_role = CONFIG_BTDM_CTRL_PCM_ROLE_EFF, \ .pcm_polar = CONFIG_BTDM_CTRL_PCM_POLAR_EFF, \ + .pcm_fsyncshp = 0, \ .hli = BTDM_CTRL_HLI, \ .dup_list_refresh_period = SCAN_DUPL_CACHE_REFRESH_PERIOD, \ .ble_scan_backoff = BTDM_CTRL_SCAN_BACKOFF_UPPERLIMITMAX, \ @@ -253,6 +254,7 @@ typedef struct { uint8_t ble_sca; /*!< BLE low power crystal accuracy index. Configurable in menuconfig. */ uint8_t pcm_role; /*!< PCM role (master & slave). Configurable in menuconfig.*/ uint8_t pcm_polar; /*!< PCM polar trig (falling clk edge & rising clk edge). Configurable in menuconfig. */ + uint8_t pcm_fsyncshp; /*!< Physical shape of the PCM Frame Synchronization signal (stereo mode & mono mode). Configurable in menuconfig */ bool hli; /*!< True if using high level interrupt; false otherwise. Configurable in menuconfig. */ uint16_t dup_list_refresh_period; /*!< Scan duplicate filtering list refresh period in seconds. Configurable in menuconfig.*/ bool ble_scan_backoff; /*!< True if BLE scan backoff is enabled; false otherwise. Configurable in menuconfig.*/ diff --git a/examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md index d00c97a9fd..fc13dc110a 100644 --- a/examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md +++ b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md @@ -43,6 +43,19 @@ The default configuration is `PCM`, if you want to use `vHCI` you should configu `Component config --> Bluetooth --> Bluedroid Options --> Hands Free/Handset Profile --> audio(SCO) data path --> HCI`. +#### PCM Signal Configurations + +PCM Signal supports two configurations in menuconfig: PCM Role, PCM Polar. + +- PCM Role: PCM role can be configured as PCM master or PCM slave. The default configuration is `Master`, you can change the PCM role in `menuconfig` path: + `Component config --> Bluetooth --> Controller Options --> PCM Signal Config(Role and Polar) --> PCM Role` + +- PCM Polar: PCM polarity can be configured as Falling Edge or Rising Edge. The default configuration is `Falling Edge`, you can change the PCM polar in `menuconfig` path: + `Component config --> Bluetooth --> Controller Options --> PCM Signal Config(Role and Polar) --> PCM Polar` + +The default configuration of PCM frame synchronization signal is `Stereo mode(Dual channel)`. FSYNC and DOUT signals both change simultaneously on the edge of CLK. The FSYNC signal continues until the end of the current channel-data transmission. As is shown in the figure ![Stereo](image/Channel_Mode.png) +The latest version of esp-idf master branch can configure three different forms(Stereo mode, Mono mode 1, Mono mode 2). + ### Codec Choice ESP32 supports two types of codec for HFP audio data: `CVSD` and `mSBC`. @@ -75,7 +88,7 @@ See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/l ## Example Output -When you flash and monitor this example, the commands help table prints the following log at the very begining: +When you flash and monitor this example, the commands help table prints the following log at the very beginning: ``` Type 'help' to get the list of commands. diff --git a/examples/bluetooth/bluedroid/classic_bt/hfp_ag/image/Channel_Mode.png b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/image/Channel_Mode.png new file mode 100644 index 0000000000000000000000000000000000000000..80b31499e738ad479d3566d21da9941ea3a6946d GIT binary patch literal 37072 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 literal 0 HcmV?d00001 diff --git a/examples/bluetooth/bluedroid/classic_bt/hfp_hf/README.md b/examples/bluetooth/bluedroid/classic_bt/hfp_hf/README.md index 55660bf85d..0008519839 100644 --- a/examples/bluetooth/bluedroid/classic_bt/hfp_hf/README.md +++ b/examples/bluetooth/bluedroid/classic_bt/hfp_hf/README.md @@ -45,6 +45,19 @@ The default configuration is `PCM`, if you want to use `vHCI` you should configu `Component config --> Bluetooth --> Bluedroid Options --> Hands Free/Handset Profile --> audio(SCO) data path --> HCI`. +#### PCM Signal Configurations + +PCM Signal supports two configurations in menuconfig: PCM Role, PCM Polar. + +- PCM Role: PCM role can be configured as PCM master or PCM slave. The default configuration is `Master`, you can change the PCM role in `menuconfig` path: + `Component config --> Bluetooth --> Controller Options --> PCM Signal Config(Role and Polar) --> PCM Role` + +- PCM Polar: PCM polarity can be configured as Falling Edge or Rising Edge. The default configuration is `Falling Edge`, you can change the PCM polar in `menuconfig` path: + `Component config --> Bluetooth --> Controller Options --> PCM Signal Config(Role and Polar) --> PCM Polar` + +The default configuration of PCM frame synchronization signal is `Stereo mode(Dual channel)`. FSYNC and DOUT signals both change simultaneously on the edge of CLK. The FSYNC signal continues until the end of the current channel-data transmission. As is shown in the figure ![Stereo](../hfp_ag/image/Channel_Mode.png) +The latest version of esp-idf master branch can configure three different forms(Stereo mode, Mono mode 1, Mono mode 2). + ### Codec Choice ESP32 supports two types of codec for HFP audio data: `CVSD` and `mSBC`. @@ -53,7 +66,7 @@ ESP32 supports two types of codec for HFP audio data: `CVSD` and `mSBC`. `Component config --> Bluetooth --> Bluedroid Options --> Wide Band Speech`. -Switching on the `Wide Band Speech` means that the prefered codec is `mSBC`, but which one is actually being used also depends on the `Data Path` configuration. +Switching on the `Wide Band Speech` means that the preferred codec is `mSBC`, but which one is actually being used also depends on the `Data Path` configuration. - If you choose `PCM` for datapath, you can only use `CVSD` and hardware is responsible for the codec job. In the meanwhile, you cannot use `mSBC` by switching `Wide Band Speech` on, because the `mSBC` is implemented in the Bluedroid (Bluetooth Host Stack) by software. @@ -77,7 +90,7 @@ See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/l ## Example Output -When you run this example, the explain prints the following at the very begining: +When you run this example, the explain prints the following at the very beginning: ``` Type 'help' to get the list of commands. @@ -167,7 +180,7 @@ I (133262) BT_HF: --audio state disconnected - Reject an incoming call - Disable the voice recognition -#### Choise of Codec +#### Choice of Codec ESP32 supports both CVSD and mSBC codec. HF Unit and AG device determine which codec to use by exchanging features during service level connection. The choice of codec also depends on the your configuration in `menuconfig`. @@ -268,7 +281,7 @@ I (293172) BT_HF: APP HFP event: AT_RESPONSE I (293172) BT_HF: --AT response event, code 0, cme 0 E (293702) BT_BTM: btm_sco_connected, handle 181 I (293702) BT_HF: APP HFP event: AUDIO_STATE_EVT -I (293702) BT_HF: --audio state connecte +I (293702) BT_HF: --audio state connected ``` #### Query Current Operator Name From e9276b75c88c5ec6f97f51185e72a4b12cff2711 Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Tue, 9 Jul 2024 16:49:11 +0800 Subject: [PATCH 2/2] fix(bt/controller): Fixed disconnection issue - Fixed the issue of disconnection caused by updating the channel map in sniff mode --- components/bt/controller/lib_esp32 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/bt/controller/lib_esp32 b/components/bt/controller/lib_esp32 index ad0d5df0b9..70337acad4 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit ad0d5df0b9890c783c02da126df8a979e5ca1cf9 +Subproject commit 70337acad449a838ebe8e49b92e201a82bcb9773