Home | History | Annotate | Download | only in hd
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2016 The Android Open Source Project
      4  *  Copyright (C) 2005-2012 Broadcom Corporation
      5  *
      6  *  Licensed under the Apache License, Version 2.0 (the "License");
      7  *  you may not use this file except in compliance with the License.
      8  *  You may obtain a copy of the License at:
      9  *
     10  *  http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  *  Unless required by applicable law or agreed to in writing, software
     13  *  distributed under the License is distributed on an "AS IS" BASIS,
     14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  *  See the License for the specific language governing permissions and
     16  *  limitations under the License.
     17  *
     18  ******************************************************************************/
     19 
     20 /******************************************************************************
     21  *
     22  *  This file contains the HID DEVICE API in the subsystem of BTA.
     23  *
     24  ******************************************************************************/
     25 
     26 #include "bt_target.h"
     27 
     28 #if defined(BTA_HD_INCLUDED) && (BTA_HD_INCLUDED == TRUE)
     29 
     30 #include <stdio.h>
     31 #include <stdlib.h>
     32 #include <string.h>
     33 
     34 #include "bta_hd_api.h"
     35 #include "bta_hd_int.h"
     36 
     37 /*****************************************************************************
     38  *  Constants
     39  ****************************************************************************/
     40 
     41 static const tBTA_SYS_REG bta_hd_reg = {bta_hd_hdl_event, BTA_HdDisable};
     42 
     43 /*******************************************************************************
     44  *
     45  * Function         BTA_HdEnable
     46  *
     47  * Description      Enables HID device
     48  *
     49  * Returns          void
     50  *
     51  ******************************************************************************/
     52 void BTA_HdEnable(tBTA_HD_CBACK* p_cback) {
     53   APPL_TRACE_API("%s", __func__);
     54 
     55   bta_sys_register(BTA_ID_HD, &bta_hd_reg);
     56 
     57   tBTA_HD_API_ENABLE* p_buf =
     58       (tBTA_HD_API_ENABLE*)osi_malloc((uint16_t)sizeof(tBTA_HD_API_ENABLE));
     59 
     60   memset(p_buf, 0, sizeof(tBTA_HD_API_ENABLE));
     61 
     62   p_buf->hdr.event = BTA_HD_API_ENABLE_EVT;
     63   p_buf->p_cback = p_cback;
     64 
     65   bta_sys_sendmsg(p_buf);
     66 }
     67 
     68 /*******************************************************************************
     69  *
     70  * Function         BTA_HdDisable
     71  *
     72  * Description      Disables HID device.
     73  *
     74  * Returns          void
     75  *
     76  ******************************************************************************/
     77 void BTA_HdDisable(void) {
     78   APPL_TRACE_API("%s", __func__);
     79 
     80   bta_sys_deregister(BTA_ID_HD);
     81 
     82   BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
     83   p_buf->event = BTA_HD_API_DISABLE_EVT;
     84   bta_sys_sendmsg(p_buf);
     85 }
     86 
     87 /*******************************************************************************
     88  *
     89  * Function         BTA_HdRegisterApp
     90  *
     91  * Description      This function is called when application should be
     92 *registered
     93  *
     94  * Returns          void
     95  *
     96  ******************************************************************************/
     97 extern void BTA_HdRegisterApp(tBTA_HD_APP_INFO* p_app_info,
     98                               tBTA_HD_QOS_INFO* p_in_qos,
     99                               tBTA_HD_QOS_INFO* p_out_qos) {
    100   APPL_TRACE_API("%s", __func__);
    101 
    102   tBTA_HD_REGISTER_APP* p_buf =
    103       (tBTA_HD_REGISTER_APP*)osi_malloc(sizeof(tBTA_HD_REGISTER_APP));
    104   p_buf->hdr.event = BTA_HD_API_REGISTER_APP_EVT;
    105 
    106   if (p_app_info->p_name) {
    107     strncpy(p_buf->name, p_app_info->p_name, BTA_HD_APP_NAME_LEN);
    108     p_buf->name[BTA_HD_APP_NAME_LEN] = '\0';
    109   } else {
    110     p_buf->name[0] = '\0';
    111   }
    112 
    113   if (p_app_info->p_description) {
    114     strncpy(p_buf->description, p_app_info->p_description,
    115             BTA_HD_APP_DESCRIPTION_LEN);
    116     p_buf->description[BTA_HD_APP_DESCRIPTION_LEN] = '\0';
    117   } else {
    118     p_buf->description[0] = '\0';
    119   }
    120 
    121   if (p_app_info->p_provider) {
    122     strncpy(p_buf->provider, p_app_info->p_provider, BTA_HD_APP_PROVIDER_LEN);
    123     p_buf->provider[BTA_HD_APP_PROVIDER_LEN] = '\0';
    124   } else {
    125     p_buf->provider[0] = '\0';
    126   }
    127 
    128   p_buf->subclass = p_app_info->subclass;
    129 
    130   p_buf->d_len = p_app_info->descriptor.dl_len;
    131   memcpy(p_buf->d_data, p_app_info->descriptor.dsc_list,
    132          p_app_info->descriptor.dl_len);
    133 
    134   // copy qos data as-is
    135   memcpy(&p_buf->in_qos, p_in_qos, sizeof(tBTA_HD_QOS_INFO));
    136   memcpy(&p_buf->out_qos, p_out_qos, sizeof(tBTA_HD_QOS_INFO));
    137 
    138   bta_sys_sendmsg(p_buf);
    139 }
    140 
    141 /*******************************************************************************
    142  *
    143  * Function         BTA_HdUnregisterApp
    144  *
    145  * Description      This function is called when application should be
    146 *unregistered
    147  *
    148  * Returns          void
    149  *
    150  ******************************************************************************/
    151 extern void BTA_HdUnregisterApp(void) {
    152   APPL_TRACE_API("%s", __func__);
    153 
    154   BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    155   p_buf->event = BTA_HD_API_UNREGISTER_APP_EVT;
    156 
    157   bta_sys_sendmsg(p_buf);
    158 }
    159 
    160 /*******************************************************************************
    161  *
    162  * Function         BTA_HdSendReport
    163  *
    164  * Description      This function is called when report is to be sent
    165  *
    166  * Returns          void
    167  *
    168  ******************************************************************************/
    169 extern void BTA_HdSendReport(tBTA_HD_REPORT* p_report) {
    170   APPL_TRACE_VERBOSE("%s", __func__);
    171 
    172   if (p_report->len > BTA_HD_REPORT_LEN) {
    173     APPL_TRACE_WARNING(
    174         "%s, report len (%d) > MTU len (%d), can't send report."
    175         " Increase value of HID_DEV_MTU_SIZE to send larger reports",
    176         __func__, p_report->len, BTA_HD_REPORT_LEN);
    177     return;
    178   }
    179 
    180   tBTA_HD_SEND_REPORT* p_buf =
    181       (tBTA_HD_SEND_REPORT*)osi_malloc(sizeof(tBTA_HD_SEND_REPORT));
    182   p_buf->hdr.event = BTA_HD_API_SEND_REPORT_EVT;
    183 
    184   p_buf->use_intr = p_report->use_intr;
    185   p_buf->type = p_report->type;
    186   p_buf->id = p_report->id;
    187   p_buf->len = p_report->len;
    188   memcpy(p_buf->data, p_report->p_data, p_report->len);
    189 
    190   bta_sys_sendmsg(p_buf);
    191 }
    192 
    193 /*******************************************************************************
    194  *
    195  * Function         BTA_HdVirtualCableUnplug
    196  *
    197  * Description      This function is called when VCU shall be sent
    198  *
    199  * Returns          void
    200  *
    201  ******************************************************************************/
    202 extern void BTA_HdVirtualCableUnplug(void) {
    203   APPL_TRACE_API("%s", __func__);
    204 
    205   BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    206   p_buf->event = BTA_HD_API_VC_UNPLUG_EVT;
    207 
    208   bta_sys_sendmsg(p_buf);
    209 }
    210 
    211 /*******************************************************************************
    212  *
    213  * Function         BTA_HdConnect
    214  *
    215  * Description      This function is called when connection to host shall be
    216 *made
    217  *
    218  * Returns          void
    219  *
    220  ******************************************************************************/
    221 extern void BTA_HdConnect(BD_ADDR addr) {
    222   APPL_TRACE_API("%s", __func__);
    223 
    224   tBTA_HD_DEVICE_CTRL* p_buf =
    225       (tBTA_HD_DEVICE_CTRL*)osi_malloc(sizeof(tBTA_HD_DEVICE_CTRL));
    226   p_buf->hdr.event = BTA_HD_API_CONNECT_EVT;
    227 
    228   memcpy(p_buf->addr, addr, sizeof(BD_ADDR));
    229 
    230   bta_sys_sendmsg(p_buf);
    231 }
    232 
    233 /*******************************************************************************
    234  *
    235  * Function         BTA_HdDisconnect
    236  *
    237  * Description      This function is called when host shall be disconnected
    238  *
    239  * Returns          void
    240  *
    241  ******************************************************************************/
    242 extern void BTA_HdDisconnect(void) {
    243   APPL_TRACE_API("%s", __func__);
    244   BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    245   p_buf->event = BTA_HD_API_DISCONNECT_EVT;
    246 
    247   bta_sys_sendmsg(p_buf);
    248 }
    249 
    250 /*******************************************************************************
    251  *
    252  * Function         BTA_HdAddDevice
    253  *
    254  * Description      This function is called when a device is virtually cabled
    255  *
    256  * Returns          void
    257  *
    258  ******************************************************************************/
    259 extern void BTA_HdAddDevice(BD_ADDR addr) {
    260   APPL_TRACE_API("%s", __func__);
    261   tBTA_HD_DEVICE_CTRL* p_buf =
    262       (tBTA_HD_DEVICE_CTRL*)osi_malloc(sizeof(tBTA_HD_DEVICE_CTRL));
    263   p_buf->hdr.event = BTA_HD_API_ADD_DEVICE_EVT;
    264 
    265   memcpy(p_buf->addr, addr, sizeof(BD_ADDR));
    266 
    267   bta_sys_sendmsg(p_buf);
    268 }
    269 
    270 /*******************************************************************************
    271  *
    272  * Function         BTA_HdRemoveDevice
    273  *
    274  * Description      This function is called when a device is virtually uncabled
    275  *
    276  * Returns          void
    277  *
    278  ******************************************************************************/
    279 extern void BTA_HdRemoveDevice(BD_ADDR addr) {
    280   APPL_TRACE_API("%s", __func__);
    281   tBTA_HD_DEVICE_CTRL* p_buf =
    282       (tBTA_HD_DEVICE_CTRL*)osi_malloc(sizeof(tBTA_HD_DEVICE_CTRL));
    283   p_buf->hdr.event = BTA_HD_API_REMOVE_DEVICE_EVT;
    284 
    285   memcpy(p_buf->addr, addr, sizeof(BD_ADDR));
    286 
    287   bta_sys_sendmsg(p_buf);
    288 }
    289 
    290 /*******************************************************************************
    291  *
    292  * Function         BTA_HdReportError
    293  *
    294  * Description      This function is called when reporting error for set report
    295  *
    296  * Returns          void
    297  *
    298  ******************************************************************************/
    299 extern void BTA_HdReportError(uint8_t error) {
    300   APPL_TRACE_API("%s", __func__);
    301   tBTA_HD_REPORT_ERR* p_buf =
    302       (tBTA_HD_REPORT_ERR*)osi_malloc(sizeof(tBTA_HD_REPORT_ERR));
    303   p_buf->hdr.event = BTA_HD_API_REPORT_ERROR_EVT;
    304   p_buf->error = error;
    305 
    306   bta_sys_sendmsg(p_buf);
    307 }
    308 
    309 #endif /* BTA_HD_INCLUDED */
    310