1 /******************************************************************************
2  *
3  *  Copyright (C) 2009-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 #ifndef BTIF_HL_H
20 #define BTIF_HL_H
21 
22 /*******************************************************************************
23 **  Constants & Macros
24 ********************************************************************************/
25 
26 #define BTIF_HL_DATA_TYPE_NONE               0x0000
27 #define BTIF_HL_DATA_TYPE_PULSE_OXIMETER     0x1004   /* from BT assigned number */
28 #define BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON 0x1007
29 #define BTIF_HL_DATA_TYPE_BODY_THERMOMETER   0x1008
30 #define BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE  0x100F
31 #define BTIF_HL_DATA_TYPE_GLUCOSE_METER      0x1011
32 #define BTIF_HL_DATA_TYPE_STEP_COUNTER       0x1068
33 #define BTIF_HL_DATA_TYPE_BCA                0x1014
34 #define BTIF_HL_DATA_TYPE_PEAK_FLOW          0x1015
35 #define BTIF_HL_DATA_TYPE_CARDIO             0x1029
36 #define BTIF_HL_DATA_TYPE_ACTIVITY_HUB       0x1047
37 #define BTIF_HL_DATA_TYPE_AMM                0x1048
38 
39 #define BTIF_HL_CCH_NUM_FILTER_ELEMS            3
40 #define BTIF_HL_APPLICATION_NAME_LEN          512
41 
42 
43 
44 /*******************************************************************************
45 **  Type definitions and return values
46 ********************************************************************************/
47 
48 typedef enum
49 {
50     BTIF_HL_SOC_STATE_IDLE,
51     BTIF_HL_SOC_STATE_W4_ADD,
52     BTIF_HL_SOC_STATE_W4_CONN,
53     BTIF_HL_SOC_STATE_W4_READ,
54     BTIF_HL_SOC_STATE_W4_REL
55 } btif_hl_soc_state_t;
56 
57 typedef enum
58 {
59     BTIF_HL_STATE_DISABLED,
60     BTIF_HL_STATE_DISABLING,
61     BTIF_HL_STATE_ENABLED,
62     BTIF_HL_STATE_ENABLING,
63 } btif_hl_state_t;
64 
65 typedef enum
66 {
67     BTIF_HL_CCH_OP_NONE,
68     BTIF_HL_CCH_OP_MDEP_FILTERING,
69     BTIF_HL_CCH_OP_MATCHED_CTRL_PSM,
70     BTIF_HL_CCH_OP_DCH_OPEN,
71     BTIF_HL_CCH_OP_DCH_RECONNECT,
72     BTIF_HL_CCH_OP_DCH_ECHO_TEST
73 } btif_hl_cch_op_t;
74 
75 typedef enum
76 {
77     BTIF_HL_PEND_DCH_OP_NONE,
78     BTIF_HL_PEND_DCH_OP_DELETE_MDL,
79     BTIF_HL_PEND_DCH_OP_OPEN,
80     BTIF_HL_PEND_DCH_OP_RECONNECT
81 } btif_hl_pend_dch_op_t;
82 
83 typedef enum
84 {
85     BTIF_HL_DCH_OP_NONE,
86     BTIF_HL_DCH_OP_DISC
87 } btif_hl_dch_op_t;
88 
89 typedef enum
90 {
91     BTIF_HL_CHAN_CB_STATE_NONE,
92     BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING,
93     BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING,
94 
95     BTIF_HL_CHAN_CB_STATE_DISCONNECTING_PENDING,
96     BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING,
97     BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING,
98 } btif_hl_chan_cb_state_t;
99 
100 enum
101 {
102     BTIF_HL_SEND_CONNECTED_CB,
103     BTIF_HL_SEND_DISCONNECTED_CB,
104     BTIF_HL_REG_APP,
105     BTIF_HL_UNREG_APP,
106     BTIF_HL_UPDATE_MDL,
107 };
108 
109 typedef struct
110 {
111     UINT8 mdep_cfg_idx;
112     int data_type;
113     tBTA_HL_MDEP_ID peer_mdep_id;
114 } btif_hl_extra_mdl_cfg_t;
115 
116 typedef struct
117 {
118     tBTA_HL_MDL_CFG         base;
119     btif_hl_extra_mdl_cfg_t extra;
120 } btif_hl_mdl_cfg_t;
121 
122 typedef struct
123 {
124     BOOLEAN active;
125     UINT8 app_idx;
126 } btif_hl_app_data_t;
127 
128 typedef struct
129 {
130     int                     channel_id;
131     BD_ADDR                 bd_addr;
132     UINT8                   mdep_cfg_idx;
133     int                     max_s;
134     int                     socket_id[2];
135     UINT8                   app_idx;
136     UINT8                   mcl_idx;
137     UINT8                   mdl_idx;
138     btif_hl_soc_state_t     state;
139 }btif_hl_soc_cb_t;
140 
141 typedef struct
142 {
143     UINT16                  data_type;
144     UINT16                  max_tx_apdu_size;
145     UINT16                  max_rx_apdu_size;
146 } btif_hl_data_type_cfg_t;
147 
148 typedef struct
149 {
150     UINT16                  data_type;
151     tBTA_HL_MDEP_ROLE       peer_mdep_role;
152 } btif_hl_filter_elem_t;
153 
154 typedef struct
155 {
156     UINT8                   num_elems;
157     btif_hl_filter_elem_t   elem[BTIF_HL_CCH_NUM_FILTER_ELEMS];
158 } btif_hl_cch_filter_t;
159 
160 typedef struct
161 {
162     BOOLEAN                 in_use;
163     UINT16                  mdl_id;
164     tBTA_HL_MDL_HANDLE      mdl_handle;
165     btif_hl_dch_op_t        dch_oper;
166     tBTA_HL_MDEP_ID         local_mdep_id;
167     UINT8                   local_mdep_cfg_idx;
168     tBTA_HL_DCH_CFG         local_cfg;
169     tBTA_HL_MDEP_ID         peer_mdep_id;
170     UINT16                  peer_data_type;
171     tBTA_HL_MDEP_ROLE       peer_mdep_role;
172     tBTA_HL_DCH_MODE        dch_mode;
173     tBTA_SEC                sec_mask;
174     BOOLEAN                 is_the_first_reliable;
175     BOOLEAN                 delete_mdl;
176     UINT16                  mtu;
177     tMCA_CHNL_CFG           chnl_cfg;
178     UINT16                  tx_size;
179     UINT8                   *p_tx_pkt;
180     UINT8                   *p_rx_pkt;
181     BOOLEAN                 cong;
182     btif_hl_soc_cb_t        *p_scb;
183     int                     channel_id;
184 } btif_hl_mdl_cb_t;
185 
186 typedef struct
187 {
188     int                     channel_id;
189     int                     mdep_cfg_idx;
190     BOOLEAN                 in_use;
191     btif_hl_chan_cb_state_t cb_state;
192     btif_hl_pend_dch_op_t   op;
193     BD_ADDR                 bd_addr;
194     BOOLEAN                 abort_pending;
195 } btif_hl_pending_chan_cb_t;
196 
197 typedef struct
198 {
199     btif_hl_mdl_cb_t        mdl[BTA_HL_NUM_MDLS_PER_MCL];
200     BOOLEAN                 in_use;
201     BOOLEAN                 is_connected;
202     UINT16                  req_ctrl_psm;
203     UINT16                  ctrl_psm;
204     UINT16                  data_psm;
205     BD_ADDR                 bd_addr;
206     UINT16                  cch_mtu;
207     tBTA_SEC                sec_mask;
208     tBTA_HL_MCL_HANDLE      mcl_handle;
209     btif_hl_pending_chan_cb_t pcb;
210     BOOLEAN                 valid_sdp_idx;
211     UINT8                   sdp_idx;
212     tBTA_HL_SDP             sdp;
213     btif_hl_cch_op_t        cch_oper;
214     BOOLEAN                 cch_timer_active;
215     TIMER_LIST_ENT          cch_timer;
216 } btif_hl_mcl_cb_t;
217 
218 typedef struct
219 {
220     BOOLEAN                 active;
221     UINT16                  mdl_id;
222     UINT8                   mdep_cfg_idx;
223     BD_ADDR                 bd_addr;
224     int                     channel_id;
225 } btif_hl_delete_mdl_t;
226 
227 typedef struct
228 {
229     btif_hl_mcl_cb_t        mcb[BTA_HL_NUM_MCLS]; /* application Control Blocks */
230     BOOLEAN                 in_use;              /* this CB is in use*/
231     BOOLEAN                 reg_pending;
232     UINT8                   app_id;
233 
234     tBTA_HL_SUP_FEATURE     sup_feature;
235     tBTA_HL_DCH_CFG         channel_type[BTA_HL_NUM_MDEPS];
236     tBTA_HL_SDP_INFO_IND    sdp_info_ind;
237     btif_hl_cch_filter_t    filter;
238 
239     btif_hl_mdl_cfg_t       mdl_cfg[BTA_HL_NUM_MDL_CFGS];
240     int                     mdl_cfg_channel_id[BTA_HL_NUM_MDL_CFGS];
241 
242     btif_hl_delete_mdl_t    delete_mdl;
243     tBTA_HL_DEVICE_TYPE     dev_type;
244     tBTA_HL_APP_HANDLE      app_handle;
245     UINT16                  sec_mask;   /* Security mask for BTM_SetSecurityLevel() */
246     char                    srv_name[BTA_SERVICE_NAME_LEN +1];        /* service name to be used in the SDP; null terminated*/
247     char                    srv_desp[BTA_SERVICE_DESP_LEN +1];        /* service description to be used in the SDP; null terminated */
248     char                    provider_name[BTA_PROVIDER_NAME_LEN +1];   /* provide name to be used in the SDP; null terminated */
249     char                    application_name[BTIF_HL_APPLICATION_NAME_LEN +1];   /* applicaiton name */
250 } btif_hl_app_cb_t;
251 
252 typedef struct
253 {
254     BOOLEAN                 in_use;
255     UINT8                   app_idx;
256 } btif_hl_pending_reg_cb_t;
257 
258 /* BTIF-HL control block  */
259 typedef struct
260 {
261     btif_hl_app_cb_t        acb[BTA_HL_NUM_APPS];      /* HL Control Blocks */
262     tBTA_HL_CTRL_CBACK      *p_ctrl_cback;             /* pointer to control callback function */
263     UINT8                   next_app_id;
264     UINT16                  next_channel_id;
265     btif_hl_state_t         state;
266 } btif_hl_cb_t;
267 
268 typedef UINT8 btif_hl_evt_t;
269 
270 typedef struct
271 {
272     int                     app_id;
273     BD_ADDR                 bd_addr;
274     int                     mdep_cfg_index;
275     int                     channel_id;
276     btif_hl_chan_cb_state_t cb_state;
277     int                     fd;
278 } btif_hl_send_chan_state_cb_t;
279 
280 
281 typedef struct
282 {
283     UINT8 app_idx;
284 } btif_hl_reg_t;
285 
286 typedef btif_hl_reg_t btif_hl_unreg_t;
287 typedef btif_hl_reg_t btif_hl_update_mdl_t;
288 
289 typedef union
290 {
291     btif_hl_send_chan_state_cb_t    chan_cb;
292     btif_hl_reg_t           reg;
293     btif_hl_unreg_t         unreg;
294     btif_hl_update_mdl_t    update_mdl;
295 } btif_hl_evt_cb_t;
296 
297 
298 /*******************************************************************************
299 **  Functions
300 ********************************************************************************/
301 
302 #define BTIF_HL_GET_CB_PTR() &(btif_hl_cb)
303 #define BTIF_HL_GET_APP_CB_PTR(app_idx) &(btif_hl_cb.acb[(app_idx)])
304 #define BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx) &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)])
305 #define BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx) &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)].mdl[mdl_idx])
306 #define BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx) &(btif_hl_cb.acb[app_idx].mcb[mcl_idx].pcb)
307 #define BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx) &(btif_hl_cb.acb[(app_idx)].mdl_cfg[(item_idx)])
308 #define BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx, item_idx) &(btif_hl_cb.acb[(app_idx)].mdl_cfg_channel_id[(item_idx)])
309 
310 extern btif_hl_cb_t  btif_hl_cb;
311 extern btif_hl_cb_t *p_btif_hl_cb;
312 
313 extern BOOLEAN btif_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx);
314 extern BOOLEAN btif_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx);
315 extern BOOLEAN btif_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx);
316 extern BOOLEAN btif_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
317                                           UINT8 *p_mdl_idx);
318 extern BOOLEAN btif_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
319                                                   UINT8 *p_app_idx, UINT8 *p_mcl_idx);
320 extern BOOLEAN  btif_hl_save_mdl_cfg(UINT8 app_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg);
321 extern BOOLEAN  btif_hl_delete_mdl_cfg(UINT8 app_id, UINT8 item_idx);
322 extern void * btif_hl_get_buf(UINT16 size);
323 extern void btif_hl_free_buf(void **p);
324 extern BOOLEAN btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
325                                                  UINT8 *p_app_idx,UINT8 *p_mcl_idx,
326                                                  UINT8 *p_mdl_idx);
327 extern void btif_hl_abort_pending_chan_setup(UINT8 app_idx, UINT8 mcl_idx);
328 extern BOOLEAN btif_hl_proc_pending_op(UINT8 app_idx, UINT8 mcl_idx);
329 extern BOOLEAN btif_hl_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
330                                         tBTA_HL_MDL_CFG *p_mdl_buf );
331 #endif
332