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 /******************************************************************************
20 *
21 * This is the implementation of the API for the HeaLth device profile (HL)
22 * subsystem of BTA, Broadcom Corp's Bluetooth application layer for mobile
23 * phones.
24 *
25 ******************************************************************************/
26
27 #include <string.h>
28
29 #include "bt_target.h"
30 #if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
31
32 #include "gki.h"
33 #include "bd.h"
34 #include "bta_hl_api.h"
35 #include "bta_hl_int.h"
36
37 /*****************************************************************************
38 ** Constants
39 *****************************************************************************/
40
41 static const tBTA_SYS_REG bta_hl_reg =
42 {
43 bta_hl_hdl_event,
44 BTA_HlDisable
45 };
46
47 /*******************************************************************************
48 **
49 ** Function BTA_HlEnable
50 **
51 ** Description Enable the HL subsystems. This function must be
52 ** called before any other functions in the HL API are called.
53 ** When the enable operation is completed the callback function
54 ** will be called with an BTA_HL_CTRL_ENABLE_CFM_EVT event.
55 **
56 ** Parameters p_cback - HL event call back function
57 **
58 ** Returns void
59 **
60 *******************************************************************************/
BTA_HlEnable(tBTA_HL_CTRL_CBACK * p_ctrl_cback)61 void BTA_HlEnable(tBTA_HL_CTRL_CBACK *p_ctrl_cback)
62 {
63 tBTA_HL_API_ENABLE *p_buf;
64
65 /* register with BTA system manager */
66 bta_sys_register(BTA_ID_HL, &bta_hl_reg);
67
68 if ((p_buf = (tBTA_HL_API_ENABLE *)GKI_getbuf(sizeof(tBTA_HL_API_ENABLE))) != NULL)
69 {
70 p_buf->hdr.event = BTA_HL_API_ENABLE_EVT;
71 p_buf->p_cback = p_ctrl_cback;
72 bta_sys_sendmsg(p_buf);
73 }
74 }
75
76 /*******************************************************************************
77 **
78 ** Function BTA_HlDisable
79 **
80 ** Description Disable the HL subsystem.
81 **
82 ** Returns void
83 **
84 *******************************************************************************/
BTA_HlDisable(void)85 void BTA_HlDisable(void)
86 {
87 BT_HDR *p_buf;
88
89 bta_sys_deregister(BTA_ID_HL);
90 if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL)
91 {
92 p_buf->event = BTA_HL_API_DISABLE_EVT;
93 bta_sys_sendmsg(p_buf);
94 }
95 }
96
97 /*******************************************************************************
98 **
99 ** Function BTA_HlUpdate
100 **
101 ** Description Register an HDP application
102 **
103 ** Parameters app_id - Application ID
104 ** p_reg_param - non-platform related parameters for the
105 ** HDP application
106 ** p_cback - HL event callback fucntion
107 **
108 ** Returns void
109 **
110 *******************************************************************************/
BTA_HlUpdate(UINT8 app_id,tBTA_HL_REG_PARAM * p_reg_param,BOOLEAN is_register,tBTA_HL_CBACK * p_cback)111 void BTA_HlUpdate(UINT8 app_id,
112 tBTA_HL_REG_PARAM *p_reg_param, BOOLEAN is_register,
113 tBTA_HL_CBACK *p_cback)
114 {
115 tBTA_HL_API_UPDATE *p_buf;
116
117 APPL_TRACE_DEBUG("BTA_HlUpdate");
118 if (is_register)
119 {
120
121 if ((p_buf = (tBTA_HL_API_UPDATE *)GKI_getbuf((UINT16)sizeof(tBTA_HL_API_UPDATE))) != NULL)
122 {
123 p_buf->hdr.event = BTA_HL_API_UPDATE_EVT;
124 p_buf->app_id = app_id;
125 p_buf->sec_mask = (p_reg_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
126 p_buf->p_cback = p_cback;
127 p_buf->is_register = is_register;
128 if (p_reg_param->p_srv_name)
129 {
130 BCM_STRNCPY_S(p_buf->srv_name, sizeof(p_buf->srv_name),
131 p_reg_param->p_srv_name, BTA_SERVICE_NAME_LEN);
132 p_buf->srv_name[BTA_SERVICE_NAME_LEN] = '\0';
133 }
134 else
135 p_buf->srv_name[0]= '\0';
136
137 if (p_reg_param->p_srv_desp)
138 {
139 BCM_STRNCPY_S(p_buf->srv_desp, sizeof(p_buf->srv_desp),
140 p_reg_param->p_srv_desp, BTA_SERVICE_DESP_LEN);
141 p_buf->srv_desp[BTA_SERVICE_DESP_LEN]= '\0';
142 }
143 else
144 p_buf->srv_desp[0]= '\0';
145
146 if (p_reg_param->p_provider_name)
147 {
148 BCM_STRNCPY_S(p_buf->provider_name, sizeof(p_buf->provider_name),
149 p_reg_param->p_provider_name, BTA_PROVIDER_NAME_LEN);
150 p_buf->provider_name[BTA_PROVIDER_NAME_LEN]= '\0';
151 }
152 else
153 p_buf->provider_name[0]= '\0';
154
155 bta_sys_sendmsg(p_buf);
156 }
157 }
158 else
159 {
160 if ((p_buf = (tBTA_HL_API_UPDATE *)GKI_getbuf((UINT16)sizeof(tBTA_HL_API_UPDATE))) != NULL)
161 {
162 p_buf->hdr.event = BTA_HL_API_UPDATE_EVT;
163 p_buf->app_id = app_id;
164 p_buf->is_register = is_register;
165 bta_sys_sendmsg(p_buf);
166 }
167
168 }
169 }
170
171 /*******************************************************************************
172 **
173 ** Function BTA_HlRegister
174 **
175 ** Description Register an HDP application
176 **
177 ** Parameters app_id - Application ID
178 ** p_reg_param - non-platform related parameters for the
179 ** HDP application
180 ** p_cback - HL event callback fucntion
181 **
182 ** Returns void
183 **
184 *******************************************************************************/
BTA_HlRegister(UINT8 app_id,tBTA_HL_REG_PARAM * p_reg_param,tBTA_HL_CBACK * p_cback)185 void BTA_HlRegister(UINT8 app_id,
186 tBTA_HL_REG_PARAM *p_reg_param,
187 tBTA_HL_CBACK *p_cback)
188 {
189 tBTA_HL_API_REGISTER *p_buf;
190
191 if ((p_buf = (tBTA_HL_API_REGISTER *)GKI_getbuf((UINT16)sizeof(tBTA_HL_API_REGISTER))) != NULL)
192 {
193 p_buf->hdr.event = BTA_HL_API_REGISTER_EVT;
194 p_buf->app_id = app_id;
195 p_buf->sec_mask = (p_reg_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
196 p_buf->p_cback = p_cback;
197 if (p_reg_param->p_srv_name)
198 {
199 BCM_STRNCPY_S(p_buf->srv_name, sizeof(p_buf->srv_name),
200 p_reg_param->p_srv_name, BTA_SERVICE_NAME_LEN);
201 p_buf->srv_name[BTA_SERVICE_NAME_LEN] = '\0';
202 }
203 else
204 p_buf->srv_name[0]= '\0';
205
206 if (p_reg_param->p_srv_desp)
207 {
208 BCM_STRNCPY_S(p_buf->srv_desp, sizeof(p_buf->srv_desp),
209 p_reg_param->p_srv_desp, BTA_SERVICE_DESP_LEN);
210 p_buf->srv_desp[BTA_SERVICE_DESP_LEN]= '\0';
211 }
212 else
213 p_buf->srv_desp[0]= '\0';
214
215 if (p_reg_param->p_provider_name)
216 {
217 BCM_STRNCPY_S(p_buf->provider_name, sizeof(p_buf->provider_name),
218 p_reg_param->p_provider_name, BTA_PROVIDER_NAME_LEN);
219 p_buf->provider_name[BTA_PROVIDER_NAME_LEN]= '\0';
220 }
221 else
222 p_buf->provider_name[0]= '\0';
223
224 bta_sys_sendmsg(p_buf);
225 }
226 }
227
228 /*******************************************************************************
229 **
230 ** Function BTA_HlDeregister
231 **
232 ** Description Deregister an HDP application
233 **
234 ** Parameters app_handle - Application handle
235 **
236 ** Returns void
237 **
238 *******************************************************************************/
BTA_HlDeregister(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle)239 void BTA_HlDeregister(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle)
240 {
241 tBTA_HL_API_DEREGISTER *p_buf;
242
243 if ((p_buf = (tBTA_HL_API_DEREGISTER *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DEREGISTER)))) != NULL)
244 {
245 p_buf->hdr.event = BTA_HL_API_DEREGISTER_EVT;
246 p_buf->app_id = app_id;
247 p_buf->app_handle = app_handle;
248 bta_sys_sendmsg(p_buf);
249 }
250 }
251 /*******************************************************************************
252 **
253 ** Function BTA_HlCchOpen
254 **
255 ** Description Open a Control channel connection with the specified BD address
256 **
257 ** Parameters app_handle - Application Handle
258 ** p_open_param - parameters for opening a control channel
259 **
260 ** Returns void
261 **
262 ** Note: The control PSM value is used to select which
263 ** HDP insatnce should be used in case the peer device support
264 ** multiple HDP instances. Also, if the control PSM value is zero
265 ** then the first HDP instance is used for the control channel setup
266 *******************************************************************************/
BTA_HlCchOpen(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle,tBTA_HL_CCH_OPEN_PARAM * p_open_param)267 void BTA_HlCchOpen(UINT8 app_id, tBTA_HL_APP_HANDLE app_handle,
268 tBTA_HL_CCH_OPEN_PARAM *p_open_param)
269 {
270 tBTA_HL_API_CCH_OPEN *p_buf;
271
272 if ((p_buf = (tBTA_HL_API_CCH_OPEN *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_CCH_OPEN)))) != NULL)
273 {
274 p_buf->hdr.event = BTA_HL_API_CCH_OPEN_EVT;
275 p_buf->app_id = app_id;
276 p_buf->app_handle = app_handle;
277 p_buf->sec_mask = (p_open_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
278 bdcpy(p_buf->bd_addr, p_open_param->bd_addr);
279 p_buf->ctrl_psm = p_open_param->ctrl_psm;
280 bta_sys_sendmsg(p_buf);
281 }
282 }
283
284 /*******************************************************************************
285 **
286 ** Function BTA_HlCchClose
287 **
288 ** Description Close a Control channel connection with the specified MCL
289 ** handle
290 **
291 ** Parameters mcl_handle - MCL handle
292 **
293 ** Returns void
294 **
295 *******************************************************************************/
BTA_HlCchClose(tBTA_HL_MCL_HANDLE mcl_handle)296 void BTA_HlCchClose(tBTA_HL_MCL_HANDLE mcl_handle)
297 {
298 tBTA_HL_API_CCH_CLOSE *p_buf;
299
300 if ((p_buf = (tBTA_HL_API_CCH_CLOSE *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_CCH_CLOSE)))) != NULL)
301 {
302 p_buf->hdr.event = BTA_HL_API_CCH_CLOSE_EVT;
303 p_buf->mcl_handle = mcl_handle;
304 bta_sys_sendmsg(p_buf);
305 }
306 }
307
308 /*******************************************************************************
309 **
310 ** Function BTA_HlDchOpen
311 **
312 ** Description Open a data channel connection with the specified DCH parameters
313 **
314 ** Parameters mcl_handle - MCL handle
315 ** p_open_param - parameters for opening a data channel
316 **
317 ** Returns void
318 **
319 *******************************************************************************/
BTA_HlDchOpen(tBTA_HL_MCL_HANDLE mcl_handle,tBTA_HL_DCH_OPEN_PARAM * p_open_param)320 void BTA_HlDchOpen(tBTA_HL_MCL_HANDLE mcl_handle,
321 tBTA_HL_DCH_OPEN_PARAM *p_open_param)
322 {
323 tBTA_HL_API_DCH_OPEN *p_buf;
324
325 if ((p_buf = (tBTA_HL_API_DCH_OPEN *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DCH_OPEN)))) != NULL)
326 {
327 p_buf->hdr.event = BTA_HL_API_DCH_OPEN_EVT;
328 p_buf->mcl_handle = mcl_handle;
329 p_buf->ctrl_psm = p_open_param->ctrl_psm;
330 p_buf->local_mdep_id = p_open_param->local_mdep_id;
331 p_buf->peer_mdep_id = p_open_param->peer_mdep_id;
332 p_buf->local_cfg = p_open_param->local_cfg;
333 p_buf->sec_mask = (p_open_param->sec_mask | BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
334 bta_sys_sendmsg(p_buf);
335 }
336 }
337
338 /*******************************************************************************
339 **
340 ** Function BTA_HlDchReconnect
341 **
342 ** Description Reconnect a data channel with the specified MDL_ID
343 **
344 ** Parameters mcl_handle - MCL handle
345 *8 p_recon_param - parameters for reconnecting a data channel
346 **
347 ** Returns void
348 **
349 *******************************************************************************/
BTA_HlDchReconnect(tBTA_HL_MCL_HANDLE mcl_handle,tBTA_HL_DCH_RECONNECT_PARAM * p_recon_param)350 void BTA_HlDchReconnect(tBTA_HL_MCL_HANDLE mcl_handle,
351 tBTA_HL_DCH_RECONNECT_PARAM *p_recon_param)
352 {
353 tBTA_HL_API_DCH_RECONNECT *p_buf;
354
355 if ((p_buf = (tBTA_HL_API_DCH_RECONNECT *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DCH_RECONNECT)))) != NULL)
356 {
357 p_buf->hdr.event = BTA_HL_API_DCH_RECONNECT_EVT;
358 p_buf->mcl_handle = mcl_handle;
359 p_buf->ctrl_psm = p_recon_param->ctrl_psm;
360 p_buf->mdl_id = p_recon_param->mdl_id;
361 bta_sys_sendmsg(p_buf);
362 }
363 }
364
365 /*******************************************************************************
366 **
367 ** Function BTA_HlDchClose
368 **
369 ** Description Close a data channel with the specified MDL handle
370 **
371 ** Parameters mdl_handle - MDL handle
372 **
373 ** Returns void
374 **
375 *******************************************************************************/
BTA_HlDchClose(tBTA_HL_MDL_HANDLE mdl_handle)376 void BTA_HlDchClose(tBTA_HL_MDL_HANDLE mdl_handle)
377 {
378 tBTA_HL_API_DCH_CLOSE *p_buf;
379
380 if ((p_buf = (tBTA_HL_API_DCH_CLOSE *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DCH_CLOSE)))) != NULL)
381 {
382 p_buf->hdr.event = BTA_HL_API_DCH_CLOSE_EVT;
383 p_buf->mdl_handle = mdl_handle;
384 bta_sys_sendmsg(p_buf);
385 }
386 }
387
388 /*******************************************************************************
389 **
390 ** Function BTA_HlDchAbort
391 **
392 ** Description Abort the current data channel setup with the specified MCL
393 ** handle
394 **
395 ** Parameters mcl_handle - MCL handle
396 **
397 **
398 ** Returns void
399 **
400 *******************************************************************************/
BTA_HlDchAbort(tBTA_HL_MCL_HANDLE mcl_handle)401 void BTA_HlDchAbort(tBTA_HL_MCL_HANDLE mcl_handle)
402 {
403 tBTA_HL_API_DCH_ABORT *p_buf;
404
405 if ((p_buf = (tBTA_HL_API_DCH_ABORT *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DCH_ABORT)))) != NULL)
406 {
407 p_buf->hdr.event = BTA_HL_API_DCH_ABORT_EVT;
408 p_buf->mcl_handle = mcl_handle;
409 bta_sys_sendmsg(p_buf);
410 }
411 }
412
413 /*******************************************************************************
414 **
415 ** Function BTA_HlSendData
416 **
417 ** Description Send an APDU to the peer device
418 **
419 ** Parameters mdl_handle - MDL handle
420 ** pkt_size - size of the data packet to be sent
421 **
422 ** Returns void
423 **
424 *******************************************************************************/
BTA_HlSendData(tBTA_HL_MDL_HANDLE mdl_handle,UINT16 pkt_size)425 void BTA_HlSendData(tBTA_HL_MDL_HANDLE mdl_handle,
426 UINT16 pkt_size)
427 {
428 tBTA_HL_API_SEND_DATA *p_buf = NULL;
429
430 if ((p_buf = (tBTA_HL_API_SEND_DATA *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_SEND_DATA)))) != NULL)
431 {
432 p_buf->hdr.event = BTA_HL_API_SEND_DATA_EVT;
433 p_buf->mdl_handle = mdl_handle;
434 p_buf->pkt_size = pkt_size;
435 bta_sys_sendmsg(p_buf);
436 }
437
438 }
439
440 /*******************************************************************************
441 **
442 ** Function BTA_HlDeleteMdl
443 **
444 ** Description Delete the specified MDL_ID within the specified MCL handle
445 **
446 ** Parameters mcl_handle - MCL handle
447 ** mdl_id - MDL ID
448 **
449 ** Returns void
450 **
451 ** note: If mdl_id = 0xFFFF then this means to delete all MDLs
452 ** and this value can only be used with DeleteMdl request only
453 ** not other requests
454 **
455 *******************************************************************************/
BTA_HlDeleteMdl(tBTA_HL_MCL_HANDLE mcl_handle,tBTA_HL_MDL_ID mdl_id)456 void BTA_HlDeleteMdl(tBTA_HL_MCL_HANDLE mcl_handle,
457 tBTA_HL_MDL_ID mdl_id )
458 {
459 tBTA_HL_API_DELETE_MDL *p_buf;
460
461 if ((p_buf = (tBTA_HL_API_DELETE_MDL *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DELETE_MDL)))) != NULL)
462 {
463 p_buf->hdr.event = BTA_HL_API_DELETE_MDL_EVT;
464 p_buf->mcl_handle = mcl_handle;
465 p_buf->mdl_id = mdl_id;
466 bta_sys_sendmsg(p_buf);
467 }
468 }
469
470 /*******************************************************************************
471 **
472 ** Function BTA_HlDchEchoTest
473 **
474 ** Description Initiate an echo test with the specified MCL handle
475 **
476 ** Parameters mcl_handle - MCL handle
477 *8 p_echo_test_param - parameters for echo testing
478 **
479 ** Returns void
480 **
481 *******************************************************************************/
BTA_HlDchEchoTest(tBTA_HL_MCL_HANDLE mcl_handle,tBTA_HL_DCH_ECHO_TEST_PARAM * p_echo_test_param)482 void BTA_HlDchEchoTest( tBTA_HL_MCL_HANDLE mcl_handle,
483 tBTA_HL_DCH_ECHO_TEST_PARAM *p_echo_test_param)
484 {
485 tBTA_HL_API_DCH_ECHO_TEST *p_buf;
486
487 if ((p_buf = (tBTA_HL_API_DCH_ECHO_TEST *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DCH_ECHO_TEST)))) != NULL)
488 {
489 p_buf->hdr.event = BTA_HL_API_DCH_ECHO_TEST_EVT;
490 p_buf->mcl_handle = mcl_handle;
491 p_buf->ctrl_psm = p_echo_test_param->ctrl_psm;
492 p_buf->local_cfg = p_echo_test_param->local_cfg;
493 p_buf->pkt_size = p_echo_test_param->pkt_size;
494 bta_sys_sendmsg(p_buf);
495 }
496 }
497
498
499 /*******************************************************************************
500 **
501 ** Function BTA_HlSdpQuery
502 **
503 ** Description SDP query request for the specified BD address
504 **
505 ** Parameters app_handle - application handle
506 ** bd_addr - BD address
507 **
508 ** Returns void
509 **
510 *******************************************************************************/
BTA_HlSdpQuery(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle,BD_ADDR bd_addr)511 void BTA_HlSdpQuery(UINT8 app_id,tBTA_HL_APP_HANDLE app_handle,
512 BD_ADDR bd_addr)
513 {
514 tBTA_HL_API_SDP_QUERY *p_buf;
515
516 if ((p_buf = (tBTA_HL_API_SDP_QUERY *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_SDP_QUERY)))) != NULL)
517 {
518 p_buf->hdr.event = BTA_HL_API_SDP_QUERY_EVT;
519 p_buf->app_id = app_id;
520 p_buf->app_handle = app_handle;
521 bdcpy(p_buf->bd_addr, bd_addr);
522 bta_sys_sendmsg(p_buf);
523 }
524 }
525
526
527 /*******************************************************************************
528 **
529 ** Function BTA_HlDchCreateMdlRsp
530 **
531 ** Description Set the Response and configuration values for the Create MDL
532 ** request
533 **
534 ** Parameters mcl_handle - MCL handle
535 ** p_rsp_param - parameters specified whether the request should
536 ** be accepted or not and if it should be accepted
537 ** then it also specified the configuration response
538 ** value
539 **
540 ** Returns void
541 **
542 *******************************************************************************/
BTA_HlDchCreateRsp(tBTA_HL_MCL_HANDLE mcl_handle,tBTA_HL_DCH_CREATE_RSP_PARAM * p_rsp_param)543 void BTA_HlDchCreateRsp(tBTA_HL_MCL_HANDLE mcl_handle,
544 tBTA_HL_DCH_CREATE_RSP_PARAM *p_rsp_param)
545 {
546 tBTA_HL_API_DCH_CREATE_RSP *p_buf;
547
548 if ((p_buf = (tBTA_HL_API_DCH_CREATE_RSP *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_API_DCH_CREATE_RSP)))) != NULL)
549 {
550 p_buf->hdr.event = BTA_HL_API_DCH_CREATE_RSP_EVT;
551 p_buf->mcl_handle = mcl_handle;
552 p_buf->mdl_id = p_rsp_param->mdl_id;
553 p_buf->local_mdep_id = p_rsp_param->local_mdep_id;
554 p_buf->rsp_code = p_rsp_param->rsp_code;
555 p_buf->cfg_rsp = p_rsp_param->cfg_rsp;
556 bta_sys_sendmsg(p_buf);
557 }
558 }
559
560 #endif /* HL_INCLUDED */
561