Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f677ae32 authored by Mudumba Ananth's avatar Mudumba Ananth Committed by Jack He
Browse files

eSCO: BT 4.1 Enhanced SCO command (1/5)

Added support for BT 4.1 enhanced SCO feature on the stack.
This feature allows the stack to create a SCO connection with
remote device by using Hci_Enhanced_Setup_Synchronous_Connection
command after checking the controller (4.1) support for
enhanced SCO command.
Added the command parameters to use the command in both wide band
speech(WBS) and narrow band speech(NBS) scenarios.

Number of Broadcom vendor specific commands(VSCs)that are needed
to be sent to Broadcom controllers along with this command have
also been updated accordingly

NOTE: This change would also need a firmware patch for
the feature to work on Broadcom contollers which will
be delivered to Google in a separate change set.

Bug: 19540029
Test: make, HFP PTS test, testplans/86884, testplans/87103
Change-Id: I1014d81be5cbe91078a4484dd072ac3957bfdfe4
parent d9890e5c
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -50,9 +50,9 @@
#ifndef BTA_AG_SCO_PKT_TYPES
/* S1 packet type setting from HFP 1.5 spec */
#define BTA_AG_SCO_PKT_TYPES /* BTM_SCO_LINK_ALL_PKT_MASK */     \
  (BTM_SCO_LINK_ONLY_MASK | BTM_SCO_PKT_TYPES_MASK_EV3 |               \
   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_SCO_LINK_ONLY_MASK | ESCO_PKT_TYPES_MASK_EV3 |            \
   ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 | \
   ESCO_PKT_TYPES_MASK_NO_3_EV5)
#endif

#ifndef BTA_AG_BIND_INFO
+22 −0
Original line number Diff line number Diff line
@@ -86,3 +86,25 @@ void bta_ag_ci_slc_ready(uint16_t handle) {

  bta_sys_sendmsg(p_buf);
}

/******************************************************************************
 *
 * Function         bta_ag_ci_audio_open_continue
 *
 * Description      This function is called to notify AG that pre-SCO vendor
 *                  setup is finished and the AG can move on and
 *                  send the rest of HCI commands meant to be sent to
 *                  create/accept a SCO connection with the peer device.
 *
 * Returns          void
 *
 *****************************************************************************/
