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