bta_ag_int.h revision 4de9bbcde79eb98dbfd56de292902549ac3e2bc1
1/******************************************************************************
2 *
3 *  Copyright (C) 2003-2012 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  This is the private interface file for the BTA audio gateway.
22 *
23 ******************************************************************************/
24#ifndef BTA_AG_INT_H
25#define BTA_AG_INT_H
26
27#include "bta_sys.h"
28#include "bta_api.h"
29#include "bta_ag_api.h"
30#include "bta_ag_at.h"
31
32/* Send RING & CLIP in one AT cmd */
33#ifndef BTA_AG_MULTI_RESULT_INCLUDED
34#define BTA_AG_MULTI_RESULT_INCLUDED FALSE
35#endif
36
37/* Replace : in VGS and VGM for HSP */
38#ifndef BTA_HSP_RESULT_REPLACE_COLON
39#define BTA_HSP_RESULT_REPLACE_COLON TRUE
40#endif
41
42/*****************************************************************************
43**  Constants
44*****************************************************************************/
45/* Number of SCBs (AG service instances that can be registered) */
46#ifndef BTA_AG_NUM_SCB
47#define BTA_AG_NUM_SCB          2
48#endif
49
50/* Time to wait for retry in case of collision */
51#ifndef BTA_AG_COLLISION_TIMEOUT_MS
52#define BTA_AG_COLLISION_TIMEOUT_MS (2 * 1000)          /* 2 seconds */
53#endif
54
55/* RFCOMM MTU SIZE */
56#define BTA_AG_MTU              256
57
58/* Max number of peer and local HF indicators */
59#define BTA_AG_MAX_NUM_PEER_HF_IND     20
60#define BTA_AG_MAX_NUM_LOCAL_HF_IND    4
61
62/* Internal profile indexes */
63#define BTA_AG_HSP              0       /* index for HSP */
64#define BTA_AG_HFP              1       /* index for HFP */
65#define BTA_AG_NUM_IDX          2       /* number of profile indexes */
66
67/* profile role for connection */
68#define BTA_AG_ACP              0       /* accepted connection */
69#define BTA_AG_INT              1       /* initiating connection */
70
71/* feature mask that matches spec */
72#define BTA_AG_BSRF_FEAT_SPEC        (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR    | \
73                                      BTA_AG_FEAT_VREC | BTA_AG_FEAT_INBAND  | \
74                                      BTA_AG_FEAT_VTAG | BTA_AG_FEAT_REJECT  | \
75                                      BTA_AG_FEAT_ECS  | BTA_AG_FEAT_ECC     | \
76                                      BTA_AG_FEAT_EXTERR | BTA_AG_FEAT_CODEC | \
77                                      BTA_AG_FEAT_HF_IND | BTA_AG_FEAT_ESCO  | \
78                                      BTA_AG_FEAT_VOIP)
79
80#define BTA_AG_SDP_FEAT_SPEC         (BTA_AG_FEAT_3WAY | BTA_AG_FEAT_ECNR    | \
81                                      BTA_AG_FEAT_VREC | BTA_AG_FEAT_INBAND  | \
82                                      BTA_AG_FEAT_VTAG)
83
84enum
85{
86    /* these events are handled by the state machine */
87    BTA_AG_API_REGISTER_EVT = BTA_SYS_EVT_START(BTA_ID_AG),
88    BTA_AG_API_DEREGISTER_EVT,
89    BTA_AG_API_OPEN_EVT,
90    BTA_AG_API_CLOSE_EVT,
91    BTA_AG_API_AUDIO_OPEN_EVT,
92    BTA_AG_API_AUDIO_CLOSE_EVT,
93    BTA_AG_API_RESULT_EVT,
94    BTA_AG_API_SETCODEC_EVT,
95    BTA_AG_RFC_OPEN_EVT,
96    BTA_AG_RFC_CLOSE_EVT,
97    BTA_AG_RFC_SRV_CLOSE_EVT,
98    BTA_AG_RFC_DATA_EVT,
99    BTA_AG_SCO_OPEN_EVT,
100    BTA_AG_SCO_CLOSE_EVT,
101    BTA_AG_DISC_ACP_RES_EVT,
102    BTA_AG_DISC_INT_RES_EVT,
103    BTA_AG_DISC_OK_EVT,
104    BTA_AG_DISC_FAIL_EVT,
105    BTA_AG_CI_RX_WRITE_EVT,
106    BTA_AG_RING_TIMEOUT_EVT,
107    BTA_AG_SVC_TIMEOUT_EVT,
108    BTA_AG_CI_SCO_DATA_EVT,
109    BTA_AG_CI_SLC_READY_EVT,
110    BTA_AG_MAX_EVT,
111
112    /* these events are handled outside of the state machine */
113    BTA_AG_API_ENABLE_EVT,
114    BTA_AG_API_DISABLE_EVT
115};
116
117/* Actions to perform after a SCO event */
118enum
119{
120    BTA_AG_POST_SCO_NONE,       /* no action */
121    BTA_AG_POST_SCO_CLOSE_RFC,  /* close RFCOMM channel after SCO closes */
122    BTA_AG_POST_SCO_RING,       /* send RING result code after SCO opens */
123    BTA_AG_POST_SCO_CALL_CONN,  /* send call indicators after SCO opens/closes */
124    BTA_AG_POST_SCO_CALL_ORIG,  /* send call indicators after SCO closes */
125    BTA_AG_POST_SCO_CALL_END,   /* send call indicators after SCO closes */
126    BTA_AG_POST_SCO_CALL_END_INCALL   /* send call indicators for end call & incoming call after SCO closes */
127};
128
129/* sco states */
130enum
131{
132    BTA_AG_SCO_SHUTDOWN_ST,     /* no sco listening, all sco connections closed */
133    BTA_AG_SCO_LISTEN_ST,       /* sco listening */
134#if (BTM_WBS_INCLUDED == TRUE)
135    BTA_AG_SCO_CODEC_ST,        /* sco codec negotiation */
136#endif
137    BTA_AG_SCO_OPENING_ST,      /* sco connection opening */
138    BTA_AG_SCO_OPEN_CL_ST,      /* opening sco connection being closed */
139    BTA_AG_SCO_OPEN_XFER_ST,    /* opening sco connection being transferred */
140    BTA_AG_SCO_OPEN_ST,         /* sco open */
141    BTA_AG_SCO_CLOSING_ST,      /* sco closing */
142    BTA_AG_SCO_CLOSE_OP_ST,     /* closing sco being opened */
143    BTA_AG_SCO_CLOSE_XFER_ST,   /* closing sco being transferred */
144    BTA_AG_SCO_SHUTTING_ST      /* sco shutting down */
145};
146
147/*****************************************************************************
148**  Data types
149*****************************************************************************/
150
151/* data type for BTA_AG_API_ENABLE_EVT */
152typedef struct
153{
154    BT_HDR              hdr;
155    tBTA_AG_PARSE_MODE  parse_mode;
156    tBTA_AG_CBACK      *p_cback;
157} tBTA_AG_API_ENABLE;
158
159/* data type for BTA_AG_API_REGISTER_EVT */
160typedef struct
161{
162    BT_HDR              hdr;
163    char                p_name[2][BTA_SERVICE_NAME_LEN+1];
164    tBTA_SERVICE_MASK   services;
165    tBTA_SEC            sec_mask;
166    tBTA_AG_FEAT        features;
167    uint8_t             app_id;
168} tBTA_AG_API_REGISTER;
169
170/* data type for BTA_AG_API_OPEN_EVT */
171typedef struct
172{
173    BT_HDR              hdr;
174    BD_ADDR             bd_addr;
175    tBTA_SERVICE_MASK   services;
176    tBTA_SEC            sec_mask;
177} tBTA_AG_API_OPEN;
178
179/* data type for BTA_AG_API_RESULT_EVT */
180typedef struct
181{
182    BT_HDR            hdr;
183    tBTA_AG_RES       result;
184    tBTA_AG_RES_DATA  data;
185} tBTA_AG_API_RESULT;
186
187/* data type for BTA_AG_API_SETCODEC_EVT */
188typedef struct
189{
190    BT_HDR              hdr;
191    tBTA_AG_PEER_CODEC  codec;
192} tBTA_AG_API_SETCODEC;
193
194/* data type for BTA_AG_DISC_RESULT_EVT */
195typedef struct
196{
197    BT_HDR          hdr;
198    uint16_t        status;
199} tBTA_AG_DISC_RESULT;
200
201/* data type for RFCOMM events */
202typedef struct
203{
204    BT_HDR          hdr;
205    uint16_t        port_handle;
206} tBTA_AG_RFC;
207
208/* data type for BTA_AG_CI_RX_WRITE_EVT */
209typedef struct
210{
211    BT_HDR          hdr;
212//    char            p_data[BTA_AG_MTU+1];
213} tBTA_AG_CI_RX_WRITE;
214
215/* union of all event datatypes */
216typedef union
217{
218    BT_HDR                  hdr;
219    tBTA_AG_API_ENABLE      api_enable;
220    tBTA_AG_API_REGISTER    api_register;
221    tBTA_AG_API_OPEN        api_open;
222    tBTA_AG_API_RESULT      api_result;
223#if (BTM_WBS_INCLUDED == TRUE)
224    tBTA_AG_API_SETCODEC    api_setcodec;
225#endif
226    tBTA_AG_DISC_RESULT     disc_result;
227    tBTA_AG_RFC             rfc;
228    tBTA_AG_CI_RX_WRITE     ci_rx_write;
229} tBTA_AG_DATA;
230
231/* type for each profile */
232typedef struct
233{
234    uint32_t          sdp_handle;
235    uint8_t           scn;
236} tBTA_AG_PROFILE;
237
238#if (BTM_WBS_INCLUDED == TRUE)
239typedef enum
240{
241    BTA_AG_SCO_MSBC_SETTINGS_T2 = 0, /* preferred/default when codec is mSBC */
242    BTA_AG_SCO_MSBC_SETTINGS_T1,
243} tBTA_AG_SCO_MSBC_SETTINGS;
244#endif
245
246/* type for each service control block */
247typedef struct
248{
249    char                clip[BTA_AG_AT_MAX_LEN+1]; /* number string used for CLIP */
250    uint16_t            serv_handle[BTA_AG_NUM_IDX]; /* RFCOMM server handles */
251    tBTA_AG_AT_CB       at_cb;          /* AT command interpreter */
252    BD_ADDR             peer_addr;      /* peer bd address */
253    tSDP_DISCOVERY_DB   *p_disc_db;     /* pointer to discovery database */
254    tBTA_SERVICE_MASK   reg_services;   /* services specified in register API */
255    tBTA_SERVICE_MASK   open_services;  /* services specified in open API */
256    uint16_t            conn_handle;    /* RFCOMM handle of connected service */
257    tBTA_SEC            serv_sec_mask;  /* server security mask */
258    tBTA_SEC            cli_sec_mask;   /* client security mask */
259    tBTA_AG_FEAT        features;       /* features registered by application */
260    tBTA_AG_PEER_FEAT   peer_features;  /* peer device features */
261    uint16_t            peer_version;   /* profile version of peer device */
262    uint16_t            hsp_version;    /* HSP profile version */
263    uint16_t            sco_idx;        /* SCO handle */
264    bool                in_use;         /* scb in use */
265    bool                dealloc;        /* true if service shutting down */
266    bool                clip_enabled;   /* set to true if HF enables CLIP reporting */
267    bool                ccwa_enabled;   /* set to true if HF enables CCWA reporting */
268    bool                cmer_enabled;   /* set to true if HF enables CMER reporting */
269    bool                cmee_enabled;   /* set to true if HF enables CME ERROR reporting */
270    bool                inband_enabled; /* set to true if inband ring enabled */
271    bool                svc_conn;       /* set to true when service level connection up */
272    uint8_t             state;          /* state machine state */
273    uint8_t             conn_service;   /* connected service */
274    uint8_t             peer_scn;       /* peer scn */
275    uint8_t             app_id;         /* application id */
276    uint8_t             role;           /* initiator/acceptor role */
277    uint8_t             post_sco;       /* action to perform after sco event */
278    uint8_t             call_ind;       /* CIEV call indicator value */
279    uint8_t             callsetup_ind;  /* CIEV callsetup indicator value */
280    uint8_t             service_ind;    /* CIEV service indicator value */
281    uint8_t             signal_ind;     /* CIEV signal indicator value */
282    uint8_t             roam_ind;       /* CIEV roam indicator value */
283    uint8_t             battchg_ind;    /* CIEV battery charge indicator value */
284    uint8_t             callheld_ind;   /* CIEV call held indicator value */
285    bool                retry_with_sco_only; /* indicator to try with SCO only when eSCO fails */
286    uint32_t            bia_masked_out; /* indicators HF does not want us to send */
287    alarm_t             *collision_timer;
288    alarm_t             *ring_timer;
289#if (BTM_WBS_INCLUDED == TRUE)
290    alarm_t             *codec_negotiation_timer;
291    tBTA_AG_PEER_CODEC  peer_codecs;    /* codecs for eSCO supported by the peer */
292    tBTA_AG_PEER_CODEC  sco_codec;      /* codec to be used for eSCO connection */
293    tBTA_AG_PEER_CODEC  inuse_codec;    /* codec being used for the current SCO connection */
294    bool                codec_updated;  /* set to true whenever the app updates codec type */
295    bool                codec_fallback; /* If sco nego fails for mSBC, fallback to CVSD */
296    tBTA_AG_SCO_MSBC_SETTINGS codec_msbc_settings; /* settings to be used for the impending eSCO */
297#endif
298
299    tBTA_AG_HF_IND      peer_hf_indicators[BTA_AG_MAX_NUM_PEER_HF_IND];   /* Peer supported
300                                                                      HF indicators */
301    tBTA_AG_HF_IND      local_hf_indicators[BTA_AG_MAX_NUM_LOCAL_HF_IND]; /* Local supported
302                                                                      HF indicators */
303} tBTA_AG_SCB;
304
305/* type for sco data */
306typedef struct
307{
308    tBTM_ESCO_CONN_REQ_EVT_DATA  conn_data;     /* SCO data for pending conn request */
309    tBTA_AG_SCB                 *p_curr_scb;    /* SCB associated with SCO connection */
310    tBTA_AG_SCB                 *p_xfer_scb;    /* SCB associated with SCO transfer */
311    uint16_t                    cur_idx;        /* SCO handle */
312    uint8_t                     state;          /* SCO state variable */
313    bool                        param_updated;  /* if params were updated to non-default */
314    tBTM_ESCO_PARAMS            params;         /* ESCO parameters */
315} tBTA_AG_SCO_CB;
316
317
318/* type for AG control block */
319typedef struct
320{
321    tBTA_AG_SCB         scb[BTA_AG_NUM_SCB];        /* service control blocks */
322    tBTA_AG_PROFILE     profile[BTA_AG_NUM_IDX];    /* profile-specific data */
323    tBTA_AG_SCO_CB      sco;                        /* SCO data */
324    tBTA_AG_CBACK       *p_cback;                   /* application callback */
325    tBTA_AG_PARSE_MODE  parse_mode;                 /* parse/pass-through mode */
326} tBTA_AG_CB;
327
328/*****************************************************************************
329**  Global data
330*****************************************************************************/
331
332/* constant lookup tables */
333extern const uint16_t bta_ag_uuid[BTA_AG_NUM_IDX];
334extern const uint8_t bta_ag_sec_id[BTA_AG_NUM_IDX];
335extern const tBTA_AG_AT_CMD *bta_ag_at_tbl[BTA_AG_NUM_IDX];
336
337/* control block declaration */
338extern tBTA_AG_CB bta_ag_cb;
339
340/* config struct */
341extern tBTA_AG_CFG *p_bta_ag_cfg;
342extern tBTA_AG_HF_IND bta_ag_local_hf_ind_cfg[];
343
344/*****************************************************************************
345**  Function prototypes
346*****************************************************************************/
347
348/* main functions */
349extern void bta_ag_scb_dealloc(tBTA_AG_SCB *p_scb);
350extern uint16_t bta_ag_scb_to_idx(tBTA_AG_SCB *p_scb);
351extern tBTA_AG_SCB *bta_ag_scb_by_idx(uint16_t idx);
352extern uint8_t bta_ag_service_to_idx(tBTA_SERVICE_MASK services);
353extern uint16_t bta_ag_idx_by_bdaddr(BD_ADDR peer_addr);
354extern bool bta_ag_other_scb_open(tBTA_AG_SCB *p_curr_scb);
355extern bool bta_ag_scb_open(tBTA_AG_SCB *p_curr_scb);
356extern tBTA_AG_SCB *bta_ag_get_other_idle_scb (tBTA_AG_SCB *p_curr_scb);
357extern void bta_ag_sm_execute(tBTA_AG_SCB *p_scb, uint16_t event, tBTA_AG_DATA *p_data);
358extern bool bta_ag_hdl_event(BT_HDR *p_msg);
359extern void bta_ag_collision_cback (tBTA_SYS_CONN_STATUS status, uint8_t id,
360                                    uint8_t app_id, BD_ADDR peer_addr);
361extern void bta_ag_resume_open (tBTA_AG_SCB *p_scb);
362
363/* SDP functions */
364extern bool bta_ag_add_record(uint16_t service_uuid, char *p_service_name, uint8_t scn,
365                                 tBTA_AG_FEAT features, uint32_t sdp_handle);
366extern void bta_ag_create_records(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
367extern void bta_ag_del_records(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
368extern bool bta_ag_sdp_find_attr(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service);
369extern void bta_ag_do_disc(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK service);
370extern void bta_ag_free_db(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
371
372/* RFCOMM functions */
373extern void bta_ag_start_servers(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK services);
374extern void bta_ag_close_servers(tBTA_AG_SCB *p_scb, tBTA_SERVICE_MASK services);
375extern bool bta_ag_is_server_closed (tBTA_AG_SCB *p_scb);
376extern void bta_ag_rfc_do_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
377extern void bta_ag_rfc_do_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
378
379/* SCO functions */
380extern bool bta_ag_sco_is_open(tBTA_AG_SCB *p_scb);
381extern bool bta_ag_sco_is_opening(tBTA_AG_SCB *p_scb);
382extern void bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data);
383
384/* AT command functions */
385extern void bta_ag_at_hsp_cback(tBTA_AG_SCB *p_scb, uint16_t cmd, uint8_t arg_type,
386                                char *p_arg, int16_t int_arg);
387extern void bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, uint16_t cmd, uint8_t arg_type,
388                                char *p_arg, int16_t int_arg);
389extern void bta_ag_at_err_cback(tBTA_AG_SCB *p_scb, bool unknown, char *p_arg);
390extern bool bta_ag_inband_enabled(tBTA_AG_SCB *p_scb);
391extern void bta_ag_send_call_inds(tBTA_AG_SCB *p_scb, tBTA_AG_RES result);
392
393/* Action functions */
394extern void bta_ag_register(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
395extern void bta_ag_deregister(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
396extern void bta_ag_start_dereg(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
397extern void bta_ag_start_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
398extern void bta_ag_start_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
399extern void bta_ag_disc_int_res(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
400extern void bta_ag_disc_acp_res(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
401extern void bta_ag_disc_fail(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
402extern void bta_ag_open_fail(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
403extern void bta_ag_rfc_fail(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
404extern void bta_ag_rfc_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
405extern void bta_ag_rfc_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
406extern void bta_ag_rfc_acp_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
407extern void bta_ag_rfc_data(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
408extern void bta_ag_sco_listen(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
409extern void bta_ag_sco_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
410extern void bta_ag_sco_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
411#if (BTM_WBS_INCLUDED == TRUE)
412extern void bta_ag_sco_codec_nego(tBTA_AG_SCB *p_scb, bool result);
413extern void bta_ag_codec_negotiate (tBTA_AG_SCB *p_scb);
414#endif
415extern void bta_ag_sco_shutdown(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
416extern void bta_ag_sco_conn_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
417extern void bta_ag_sco_conn_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
418extern void bta_ag_post_sco_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
419extern void bta_ag_post_sco_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
420extern void bta_ag_svc_conn_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
421extern void bta_ag_result(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
422extern void bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
423#if (BTM_WBS_INCLUDED == TRUE)
424extern void bta_ag_send_bcs(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
425#endif
426extern void bta_ag_send_ring(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
427extern void bta_ag_ci_sco_data(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
428extern void bta_ag_set_esco_param(bool set_reset, tBTM_ESCO_PARAMS *param);
429extern void bta_ag_ci_rx_data(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
430extern void bta_ag_rcvd_slc_ready(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data);
431#endif /* BTA_AG_INT_H */
432