void bta_ag_ci_audio_open_continue(uint16_t handle, uint8_t status) {
  tBTA_AG_DATA* p_buf;
  if ((p_buf = (tBTA_AG_DATA*)osi_malloc(sizeof(tBTA_AG_DATA))) != NULL) {
    p_buf->api_result.hdr.event = BTA_AG_CI_AUDIO_OPEN_CONTINUE_EVT;
    p_buf->api_result.hdr.layer_specific = handle;
    p_buf->api_result.result = status;
    bta_sys_sendmsg(p_buf);
  }
}
+12 −7
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ enum {
  BTA_AG_SVC_TIMEOUT_EVT,
  BTA_AG_CI_SCO_DATA_EVT,
  BTA_AG_CI_SLC_READY_EVT,
  BTA_AG_CI_AUDIO_OPEN_CONTINUE_EVT,
  BTA_AG_MAX_EVT,

  /* these events are handled outside of the state machine */
@@ -265,8 +266,10 @@ typedef struct {
  alarm_t* codec_negotiation_timer;
  tBTA_AG_PEER_CODEC peer_codecs; /* codecs for eSCO supported by the peer */
  tBTA_AG_PEER_CODEC sco_codec;   /* codec to be used for eSCO connection */
#endif
  tBTA_AG_PEER_CODEC
      inuse_codec;     /* codec being used for the current SCO connection */
#if (BTM_WBS_INCLUDED == TRUE)
  bool codec_updated;  /* set to true whenever the app updates codec type */
  bool codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
  tBTA_AG_SCO_MSBC_SETTINGS
@@ -288,8 +291,9 @@ typedef struct {
  tBTA_AG_SCB* p_xfer_scb;  /* SCB associated with SCO transfer */
  uint16_t cur_idx;         /* SCO handle */
  uint8_t state;            /* SCO state variable */
  bool param_updated;      /* if params were updated to non-default */
  tBTM_ESCO_PARAMS params; /* ESCO parameters */
  bool is_local;            /* SCO connection initiated locally or remotely */
  uint8_t set_audio_status; /* SCO variable for storing the status of the
                           pre-SCO vendor setup (set_audio_state)*/
} tBTA_AG_SCO_CB;

/* type for AG control block */
@@ -388,6 +392,8 @@ extern void bta_ag_rfc_acp_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_rfc_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_listen(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_ci_sco_open_continue(tBTA_AG_SCB* p_scb,
                                        tBTA_AG_DATA* p_data);
extern void bta_ag_sco_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
#if (BTM_WBS_INCLUDED == TRUE)
extern void bta_ag_sco_codec_nego(tBTA_AG_SCB* p_scb, bool result);
@@ -406,7 +412,6 @@ extern void bta_ag_send_bcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
#endif
extern void bta_ag_send_ring(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_ci_sco_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_set_esco_param(bool set_reset, tBTM_ESCO_PARAMS* param);
extern void bta_ag_ci_rx_data(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_rcvd_slc_ready(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);

+46 −25
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ enum {
  BTA_AG_SEND_RING,
  BTA_AG_CI_SCO_DATA,
  BTA_AG_CI_RX_DATA,
  BTA_AG_CI_SCO_OPEN_CONTINUE,
  BTA_AG_RCVD_SLC_READY,
  BTA_AG_NUM_ACTIONS
};
@@ -92,17 +93,23 @@ typedef void (*tBTA_AG_ACTION)(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);

/* action functions */
const tBTA_AG_ACTION bta_ag_action[] = {
    bta_ag_register,       bta_ag_deregister,    bta_ag_start_open,
    bta_ag_rfc_do_open,    bta_ag_rfc_do_close,  bta_ag_start_dereg,
    bta_ag_start_close,    bta_ag_rfc_open,      bta_ag_open_fail,
    bta_ag_rfc_acp_open,   bta_ag_rfc_close,     bta_ag_rfc_fail,
    bta_ag_rfc_data,       bta_ag_disc_int_res,  bta_ag_disc_fail,
    bta_ag_disc_acp_res,   bta_ag_free_db,       bta_ag_sco_conn_open,
    bta_ag_sco_conn_close, bta_ag_sco_listen,    bta_ag_sco_open,
    bta_ag_sco_close,      bta_ag_sco_shutdown,  bta_ag_post_sco_open,
    bta_ag_post_sco_close, bta_ag_svc_conn_open, bta_ag_result,
    bta_ag_setcodec,       bta_ag_send_ring,     bta_ag_ci_sco_data,
    bta_ag_ci_rx_data,     bta_ag_rcvd_slc_ready};
    bta_ag_register,       bta_ag_deregister,
    bta_ag_start_open,     bta_ag_rfc_do_open,
    bta_ag_rfc_do_close,   bta_ag_start_dereg,
    bta_ag_start_close,    bta_ag_rfc_open,
    bta_ag_open_fail,      bta_ag_rfc_acp_open,
    bta_ag_rfc_close,      bta_ag_rfc_fail,
    bta_ag_rfc_data,       bta_ag_disc_int_res,
    bta_ag_disc_fail,      bta_ag_disc_acp_res,
    bta_ag_free_db,        bta_ag_sco_conn_open,
    bta_ag_sco_conn_close, bta_ag_sco_listen,
    bta_ag_sco_open,       bta_ag_sco_close,
    bta_ag_sco_shutdown,   bta_ag_post_sco_open,
    bta_ag_post_sco_close, bta_ag_svc_conn_open,
    bta_ag_result,         bta_ag_setcodec,
    bta_ag_send_ring,      bta_ag_ci_sco_data,
    bta_ag_ci_rx_data,     bta_ag_ci_sco_open_continue,
    bta_ag_rcvd_slc_ready};

/* state table information */
#define BTA_AG_ACTIONS 2    /* number of actions */
@@ -134,7 +141,9 @@ const uint8_t bta_ag_st_init[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST}};
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_INIT_ST}};

/* state table for opening state */
const uint8_t bta_ag_st_opening[][BTA_AG_NUM_COLS] = {
@@ -164,7 +173,9 @@ const uint8_t bta_ag_st_opening[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST}};
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_OPENING_ST}};

