1 /******************************************************************************
3 * Copyright (C) 2009-2012 Broadcom Corporation
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:
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 ******************************************************************************/
22 #include <hardware/bluetooth.h>
24 #include "bta_hl_api.h"
25 #include "bt_common.h"
26 #include "osi/include/alarm.h"
28 /*******************************************************************************
30 ********************************************************************************/
32 #define BTIF_HL_DATA_TYPE_NONE 0x0000
33 #define BTIF_HL_DATA_TYPE_PULSE_OXIMETER 0x1004 /* from BT assigned number */
34 #define BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON 0x1007
35 #define BTIF_HL_DATA_TYPE_BODY_THERMOMETER 0x1008
36 #define BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE 0x100F
37 #define BTIF_HL_DATA_TYPE_GLUCOSE_METER 0x1011
38 #define BTIF_HL_DATA_TYPE_STEP_COUNTER 0x1068
39 #define BTIF_HL_DATA_TYPE_BCA 0x1014
40 #define BTIF_HL_DATA_TYPE_PEAK_FLOW 0x1015
41 #define BTIF_HL_DATA_TYPE_CARDIO 0x1029
42 #define BTIF_HL_DATA_TYPE_ACTIVITY_HUB 0x1047
43 #define BTIF_HL_DATA_TYPE_AMM 0x1048
45 #define BTIF_HL_CCH_NUM_FILTER_ELEMS 3
46 #define BTIF_HL_APPLICATION_NAME_LEN 512
48 /*******************************************************************************
49 ** Type definitions and return values
50 ********************************************************************************/
54 BTIF_HL_SOC_STATE_IDLE,
55 BTIF_HL_SOC_STATE_W4_ADD,
56 BTIF_HL_SOC_STATE_W4_CONN,
57 BTIF_HL_SOC_STATE_W4_READ,
58 BTIF_HL_SOC_STATE_W4_REL
59 } btif_hl_soc_state_t;
63 BTIF_HL_STATE_DISABLED,
64 BTIF_HL_STATE_DISABLING,
65 BTIF_HL_STATE_ENABLED,
66 BTIF_HL_STATE_ENABLING,
72 BTIF_HL_CCH_OP_MDEP_FILTERING,
73 BTIF_HL_CCH_OP_MATCHED_CTRL_PSM,
74 BTIF_HL_CCH_OP_DCH_OPEN,
75 BTIF_HL_CCH_OP_DCH_RECONNECT,
76 BTIF_HL_CCH_OP_DCH_ECHO_TEST
81 BTIF_HL_PEND_DCH_OP_NONE,
82 BTIF_HL_PEND_DCH_OP_DELETE_MDL,
83 BTIF_HL_PEND_DCH_OP_OPEN,
84 BTIF_HL_PEND_DCH_OP_RECONNECT
85 } btif_hl_pend_dch_op_t;
95 BTIF_HL_CHAN_CB_STATE_NONE,
96 BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING,
97 BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING,
99 BTIF_HL_CHAN_CB_STATE_DISCONNECTING_PENDING,
100 BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING,
101 BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING,
102 } btif_hl_chan_cb_state_t;
106 BTIF_HL_SEND_CONNECTED_CB,
107 BTIF_HL_SEND_DISCONNECTED_CB,
117 tBTA_HL_MDEP_ID peer_mdep_id;
118 } btif_hl_extra_mdl_cfg_t;
122 tBTA_HL_MDL_CFG base;
123 btif_hl_extra_mdl_cfg_t extra;
130 } btif_hl_app_data_t;
142 btif_hl_soc_state_t state;
148 UINT16 max_tx_apdu_size;
149 UINT16 max_rx_apdu_size;
150 } btif_hl_data_type_cfg_t;
155 tBTA_HL_MDEP_ROLE peer_mdep_role;
156 } btif_hl_filter_elem_t;
161 btif_hl_filter_elem_t elem[BTIF_HL_CCH_NUM_FILTER_ELEMS];
162 } btif_hl_cch_filter_t;
168 tBTA_HL_MDL_HANDLE mdl_handle;
169 btif_hl_dch_op_t dch_oper;
170 tBTA_HL_MDEP_ID local_mdep_id;
171 UINT8 local_mdep_cfg_idx;
172 tBTA_HL_DCH_CFG local_cfg;
173 tBTA_HL_MDEP_ID peer_mdep_id;
174 UINT16 peer_data_type;
175 tBTA_HL_MDEP_ROLE peer_mdep_role;
176 tBTA_HL_DCH_MODE dch_mode;
178 BOOLEAN is_the_first_reliable;
181 tMCA_CHNL_CFG chnl_cfg;
186 btif_hl_soc_cb_t *p_scb;
195 btif_hl_chan_cb_state_t cb_state;
196 btif_hl_pend_dch_op_t op;
198 BOOLEAN abort_pending;
199 } btif_hl_pending_chan_cb_t;
203 btif_hl_mdl_cb_t mdl[BTA_HL_NUM_MDLS_PER_MCL];
205 BOOLEAN is_connected;
212 tBTA_HL_MCL_HANDLE mcl_handle;
213 btif_hl_pending_chan_cb_t pcb;
214 BOOLEAN valid_sdp_idx;
217 btif_hl_cch_op_t cch_oper;
228 } btif_hl_delete_mdl_t;
232 btif_hl_mcl_cb_t mcb[BTA_HL_NUM_MCLS]; /* application Control Blocks */
233 BOOLEAN in_use; /* this CB is in use*/
237 tBTA_HL_SUP_FEATURE sup_feature;
238 tBTA_HL_DCH_CFG channel_type[BTA_HL_NUM_MDEPS];
239 tBTA_HL_SDP_INFO_IND sdp_info_ind;
240 btif_hl_cch_filter_t filter;
242 btif_hl_mdl_cfg_t mdl_cfg[BTA_HL_NUM_MDL_CFGS];
243 int mdl_cfg_channel_id[BTA_HL_NUM_MDL_CFGS];
245 btif_hl_delete_mdl_t delete_mdl;
246 tBTA_HL_DEVICE_TYPE dev_type;
247 tBTA_HL_APP_HANDLE app_handle;
248 UINT16 sec_mask; /* Security mask for BTM_SetSecurityLevel() */
249 char srv_name[BTA_SERVICE_NAME_LEN +1]; /* service name to be used in the SDP; null terminated*/
250 char srv_desp[BTA_SERVICE_DESP_LEN +1]; /* service description to be used in the SDP; null terminated */
251 char provider_name[BTA_PROVIDER_NAME_LEN +1]; /* provide name to be used in the SDP; null terminated */
252 char application_name[BTIF_HL_APPLICATION_NAME_LEN +1]; /* applicaiton name */
259 } btif_hl_pending_reg_cb_t;
261 /* BTIF-HL control block */
264 btif_hl_app_cb_t acb[BTA_HL_NUM_APPS]; /* HL Control Blocks */
265 tBTA_HL_CTRL_CBACK *p_ctrl_cback; /* pointer to control callback function */
267 UINT16 next_channel_id;
268 btif_hl_state_t state;
271 typedef UINT8 btif_hl_evt_t;
279 btif_hl_chan_cb_state_t cb_state;
281 } btif_hl_send_chan_state_cb_t;
288 typedef btif_hl_reg_t btif_hl_unreg_t;
289 typedef btif_hl_reg_t btif_hl_update_mdl_t;
293 btif_hl_send_chan_state_cb_t chan_cb;
295 btif_hl_unreg_t unreg;
296 btif_hl_update_mdl_t update_mdl;
299 /*******************************************************************************
301 ********************************************************************************/
303 #define BTIF_HL_GET_CB_PTR() &(btif_hl_cb)
304 #define BTIF_HL_GET_APP_CB_PTR(app_idx) &(btif_hl_cb.acb[(app_idx)])
305 #define BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx) &(btif_hl_cb.acb[(app_idx)].mcb[(mcl_idx)])
306 #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])
307 #define BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx) &(btif_hl_cb.acb[app_idx].mcb[mcl_idx].pcb)
308 #define BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx) &(btif_hl_cb.acb[(app_idx)].mdl_cfg[(item_idx)])
309 #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)])
311 extern btif_hl_cb_t btif_hl_cb;
312 extern btif_hl_cb_t *p_btif_hl_cb;
314 extern BOOLEAN btif_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx);
315 extern BOOLEAN btif_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx);
316 extern BOOLEAN btif_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx);
317 extern BOOLEAN btif_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
319 extern BOOLEAN btif_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
320 UINT8 *p_app_idx, UINT8 *p_mcl_idx);
321 extern BOOLEAN btif_hl_save_mdl_cfg(UINT8 app_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg);
322 extern BOOLEAN btif_hl_delete_mdl_cfg(UINT8 app_id, UINT8 item_idx);
323 extern BOOLEAN btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
324 UINT8 *p_app_idx,UINT8 *p_mcl_idx,
326 extern void btif_hl_abort_pending_chan_setup(UINT8 app_idx, UINT8 mcl_idx);
327 extern BOOLEAN btif_hl_proc_pending_op(UINT8 app_idx, UINT8 mcl_idx);
328 extern BOOLEAN btif_hl_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
329 tBTA_HL_MDL_CFG *p_mdl_buf );