hidd_api.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. /******************************************************************************
  2. *
  3. * Copyright (C) 2016 The Android Open Source Project
  4. * Copyright (C) 2002-2012 Broadcom Corporation
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at:
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. *
  18. ******************************************************************************/
  19. /******************************************************************************
  20. *
  21. * This file contains the HID Device API entry points
  22. *
  23. ******************************************************************************/
  24. //#include <errno.h>
  25. //#include <hardware/bluetooth.h>
  26. //#include <hardware/bt_hd.h>
  27. #include "stack/hidd_api.h"
  28. #include "esp_hidd_api.h"
  29. #include "hid_int.h"
  30. #include "osi/allocator.h"
  31. #include "stack/btm_api.h"
  32. #include "stack/btu.h"
  33. #include "stack/hiddefs.h"
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #if (HID_DEV_INCLUDED == TRUE)
  38. #if HID_DYNAMIC_MEMORY == FALSE
  39. tHID_DEV_CTB hd_cb;
  40. #else
  41. tHID_DEV_CTB *hidd_cb_ptr = NULL;
  42. #endif
  43. /*******************************************************************************
  44. *
  45. * Function HID_DevInit
  46. *
  47. * Description Initializes control block
  48. *
  49. * Returns tHID_STATUS
  50. *
  51. ******************************************************************************/
  52. tHID_STATUS HID_DevInit(void)
  53. {
  54. #if (HID_DYNAMIC_MEMORY)
  55. if (!hidd_cb_ptr) {
  56. hidd_cb_ptr = (tHID_DEV_CTB *)osi_malloc(sizeof(tHID_DEV_CTB));
  57. if (!hidd_cb_ptr) {
  58. return HID_ERR_NO_RESOURCES;
  59. }
  60. }
  61. #endif /* #if (HID_DYNAMIC_MEMORY) */
  62. memset(&hd_cb, 0, sizeof(tHID_DEV_CTB));
  63. #if defined(HIDD_INITIAL_TRACE_LEVEL)
  64. hd_cb.trace_level = HIDD_INITIAL_TRACE_LEVEL;
  65. #else
  66. hd_cb.trace_level = BT_TRACE_LEVEL_NONE;
  67. #endif
  68. return HID_SUCCESS;
  69. }
  70. /*******************************************************************************
  71. *
  72. * Function HID_DevDeinit
  73. *
  74. * Description Deinitializes control block
  75. *
  76. * Returns void
  77. *
  78. ******************************************************************************/
  79. void HID_DevDeinit(void)
  80. {
  81. #if (HID_DYNAMIC_MEMORY)
  82. if (hidd_cb_ptr) {
  83. osi_free(hidd_cb_ptr);
  84. hidd_cb_ptr = NULL;
  85. }
  86. #endif /* #if (HID_DYNAMIC_MEMORY) */
  87. }
  88. /*******************************************************************************
  89. *
  90. * Function HID_DevSetTraceLevel
  91. *
  92. * Description This function sets the trace level for HID Dev. If called
  93. * with
  94. * a value of 0xFF, it simply reads the current trace level.
  95. *
  96. * Returns the new (current) trace level
  97. *
  98. ******************************************************************************/
  99. uint8_t HID_DevSetTraceLevel(uint8_t new_level)
  100. {
  101. if (new_level != 0xFF) {
  102. hd_cb.trace_level = new_level;
  103. }
  104. return (hd_cb.trace_level);
  105. }
  106. /*******************************************************************************
  107. *
  108. * Function HID_DevRegister
  109. *
  110. * Description Registers HID device with lower layers
  111. *
  112. * Returns tHID_STATUS
  113. *
  114. ******************************************************************************/
  115. tHID_STATUS HID_DevRegister(tHID_DEV_HOST_CALLBACK *host_cback)
  116. {
  117. tHID_STATUS st;
  118. HIDD_TRACE_API("%s", __func__);
  119. if (hd_cb.reg_flag) {
  120. return HID_ERR_ALREADY_REGISTERED;
  121. }
  122. if (host_cback == NULL) {
  123. return HID_ERR_INVALID_PARAM;
  124. }
  125. /* Register with L2CAP */
  126. if ((st = hidd_conn_reg()) != HID_SUCCESS) {
  127. return st;
  128. }
  129. hd_cb.callback = host_cback;
  130. hd_cb.reg_flag = TRUE;
  131. if (hd_cb.pending_data) {
  132. osi_free(hd_cb.pending_data);
  133. hd_cb.pending_data = NULL;
  134. }
  135. return (HID_SUCCESS);
  136. }
  137. /*******************************************************************************
  138. *
  139. * Function HID_DevDeregister
  140. *
  141. * Description Deregisters HID device with lower layers
  142. *
  143. * Returns tHID_STATUS
  144. *
  145. ******************************************************************************/
  146. tHID_STATUS HID_DevDeregister(void)
  147. {
  148. HIDD_TRACE_API("%s", __func__);
  149. if (!hd_cb.reg_flag)
  150. return (HID_ERR_NOT_REGISTERED);
  151. hidd_conn_dereg();
  152. hd_cb.reg_flag = FALSE;
  153. return (HID_SUCCESS);
  154. }
  155. tHID_STATUS HID_DevSetSecurityLevel(uint8_t sec_lvl)
  156. {
  157. HIDD_TRACE_API("%s", __func__);
  158. if (!BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HIDD_SEC_CTRL, sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID,
  159. HIDD_SEC_CHN)) {
  160. HIDD_TRACE_ERROR("Security Registration 1 failed");
  161. return (HID_ERR_NO_RESOURCES);
  162. }
  163. if (!BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HIDD_SEC_CTRL, sec_lvl, HID_PSM_CONTROL, BTM_SEC_PROTO_HID,
  164. HIDD_SEC_CHN)) {
  165. HIDD_TRACE_ERROR("Security Registration 2 failed");
  166. return (HID_ERR_NO_RESOURCES);
  167. }
  168. if (!BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HIDD_NOSEC_CTRL, BTM_SEC_NONE, HID_PSM_CONTROL,
  169. BTM_SEC_PROTO_HID, HIDD_NOSEC_CHN)) {
  170. HIDD_TRACE_ERROR("Security Registration 3 failed");
  171. return (HID_ERR_NO_RESOURCES);
  172. }
  173. if (!BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HIDD_NOSEC_CTRL, BTM_SEC_NONE, HID_PSM_CONTROL,
  174. BTM_SEC_PROTO_HID, HIDD_NOSEC_CHN)) {
  175. HIDD_TRACE_ERROR("Security Registration 4 failed");
  176. return (HID_ERR_NO_RESOURCES);
  177. }
  178. if (!BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_HIDD_INTR, BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID,
  179. 0)) {
  180. HIDD_TRACE_ERROR("Security Registration 5 failed");
  181. return (HID_ERR_NO_RESOURCES);
  182. }
  183. if (!BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_HIDD_INTR, BTM_SEC_NONE, HID_PSM_INTERRUPT, BTM_SEC_PROTO_HID,
  184. 0)) {
  185. HIDD_TRACE_ERROR("Security Registration 6 failed");
  186. return (HID_ERR_NO_RESOURCES);
  187. }
  188. return (HID_SUCCESS);
  189. }
  190. /*******************************************************************************
  191. *
  192. * Function HID_DevAddRecord
  193. *
  194. * Description Creates SDP record for HID device
  195. *
  196. * Returns tHID_STATUS
  197. *
  198. ******************************************************************************/
  199. tHID_STATUS HID_DevAddRecord(uint32_t handle, char *p_name, char *p_description, char *p_provider, uint16_t subclass,
  200. uint16_t desc_len, uint8_t *p_desc_data)
  201. {
  202. bool result = TRUE;
  203. HIDD_TRACE_API("%s", __func__);
  204. // Service Class ID List
  205. if (result) {
  206. uint16_t uuid = UUID_SERVCLASS_HUMAN_INTERFACE;
  207. result &= SDP_AddServiceClassIdList(handle, 1, &uuid);
  208. }
  209. // Protocol Descriptor List
  210. if (result) {
  211. tSDP_PROTOCOL_ELEM proto_list[2];
  212. proto_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
  213. proto_list[0].num_params = 1;
  214. proto_list[0].params[0] = BT_PSM_HIDC;
  215. proto_list[1].protocol_uuid = UUID_PROTOCOL_HIDP;
  216. proto_list[1].num_params = 0;
  217. result &= SDP_AddProtocolList(handle, 2, proto_list);
  218. }
  219. // Language Base Attribute ID List
  220. if (result) {
  221. result &=
  222. SDP_AddLanguageBaseAttrIDList(handle, LANG_ID_CODE_ENGLISH, LANG_ID_CHAR_ENCODE_UTF8, LANGUAGE_BASE_ID);
  223. }
  224. // Additional Protocol Descriptor List
  225. if (result) {
  226. tSDP_PROTO_LIST_ELEM add_proto_list;
  227. add_proto_list.num_elems = 2;
  228. add_proto_list.list_elem[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
  229. add_proto_list.list_elem[0].num_params = 1;
  230. add_proto_list.list_elem[0].params[0] = BT_PSM_HIDI;
  231. add_proto_list.list_elem[1].protocol_uuid = UUID_PROTOCOL_HIDP;
  232. add_proto_list.list_elem[1].num_params = 0;
  233. result &= SDP_AddAdditionProtoLists(handle, 1, &add_proto_list);
  234. }
  235. // Service Name (O)
  236. // Service Description (O)
  237. // Provider Name (O)
  238. if (result) {
  239. const char *srv_name = p_name;
  240. const char *srv_desc = p_description;
  241. const char *provider_name = p_provider;
  242. result &= SDP_AddAttribute(handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, strlen(srv_name) + 1,
  243. (uint8_t *)srv_name);
  244. result &= SDP_AddAttribute(handle, ATTR_ID_SERVICE_DESCRIPTION, TEXT_STR_DESC_TYPE, strlen(srv_desc) + 1,
  245. (uint8_t *)srv_desc);
  246. result &= SDP_AddAttribute(handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE, strlen(provider_name) + 1,
  247. (uint8_t *)provider_name);
  248. }
  249. // Bluetooth Profile Descriptor List
  250. if (result) {
  251. const uint16_t profile_uuid = UUID_SERVCLASS_HUMAN_INTERFACE;
  252. const uint16_t version = 0x0100;
  253. result &= SDP_AddProfileDescriptorList(handle, profile_uuid, version);
  254. }
  255. // HID Parser Version
  256. if (result) {
  257. uint8_t *p;
  258. const uint16_t rel_num = 0x0100;
  259. const uint16_t parser_version = 0x0111;
  260. const uint16_t prof_ver = 0x0100;
  261. const uint8_t dev_subclass = subclass;
  262. const uint8_t country_code = 0x21;
  263. const uint8_t bool_false = 0x00;
  264. const uint8_t bool_true = 0x01;
  265. uint16_t temp;
  266. p = (uint8_t *)&temp;
  267. UINT16_TO_BE_STREAM(p, rel_num);
  268. result &= SDP_AddAttribute(handle, ATTR_ID_HID_DEVICE_RELNUM, UINT_DESC_TYPE, 2, (uint8_t *)&temp);
  269. p = (uint8_t *)&temp;
  270. UINT16_TO_BE_STREAM(p, parser_version);
  271. result &= SDP_AddAttribute(handle, ATTR_ID_HID_PARSER_VERSION, UINT_DESC_TYPE, 2, (uint8_t *)&temp);
  272. result &= SDP_AddAttribute(handle, ATTR_ID_HID_DEVICE_SUBCLASS, UINT_DESC_TYPE, 1, (uint8_t *)&dev_subclass);
  273. result &= SDP_AddAttribute(handle, ATTR_ID_HID_COUNTRY_CODE, UINT_DESC_TYPE, 1, (uint8_t *)&country_code);
  274. result &= SDP_AddAttribute(handle, ATTR_ID_HID_VIRTUAL_CABLE, BOOLEAN_DESC_TYPE, 1, (uint8_t *)&bool_true);
  275. result &= SDP_AddAttribute(handle, ATTR_ID_HID_RECONNECT_INITIATE, BOOLEAN_DESC_TYPE, 1, (uint8_t *)&bool_true);
  276. {
  277. static uint8_t cdt = 0x22;
  278. uint8_t *p_buf;
  279. uint8_t seq_len = 4 + desc_len;
  280. p_buf = (uint8_t *)osi_malloc(2048);
  281. if (p_buf == NULL) {
  282. HIDD_TRACE_ERROR("%s: Buffer allocation failure for size = 2048 ", __func__);
  283. return HID_ERR_NOT_REGISTERED;
  284. }
  285. p = p_buf;
  286. UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
  287. UINT8_TO_BE_STREAM(p, seq_len);
  288. UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_ONE_BYTE);
  289. UINT8_TO_BE_STREAM(p, cdt);
  290. UINT8_TO_BE_STREAM(p, (TEXT_STR_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
  291. UINT8_TO_BE_STREAM(p, desc_len);
  292. ARRAY_TO_BE_STREAM(p, p_desc_data, (int)desc_len);
  293. result &= SDP_AddAttribute(handle, ATTR_ID_HID_DESCRIPTOR_LIST, DATA_ELE_SEQ_DESC_TYPE, p - p_buf, p_buf);
  294. osi_free(p_buf);
  295. }
  296. {
  297. uint8_t lang_buf[8];
  298. p = lang_buf;
  299. uint8_t seq_len = 6;
  300. uint16_t lang_english = 0x0409;
  301. UINT8_TO_BE_STREAM(p, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE);
  302. UINT8_TO_BE_STREAM(p, seq_len);
  303. UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
  304. UINT16_TO_BE_STREAM(p, lang_english);
  305. UINT8_TO_BE_STREAM(p, (UINT_DESC_TYPE << 3) | SIZE_TWO_BYTES);
  306. UINT16_TO_BE_STREAM(p, LANGUAGE_BASE_ID);
  307. result &=
  308. SDP_AddAttribute(handle, ATTR_ID_HID_LANGUAGE_ID_BASE, DATA_ELE_SEQ_DESC_TYPE, p - lang_buf, lang_buf);
  309. }
  310. result &= SDP_AddAttribute(handle, ATTR_ID_HID_BATTERY_POWER, BOOLEAN_DESC_TYPE, 1, (uint8_t *)&bool_true);
  311. result &= SDP_AddAttribute(handle, ATTR_ID_HID_REMOTE_WAKE, BOOLEAN_DESC_TYPE, 1, (uint8_t *)&bool_false);
  312. result &=
  313. SDP_AddAttribute(handle, ATTR_ID_HID_NORMALLY_CONNECTABLE, BOOLEAN_DESC_TYPE, 1, (uint8_t *)&bool_true);
  314. result &= SDP_AddAttribute(handle, ATTR_ID_HID_BOOT_DEVICE, BOOLEAN_DESC_TYPE, 1, (uint8_t *)&bool_true);
  315. p = (uint8_t *)&temp;
  316. UINT16_TO_BE_STREAM(p, prof_ver);
  317. result &= SDP_AddAttribute(handle, ATTR_ID_HID_PROFILE_VERSION, UINT_DESC_TYPE, 2, (uint8_t *)&temp);
  318. }
  319. if (result) {
  320. uint16_t browse_group = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
  321. result &= SDP_AddUuidSequence(handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &browse_group);
  322. }
  323. if (!result) {
  324. HIDD_TRACE_ERROR("%s: failed to complete SDP record", __func__);
  325. return HID_ERR_NOT_REGISTERED;
  326. }
  327. return HID_SUCCESS;
  328. }
  329. /*******************************************************************************
  330. *
  331. * Function HID_DevSendReport
  332. *
  333. * Description Sends report
  334. *
  335. * Returns tHID_STATUS
  336. *
  337. ******************************************************************************/
  338. tHID_STATUS HID_DevSendReport(uint8_t channel, uint8_t type, uint8_t id, uint16_t len, uint8_t *p_data)
  339. {
  340. HIDD_TRACE_VERBOSE("%s: channel=%d type=%d id=%d len=%d", __func__, channel, type, id, len);
  341. if (channel == HID_CHANNEL_CTRL) {
  342. return hidd_conn_send_data(HID_CHANNEL_CTRL, HID_TRANS_DATA, type, id, len, p_data);
  343. }
  344. if (channel == HID_CHANNEL_INTR && type == HID_PAR_REP_TYPE_INPUT) {
  345. // on INTR we can only send INPUT
  346. return hidd_conn_send_data(HID_CHANNEL_INTR, HID_TRANS_DATA, HID_PAR_REP_TYPE_INPUT, id, len, p_data);
  347. }
  348. return HID_ERR_INVALID_PARAM;
  349. }
  350. /*******************************************************************************
  351. *
  352. * Function HID_DevVirtualCableUnplug
  353. *
  354. * Description Sends Virtual Cable Unplug
  355. *
  356. * Returns tHID_STATUS
  357. *
  358. ******************************************************************************/
  359. tHID_STATUS HID_DevVirtualCableUnplug(void)
  360. {
  361. HIDD_TRACE_API("%s", __func__);
  362. return hidd_conn_send_data(HID_CHANNEL_CTRL, HID_TRANS_CONTROL, HID_PAR_CONTROL_VIRTUAL_CABLE_UNPLUG, 0, 0, NULL);
  363. }
  364. /*******************************************************************************
  365. *
  366. * Function HID_DevPlugDevice
  367. *
  368. * Description Establishes virtual cable to given host
  369. *
  370. * Returns tHID_STATUS
  371. *
  372. ******************************************************************************/
  373. tHID_STATUS HID_DevPlugDevice(BD_ADDR addr)
  374. {
  375. hd_cb.device.in_use = TRUE;
  376. memcpy(hd_cb.device.addr, addr, sizeof(BD_ADDR));
  377. return HID_SUCCESS;
  378. }
  379. /*******************************************************************************
  380. *
  381. * Function HID_DevUnplugDevice
  382. *
  383. * Description Unplugs virtual cable from given host
  384. *
  385. * Returns tHID_STATUS
  386. *
  387. ******************************************************************************/
  388. tHID_STATUS HID_DevUnplugDevice(BD_ADDR addr)
  389. {
  390. if (!memcmp(hd_cb.device.addr, addr, sizeof(BD_ADDR))) {
  391. hd_cb.device.in_use = FALSE;
  392. hd_cb.device.conn.conn_state = HID_CONN_STATE_UNUSED;
  393. hd_cb.device.conn.ctrl_cid = 0;
  394. hd_cb.device.conn.intr_cid = 0;
  395. }
  396. return HID_SUCCESS;
  397. }
  398. /*******************************************************************************
  399. *
  400. * Function HID_DevConnect
  401. *
  402. * Description Connects to device
  403. *
  404. * Returns tHID_STATUS
  405. *
  406. ******************************************************************************/
  407. tHID_STATUS HID_DevConnect(void)
  408. {
  409. if (!hd_cb.reg_flag) {
  410. return HID_ERR_NOT_REGISTERED;
  411. }
  412. if (!hd_cb.device.in_use) {
  413. return HID_ERR_INVALID_PARAM;
  414. }
  415. if (hd_cb.device.state != HIDD_DEV_NO_CONN) {
  416. return HID_ERR_ALREADY_CONN;
  417. }
  418. return hidd_conn_initiate();
  419. }
  420. /*******************************************************************************
  421. *
  422. * Function HID_DevDisconnect
  423. *
  424. * Description Disconnects from device
  425. *
  426. * Returns tHID_STATUS
  427. *
  428. ******************************************************************************/
  429. tHID_STATUS HID_DevDisconnect(void)
  430. {
  431. if (!hd_cb.reg_flag) {
  432. return HID_ERR_NOT_REGISTERED;
  433. }
  434. if (!hd_cb.device.in_use) {
  435. return HID_ERR_INVALID_PARAM;
  436. }
  437. if (hd_cb.device.state == HIDD_DEV_NO_CONN) {
  438. return HID_ERR_NO_CONNECTION;
  439. }
  440. return hidd_conn_disconnect();
  441. }
  442. /*******************************************************************************
  443. *
  444. * Function HID_DevSetIncomingPolicy
  445. *
  446. * Description Sets policy for incoming connections (allowed/disallowed)
  447. *
  448. * Returns tHID_STATUS
  449. *
  450. ******************************************************************************/
  451. tHID_STATUS HID_DevSetIncomingPolicy(bool allow)
  452. {
  453. hd_cb.allow_incoming = allow;
  454. return HID_SUCCESS;
  455. }
  456. /*******************************************************************************
  457. *
  458. * Function HID_DevReportError
  459. *
  460. * Description Reports error for Set Report via HANDSHAKE
  461. *
  462. * Returns tHID_STATUS
  463. *
  464. ******************************************************************************/
  465. tHID_STATUS HID_DevReportError(uint8_t error)
  466. {
  467. uint8_t handshake_param;
  468. HIDD_TRACE_API("%s: error = %d", __func__, error);
  469. switch (error) {
  470. case HID_PAR_HANDSHAKE_RSP_SUCCESS:
  471. case HID_PAR_HANDSHAKE_RSP_NOT_READY:
  472. case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_REP_ID:
  473. case HID_PAR_HANDSHAKE_RSP_ERR_UNSUPPORTED_REQ:
  474. case HID_PAR_HANDSHAKE_RSP_ERR_INVALID_PARAM:
  475. case HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN:
  476. case HID_PAR_HANDSHAKE_RSP_ERR_FATAL:
  477. handshake_param = error;
  478. break;
  479. default:
  480. handshake_param = HID_PAR_HANDSHAKE_RSP_ERR_UNKNOWN;
  481. break;
  482. }
  483. return hidd_conn_send_data(0, HID_TRANS_HANDSHAKE, handshake_param, 0, 0, NULL);
  484. }
  485. /*******************************************************************************
  486. *
  487. * Function HID_DevGetDevice
  488. *
  489. * Description Returns the BD Address of virtually cabled device
  490. *
  491. * Returns tHID_STATUS
  492. *
  493. ******************************************************************************/
  494. tHID_STATUS HID_DevGetDevice(BD_ADDR *addr)
  495. {
  496. HIDD_TRACE_API("%s", __func__);
  497. if (hd_cb.device.in_use) {
  498. memcpy(addr, hd_cb.device.addr, sizeof(BD_ADDR));
  499. } else {
  500. return HID_ERR_NOT_REGISTERED;
  501. }
  502. return HID_SUCCESS;
  503. }
  504. /*******************************************************************************
  505. *
  506. * Function HID_DevSetIncomingQos
  507. *
  508. * Description Sets Incoming QoS values for Interrupt L2CAP Channel
  509. *
  510. * Returns tHID_STATUS
  511. *
  512. ******************************************************************************/
  513. tHID_STATUS HID_DevSetIncomingQos(uint8_t service_type, uint32_t token_rate, uint32_t token_bucket_size,
  514. uint32_t peak_bandwidth, uint32_t latency, uint32_t delay_variation)
  515. {
  516. HIDD_TRACE_API("%s", __func__);
  517. hd_cb.use_in_qos = TRUE;
  518. hd_cb.in_qos.service_type = service_type;
  519. hd_cb.in_qos.token_rate = token_rate;
  520. hd_cb.in_qos.token_bucket_size = token_bucket_size;
  521. hd_cb.in_qos.peak_bandwidth = peak_bandwidth;
  522. hd_cb.in_qos.latency = latency;
  523. hd_cb.in_qos.delay_variation = delay_variation;
  524. return HID_SUCCESS;
  525. }
  526. /*******************************************************************************
  527. *
  528. * Function HID_DevSetOutgoingQos
  529. *
  530. * Description Sets Outgoing QoS values for Interrupt L2CAP Channel
  531. *
  532. * Returns tHID_STATUS
  533. *
  534. ******************************************************************************/
  535. tHID_STATUS HID_DevSetOutgoingQos(uint8_t service_type, uint32_t token_rate, uint32_t token_bucket_size,
  536. uint32_t peak_bandwidth, uint32_t latency, uint32_t delay_variation)
  537. {
  538. HIDD_TRACE_API("%s", __func__);
  539. hd_cb.l2cap_intr_cfg.qos_present = TRUE;
  540. hd_cb.l2cap_intr_cfg.qos.service_type = service_type;
  541. hd_cb.l2cap_intr_cfg.qos.token_rate = token_rate;
  542. hd_cb.l2cap_intr_cfg.qos.token_bucket_size = token_bucket_size;
  543. hd_cb.l2cap_intr_cfg.qos.peak_bandwidth = peak_bandwidth;
  544. hd_cb.l2cap_intr_cfg.qos.latency = latency;
  545. hd_cb.l2cap_intr_cfg.qos.delay_variation = delay_variation;
  546. return HID_SUCCESS;
  547. }
  548. #endif