/* state table for open state */
const uint8_t bta_ag_st_open[][BTA_AG_NUM_COLS] = {
@@ -194,8 +205,10 @@ const uint8_t bta_ag_st_open[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_SEND_RING, BTA_AG_IGNORE, BTA_AG_OPEN_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_START_CLOSE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_CI_SCO_DATA, BTA_AG_IGNORE, BTA_AG_OPEN_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_RCVD_SLC_READY, BTA_AG_IGNORE,
                            BTA_AG_OPEN_ST}};
    /* CI_SLC_READY_EVT */
    {BTA_AG_RCVD_SLC_READY, BTA_AG_IGNORE, BTA_AG_OPEN_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_CI_SCO_OPEN_CONTINUE, BTA_AG_IGNORE, BTA_AG_OPEN_ST}};

/* state table for closing state */
const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = {
@@ -224,7 +237,9 @@ const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = {
    /* RING_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* SVC_TOUT_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_SCO_DATA_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST}};
    /* CI_SLC_READY_EVT */ {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST},
    /* CI_AUDIO_OPEN_CONTINUE_EVT */
    {BTA_AG_IGNORE, BTA_AG_IGNORE, BTA_AG_CLOSING_ST}};

/* type for state table */
typedef const uint8_t (*tBTA_AG_ST_TBL)[BTA_AG_NUM_COLS];
@@ -723,22 +738,25 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
  tBTA_AG_ST_TBL state_table;
  uint8_t action;
  int i;

#if (BTA_AG_DEBUG == TRUE)
  uint16_t in_event = event;
  uint8_t in_state = p_scb->state;
  uint16_t previous_event = event;
  uint8_t previous_state = p_scb->state;

  /* Ignore displaying of AT results when not connected (Ignored in state
   * machine) */
  if (in_event != BTA_AG_API_RESULT_EVT || p_scb->state == BTA_AG_OPEN_ST) {
  if ((previous_event != BTA_AG_API_RESULT_EVT ||
       p_scb->state == BTA_AG_OPEN_ST) &&
      event != BTA_AG_CI_SCO_DATA_EVT) {
    APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d (%s), Event 0x%04x (%s)",
                     bta_ag_scb_to_idx(p_scb), p_scb->state,
                     bta_ag_state_str(p_scb->state), event,
                     bta_ag_evt_str(event, p_data->api_result.result));
  }
#else
  APPL_TRACE_EVENT("AG evt (hdl 0x%04x): State %d, Event 0x%04x",
                   bta_ag_scb_to_idx(p_scb), p_scb->state, event);
  if (event != BTA_AG_CI_SCO_DATA_EVT) {
    APPL_TRACE_EVENT("%s: AG evt (hdl 0x%04x): State %d, Event 0x%04x",
                     __func__, bta_ag_scb_to_idx(p_scb), p_scb->state, event);
  }
#endif

  event &= 0x00FF;
@@ -763,10 +781,11 @@ void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event,
    }
  }
#if (BTA_AG_DEBUG == TRUE)
  if (p_scb->state != in_state) {
  if (p_scb->state != previous_state) {
    APPL_TRACE_EVENT("BTA AG State Change: [%s] -> [%s] after Event [%s]",
                     bta_ag_state_str(in_state), bta_ag_state_str(p_scb->state),
                     bta_ag_evt_str(in_event, p_data->api_result.result));
                     bta_ag_state_str(previous_state),
                     bta_ag_state_str(p_scb->state),
                     bta_ag_evt_str(previous_event, p_data->api_result.result));
  }
#endif
}
@@ -914,6 +933,8 @@ static char* bta_ag_evt_str(uint16_t event, tBTA_AG_RES result) {
      return "SCO data Callin";
    case BTA_AG_CI_SLC_READY_EVT:
      return "SLC Ready Callin";
    case BTA_AG_CI_AUDIO_OPEN_CONTINUE_EVT:
      return "Pre-SCO setup done. Continue Audio Open";
    default:
      return "Unknown AG Event";
  }
+251 −256

File changed.

Preview size limit exceeded, changes collapsed.

Loading