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