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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 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