Merge branch 'feature/update_hfp_hf_version_v4.4' into 'release/v4.4'

Update HFP_HF version to 1.7.2(v4.4)

See merge request espressif/esp-idf!17382
This commit is contained in:
Wang Meng Yang 2022-03-10 20:20:16 +08:00
commit 7a2068c864
7 changed files with 95 additions and 42 deletions

View File

@ -60,6 +60,9 @@ typedef enum {
#define ESP_HF_CLIENT_PEER_FEAT_ECC 0x80 /* Enhanced Call Control */ #define ESP_HF_CLIENT_PEER_FEAT_ECC 0x80 /* Enhanced Call Control */
#define ESP_HF_CLIENT_PEER_FEAT_EXTERR 0x100 /* Extended error codes */ #define ESP_HF_CLIENT_PEER_FEAT_EXTERR 0x100 /* Extended error codes */
#define ESP_HF_CLIENT_PEER_FEAT_CODEC 0x200 /* Codec Negotiation */ #define ESP_HF_CLIENT_PEER_FEAT_CODEC 0x200 /* Codec Negotiation */
/* HFP 1.7+ */
#define ESP_HF_CLIENT_PEER_FEAT_HF_IND 0x400 /* HF Indicators */
#define ESP_HF_CLIENT_PEER_FEAT_ESCO_S4 0x800 /* eSCO S4 Setting Supported */
/* CHLD feature masks of AG */ /* CHLD feature masks of AG */
#define ESP_HF_CLIENT_CHLD_FEAT_REL 0x01 /* 0 Release waiting call or held calls */ #define ESP_HF_CLIENT_CHLD_FEAT_REL 0x01 /* 0 Release waiting call or held calls */

View File

@ -232,7 +232,7 @@ const tBTA_HF_CLIENT_ST_TBL bta_hf_client_st_tbl[] = {
bta_hf_client_st_closing bta_hf_client_st_closing
}; };
const char *bta_hf_client_version = "1.6"; const int bta_hf_client_version = HFP_HF_VERSION_1_7;
/* HF Client control block */ /* HF Client control block */
#if BTA_DYNAMIC_MEMORY == FALSE #if BTA_DYNAMIC_MEMORY == FALSE
@ -387,7 +387,7 @@ static void bta_hf_client_api_enable(tBTA_HF_CLIENT_DATA *p_data)
bta_hf_client_cb.p_cback = p_data->api_enable.p_cback; bta_hf_client_cb.p_cback = p_data->api_enable.p_cback;
/* check if mSBC support enabled */ /* check if mSBC support enabled */
if (strcmp(bta_hf_client_version, "1.6") == 0) { if (bta_hf_client_version >= HFP_HF_VERSION_1_6) {
bta_hf_client_cb.msbc_enabled = TRUE; bta_hf_client_cb.msbc_enabled = TRUE;
} else{ } else{
bta_hf_client_cb.msbc_enabled = FALSE; bta_hf_client_cb.msbc_enabled = FALSE;

View File

@ -18,6 +18,7 @@
******************************************************************************/ ******************************************************************************/
#include "bta_hf_client_int.h" #include "bta_hf_client_int.h"
#include "bta/bta_hf_client_api.h"
#include "common/bt_trace.h" #include "common/bt_trace.h"
#include <string.h> #include <string.h>
#include "common/bt_defs.h" #include "common/bt_defs.h"
@ -34,6 +35,11 @@
BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \ BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | \
BTM_SCO_PKT_TYPES_MASK_NO_3_EV5) BTM_SCO_PKT_TYPES_MASK_NO_3_EV5)
#define BTA_HF_CLIENT_SCO_PARAM_IDX_CVSD 0 /* SCO setting for CVSD */
#define BTA_HF_CLIENT_ESCO_PARAM_IDX_CVSD_S3 1 /* eSCO setting for CVSD S3 */
#define BTA_HF_CLIENT_ESCO_PARAM_IDX_MSBC_T2 2 /* eSCO setting for mSBC T2 */
#define BTA_HF_CLIENT_ESCO_PARAM_IDX_CVSD_S4 3 /* eSCO setting for CVSD S4 */
static const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = { static const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = {
/* SCO CVSD */ /* SCO CVSD */
{ {
@ -72,6 +78,19 @@ static const tBTM_ESCO_PARAMS bta_hf_client_esco_params[] = {
BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
.retrans_effort = BTM_ESCO_RETRANS_QUALITY, .retrans_effort = BTM_ESCO_RETRANS_QUALITY,
},
/* HFP 1.7+ */
/* ESCO CVSD S4 */
{
.rx_bw = BTM_64KBITS_RATE,
.tx_bw = BTM_64KBITS_RATE,
.max_latency = 12,
.voice_contfmt = BTM_VOICE_SETTING_CVSD,
/* Allow controller to use all types available except 5-slot EDR */
.packet_types = (BTM_SCO_LINK_ALL_PKT_MASK |
BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 |
BTM_SCO_PKT_TYPES_MASK_NO_3_EV5),
.retrans_effort = BTM_ESCO_RETRANS_QUALITY,
} }
}; };
@ -178,18 +197,27 @@ static void bta_hf_client_sco_conn_rsp(tBTM_ESCO_CONN_REQ_EVT_DATA *p_data)
{ {
tBTM_ESCO_PARAMS resp; tBTM_ESCO_PARAMS resp;
UINT8 hci_status = HCI_SUCCESS; UINT8 hci_status = HCI_SUCCESS;
UINT8 index = BTA_HF_CLIENT_ESCO_PARAM_IDX_CVSD_S3;
#if (BTM_SCO_HCI_INCLUDED == TRUE ) #if (BTM_SCO_HCI_INCLUDED == TRUE )
tBTA_HFP_CODEC_INFO codec_info = {BTA_HFP_SCO_CODEC_PCM}; tBTA_HFP_CODEC_INFO codec_info = {BTA_HFP_SCO_CODEC_PCM};
UINT32 pcm_sample_rate; UINT32 pcm_sample_rate;
#endif #endif
APPL_TRACE_DEBUG("%s", __FUNCTION__);
APPL_TRACE_DEBUG("%s: negotiated codec = %d", __FUNCTION__, bta_hf_client_cb.scb.negotiated_codec);
if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) { if (bta_hf_client_cb.scb.sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) {
if (p_data->link_type == BTM_LINK_TYPE_SCO) { if (p_data->link_type == BTM_LINK_TYPE_SCO) {
resp = bta_hf_client_esco_params[0]; index = BTA_HF_CLIENT_SCO_PARAM_IDX_CVSD;
} else { } else {
resp = bta_hf_client_esco_params[bta_hf_client_cb.scb.negotiated_codec]; if ((bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_CVSD) &&
(bta_hf_client_cb.scb.features && BTA_HF_CLIENT_FEAT_ESCO_S4) &&
(bta_hf_client_cb.scb.peer_features && BTA_HF_CLIENT_PEER_ESCO_S4)) {
index = BTA_HF_CLIENT_ESCO_PARAM_IDX_CVSD_S4;
} else if (bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_MSBC) {
index = BTA_HF_CLIENT_ESCO_PARAM_IDX_MSBC_T2;
}
} }
resp = bta_hf_client_esco_params[index];
/* tell sys to stop av if any */ /* tell sys to stop av if any */
bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr); bta_sys_sco_use(BTA_ID_HS, 1, bta_hf_client_cb.scb.peer_addr);
@ -350,6 +378,7 @@ static void bta_hf_client_sco_create(BOOLEAN is_orig)
tBTM_STATUS status; tBTM_STATUS status;
UINT8 *p_bd_addr = NULL; UINT8 *p_bd_addr = NULL;
tBTM_ESCO_PARAMS params; tBTM_ESCO_PARAMS params;
UINT8 index = BTA_HF_CLIENT_ESCO_PARAM_IDX_CVSD_S3;
#if (BTM_SCO_HCI_INCLUDED == TRUE ) #if (BTM_SCO_HCI_INCLUDED == TRUE )
tBTM_SCO_ROUTE_TYPE sco_route; tBTM_SCO_ROUTE_TYPE sco_route;
tBTA_HFP_CODEC_INFO codec_info = {BTA_HFP_SCO_CODEC_PCM}; tBTA_HFP_CODEC_INFO codec_info = {BTA_HFP_SCO_CODEC_PCM};
@ -364,7 +393,15 @@ static void bta_hf_client_sco_create(BOOLEAN is_orig)
return; return;
} }
params = bta_hf_client_esco_params[1]; if (bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_CVSD) {
if ((bta_hf_client_cb.scb.features && BTA_HF_CLIENT_FEAT_ESCO_S4) &&
(bta_hf_client_cb.scb.peer_features && BTA_HF_CLIENT_PEER_ESCO_S4)) {
index = BTA_HF_CLIENT_ESCO_PARAM_IDX_CVSD_S4;
}
} else if (bta_hf_client_cb.scb.negotiated_codec == BTM_SCO_CODEC_MSBC) {
index = BTA_HF_CLIENT_ESCO_PARAM_IDX_MSBC_T2;
}
params = bta_hf_client_esco_params[index];
/* if initiating set current scb and peer bd addr */ /* if initiating set current scb and peer bd addr */
if (is_orig) { if (is_orig) {

View File

@ -114,7 +114,7 @@ BOOLEAN bta_hf_client_add_record(char *p_service_name, UINT8 scn,
/* add profile descriptor list */ /* add profile descriptor list */
profile_uuid = UUID_SERVCLASS_HF_HANDSFREE; profile_uuid = UUID_SERVCLASS_HF_HANDSFREE;
version = HFP_VERSION_1_6; version = HFP_VERSION_1_7;
result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version); result &= SDP_AddProfileDescriptorList(sdp_handle, profile_uuid, version);

View File

@ -29,6 +29,7 @@
#define HFP_VERSION_1_1 0x0101 #define HFP_VERSION_1_1 0x0101
#define HFP_VERSION_1_5 0x0105 #define HFP_VERSION_1_5 0x0105
#define HFP_VERSION_1_6 0x0106 #define HFP_VERSION_1_6 0x0106
#define HFP_VERSION_1_7 0x0107
/* RFCOMM MTU SIZE */ /* RFCOMM MTU SIZE */
#define BTA_HF_CLIENT_MTU 256 #define BTA_HF_CLIENT_MTU 256

View File

@ -33,6 +33,10 @@
** Constants and data types ** Constants and data types
*****************************************************************************/ *****************************************************************************/
/* Hands-Free unit(HF) version */
#define HFP_HF_VERSION_1_6 0x0106 /* v1.6 */
#define HFP_HF_VERSION_1_7 0x0107 /* v1.7 */
/* HFP peer (AG) features*/ /* HFP peer (AG) features*/
#define BTA_HF_CLIENT_PEER_FEAT_3WAY 0x00000001 /* Three-way calling */ #define BTA_HF_CLIENT_PEER_FEAT_3WAY 0x00000001 /* Three-way calling */
#define BTA_HF_CLIENT_PEER_FEAT_ECNR 0x00000002 /* Echo cancellation and/or noise reduction */ #define BTA_HF_CLIENT_PEER_FEAT_ECNR 0x00000002 /* Echo cancellation and/or noise reduction */
@ -44,6 +48,9 @@
#define BTA_HF_CLIENT_PEER_ECC 0x00000080 /* Enhanced Call Control */ #define BTA_HF_CLIENT_PEER_ECC 0x00000080 /* Enhanced Call Control */
#define BTA_HF_CLIENT_PEER_EXTERR 0x00000100 /* Extended error codes */ #define BTA_HF_CLIENT_PEER_EXTERR 0x00000100 /* Extended error codes */
#define BTA_HF_CLIENT_PEER_CODEC 0x00000200 /* Codec Negotiation */ #define BTA_HF_CLIENT_PEER_CODEC 0x00000200 /* Codec Negotiation */
/* HFP 1.7+ */
#define BTA_HF_CLIENT_PEER_HF_IND 0x00000400 /* HF Indicators */
#define BTA_HF_CLIENT_PEER_ESCO_S4 0x00000800 /* eSCO S4 Setting Supported */
typedef UINT16 tBTA_HF_CLIENT_PEER_FEAT; typedef UINT16 tBTA_HF_CLIENT_PEER_FEAT;
@ -56,6 +63,8 @@ typedef UINT16 tBTA_HF_CLIENT_PEER_FEAT;
#define BTA_HF_CLIENT_FEAT_ECS 0x00000020 /* Enhanced Call Status */ #define BTA_HF_CLIENT_FEAT_ECS 0x00000020 /* Enhanced Call Status */
#define BTA_HF_CLIENT_FEAT_ECC 0x00000040 /* Enhanced Call Control */ #define BTA_HF_CLIENT_FEAT_ECC 0x00000040 /* Enhanced Call Control */
#define BTA_HF_CLIENT_FEAT_CODEC 0x00000080 /* Codec Negotiation */ #define BTA_HF_CLIENT_FEAT_CODEC 0x00000080 /* Codec Negotiation */
#define BTA_HF_CLIENT_FEAT_HF_IND 0x00000100 /* HF indicators */
#define BTA_HF_CLIENT_FEAT_ESCO_S4 0x00000200 /* eSCO S4 Setting Supported */
/* HFP HF extended call handling - masks not related to any spec */ /* HFP HF extended call handling - masks not related to any spec */
#define BTA_HF_CLIENT_CHLD_REL 0x00000001 /* 0 Release waiting call or held calls */ #define BTA_HF_CLIENT_CHLD_REL 0x00000001 /* 0 Release waiting call or held calls */

View File

@ -51,13 +51,13 @@
#endif #endif
#ifndef BTC_HF_CLIENT_FEATURES #ifndef BTC_HF_CLIENT_FEATURES
#define BTC_HF_CLIENT_FEATURES ( BTA_HF_CLIENT_FEAT_ECNR | \ #define BTC_HF_CLIENT_FEATURES ( BTA_HF_CLIENT_FEAT_ECNR | \
BTA_HF_CLIENT_FEAT_3WAY | \ BTA_HF_CLIENT_FEAT_3WAY | \
BTA_HF_CLIENT_FEAT_CLI | \ BTA_HF_CLIENT_FEAT_CLI | \
BTA_HF_CLIENT_FEAT_VREC | \ BTA_HF_CLIENT_FEAT_VREC | \
BTA_HF_CLIENT_FEAT_VOL | \ BTA_HF_CLIENT_FEAT_VOL | \
BTA_HF_CLIENT_FEAT_ECS | \ BTA_HF_CLIENT_FEAT_ECS | \
BTA_HF_CLIENT_FEAT_ECC | \ BTA_HF_CLIENT_FEAT_ECC | \
BTA_HF_CLIENT_FEAT_CODEC) BTA_HF_CLIENT_FEAT_CODEC)
#endif #endif
@ -66,7 +66,7 @@
/************************************************************************************ /************************************************************************************
** Static variables ** Static variables
************************************************************************************/ ************************************************************************************/
const char *btc_hf_client_version = "1.6"; const int btc_hf_client_version = HFP_HF_VERSION_1_7;
#if HFP_DYNAMIC_MEMORY == FALSE #if HFP_DYNAMIC_MEMORY == FALSE
static hf_client_local_param_t hf_client_local_param; static hf_client_local_param_t hf_client_local_param;
@ -200,7 +200,7 @@ static bt_status_t connect_int( bt_bdaddr_t *bd_addr, uint16_t uuid )
bt_status_t btc_hf_client_connect( bt_bdaddr_t *bd_addr ) bt_status_t btc_hf_client_connect( bt_bdaddr_t *bd_addr )
{ {
BTC_TRACE_EVENT("HFP Client version is %s", btc_hf_client_version); BTC_TRACE_EVENT("HFP Client version is 0x%04x", btc_hf_client_version);
CHECK_HF_CLIENT_INIT(); CHECK_HF_CLIENT_INIT();
return btc_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int); return btc_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int);
} }
@ -690,33 +690,36 @@ bt_status_t btc_hf_client_execute_service(BOOLEAN b_enable)
{ {
BTC_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable); BTC_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable);
if (b_enable) if (b_enable)
{ {
/* Enable and register with BTA-HFClient */ /* Enable and register with BTA-HFClient */
BTA_HfClientEnable(bte_hf_client_evt); BTA_HfClientEnable(bte_hf_client_evt);
if (strcmp(btc_hf_client_version, "1.6") == 0) hf_client_local_param.btc_hf_client_features = BTC_HF_CLIENT_FEATURES;
{ if (btc_hf_client_version >= HFP_HF_VERSION_1_7)
BTC_TRACE_EVENT("Support Codec Nego. %d ", BTC_HF_CLIENT_FEATURES); {
BTA_HfClientRegister(BTC_HF_CLIENT_SECURITY, BTC_HF_CLIENT_FEATURES, hf_client_local_param.btc_hf_client_features |= BTA_HF_CLIENT_FEAT_ESCO_S4;
BTC_HF_CLIENT_SERVICE_NAME); BTC_TRACE_EVENT("eSCO S4 Setting Supported");
}
else
{
BTC_TRACE_EVENT("No Codec Nego Supported");
hf_client_local_param.btc_hf_client_features = BTC_HF_CLIENT_FEATURES;
hf_client_local_param.btc_hf_client_features = hf_client_local_param.btc_hf_client_features & (~BTA_HF_CLIENT_FEAT_CODEC);
BTC_TRACE_EVENT("hf_client_local_param.btc_hf_client_features is %d", hf_client_local_param.btc_hf_client_features);
BTA_HfClientRegister(BTC_HF_CLIENT_SECURITY, hf_client_local_param.btc_hf_client_features,
BTC_HF_CLIENT_SERVICE_NAME);
}
} }
else else if (btc_hf_client_version >= HFP_HF_VERSION_1_6)
{ {
BTA_HfClientDeregister(hf_client_local_param.btc_hf_client_cb.handle); BTC_TRACE_EVENT("No eSCO S4 Setting Supported");
BTA_HfClientDisable(); }
} else
return BT_STATUS_SUCCESS; {
BTC_TRACE_EVENT("No Codec Nego Supported");
hf_client_local_param.btc_hf_client_features = hf_client_local_param.btc_hf_client_features & (~BTA_HF_CLIENT_FEAT_CODEC);
}
BTC_TRACE_EVENT("hf_client_local_param.btc_hf_client_features is %d", hf_client_local_param.btc_hf_client_features);
BTA_HfClientRegister(BTC_HF_CLIENT_SECURITY, hf_client_local_param.btc_hf_client_features,
BTC_HF_CLIENT_SERVICE_NAME);
}
else
{
BTA_HfClientDeregister(hf_client_local_param.btc_hf_client_cb.handle);
BTA_HfClientDisable();
}
return BT_STATUS_SUCCESS;
} }
static void process_ind_evt(tBTA_HF_CLIENT_IND *ind) static void process_ind_evt(tBTA_HF_CLIENT_IND *ind)