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

Commit a8fbed7b authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topic 'eSCO'

* changes:
  eSCO: Format changes to original vendor patch (4/5)
  eSCO: Additional fix to get eSCO working for HFP and HSP (3/5)
  eSCO: Remove BTM_WBS_INCLUDED from the stack (2/5)
  eSCO: BT 4.1 Enhanced SCO command (1/5)
parents ac06a43b ad319935
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -341,10 +341,8 @@ void bta_ag_rfc_fail(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
  p_scb->conn_handle = 0;
  p_scb->conn_service = 0;
  p_scb->peer_features = 0;
#if (BTM_WBS_INCLUDED == TRUE)
  p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
  p_scb->sco_codec = BTA_AG_CODEC_CVSD;
#endif
  p_scb->role = 0;
  p_scb->svc_conn = false;
  p_scb->hsp_version = HSP_VERSION_1_2;
@@ -376,14 +374,12 @@ void bta_ag_rfc_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
  /* reinitialize stuff */
  p_scb->conn_service = 0;
  p_scb->peer_features = 0;
#if (BTM_WBS_INCLUDED == TRUE)
  p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
  p_scb->sco_codec = BTA_AG_CODEC_CVSD;
  /* Clear these flags upon SLC teardown */
  p_scb->codec_updated = false;
  p_scb->codec_fallback = false;
  p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
#endif
  p_scb->role = 0;
  p_scb->post_sco = BTA_AG_POST_SCO_NONE;
  p_scb->svc_conn = false;
@@ -395,9 +391,7 @@ void bta_ag_rfc_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {

  /* stop timers */
  alarm_cancel(p_scb->ring_timer);
#if (BTM_WBS_INCLUDED == TRUE)
  alarm_cancel(p_scb->codec_negotiation_timer);
#endif

  close.hdr.handle = bta_ag_scb_to_idx(p_scb);
  close.hdr.app_id = p_scb->app_id;
@@ -762,9 +756,7 @@ void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb,
    evt.hdr.app_id = p_scb->app_id;
    evt.peer_feat = p_scb->peer_features;
    bdcpy(evt.bd_addr, p_scb->peer_addr);
#if (BTM_WBS_INCLUDED == TRUE)
    evt.peer_codec = p_scb->peer_codecs;
#endif

    if ((p_scb->call_ind != BTA_AG_CALL_INACTIVE) ||
        (p_scb->callsetup_ind != BTA_AG_CALLSETUP_NONE)) {
@@ -834,7 +826,6 @@ void bta_ag_rcvd_slc_ready(tBTA_AG_SCB* p_scb,
 *
 ******************************************************************************/
void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
#if (BTM_WBS_INCLUDED == TRUE)
  tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
  tBTA_AG_VAL val;

@@ -864,5 +855,4 @@ void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
  }

  (*bta_ag_cb.p_cback)(BTA_AG_WBS_EVT, (tBTA_AG*)&val);
#endif
}
+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
+5 −13
Original line number Diff line number Diff line
@@ -443,7 +443,6 @@ static uint8_t bta_ag_parse_chld(UNUSED_ATTR tBTA_AG_SCB* p_scb, char* p_s) {
  return (retval);
}

#if (BTM_WBS_INCLUDED == TRUE)
/*******************************************************************************
 *
 * Function         bta_ag_parse_bac
@@ -492,7 +491,6 @@ static tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB* p_scb, char* p_s) {

  return (retval);
}
#endif

/*******************************************************************************
 *
@@ -830,17 +828,14 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
  tBTA_AG_SCB* ag_scb;
  uint32_t i, ind_id;
  uint32_t bia_masked_out;
#if (BTM_WBS_INCLUDED == TRUE)
  tBTA_AG_PEER_CODEC codec_type, codec_sent;
#endif
  if (p_arg == NULL) {
    APPL_TRACE_ERROR("%s: p_arg is null, send error and return", __func__);
    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
    return;
  }

  APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
                   int_arg, p_arg);
  APPL_TRACE_DEBUG("%s: AT command %d, arg_type %d, int_arg %d, arg %s",
                   __func__, cmd, arg_type, int_arg, p_arg);

  memset(&val, 0, sizeof(tBTA_AG_VAL));
  val.hdr.handle = bta_ag_scb_to_idx(p_scb);
@@ -1173,7 +1168,6 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
      }
      break;

#if (BTM_WBS_INCLUDED == TRUE)
    case BTA_AG_AT_BAC_EVT:
      bta_ag_send_ok(p_scb);

@@ -1209,7 +1203,8 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
      }
      break;

    case BTA_AG_AT_BCS_EVT:
    case BTA_AG_AT_BCS_EVT: {
      tBTA_AG_PEER_CODEC codec_type, codec_sent;
      bta_ag_send_ok(p_scb);
      alarm_cancel(p_scb->codec_negotiation_timer);

@@ -1239,12 +1234,11 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB* p_scb, uint16_t cmd, uint8_t arg_type,
      /* send final codec info to callback */
      val.num = codec_sent;
      break;

    }
    case BTA_AG_LOCAL_EVT_BCC:
      bta_ag_send_ok(p_scb);
      bta_ag_sco_open(p_scb, NULL);
      break;
#endif

    default:
      bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
@@ -1684,7 +1678,6 @@ void bta_ag_result(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
  }
}

