18843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/******************************************************************************
28843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 2016 The Android Open Source Project
45b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 2002-2012 Broadcom Corporation
58843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
68843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  Licensed under the Apache License, Version 2.0 (the "License");
78843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  you may not use this file except in compliance with the License.
88843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  You may obtain a copy of the License at:
98843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  http://www.apache.org/licenses/LICENSE-2.0
118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  Unless required by applicable law or agreed to in writing, software
138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  distributed under the License is distributed on an "AS IS" BASIS,
148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
158843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  See the License for the specific language governing permissions and
168843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  limitations under the License.
178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
198843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/******************************************************************************
218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *  This file contains the HID Device API entry points
238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include <stdio.h>
278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include <stdlib.h>
288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include <string.h>
298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include "bt_types.h"
318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include "btm_api.h"
328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include "btu.h"
338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include "hidd_api.h"
348843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include "hidd_int.h"
358843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta#include "hiddefs.h"
368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
378843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_DEV_CTB hd_cb;
388843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
418843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevInit
428843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Initializes control block
448843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
458843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          void
468843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
478843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
488843cc830b522cfe6f1e361297fc28fd331a1378Hemant Guptavoid HID_DevInit(void) {
498843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  uint8_t log_level = hd_cb.trace_level;
508843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
518843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
528843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
538843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  memset(&hd_cb, 0, sizeof(tHID_DEV_CTB));
548843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.trace_level = log_level;
558843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
568843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
578843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
588843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
598843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevSetTraceLevel
608843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
618843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      This function sets the trace level for HID Dev. If called
628843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta*with
638843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *                  a value of 0xFF, it simply reads the current trace level.
648843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
658843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          the new (current) trace level
668843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
678843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Guptauint8_t HID_DevSetTraceLevel(uint8_t new_level) {
698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (new_level != 0xFF) hd_cb.trace_level = new_level;
708843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
718843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return (hd_cb.trace_level);
728843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
738843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
748843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
758843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
768843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevRegister
778843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
788843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Registers HID device with lower layers
798843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
808843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
818843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
828843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
838843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevRegister(tHID_DEV_HOST_CALLBACK* host_cback) {
848843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  tHID_STATUS st;
858843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
868843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
878843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
888843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (hd_cb.reg_flag) return HID_ERR_ALREADY_REGISTERED;
898843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
908843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (host_cback == NULL) return HID_ERR_INVALID_PARAM;
918843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
928843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  /* Register with L2CAP */
93f9c5752344ec459def74765f512d28fa0f402168Marie Janssen  st = hidd_conn_reg();
94f9c5752344ec459def74765f512d28fa0f402168Marie Janssen  if (st != HID_SUCCESS) return st;
958843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
968843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.callback = host_cback;
978843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.reg_flag = TRUE;
988843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
998843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (hd_cb.pending_data) {
1008843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    osi_free(hd_cb.pending_data);
1018843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    hd_cb.pending_data = NULL;
1028843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1038843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1048843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return (HID_SUCCESS);
1058843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
1068843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1078843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
1088843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1098843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevDeregister
1108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Deregisters HID device with lower layers
1128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
1148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1158843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
1168843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevDeregister(void) {
1178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
1188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1198843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!hd_cb.reg_flag) return (HID_ERR_NOT_REGISTERED);
1208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hidd_conn_dereg();
1228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.reg_flag = FALSE;
1248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return (HID_SUCCESS);
1268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
1278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1288843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevSetSecurityLevel(uint8_t sec_lvl) {
1298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
1308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HIDD_SEC_CTRL, sec_lvl,
1328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HIDD_SEC_CHN)) {
1338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("Security Registration 1 failed");
1348843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return (HID_ERR_NO_RESOURCES);
1358843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1378843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HIDD_SEC_CTRL, sec_lvl,
1388843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            HID_PSM_CONTROL, BTM_SEC_PROTO_HID, HIDD_SEC_CHN)) {
1398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("Security Registration 2 failed");
1408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return (HID_ERR_NO_RESOURCES);
1418843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1428843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HIDD_NOSEC_CTRL,
1448843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID,
1458843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            HIDD_NOSEC_CHN)) {
1468843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("Security Registration 3 failed");
1478843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return (HID_ERR_NO_RESOURCES);
1488843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1498843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1508843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HIDD_NOSEC_CTRL,
1518843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            BTM_SEC_NONE, HID_PSM_CONTROL, BTM_SEC_PROTO_HID,
1528843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            HIDD_NOSEC_CHN)) {
1538843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("Security Registration 4 failed");
1548843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return (HID_ERR_NO_RESOURCES);
1558843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1568843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1578843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HIDD_INTR, BTM_SEC_NONE,
1588843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0)) {
1598843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("Security Registration 5 failed");
1608843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return (HID_ERR_NO_RESOURCES);
1618843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1628843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1638843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HIDD_INTR, BTM_SEC_NONE,
1648843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                            HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID, 0)) {
1658843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("Security Registration 6 failed");
1668843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return (HID_ERR_NO_RESOURCES);
1678843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return (HID_SUCCESS);
1708843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
1718843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1728843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
1738843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1748843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevAddRecord
1758843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1768843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Creates SDP record for HID device
1778843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1788843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
1798843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
1808843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
1818843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevAddRecord(uint32_t handle, char* p_name, char* p_description,
1828843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                             char* p_provider, uint16_t subclass,
1838843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                             uint16_t desc_len, uint8_t* p_desc_data) {
1848843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  bool result = TRUE;
1858843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1868843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
1878843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1888843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Service Class ID List
1898843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
1908843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    uint16_t uuid = UUID_SERVCLASS_HUMAN_INTERFACE;
1918843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddServiceClassIdList(handle, 1, &uuid);
1928843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
1938843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1948843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Protocol Descriptor List
1958843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
1968843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    tSDP_PROTOCOL_ELEM proto_list[2];
1978843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
1988843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    proto_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
1998843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    proto_list[0].num_params = 1;
2008843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    proto_list[0].params[0] = BT_PSM_HIDC;
2018843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2028843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    proto_list[1].protocol_uuid = UUID_PROTOCOL_HIDP;
2038843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    proto_list[1].num_params = 0;
2048843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2058843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddProtocolList(handle, 2, proto_list);
2068843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
2078843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2088843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Language Base Attribute ID List
2098843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
2108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddLanguageBaseAttrIDList(handle, LANG_ID_CODE_ENGLISH,
2118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                            LANG_ID_CHAR_ENCODE_UTF8,
2128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                            LANGUAGE_BASE_ID);
2138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
2148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2158843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Additional Protocol Descriptor List
2168843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
2178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    tSDP_PROTO_LIST_ELEM add_proto_list;
2188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2198843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    add_proto_list.num_elems = 2;
2208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    add_proto_list.list_elem[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
2218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    add_proto_list.list_elem[0].num_params = 1;
2228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    add_proto_list.list_elem[0].params[0] = BT_PSM_HIDI;
2238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    add_proto_list.list_elem[1].protocol_uuid = UUID_PROTOCOL_HIDP;
2248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    add_proto_list.list_elem[1].num_params = 0;
2258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAdditionProtoLists(handle, 1, &add_proto_list);
2278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
2288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Service Name (O)
2308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Service Description (O)
2318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Provider Name (O)
2328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
2338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const char* srv_name = p_name;
2348843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const char* srv_desc = p_description;
2358843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const char* provider_name = p_provider;
2368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2378843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE,
2388843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               strlen(srv_name) + 1, (uint8_t*)srv_name);
2398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_SERVICE_DESCRIPTION,
2418843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               TEXT_STR_DESC_TYPE, strlen(srv_desc) + 1,
2428843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               (uint8_t*)srv_desc);
2438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2448843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &=
2458843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta        SDP_AddAttribute(handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE,
2468843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                         strlen(provider_name) + 1, (uint8_t*)provider_name);
2478843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
2488843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2498843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // Bluetooth Profile Descriptor List
2508843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
2518843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint16_t profile_uuid = UUID_SERVCLASS_HUMAN_INTERFACE;
2528843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint16_t version = 0x0100;
2538843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2548843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddProfileDescriptorList(handle, profile_uuid, version);
2558843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
2568843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2578843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  // HID Parser Version
2588843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
2598843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    uint8_t* p;
2608843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint16_t rel_num = 0x0100;
2618843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint16_t parser_version = 0x0111;
2628843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint16_t prof_ver = 0x0100;
2638843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint8_t dev_subclass = subclass;
2648843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint8_t country_code = 0x21;
2658843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint8_t bool_false = 0x00;
2668843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    const uint8_t bool_true = 0x01;
2678843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    uint16_t temp;
2688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    p = (uint8_t*)&temp;
2708843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    UINT16_TO_BE_STREAM(p, rel_num);
2718843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_DEVICE_RELNUM,
2728843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               UINT_DESC_TYPE, 2, (uint8_t*)&temp);
2738843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2748843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    p = (uint8_t*)&temp;
2758843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    UINT16_TO_BE_STREAM(p, parser_version);
2768843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_PARSER_VERSION,
2778843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               UINT_DESC_TYPE, 2, (uint8_t*)&temp);
2788843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2798843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_DEVICE_SUBCLASS,
2808843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               UINT_DESC_TYPE, 1, (uint8_t*)&dev_subclass);
2818843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2828843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_COUNTRY_CODE, UINT_DESC_TYPE,
2838843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               1, (uint8_t*)&country_code);
2848843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2858843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_VIRTUAL_CABLE,
2868843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
2878843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2888843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_RECONNECT_INITIATE,
2898843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
2908843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2918843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    {
2928843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      static uint8_t cdt = 0x22;
2938843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      uint8_t* p_buf;
2948843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      uint8_t seq_len = 4 + desc_len;
2958843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2968843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      p_buf = (uint8_t*)osi_malloc(2048);
2978843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
2988843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      if (p_buf == NULL) {
2998843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta        HIDD_TRACE_ERROR("%s: Buffer allocation failure for size = 2048 ",
3008843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                         __func__);
3018843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta        return HID_ERR_NOT_REGISTERED;
3028843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      }
3038843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3048843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      p = p_buf;
3058843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3068843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
3078843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3088843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, seq_len);
3098843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE);
3118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, cdt);
3128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, (TEXT_STR_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
3148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, desc_len);
3158843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      ARRAY_TO_BE_STREAM(p, p_desc_data, (int)desc_len);
3168843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      result &= SDP_AddAttribute(handle, ATTR_ID_HID_DESCRIPTOR_LIST,
3188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                 DATA_ELE_SEQ_DESC_TYPE, p - p_buf, p_buf);
3198843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      osi_free(p_buf);
3218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    }
3228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    {
3248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      uint8_t lang_buf[8];
3258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      p = lang_buf;
3268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      uint8_t seq_len = 6;
3278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      uint16_t lang_english = 0x0409;
3288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
3298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, seq_len);
3308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
3318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT16_TO_BE_STREAM(p, lang_english);
3328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
3338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      UINT16_TO_BE_STREAM(p, LANGUAGE_BASE_ID);
3348843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      result &=
3358843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta          SDP_AddAttribute(handle, ATTR_ID_HID_LANGUAGE_ID_BASE,
3368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                           DATA_ELE_SEQ_DESC_TYPE, p - lang_buf, lang_buf);
3378843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    }
3388843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_BATTERY_POWER,
3408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
3418843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3428843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_REMOTE_WAKE,
3438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_false);
3448843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3458843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_NORMALLY_CONNECTABLE,
3468843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
3478843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3488843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_BOOT_DEVICE,
3498843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               BOOLEAN_DESC_TYPE, 1, (uint8_t*)&bool_true);
3508843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3518843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    p = (uint8_t*)&temp;
3528843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    UINT16_TO_BE_STREAM(p, prof_ver);
3538843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddAttribute(handle, ATTR_ID_HID_PROFILE_VERSION,
3548843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               UINT_DESC_TYPE, 2, (uint8_t*)&temp);
3558843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
3568843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3578843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (result) {
3588843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    uint16_t browse_group = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
3598843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    result &= SDP_AddUuidSequence(handle, ATTR_ID_BROWSE_GROUP_LIST, 1,
3608843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  &browse_group);
3618843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
3628843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3638843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!result) {
3648843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    HIDD_TRACE_ERROR("%s: failed to complete SDP record", __func__);
3658843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3668843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_NOT_REGISTERED;
3678843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
3688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
3708843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
3718843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3728843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
3738843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
3748843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevSendReport
3758843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
3768843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Sends report
3778843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
3788843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
3798843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
3808843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
3818843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevSendReport(uint8_t channel, uint8_t type, uint8_t id,
3828843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                              uint16_t len, uint8_t* p_data) {
3838843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_VERBOSE("%s: channel=%d type=%d id=%d len=%d", __func__, channel,
3848843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                     type, id, len);
3858843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3868843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (channel == HID_CHANNEL_CTRL) {
3878843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return hidd_conn_send_data(HID_CHANNEL_CTRL, HID_TRANS_DATA, type, id, len,
3888843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               p_data);
3898843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
3908843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3918843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (channel == HID_CHANNEL_INTR && type == HID_PAR_REP_TYPE_INPUT) {
3928843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    // on INTR we can only send INPUT
3938843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return hidd_conn_send_data(HID_CHANNEL_INTR, HID_TRANS_DATA,
3948843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                               HID_PAR_REP_TYPE_INPUT, id, len, p_data);
3958843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
3968843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
3978843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_ERR_INVALID_PARAM;
3988843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
3998843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4008843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
4018843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4028843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevVirtualCableUnplug
4038843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4048843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Sends Virtual Cable Unplug
4058843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4068843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
4078843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4088843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
4098843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevVirtualCableUnplug(void) {
4108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
4118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return hidd_conn_send_data(HID_CHANNEL_CTRL, HID_TRANS_CONTROL,
4138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                             HID_PAR_CONTROL_VIRTUAL_CABLE_UNPLUG, 0, 0, NULL);
4148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
4158843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4168843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
4178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevPlugDevice
4198843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Establishes virtual cable to given host
4218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
4238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
425a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitHID_STATUS HID_DevPlugDevice(const RawAddress& addr) {
4268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.device.in_use = TRUE;
427011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski  hd_cb.device.addr = addr;
4288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
4308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
4318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
4338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4348843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevUnplugDevice
4358843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Unplugs virtual cable from given host
4378843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4388843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
4398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
441a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitHID_STATUS HID_DevUnplugDevice(const RawAddress& addr) {
442011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski  if (hd_cb.device.addr == addr) {
4438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    hd_cb.device.in_use = FALSE;
4448843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    hd_cb.device.conn.conn_state = HID_CONN_STATE_UNUSED;
4458843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    hd_cb.device.conn.ctrl_cid = 0;
4468843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    hd_cb.device.conn.intr_cid = 0;
4478843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
4488843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4498843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
4508843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
4518843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4528843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
4538843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4548843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevConnect
4558843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4568843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Connects to device
4578843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4588843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
4598843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4608843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
4618843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevConnect(void) {
4628843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!hd_cb.reg_flag) {
4638843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_NOT_REGISTERED;
4648843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
4658843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4668843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!hd_cb.device.in_use) {
4678843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_INVALID_PARAM;
4688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
4698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4708843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (hd_cb.device.state != HIDD_DEV_NO_CONN) {
4718843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_ALREADY_CONN;
4728843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
4738843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4748843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return hidd_conn_initiate();
4758843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
4768843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4778843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
4788843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4798843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevDisconnect
4808843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4818843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Disconnects from device
4828843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4838843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
4848843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
4858843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
4868843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevDisconnect(void) {
4878843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!hd_cb.reg_flag) {
4888843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_NOT_REGISTERED;
4898843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
4908843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4918843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (!hd_cb.device.in_use) {
4928843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_INVALID_PARAM;
4938843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
4948843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
4958843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (hd_cb.device.state == HIDD_DEV_NO_CONN) {
496367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov    /* If we are still trying to connect, just close the connection. */
497367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov    if (hd_cb.device.conn.conn_state != HID_CONN_STATE_UNUSED) {
498367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov      tHID_STATUS ret = hidd_conn_disconnect();
499367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov      hd_cb.device.conn.conn_state = HID_CONN_STATE_UNUSED;
500367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov      hd_cb.callback(hd_cb.device.addr, HID_DHOST_EVT_CLOSE,
501367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov                     HID_ERR_DISCONNECTING, NULL);
502367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov      return ret;
503367373ba8bcfb1d9db41b1904de372483991fc10Ivan Podogov    }
5048843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_NO_CONNECTION;
5058843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
5068843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5078843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return hidd_conn_disconnect();
5088843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
5098843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
5118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevSetIncomingPolicy
5138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Sets policy for incoming connections (allowed/disallowed)
5158843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5168843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
5178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
5198843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevSetIncomingPolicy(bool allow) {
5208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.allow_incoming = allow;
5218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
5238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
5248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
5268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevReportError
5288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Reports error for Set Report via HANDSHAKE
5308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
5328843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5338843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
5348843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevReportError(uint8_t error) {
5358843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  uint8_t handshake_param;
5368843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5378843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s: error = %d", __func__, error);
5388843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5398843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  switch (error) {
5408843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_SUCCESS:
5418843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_NOT_READY:
5428843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID:
5438843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ:
5448843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM:
5458843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN:
5468843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    case HID_PAR_HANDSHAKE_RSP_ERR_FATAL:
5478843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      handshake_param = error;
5488843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      break;
5498843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    default:
5508843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      handshake_param = HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN;
5518843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta      break;
5528843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
5538843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5548843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return hidd_conn_send_data(0, HID_TRANS_HANDSHAKE, handshake_param, 0, 0,
5558843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                             NULL);
5568843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
5578843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5588843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
5598843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5608843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevGetDevice
5618843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5628843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Returns the BD Address of virtually cabled device
5638843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5648843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
5658843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5668843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
567a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub PawlowskitHID_STATUS HID_DevGetDevice(RawAddress* addr) {
5688843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
5698843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5708843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  if (hd_cb.device.in_use) {
571011a61951975849b23a10d2be87e5268008d3407Jakub Pawlowski    *addr = hd_cb.device.addr;
5728843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  } else {
5738843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta    return HID_ERR_NOT_REGISTERED;
5748843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  }
5758843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5768843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
5778843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
5788843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5798843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
5808843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5818843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevSetIncomingQos
5828843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5838843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Sets Incoming QoS values for Interrupt L2CAP Channel
5848843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5858843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
5868843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
5878843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
5888843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevSetIncomingQos(uint8_t service_type, uint32_t token_rate,
5898843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  uint32_t token_bucket_size,
5908843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  uint32_t peak_bandwidth, uint32_t latency,
5918843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  uint32_t delay_variation) {
5928843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
5938843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5948843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.use_in_qos = TRUE;
5958843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
5968843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.in_qos.service_type = service_type;
5978843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.in_qos.token_rate = token_rate;
5988843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.in_qos.token_bucket_size = token_bucket_size;
5998843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.in_qos.peak_bandwidth = peak_bandwidth;
6008843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.in_qos.latency = latency;
6018843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.in_qos.delay_variation = delay_variation;
6028843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
6038843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
6048843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
6058843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
6068843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta/*******************************************************************************
6078843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
6088843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Function         HID_DevSetOutgoingQos
6098843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
6108843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Description      Sets Outgoing QoS values for Interrupt L2CAP Channel
6118843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
6128843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta * Returns          tHID_STATUS
6138843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta *
6148843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta ******************************************************************************/
6158843cc830b522cfe6f1e361297fc28fd331a1378Hemant GuptatHID_STATUS HID_DevSetOutgoingQos(uint8_t service_type, uint32_t token_rate,
6168843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  uint32_t token_bucket_size,
6178843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  uint32_t peak_bandwidth, uint32_t latency,
6188843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta                                  uint32_t delay_variation) {
6198843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  HIDD_TRACE_API("%s", __func__);
6208843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
6218843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos_present = TRUE;
6228843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
6238843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos.service_type = service_type;
6248843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos.token_rate = token_rate;
6258843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos.token_bucket_size = token_bucket_size;
6268843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos.peak_bandwidth = peak_bandwidth;
6278843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos.latency = latency;
6288843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  hd_cb.l2cap_intr_cfg.qos.delay_variation = delay_variation;
6298843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta
6308843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta  return HID_SUCCESS;
6318843cc830b522cfe6f1e361297fc28fd331a1378Hemant Gupta}
632