From aa2290a0ae63ed53d855030c01cf0a9a094f1868 Mon Sep 17 00:00:00 2001 From: chenqingqing Date: Thu, 1 Aug 2024 11:20:58 +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 b814f26bbb3d..ad0d5df0b989 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 ed7cfa1df2be..16b2898e7d74 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 d00c97a9fd89..fc13dc110ad6 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 55660bf85d42..000851983956 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 b1c9475b714124d047add2536f52c5a8d0f2b1ce 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 ad0d5df0b989..70337acad449 160000 --- a/components/bt/controller/lib_esp32 +++ b/components/bt/controller/lib_esp32 @@ -1 +1 @@ -Subproject commit ad0d5df0b9890c783c02da126df8a979e5ca1cf9 +Subproject commit 70337acad449a838ebe8e49b92e201a82bcb9773