From 5020faf559ad0c3ab6a9ff3427778266aafc0e2b Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Tue, 31 May 2022 11:02:40 +0800 Subject: [PATCH] update hfp_ag version to 1.7.2 --- .../bluedroid/api/include/api/esp_hf_ag_api.h | 4 + .../bt/host/bluedroid/bta/hf_ag/bta_ag_main.c | 4 +- .../bt/host/bluedroid/bta/hf_ag/bta_ag_sco.c | 109 +++++++++++++----- .../bt/host/bluedroid/bta/hf_ag/bta_ag_sdp.c | 2 +- .../bluedroid/bta/hf_ag/include/bta_ag_int.h | 13 ++- .../bluedroid/bta/include/bta/bta_ag_api.h | 15 ++- .../btc/profile/std/hf_ag/btc_hf_ag.c | 22 +--- 7 files changed, 113 insertions(+), 56 deletions(-) diff --git a/components/bt/host/bluedroid/api/include/api/esp_hf_ag_api.h b/components/bt/host/bluedroid/api/include/api/esp_hf_ag_api.h index 3d4999f8a7..8637d74a31 100644 --- a/components/bt/host/bluedroid/api/include/api/esp_hf_ag_api.h +++ b/components/bt/host/bluedroid/api/include/api/esp_hf_ag_api.h @@ -34,6 +34,10 @@ extern "C" { #define ESP_HF_PEER_FEAT_ECC 0x80 /* Enhanced Call Control */ #define ESP_HF_PEER_FEAT_EXTERR 0x100 /* Extended error codes */ #define ESP_HF_PEER_FEAT_CODEC 0x200 /* Codec Negotiation */ +/* HFP 1.7+ */ +#define ESP_HF_PEER_FEAT_HF_IND 0x400 /* HF Indicators */ +#define ESP_HF_PEER_FEAT_ESCO_S4 0x800 /* eSCO S4 Setting Supported */ + /* CHLD feature masks of HF AG */ #define ESP_HF_CHLD_FEAT_REL 0x01 /* 0 Release waiting call or held calls */ diff --git a/components/bt/host/bluedroid/bta/hf_ag/bta_ag_main.c b/components/bt/host/bluedroid/bta/hf_ag/bta_ag_main.c index 2470c6008b..a517725d9f 100644 --- a/components/bt/host/bluedroid/bta/hf_ag/bta_ag_main.c +++ b/components/bt/host/bluedroid/bta/hf_ag/bta_ag_main.c @@ -272,7 +272,7 @@ const tBTA_AG_ST_TBL bta_ag_st_tbl[] = /***************************************************************************** ** Global data *****************************************************************************/ -const char *bta_ag_version = "1.6"; +const uint16_t bta_ag_version = HFP_VERSION_1_7; /* AG control block */ #if BTA_DYNAMIC_MEMORY == FALSE tBTA_AG_CB bta_ag_cb; @@ -758,7 +758,7 @@ static void bta_ag_api_enable(tBTA_AG_DATA *p_data) bta_ag_cb.p_cback = p_data->api_enable.p_cback; bta_ag_cb.parse_mode = p_data->api_enable.parse_mode; /* check if mSBC support enabled */ - if (strcmp(bta_ag_version, "1.6") == 0) { + if (bta_ag_version >= HFP_VERSION_1_6) { bta_ag_cb.msbc_enabled = TRUE; bta_ag_cb.scb->negotiated_codec = BTM_SCO_CODEC_MSBC; } else{ diff --git a/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sco.c b/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sco.c index bdeb2188d0..a4263dde8f 100644 --- a/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sco.c +++ b/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sco.c @@ -70,10 +70,11 @@ enum }; #if (BTM_WBS_INCLUDED == TRUE) -#define BTA_AG_NUM_CODECS 3 -#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD */ +#define BTA_AG_NUM_CODECS 4 +#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD */ #define BTA_AG_ESCO_SETTING_IDX_T1 1 /* eSCO setting for mSBC T1 */ #define BTA_AG_ESCO_SETTING_IDX_T2 2 /* eSCO setting for mSBC T2 */ +#define BTA_AG_ESCO_SETTING_IDX_S4 3 /* eSCO setting for CVSD S4 */ static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = { @@ -81,9 +82,9 @@ static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = { BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ - 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ + 10, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ - (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ + (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ BTM_SCO_PKT_TYPES_MASK_HV2 + BTM_SCO_PKT_TYPES_MASK_HV3 + BTM_SCO_PKT_TYPES_MASK_EV3 + @@ -91,7 +92,7 @@ static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = BTM_SCO_PKT_TYPES_MASK_EV5 + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), - BTM_ESCO_RETRANS_POWER /* Retransmission effort */ + BTM_ESCO_RETRANS_POWER /* Retransmission effort */ }, /* mSBC T1 */ { @@ -104,7 +105,7 @@ static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 ), - BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ + BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ }, /* mSBC T2*/ { @@ -116,26 +117,56 @@ static const tBTM_ESCO_PARAMS bta_ag_esco_params[BTA_AG_NUM_CODECS] = BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), - BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ + BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ + }, + /* HFP 1.7+ */ + /* eSCO CVSD S4 */ + { + BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ + BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ + 12, /* 12 ms (HS/HF can use EV3, 2-EV3) */ + BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ + (BTM_SCO_LINK_ALL_PKT_MASK | + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | + BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), + BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ } }; #else +#define BTA_AG_NUM_CODECS 2 +#define BTA_AG_ESCO_SETTING_IDX_CVSD 0 /* eSCO setting for CVSD S3 */ +#define BTA_AG_ESCO_SETTING_IDX_S4 1 /* eSCO setting for CVSD S4 */ + /* WBS not included, CVSD by default */ -static const tBTM_ESCO_PARAMS bta_ag_esco_params = +static const tBTM_ESCO_PARAMS bta_ag_esco_params[] = { - BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ - BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ - 0x000a, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ - 0x0060, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ - (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ - BTM_SCO_PKT_TYPES_MASK_HV2 + - BTM_SCO_PKT_TYPES_MASK_HV3 + - BTM_SCO_PKT_TYPES_MASK_EV3 + - BTM_SCO_PKT_TYPES_MASK_EV4 + - BTM_SCO_PKT_TYPES_MASK_EV5 + - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), - BTM_ESCO_RETRANS_POWER /* Retransmission effort */ + { + BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ + BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ + 10, /* 10 ms (HS/HF can use EV3, 2-EV3, 3-EV3) */ + BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ + (BTM_SCO_PKT_TYPES_MASK_HV1 + /* Packet Types */ + BTM_SCO_PKT_TYPES_MASK_HV2 + + BTM_SCO_PKT_TYPES_MASK_HV3 + + BTM_SCO_PKT_TYPES_MASK_EV3 + + BTM_SCO_PKT_TYPES_MASK_EV4 + + BTM_SCO_PKT_TYPES_MASK_EV5 + + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 + + BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), + BTM_ESCO_RETRANS_POWER /* Retransmission effort */ + }, + /* HFP 1.7+ */ + /* eSCO CVSD S4 */ + { + BTM_64KBITS_RATE, /* TX Bandwidth (64 kbits/sec) */ + BTM_64KBITS_RATE, /* RX Bandwidth (64 kbits/sec) */ + 12, /* 12 ms (HS/HF can use EV3, 2-EV3) */ + BTM_VOICE_SETTING_CVSD, /* Inp Linear, Air CVSD, 2s Comp, 16bit */ + (BTM_SCO_LINK_ALL_PKT_MASK | + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | + BTM_SCO_PKT_TYPES_MASK_NO_3_EV5), + BTM_ESCO_RETRANS_QUALITY /* Retransmission effort */ + } }; #endif @@ -470,9 +501,9 @@ static void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig) tBTM_STATUS status; UINT8 *p_bd_addr = NULL; tBTM_ESCO_PARAMS params; + UINT8 codec_index = BTA_AG_ESCO_SETTING_IDX_CVSD; #if (BTM_WBS_INCLUDED == TRUE) tBTA_AG_PEER_CODEC esco_codec = BTM_SCO_CODEC_CVSD; - int codec_index = 0; #endif #if (BTM_SCO_HCI_INCLUDED == TRUE) tBTM_SCO_ROUTE_TYPE sco_route; @@ -513,11 +544,20 @@ static void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig) codec_index = BTA_AG_ESCO_SETTING_IDX_T1; } } - params = bta_ag_esco_params[codec_index]; + /* If eSCO codec is CVSD and eSC0 S4 is supported, index is S4 */ + else if ((esco_codec == BTM_SCO_CODEC_CVSD) && (p_scb->features & BTA_AG_FEAT_ESCO_S4) + && (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) + { + codec_index = BTA_AG_ESCO_SETTING_IDX_S4; + } + #else - /* When WBS is not included, use CVSD by default */ - params = bta_ag_esco_params; + if ((p_scb->features & BTA_AG_FEAT_ESCO_S4) && (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) + { + codec_index = BTA_AG_ESCO_SETTING_IDX_S4; + } #endif + params = bta_ag_esco_params[codec_index]; if(bta_ag_cb.sco.param_updated) /* If we do not use the default parameters */ params = bta_ag_cb.sco.params; @@ -528,10 +568,13 @@ static void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig) if (esco_codec == BTM_SCO_CODEC_CVSD) /* For CVSD */ #endif { - /* Use the application packet types (5 slot EV packets not allowed) */ - params.packet_types = p_bta_ag_cfg->sco_pkt_types | - BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | - BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; + if (codec_index == BTA_AG_ESCO_SETTING_IDX_CVSD) + { + /* Use the application packet types (5 slot EV packets not allowed) */ + params.packet_types = p_bta_ag_cfg->sco_pkt_types | + BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | + BTM_SCO_PKT_TYPES_MASK_NO_3_EV5; + } } } @@ -1615,6 +1658,7 @@ void bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data if (p_data->link_type == BTM_LINK_TYPE_SCO) { + resp.retrans_effort = BTM_ESCO_RETRANS_OFF; resp.packet_types = (BTM_SCO_LINK_ONLY_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV3 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV3 | @@ -1623,6 +1667,13 @@ void bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data } else /* Allow controller to use all types available except 5-slot EDR */ { + if ((p_scb->features & BTA_AG_FEAT_ESCO_S4) && + (p_scb->peer_features & BTA_AG_PEER_FEAT_ESCO_S4)) + { + resp.max_latency = 12; + resp.retrans_effort = BTM_ESCO_RETRANS_QUALITY; + } + resp.packet_types = (BTM_SCO_LINK_ALL_PKT_MASK | BTM_SCO_PKT_TYPES_MASK_NO_2_EV5 | BTM_SCO_PKT_TYPES_MASK_NO_3_EV5); diff --git a/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sdp.c b/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sdp.c index 3884a7d34c..60688c4924 100644 --- a/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sdp.c +++ b/components/bt/host/bluedroid/bta/hf_ag/bta_ag_sdp.c @@ -157,7 +157,7 @@ BOOLEAN bta_ag_add_record(UINT16 service_uuid, char *p_service_name, UINT8 scn, /* add profile descriptor list */ if (service_uuid == UUID_SERVCLASS_AG_HANDSFREE) { profile_uuid = UUID_SERVCLASS_HF_HANDSFREE; - version = HFP_VERSION_1_6; + version = HFP_VERSION_1_7; } else { profile_uuid = UUID_SERVCLASS_HEADSET; version = HSP_VERSION_1_2; diff --git a/components/bt/host/bluedroid/bta/hf_ag/include/bta_ag_int.h b/components/bt/host/bluedroid/bta/hf_ag/include/bta_ag_int.h index 5381c66433..4956916d7d 100644 --- a/components/bt/host/bluedroid/bta/hf_ag/include/bta_ag_int.h +++ b/components/bt/host/bluedroid/bta/hf_ag/include/bta_ag_int.h @@ -48,6 +48,7 @@ #define HFP_VERSION_1_1 0x0101 #define HFP_VERSION_1_5 0x0105 #define HFP_VERSION_1_6 0x0106 +#define HFP_VERSION_1_7 0x0107 #define HSP_VERSION_1_0 0x0100 #define HSP_VERSION_1_2 0x0102 @@ -75,12 +76,12 @@ #define BTA_AG_INT 1 /* initiating connection */ /* feature mask that matches spec */ -#define BTA_AG_BSRF_FEAT_SPEC (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | \ - BTA_AG_FEAT_VREC | BTA_AG_FEAT_INBAND | \ - BTA_AG_FEAT_VTAG | BTA_AG_FEAT_REJECT | \ - BTA_AG_FEAT_ECS | BTA_AG_FEAT_ECC | \ - BTA_AG_FEAT_EXTERR | BTA_AG_FEAT_CODEC | \ - BTA_AG_FEAT_VOIP) +#define BTA_AG_BSRF_FEAT_SPEC (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | \ + BTA_AG_FEAT_VREC | BTA_AG_FEAT_INBAND | \ + BTA_AG_FEAT_VTAG | BTA_AG_FEAT_REJECT | \ + BTA_AG_FEAT_ECS | BTA_AG_FEAT_ECC | \ + BTA_AG_FEAT_EXTERR | BTA_AG_FEAT_CODEC | \ + BTA_AG_FEAT_ESCO_S4| BTA_AG_FEAT_VOIP) #define BTA_AG_SDP_FEAT_SPEC (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR | \ BTA_AG_FEAT_VREC | BTA_AG_FEAT_INBAND | \ diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_ag_api.h b/components/bt/host/bluedroid/bta/include/bta/bta_ag_api.h index f7c6dd6a39..aff63a26ea 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_ag_api.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_ag_api.h @@ -45,12 +45,16 @@ #define BTA_AG_FEAT_ECC 0x00000080 /* Enhanced Call Control */ #define BTA_AG_FEAT_EXTERR 0x00000100 /* Extended error codes */ #define BTA_AG_FEAT_CODEC 0x00000200 /* Codec Negotiation */ -#define BTA_AG_FEAT_VOIP 0x00000400 /* VoIP call */ +/* HFP 1.7+ */ +#define BTA_AG_FEAT_HF_IND 0x00000400 /* HF Indicators */ +#define BTA_AG_FEAT_ESCO_S4 0x00000800 /* eSCO S4 Setting Supported */ + /* Proprietary features: using 31 ~ 16 bits */ #define BTA_AG_FEAT_BTRH 0x00010000 /* CCAP incoming call hold */ #define BTA_AG_FEAT_UNAT 0x00020000 /* Pass unknown AT commands to application */ #define BTA_AG_FEAT_NOSCO 0x00040000 /* No SCO control performed by BTA AG */ #define BTA_AG_FEAT_NO_ESCO 0x00080000 /* Do not allow or use eSCO */ +#define BTA_AG_FEAT_VOIP 0x00100000 /* VoIP call */ typedef UINT32 tBTA_AG_FEAT; /* HFP peer features */ @@ -62,9 +66,16 @@ typedef UINT32 tBTA_AG_FEAT; #define BTA_AG_PEER_FEAT_ECS 0x0020 /* Enhanced Call Status */ #define BTA_AG_PEER_FEAT_ECC 0x0040 /* Enhanced Call Control */ #define BTA_AG_PEER_FEAT_CODEC 0x0080 /* Codec Negotiation */ -#define BTA_AG_PEER_FEAT_VOIP 0x0100 /* VoIP call */ +/* HFP 1.7+ */ +#define BTA_AG_PEER_FEAT_HF_IND 0x0100 /* HF Indicators */ +#define BTA_AG_PEER_FEAT_ESCO_S4 0x0200 /* eSCO S4 Setting Supported */ typedef UINT16 tBTA_AG_PEER_FEAT; +/* Proprietary features: using bits after 12 */ +/* Pass unknown AT command responses to application */ +#define BTA_AG_PEER_FEAT_UNAT 0x1000 +#define BTA_AG_PEER_FEAT_VOIP 0x2000 /* VoIP call */ + /* AG extended call handling - masks not related to any spec */ #define BTA_AG_CLIENT_CHLD_REL 0x00000001 /* 0 Release waiting call or held calls */ #define BTA_AG_CLIENT_CHLD_REL_ACC 0x00000002 /* 1 Release active calls and accept other (waiting or held) cal */ diff --git a/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c b/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c index caffc76c08..ef04498bc8 100644 --- a/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c +++ b/components/bt/host/bluedroid/btc/profile/std/hf_ag/btc_hf_ag.c @@ -1,20 +1,8 @@ -/****************************************************************************** +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD * - * Copyright (C) 2009-2012 Broadcom Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ******************************************************************************/ + * SPDX-License-Identifier: Apache-2.0 + */ /************************************************************************************ * @@ -68,6 +56,7 @@ static hf_local_param_t *hf_local_param; BTA_AG_FEAT_VREC | \ BTA_AG_FEAT_INBAND | \ BTA_AG_FEAT_CODEC | \ + BTA_AG_FEAT_ESCO_S4| \ BTA_AG_FEAT_UNAT) #endif #else @@ -78,6 +67,7 @@ static hf_local_param_t *hf_local_param; BTA_AG_FEAT_EXTERR | \ BTA_AG_FEAT_VREC | \ BTA_AG_FEAT_INBAND | \ + BTA_AG_FEAT_ESCO_S4| \ BTA_AG_FEAT_UNAT) #endif #endif