From 4e8dcf5753d4852bb5d904f2b5d930f7879b9204 Mon Sep 17 00:00:00 2001 From: chenqingqing Date: Mon, 22 Jul 2024 12:32:12 +0800 Subject: [PATCH] fix(bt/bluedroid): Add PCM configuration about pcm frame sync signal shape --- components/bt/controller/esp32/Kconfig.in | 40 +++++++++++++++++- components/bt/controller/lib_esp32 | 2 +- components/bt/include/esp32/include/esp_bt.h | 4 +- .../bluedroid/classic_bt/hfp_ag/README.md | 21 ++++++++- .../hfp_ag/image/Channel_Mode_Stereo_Mono.png | Bin 0 -> 59992 bytes .../bluedroid/classic_bt/hfp_hf/README.md | 27 ++++++++++-- 6 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 examples/bluetooth/bluedroid/classic_bt/hfp_ag/image/Channel_Mode_Stereo_Mono.png diff --git a/components/bt/controller/esp32/Kconfig.in b/components/bt/controller/esp32/Kconfig.in index 7254a6ae59..191738d0d2 100644 --- a/components/bt/controller/esp32/Kconfig.in +++ b/components/bt/controller/esp32/Kconfig.in @@ -67,7 +67,7 @@ config BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF default 0 menuconfig BTDM_CTRL_PCM_ROLE_EDGE_CONFIG - bool "PCM Signal Config (Role and Polar)" + bool "PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono)" depends on BTDM_CTRL_BR_EDR_SCO_DATA_PATH_PCM default y @@ -95,6 +95,37 @@ choice BTDM_CTRL_PCM_POLAR bool "Rising Edge" endchoice +choice BTDM_CTRL_PCM_FSYNCSHP + prompt "Channel Mode(Stereo/Mono)" + depends on BTDM_CTRL_PCM_ROLE_EDGE_CONFIG + default BTDM_CTRL_PCM_FSYNCSHP_STEREO_MODE + help + PCM frame synchronization signal shape can be configured as Stereo Mode or Mono Mode. + (There are detailed instructions under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md) + + config BTDM_CTRL_PCM_FSYNCSHP_STEREO_MODE + bool "Stereo Mode" + help + 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. + (There is a waveform graph under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/image) + + config BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_LF + bool "Mono Mode 1" + help + Mono Mode 1(Single channel): FSYNC signal starts to change a CLK clock cycle earlier than the DOUT signal. + The FSYNC signal continues for one extra CLK clock cycle. + (There is a waveform graph under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/image) + + config BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_FF + bool "Mono Mode 2" + help + Mono Mode 2(Single channel): FSYNC and DOUT signals both change simultaneously on the edge of CLK. + The FSYNC signal continues for one extra CLK clock cycle. + (There is a waveform graph under the path examples/bluetooth/bluedroid/classic_bt/hfp_ag/image) + +endchoice + config BTDM_CTRL_PCM_ROLE_EFF int default 0 if BTDM_CTRL_PCM_ROLE_MASTER @@ -107,6 +138,13 @@ config BTDM_CTRL_PCM_POLAR_EFF default 1 if BTDM_CTRL_PCM_POLAR_RISING_EDGE default 0 +config BTDM_CTRL_PCM_FSYNCSHP_EFF + int + default 0 if BTDM_CTRL_PCM_FSYNCSHP_STEREO_MODE + default 1 if BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_LF + default 2 if BTDM_CTRL_PCM_FSYNCSHP_MONO_MODE_FF + default 0 + config BTDM_CTRL_AUTO_LATENCY bool "Auto latency" depends on BTDM_CTRL_MODE_BTDM 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 eb7b16cb25..722da480de 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 advertising 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 = CONFIG_BTDM_CTRL_PCM_FSYNCSHP_EFF, \ .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..50ccb079e9 100644 --- a/examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md +++ b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/README.md @@ -43,6 +43,25 @@ 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 three configurations in menuconfig: PCM Role, PCM Polar and Channel Mode(Stereo/Mono). + +- 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 Configurations --> PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono) --> 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 Configurations --> PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono) --> PCM Polar` + +- Channel Mode(Stereo/Mono): PCM frame synchronization signal can be configured as Stereo mode or Mono mode, where the Mono mode can be configured in two different forms(Mono mode 1 and Mono mode 2). As is shown in the figure ![Stereo/Mono](image/Channel_Mode_Stereo_Mono.png) + + - 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. + - Mono Mode 1(Single channel): FSYNC signal starts to change a CLK clock cycle earlier than the DOUT signal, which means that the FSYNC signal takes effect a clock cycle earlier than the first bit of the current channel-data transmission. The FSYNC signal continues for one extra CLK clock cycle. + - Mono Mode 2(Single channel): FSYNC and DOUT signals both change simultaneously on the edge of CLK. The FSYNC signal continues for one extra CLK clock cycle. + +- The default configuration is `Stereo Mode`, you can change the PCM Channel mode in `menuconfig` path: + `Component config --> Bluetooth --> Controller Options --> PCM Signal Configurations --> PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono) --> Channel Mode(Stereo/Mono)` + ### Codec Choice ESP32 supports two types of codec for HFP audio data: `CVSD` and `mSBC`. @@ -75,7 +94,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_Stereo_Mono.png b/examples/bluetooth/bluedroid/classic_bt/hfp_ag/image/Channel_Mode_Stereo_Mono.png new file mode 100644 index 0000000000000000000000000000000000000000..36416ff0b1194a5a41cb9fe0dddd641b4a967528 GIT binary patch literal 59992 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

YTLk#)9=R|x+e`&8cRX6(DD@7rB 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≪Gr*-yeanq7VS>-fr!kG;z$=v`6+ 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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..ab8040e276 100644 --- a/examples/bluetooth/bluedroid/classic_bt/hfp_hf/README.md +++ b/examples/bluetooth/bluedroid/classic_bt/hfp_hf/README.md @@ -45,6 +45,25 @@ 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 three configurations in menuconfig: PCM Role, PCM Polar and Channel Mode(Stereo/Mono). + +- 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 Configurations --> PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono) --> 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 Configurations --> PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono) --> PCM Polar` + +- Channel Mode(Stereo/Mono): PCM frame synchronization signal can be configured as Stereo mode or Mono mode, where the Mono mode can be configured in two different forms(Mono mode 1 and Mono mode 2). As is shown in the figure ![Stereo/Mono](../hfp_ag/image/Channel_Mode_Stereo_Mono.png) + + - 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. + - Mono Mode 1(Single channel): FSYNC signal starts to change a CLK clock cycle earlier than the DOUT signal, which means that the FSYNC signal takes effect a clock cycle earlier than the first bit of the current channel-data transmission. The FSYNC signal continues for one extra CLK clock cycle. + - Mono Mode 2(Single channel): FSYNC and DOUT signals both change simultaneously on the edge of CLK. The FSYNC signal continues for one extra CLK clock cycle. + +- The default configuration is `Stereo Mode`, you can change the PCM Channel mode in `menuconfig` path: + `Component config --> Bluetooth --> Controller Options --> PCM Signal Configurations --> PCM Signal Configurations: Role, Polar and Channel Mode(Stereo/Mono) --> Channel Mode(Stereo/Mono)` + ### Codec Choice ESP32 supports two types of codec for HFP audio data: `CVSD` and `mSBC`. @@ -53,7 +72,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 +96,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 +186,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 +287,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