Home | History | Annotate | Download | only in hl
      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 *******************************************************************************/
     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 *******************************************************************************/
     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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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 *******************************************************************************/
    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