#if (BTM_WBS_INCLUDED == TRUE)
/*******************************************************************************
 *
 * Function         bta_ag_send_bcs
@@ -1722,7 +1715,6 @@ void bta_ag_send_bcs(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
  APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid);
  bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BCS, NULL, codec_uuid);
}
#endif

/*******************************************************************************
 *
+8 −22
Original line number Diff line number Diff line
@@ -118,9 +118,7 @@ enum {
enum {
  BTA_AG_SCO_SHUTDOWN_ST,   /* no sco listening, all sco connections closed */
  BTA_AG_SCO_LISTEN_ST,     /* sco listening */
#if (BTM_WBS_INCLUDED == TRUE)
  BTA_AG_SCO_CODEC_ST,      /* sco codec negotiation */
#endif
  BTA_AG_SCO_OPENING_ST,    /* sco connection opening */
  BTA_AG_SCO_OPEN_CL_ST,    /* opening sco connection being closed */
  BTA_AG_SCO_OPEN_XFER_ST,  /* opening sco connection being transferred */
@@ -198,9 +196,7 @@ typedef union {
  tBTA_AG_API_REGISTER api_register;
  tBTA_AG_API_OPEN api_open;
  tBTA_AG_API_RESULT api_result;
#if (BTM_WBS_INCLUDED == TRUE)
  tBTA_AG_API_SETCODEC api_setcodec;
#endif
  tBTA_AG_DISC_RESULT disc_result;
  tBTA_AG_RFC rfc;
  tBTA_AG_CI_RX_WRITE ci_rx_write;
@@ -212,12 +208,10 @@ typedef struct {
  uint8_t scn;
} tBTA_AG_PROFILE;

#if (BTM_WBS_INCLUDED == TRUE)
typedef enum {
  BTA_AG_SCO_MSBC_SETTINGS_T2 = 0, /* preferred/default when codec is mSBC */
  BTA_AG_SCO_MSBC_SETTINGS_T1,
} tBTA_AG_SCO_MSBC_SETTINGS;
#endif

/* type for each service control block */
typedef struct {
@@ -261,7 +255,6 @@ typedef struct {
  uint32_t bia_masked_out;  /* indicators HF does not want us to send */
  alarm_t* collision_timer;
  alarm_t* ring_timer;
#if (BTM_WBS_INCLUDED == TRUE)
  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 */
@@ -271,7 +264,6 @@ typedef struct {
  bool codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
  tBTA_AG_SCO_MSBC_SETTINGS
      codec_msbc_settings; /* settings to be used for the impending eSCO */
#endif

  tBTA_AG_HF_IND
      peer_hf_indicators[BTA_AG_MAX_NUM_PEER_HF_IND]; /* Peer supported
@@ -288,8 +280,7 @@ 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 */
} tBTA_AG_SCO_CB;

/* type for AG control block */
@@ -389,10 +380,8 @@ 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_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);
extern void bta_ag_codec_negotiate(tBTA_AG_SCB* p_scb);
#endif
extern void bta_ag_sco_shutdown(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_conn_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_sco_conn_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
@@ -401,12 +390,9 @@ extern void bta_ag_post_sco_close(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_svc_conn_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_result(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
extern void bta_ag_setcodec(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data);
#if (BTM_WBS_INCLUDED == TRUE)
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);

+20 −28
Original line number Diff line number Diff line
@@ -194,8 +194,8 @@ 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}};

/* state table for closing state */
const uint8_t bta_ag_st_closing[][BTA_AG_NUM_COLS] = {
@@ -259,20 +259,16 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
      /* initialize variables */
      p_scb->in_use = true;
      p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
#if (BTM_WBS_INCLUDED == TRUE)
      p_scb->codec_updated = false;
      p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
      p_scb->sco_codec = BTA_AG_CODEC_CVSD;
#endif
      /* set up timers */
      p_scb->ring_timer = alarm_new("bta_ag.scb_ring_timer");
      p_scb->collision_timer = alarm_new("bta_ag.scb_collision_timer");
#if (BTM_WBS_INCLUDED == TRUE)
      p_scb->codec_negotiation_timer =
          alarm_new("bta_ag.scb_codec_negotiation_timer");
      /* set eSCO mSBC setting to T2 as the preferred */
      p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
#endif
      APPL_TRACE_DEBUG("bta_ag_scb_alloc %d", bta_ag_scb_to_idx(p_scb));
      break;
    }
@@ -281,7 +277,7 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
  if (i == BTA_AG_NUM_SCB) {
    /* out of scbs */
    p_scb = NULL;
    APPL_TRACE_WARNING("Out of ag scbs");
    APPL_TRACE_WARNING("%s: Out of scbs", __func__);
  }
  return p_scb;
}
@@ -304,9 +300,7 @@ void bta_ag_scb_dealloc(tBTA_AG_SCB* p_scb) {

  /* stop and free timers */
  alarm_free(p_scb->ring_timer);
#if (BTM_WBS_INCLUDED == TRUE)
  alarm_free(p_scb->codec_negotiation_timer);
#endif
  alarm_free(p_scb->collision_timer);

  /* initialize control block */
@@ -594,9 +588,7 @@ static void bta_ag_api_enable(tBTA_AG_DATA* p_data) {
  /* initialize control block */
  for (size_t i = 0; i < BTA_AG_NUM_SCB; i++) {
    alarm_free(bta_ag_cb.scb[i].ring_timer);
#if (BTM_WBS_INCLUDED == TRUE)
    alarm_free(bta_ag_cb.scb[i].codec_negotiation_timer);
#endif
    alarm_free(bta_ag_cb.scb[i].collision_timer);
  }
  memset(&bta_ag_cb, 0, sizeof(tBTA_AG_CB));
@@ -723,27 +715,30 @@ 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) {
    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,
  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("%s: Handle 0x%04x, State %d (%s), Event 0x%04x (%s)",
                     __func__, 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",
  if (event != BTA_AG_CI_SCO_DATA_EVT) {
    APPL_TRACE_EVENT("%s: Handle 0x%04x, State %d, Event 0x%04x", __func__,
                     bta_ag_scb_to_idx(p_scb), p_scb->state, event);
  }
#endif

  event &= 0x00FF;
  if (event >= (BTA_AG_MAX_EVT & 0x00FF)) {
    APPL_TRACE_ERROR("AG evt out of range, ignoring...");
    APPL_TRACE_ERROR("%s: event out of range, ignored", __func__);
    return;
  }

@@ -763,10 +758,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) {
    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));
  if (p_scb->state != previous_state) {
    APPL_TRACE_EVENT("%s: State Change: [%s] -> [%s] after Event [%s]",
                     __func__, 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
}
@@ -786,22 +782,18 @@ bool bta_ag_hdl_event(BT_HDR* p_msg) {

  APPL_TRACE_DEBUG("bta_ag_hdl_event: Event 0x%04x ", p_msg->event);
  switch (p_msg->event) {
    /* handle enable event */
    case BTA_AG_API_ENABLE_EVT:
      bta_ag_api_enable((tBTA_AG_DATA*)p_msg);
      break;

    /* handle disable event */
    case BTA_AG_API_DISABLE_EVT:
      bta_ag_api_disable((tBTA_AG_DATA*)p_msg);
      break;

    /* handle register event */
    case BTA_AG_API_REGISTER_EVT:
      bta_ag_api_register((tBTA_AG_DATA*)p_msg);
      break;

    /* handle result event */
    case BTA_AG_API_RESULT_EVT:
      bta_ag_api_result((tBTA_AG_DATA*)p_msg);
      break;
Loading