/external/bluetooth/bluedroid/stack/hcic/hcicmds.c

https://bitbucket.org/rlyspn/androidrr · C · 1968 lines · 1377 code · 560 blank · 31 comment · 182 complexity · 68c1eb5509f4d28484014e616d5dbcc7 MD5 · raw file

  1. /******************************************************************************
  2. *
  3. * Copyright (C) 1999-2012 Broadcom Corporation
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at:
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. ******************************************************************************/
  18. /******************************************************************************
  19. *
  20. * This file contains function of the HCIC unit to format and send HCI
  21. * commands.
  22. *
  23. ******************************************************************************/
  24. #include "bt_target.h"
  25. #include "gki.h"
  26. #include "hcidefs.h"
  27. #include "hcimsgs.h"
  28. #include "hcidefs.h"
  29. #include "btu.h"
  30. #include <stddef.h>
  31. #include <string.h>
  32. #if defined (LMP_TEST)
  33. #include <script.h>
  34. #define btu_hcif_send_cmd(p1, p2) HCI_CMD_TO_LOWER((p2))
  35. #else
  36. #include "btm_int.h" /* Included for UIPC_* macro definitions */
  37. #endif
  38. BOOLEAN btsnd_hcic_inquiry(const LAP inq_lap, UINT8 duration, UINT8 response_cnt)
  39. {
  40. BT_HDR *p;
  41. UINT8 *pp;
  42. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQUIRY)) == NULL)
  43. return (FALSE);
  44. pp = (UINT8 *)(p + 1);
  45. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQUIRY;
  46. p->offset = 0;
  47. UINT16_TO_STREAM (pp, HCI_INQUIRY);
  48. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_INQUIRY);
  49. LAP_TO_STREAM (pp, inq_lap);
  50. UINT8_TO_STREAM (pp, duration);
  51. UINT8_TO_STREAM (pp, response_cnt);
  52. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  53. return (TRUE);
  54. }
  55. BOOLEAN btsnd_hcic_inq_cancel(void)
  56. {
  57. BT_HDR *p;
  58. UINT8 *pp;
  59. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_INQ_CANCEL)) == NULL)
  60. return (FALSE);
  61. pp = (UINT8 *)(p + 1);
  62. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQ_CANCEL;
  63. p->offset = 0;
  64. UINT16_TO_STREAM (pp, HCI_INQUIRY_CANCEL);
  65. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_INQ_CANCEL);
  66. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  67. return (TRUE);
  68. }
  69. BOOLEAN btsnd_hcic_per_inq_mode (UINT16 max_period, UINT16 min_period,
  70. const LAP inq_lap, UINT8 duration, UINT8 response_cnt)
  71. {
  72. BT_HDR *p;
  73. UINT8 *pp;
  74. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PER_INQ_MODE)) == NULL)
  75. return (FALSE);
  76. pp = (UINT8 *)(p + 1);
  77. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PER_INQ_MODE;
  78. p->offset = 0;
  79. UINT16_TO_STREAM (pp, HCI_PERIODIC_INQUIRY_MODE);
  80. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PER_INQ_MODE);
  81. UINT16_TO_STREAM (pp, max_period);
  82. UINT16_TO_STREAM (pp, min_period);
  83. LAP_TO_STREAM (pp, inq_lap);
  84. UINT8_TO_STREAM (pp, duration);
  85. UINT8_TO_STREAM (pp, response_cnt);
  86. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  87. return (TRUE);
  88. }
  89. BOOLEAN btsnd_hcic_exit_per_inq (void)
  90. {
  91. BT_HDR *p;
  92. UINT8 *pp;
  93. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_EXIT_PER_INQ)) == NULL)
  94. return (FALSE);
  95. pp = (UINT8 *)(p + 1);
  96. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXIT_PER_INQ;
  97. p->offset = 0;
  98. UINT16_TO_STREAM (pp, HCI_EXIT_PERIODIC_INQUIRY_MODE);
  99. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_EXIT_PER_INQ);
  100. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  101. return (TRUE);
  102. }
  103. BOOLEAN btsnd_hcic_create_conn(BD_ADDR dest, UINT16 packet_types,
  104. UINT8 page_scan_rep_mode, UINT8 page_scan_mode,
  105. UINT16 clock_offset, UINT8 allow_switch)
  106. {
  107. BT_HDR *p;
  108. UINT8 *pp;
  109. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN)) == NULL)
  110. return (FALSE);
  111. pp = (UINT8 *)(p + 1);
  112. #ifndef BT_10A
  113. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN;
  114. #else
  115. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN - 1;
  116. #endif
  117. p->offset = 0;
  118. UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION);
  119. #ifndef BT_10A
  120. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CREATE_CONN);
  121. #else
  122. UINT8_TO_STREAM (pp, (HCIC_PARAM_SIZE_CREATE_CONN - 1));
  123. #endif
  124. BDADDR_TO_STREAM (pp, dest);
  125. UINT16_TO_STREAM (pp, packet_types);
  126. UINT8_TO_STREAM (pp, page_scan_rep_mode);
  127. UINT8_TO_STREAM (pp, page_scan_mode);
  128. UINT16_TO_STREAM (pp, clock_offset);
  129. #if !defined (BT_10A)
  130. UINT8_TO_STREAM (pp, allow_switch);
  131. #endif
  132. /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */
  133. #if (!defined (LMP_TEST) && !defined(BTISE))
  134. btm_acl_paging (p, dest);
  135. #else
  136. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  137. #endif
  138. return (TRUE);
  139. }
  140. BOOLEAN btsnd_hcic_disconnect (UINT16 handle, UINT8 reason)
  141. {
  142. BT_HDR *p;
  143. UINT8 *pp;
  144. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DISCONNECT)) == NULL)
  145. return (FALSE);
  146. pp = (UINT8 *)(p + 1);
  147. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DISCONNECT;
  148. p->offset = 0;
  149. UINT16_TO_STREAM (pp, HCI_DISCONNECT);
  150. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_DISCONNECT);
  151. UINT16_TO_STREAM (pp, handle);
  152. UINT8_TO_STREAM (pp, reason);
  153. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  154. /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */
  155. #if (!defined (LMP_TEST) && !defined(BTISE))
  156. // btla-specific ++
  157. // btm_acl_set_discing(TRUE);
  158. // btla-specific --
  159. #endif
  160. return (TRUE);
  161. }
  162. #if BTM_SCO_INCLUDED == TRUE
  163. BOOLEAN btsnd_hcic_add_SCO_conn (UINT16 handle, UINT16 packet_types)
  164. {
  165. BT_HDR *p;
  166. UINT8 *pp;
  167. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_SCO_CONN)) == NULL)
  168. return (FALSE);
  169. pp = (UINT8 *)(p + 1);
  170. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_SCO_CONN;
  171. p->offset = 0;
  172. UINT16_TO_STREAM (pp, HCI_ADD_SCO_CONNECTION);
  173. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ADD_SCO_CONN);
  174. UINT16_TO_STREAM (pp, handle);
  175. UINT16_TO_STREAM (pp, packet_types);
  176. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  177. return (TRUE);
  178. }
  179. #endif /* BTM_SCO_INCLUDED */
  180. BOOLEAN btsnd_hcic_create_conn_cancel(BD_ADDR dest)
  181. {
  182. BT_HDR *p;
  183. UINT8 *pp;
  184. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CREATE_CONN_CANCEL)) == NULL)
  185. return (FALSE);
  186. pp = (UINT8 *)(p + 1);
  187. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN_CANCEL;
  188. p->offset = 0;
  189. UINT16_TO_STREAM (pp, HCI_CREATE_CONNECTION_CANCEL);
  190. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CREATE_CONN_CANCEL);
  191. BDADDR_TO_STREAM (pp, dest);
  192. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  193. return (TRUE);
  194. }
  195. BOOLEAN btsnd_hcic_accept_conn (BD_ADDR dest, UINT8 role)
  196. {
  197. BT_HDR *p;
  198. UINT8 *pp;
  199. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_CONN)) == NULL)
  200. return (FALSE);
  201. pp = (UINT8 *)(p + 1);
  202. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_CONN;
  203. p->offset = 0;
  204. UINT16_TO_STREAM (pp, HCI_ACCEPT_CONNECTION_REQUEST);
  205. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ACCEPT_CONN);
  206. BDADDR_TO_STREAM (pp, dest);
  207. UINT8_TO_STREAM (pp, role);
  208. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  209. return (TRUE);
  210. }
  211. BOOLEAN btsnd_hcic_reject_conn (BD_ADDR dest, UINT8 reason)
  212. {
  213. BT_HDR *p;
  214. UINT8 *pp;
  215. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_CONN)) == NULL)
  216. return (FALSE);
  217. pp = (UINT8 *)(p + 1);
  218. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_CONN;
  219. p->offset = 0;
  220. UINT16_TO_STREAM (pp, HCI_REJECT_CONNECTION_REQUEST);
  221. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REJECT_CONN);
  222. BDADDR_TO_STREAM (pp, dest);
  223. UINT8_TO_STREAM (pp, reason);
  224. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  225. return (TRUE);
  226. }
  227. BOOLEAN btsnd_hcic_link_key_req_reply (BD_ADDR bd_addr, LINK_KEY link_key)
  228. {
  229. BT_HDR *p;
  230. UINT8 *pp;
  231. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY)) == NULL)
  232. return (FALSE);
  233. pp = (UINT8 *)(p + 1);
  234. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY;
  235. p->offset = 0;
  236. UINT16_TO_STREAM (pp, HCI_LINK_KEY_REQUEST_REPLY);
  237. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY);
  238. BDADDR_TO_STREAM (pp, bd_addr);
  239. ARRAY16_TO_STREAM (pp, link_key);
  240. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  241. return (TRUE);
  242. }
  243. BOOLEAN btsnd_hcic_link_key_neg_reply (BD_ADDR bd_addr)
  244. {
  245. BT_HDR *p;
  246. UINT8 *pp;
  247. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY)) == NULL)
  248. return (FALSE);
  249. pp = (UINT8 *)(p + 1);
  250. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY;
  251. p->offset = 0;
  252. UINT16_TO_STREAM (pp, HCI_LINK_KEY_REQUEST_NEG_REPLY);
  253. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY);
  254. BDADDR_TO_STREAM (pp, bd_addr);
  255. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  256. return (TRUE);
  257. }
  258. BOOLEAN btsnd_hcic_pin_code_req_reply (BD_ADDR bd_addr, UINT8 pin_code_len,
  259. PIN_CODE pin_code)
  260. {
  261. BT_HDR *p;
  262. UINT8 *pp;
  263. int i;
  264. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY)) == NULL)
  265. return (FALSE);
  266. pp = (UINT8 *)(p + 1);
  267. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY;
  268. p->offset = 0;
  269. UINT16_TO_STREAM (pp, HCI_PIN_CODE_REQUEST_REPLY);
  270. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY);
  271. BDADDR_TO_STREAM (pp, bd_addr);
  272. UINT8_TO_STREAM (pp, pin_code_len);
  273. for (i = 0; i < pin_code_len; i++)
  274. *pp++ = *pin_code++;
  275. for (; i < PIN_CODE_LEN; i++)
  276. *pp++ = 0;
  277. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  278. return (TRUE);
  279. }
  280. BOOLEAN btsnd_hcic_pin_code_neg_reply (BD_ADDR bd_addr)
  281. {
  282. BT_HDR *p;
  283. UINT8 *pp;
  284. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY)) == NULL)
  285. return (FALSE);
  286. pp = (UINT8 *)(p + 1);
  287. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY;
  288. p->offset = 0;
  289. UINT16_TO_STREAM (pp, HCI_PIN_CODE_REQUEST_NEG_REPLY);
  290. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY);
  291. BDADDR_TO_STREAM (pp, bd_addr);
  292. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  293. return (TRUE);
  294. }
  295. BOOLEAN btsnd_hcic_change_conn_type (UINT16 handle, UINT16 packet_types)
  296. {
  297. BT_HDR *p;
  298. UINT8 *pp;
  299. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_CONN_TYPE)) == NULL)
  300. return (FALSE);
  301. pp = (UINT8 *)(p + 1);
  302. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_CONN_TYPE;
  303. p->offset = 0;
  304. UINT16_TO_STREAM (pp, HCI_CHANGE_CONN_PACKET_TYPE);
  305. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CHANGE_CONN_TYPE);
  306. UINT16_TO_STREAM (pp, handle);
  307. UINT16_TO_STREAM (pp, packet_types);
  308. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  309. return (TRUE);
  310. }
  311. BOOLEAN btsnd_hcic_auth_request (UINT16 handle)
  312. {
  313. BT_HDR *p;
  314. UINT8 *pp;
  315. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  316. return (FALSE);
  317. pp = (UINT8 *)(p + 1);
  318. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  319. p->offset = 0;
  320. UINT16_TO_STREAM (pp, HCI_AUTHENTICATION_REQUESTED);
  321. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  322. UINT16_TO_STREAM (pp, handle);
  323. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  324. return (TRUE);
  325. }
  326. BOOLEAN btsnd_hcic_set_conn_encrypt (UINT16 handle, BOOLEAN enable)
  327. {
  328. BT_HDR *p;
  329. UINT8 *pp;
  330. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_CONN_ENCRYPT)) == NULL)
  331. return (FALSE);
  332. pp = (UINT8 *)(p + 1);
  333. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_CONN_ENCRYPT;
  334. p->offset = 0;
  335. UINT16_TO_STREAM (pp, HCI_SET_CONN_ENCRYPTION);
  336. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_CONN_ENCRYPT);
  337. UINT16_TO_STREAM (pp, handle);
  338. UINT8_TO_STREAM (pp, enable);
  339. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  340. return (TRUE);
  341. }
  342. BOOLEAN btsnd_hcic_change_link_key (UINT16 handle)
  343. {
  344. BT_HDR *p;
  345. UINT8 *pp;
  346. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  347. return (FALSE);
  348. pp = (UINT8 *)(p + 1);
  349. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  350. p->offset = 0;
  351. UINT16_TO_STREAM (pp, HCI_CHANGE_CONN_LINK_KEY);
  352. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  353. UINT16_TO_STREAM (pp, handle);
  354. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  355. return (TRUE);
  356. }
  357. BOOLEAN btsnd_hcic_master_link_key (BOOLEAN key_flag)
  358. {
  359. BT_HDR *p;
  360. UINT8 *pp;
  361. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_MASTER_LINK_KEY)) == NULL)
  362. return (FALSE);
  363. pp = (UINT8 *)(p + 1);
  364. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_MASTER_LINK_KEY;
  365. p->offset = 0;
  366. UINT16_TO_STREAM (pp, HCI_MASTER_LINK_KEY);
  367. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_MASTER_LINK_KEY);
  368. UINT8_TO_STREAM (pp, key_flag);
  369. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  370. return (TRUE);
  371. }
  372. BOOLEAN btsnd_hcic_rmt_name_req (BD_ADDR bd_addr, UINT8 page_scan_rep_mode,
  373. UINT8 page_scan_mode, UINT16 clock_offset)
  374. {
  375. BT_HDR *p;
  376. UINT8 *pp;
  377. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ)) == NULL)
  378. return (FALSE);
  379. pp = (UINT8 *)(p + 1);
  380. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ;
  381. p->offset = 0;
  382. UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST);
  383. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ);
  384. BDADDR_TO_STREAM (pp, bd_addr);
  385. UINT8_TO_STREAM (pp, page_scan_rep_mode);
  386. UINT8_TO_STREAM (pp, page_scan_mode);
  387. UINT16_TO_STREAM (pp, clock_offset);
  388. /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */
  389. #if (!defined (LMP_TEST) && !defined(BTISE))
  390. btm_acl_paging (p, bd_addr);
  391. #else
  392. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  393. #endif
  394. return (TRUE);
  395. }
  396. BOOLEAN btsnd_hcic_rmt_name_req_cancel (BD_ADDR bd_addr)
  397. {
  398. BT_HDR *p;
  399. UINT8 *pp;
  400. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL)) == NULL)
  401. return (FALSE);
  402. pp = (UINT8 *)(p + 1);
  403. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL;
  404. p->offset = 0;
  405. UINT16_TO_STREAM (pp, HCI_RMT_NAME_REQUEST_CANCEL);
  406. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL);
  407. BDADDR_TO_STREAM (pp, bd_addr);
  408. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  409. return (TRUE);
  410. }
  411. BOOLEAN btsnd_hcic_rmt_features_req (UINT16 handle)
  412. {
  413. BT_HDR *p;
  414. UINT8 *pp;
  415. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  416. return (FALSE);
  417. pp = (UINT8 *)(p + 1);
  418. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  419. p->offset = 0;
  420. UINT16_TO_STREAM (pp, HCI_READ_RMT_FEATURES);
  421. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  422. UINT16_TO_STREAM (pp, handle);
  423. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  424. return (TRUE);
  425. }
  426. BOOLEAN btsnd_hcic_rmt_ext_features (UINT16 handle, UINT8 page_num)
  427. {
  428. BT_HDR *p;
  429. UINT8 *pp;
  430. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RMT_EXT_FEATURES)) == NULL)
  431. return (FALSE);
  432. pp = (UINT8 *)(p + 1);
  433. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_EXT_FEATURES;
  434. p->offset = 0;
  435. UINT16_TO_STREAM (pp, HCI_READ_RMT_EXT_FEATURES);
  436. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RMT_EXT_FEATURES);
  437. UINT16_TO_STREAM (pp, handle);
  438. UINT8_TO_STREAM (pp, page_num);
  439. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  440. return (TRUE);
  441. }
  442. BOOLEAN btsnd_hcic_rmt_ver_req (UINT16 handle)
  443. {
  444. BT_HDR *p;
  445. UINT8 *pp;
  446. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  447. return (FALSE);
  448. pp = (UINT8 *)(p + 1);
  449. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  450. p->offset = 0;
  451. UINT16_TO_STREAM (pp, HCI_READ_RMT_VERSION_INFO);
  452. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  453. UINT16_TO_STREAM (pp, handle);
  454. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  455. return (TRUE);
  456. }
  457. BOOLEAN btsnd_hcic_read_rmt_clk_offset (UINT16 handle)
  458. {
  459. BT_HDR *p;
  460. UINT8 *pp;
  461. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  462. return (FALSE);
  463. pp = (UINT8 *)(p + 1);
  464. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  465. p->offset = 0;
  466. UINT16_TO_STREAM (pp, HCI_READ_RMT_CLOCK_OFFSET);
  467. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  468. UINT16_TO_STREAM (pp, handle);
  469. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  470. return (TRUE);
  471. }
  472. BOOLEAN btsnd_hcic_read_lmp_handle (UINT16 handle)
  473. {
  474. BT_HDR *p;
  475. UINT8 *pp;
  476. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  477. return (FALSE);
  478. pp = (UINT8 *)(p + 1);
  479. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  480. p->offset = 0;
  481. UINT16_TO_STREAM (pp, HCI_READ_LMP_HANDLE);
  482. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  483. UINT16_TO_STREAM (pp, handle);
  484. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  485. return (TRUE);
  486. }
  487. BOOLEAN btsnd_hcic_setup_esco_conn (UINT16 handle, UINT32 tx_bw,
  488. UINT32 rx_bw, UINT16 max_latency, UINT16 voice,
  489. UINT8 retrans_effort, UINT16 packet_types)
  490. {
  491. BT_HDR *p;
  492. UINT8 *pp;
  493. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SETUP_ESCO)) == NULL)
  494. return (FALSE);
  495. pp = (UINT8 *)(p + 1);
  496. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SETUP_ESCO;
  497. p->offset = 0;
  498. UINT16_TO_STREAM (pp, HCI_SETUP_ESCO_CONNECTION);
  499. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SETUP_ESCO);
  500. UINT16_TO_STREAM (pp, handle);
  501. UINT32_TO_STREAM (pp, tx_bw);
  502. UINT32_TO_STREAM (pp, rx_bw);
  503. UINT16_TO_STREAM (pp, max_latency);
  504. UINT16_TO_STREAM (pp, voice);
  505. UINT8_TO_STREAM (pp, retrans_effort);
  506. UINT16_TO_STREAM (pp, packet_types);
  507. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  508. return (TRUE);
  509. }
  510. BOOLEAN btsnd_hcic_accept_esco_conn (BD_ADDR bd_addr, UINT32 tx_bw,
  511. UINT32 rx_bw, UINT16 max_latency,
  512. UINT16 content_fmt, UINT8 retrans_effort,
  513. UINT16 packet_types)
  514. {
  515. BT_HDR *p;
  516. UINT8 *pp;
  517. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ACCEPT_ESCO)) == NULL)
  518. return (FALSE);
  519. pp = (UINT8 *)(p + 1);
  520. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_ESCO;
  521. p->offset = 0;
  522. UINT16_TO_STREAM (pp, HCI_ACCEPT_ESCO_CONNECTION);
  523. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ACCEPT_ESCO);
  524. BDADDR_TO_STREAM (pp, bd_addr);
  525. UINT32_TO_STREAM (pp, tx_bw);
  526. UINT32_TO_STREAM (pp, rx_bw);
  527. UINT16_TO_STREAM (pp, max_latency);
  528. UINT16_TO_STREAM (pp, content_fmt);
  529. UINT8_TO_STREAM (pp, retrans_effort);
  530. UINT16_TO_STREAM (pp, packet_types);
  531. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  532. return (TRUE);
  533. }
  534. BOOLEAN btsnd_hcic_reject_esco_conn (BD_ADDR bd_addr, UINT8 reason)
  535. {
  536. BT_HDR *p;
  537. UINT8 *pp;
  538. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REJECT_ESCO)) == NULL)
  539. return (FALSE);
  540. pp = (UINT8 *)(p + 1);
  541. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_ESCO;
  542. p->offset = 0;
  543. UINT16_TO_STREAM (pp, HCI_REJECT_ESCO_CONNECTION);
  544. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REJECT_ESCO);
  545. BDADDR_TO_STREAM (pp, bd_addr);
  546. UINT8_TO_STREAM (pp, reason);
  547. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  548. return (TRUE);
  549. }
  550. BOOLEAN btsnd_hcic_hold_mode (UINT16 handle, UINT16 max_hold_period,
  551. UINT16 min_hold_period)
  552. {
  553. BT_HDR *p;
  554. UINT8 *pp;
  555. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_HOLD_MODE)) == NULL)
  556. return (FALSE);
  557. pp = (UINT8 *)(p + 1);
  558. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_HOLD_MODE;
  559. p->offset = 0;
  560. UINT16_TO_STREAM (pp, HCI_HOLD_MODE);
  561. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_HOLD_MODE);
  562. UINT16_TO_STREAM (pp, handle);
  563. UINT16_TO_STREAM (pp, max_hold_period);
  564. UINT16_TO_STREAM (pp, min_hold_period);
  565. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  566. return (TRUE);
  567. }
  568. BOOLEAN btsnd_hcic_sniff_mode (UINT16 handle, UINT16 max_sniff_period,
  569. UINT16 min_sniff_period, UINT16 sniff_attempt,
  570. UINT16 sniff_timeout)
  571. {
  572. BT_HDR *p;
  573. UINT8 *pp;
  574. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SNIFF_MODE)) == NULL)
  575. return (FALSE);
  576. pp = (UINT8 *)(p + 1);
  577. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_MODE;
  578. p->offset = 0;
  579. UINT16_TO_STREAM (pp, HCI_SNIFF_MODE);
  580. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SNIFF_MODE);
  581. UINT16_TO_STREAM (pp, handle);
  582. UINT16_TO_STREAM (pp, max_sniff_period);
  583. UINT16_TO_STREAM (pp, min_sniff_period);
  584. UINT16_TO_STREAM (pp, sniff_attempt);
  585. UINT16_TO_STREAM (pp, sniff_timeout);
  586. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  587. return (TRUE);
  588. }
  589. BOOLEAN btsnd_hcic_exit_sniff_mode (UINT16 handle)
  590. {
  591. BT_HDR *p;
  592. UINT8 *pp;
  593. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  594. return (FALSE);
  595. pp = (UINT8 *)(p + 1);
  596. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  597. p->offset = 0;
  598. UINT16_TO_STREAM (pp, HCI_EXIT_SNIFF_MODE);
  599. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  600. UINT16_TO_STREAM (pp, handle);
  601. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  602. return TRUE;
  603. }
  604. BOOLEAN btsnd_hcic_park_mode (UINT16 handle, UINT16 beacon_max_interval,
  605. UINT16 beacon_min_interval)
  606. {
  607. BT_HDR *p;
  608. UINT8 *pp;
  609. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_PARK_MODE)) == NULL)
  610. return (FALSE);
  611. pp = (UINT8 *)(p + 1);
  612. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PARK_MODE;
  613. p->offset = 0;
  614. UINT16_TO_STREAM (pp, HCI_PARK_MODE);
  615. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_PARK_MODE);
  616. UINT16_TO_STREAM (pp, handle);
  617. UINT16_TO_STREAM (pp, beacon_max_interval);
  618. UINT16_TO_STREAM (pp, beacon_min_interval);
  619. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  620. return (TRUE);
  621. }
  622. BOOLEAN btsnd_hcic_exit_park_mode (UINT16 handle)
  623. {
  624. BT_HDR *p;
  625. UINT8 *pp;
  626. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  627. return (FALSE);
  628. pp = (UINT8 *)(p + 1);
  629. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  630. p->offset = 0;
  631. UINT16_TO_STREAM (pp, HCI_EXIT_PARK_MODE);
  632. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  633. UINT16_TO_STREAM (pp, handle);
  634. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  635. return TRUE;
  636. }
  637. BOOLEAN btsnd_hcic_qos_setup (UINT16 handle, UINT8 flags, UINT8 service_type,
  638. UINT32 token_rate, UINT32 peak, UINT32 latency,
  639. UINT32 delay_var)
  640. {
  641. BT_HDR *p;
  642. UINT8 *pp;
  643. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_QOS_SETUP)) == NULL)
  644. return (FALSE);
  645. pp = (UINT8 *)(p + 1);
  646. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_QOS_SETUP;
  647. p->offset = 0;
  648. UINT16_TO_STREAM (pp, HCI_QOS_SETUP);
  649. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_QOS_SETUP);
  650. UINT16_TO_STREAM (pp, handle);
  651. UINT8_TO_STREAM (pp, flags);
  652. UINT8_TO_STREAM (pp, service_type);
  653. UINT32_TO_STREAM (pp, token_rate);
  654. UINT32_TO_STREAM (pp, peak);
  655. UINT32_TO_STREAM (pp, latency);
  656. UINT32_TO_STREAM (pp, delay_var);
  657. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  658. return (TRUE);
  659. }
  660. BOOLEAN btsnd_hcic_role_discovery (UINT16 handle)
  661. {
  662. BT_HDR *p;
  663. UINT8 *pp;
  664. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  665. return (FALSE);
  666. pp = (UINT8 *)(p + 1);
  667. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  668. p->offset = 0;
  669. UINT16_TO_STREAM (pp, HCI_ROLE_DISCOVERY);
  670. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  671. UINT16_TO_STREAM (pp, handle);
  672. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  673. return (TRUE);
  674. }
  675. BOOLEAN btsnd_hcic_switch_role (BD_ADDR bd_addr, UINT8 role)
  676. {
  677. BT_HDR *p;
  678. UINT8 *pp;
  679. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SWITCH_ROLE)) == NULL)
  680. return (FALSE);
  681. pp = (UINT8 *)(p + 1);
  682. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SWITCH_ROLE;
  683. p->offset = 0;
  684. UINT16_TO_STREAM (pp, HCI_SWITCH_ROLE);
  685. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SWITCH_ROLE);
  686. BDADDR_TO_STREAM (pp, bd_addr);
  687. UINT8_TO_STREAM (pp, role);
  688. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  689. return (TRUE);
  690. }
  691. BOOLEAN btsnd_hcic_read_policy_set (UINT16 handle)
  692. {
  693. BT_HDR *p;
  694. UINT8 *pp;
  695. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  696. return (FALSE);
  697. pp = (UINT8 *)(p + 1);
  698. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  699. p->offset = 0;
  700. UINT16_TO_STREAM (pp, HCI_READ_POLICY_SETTINGS);
  701. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  702. UINT16_TO_STREAM (pp, handle);
  703. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  704. return (TRUE);
  705. }
  706. BOOLEAN btsnd_hcic_write_policy_set (UINT16 handle, UINT16 settings)
  707. {
  708. BT_HDR *p;
  709. UINT8 *pp;
  710. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_POLICY_SET)) == NULL)
  711. return (FALSE);
  712. pp = (UINT8 *)(p + 1);
  713. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_POLICY_SET;
  714. p->offset = 0;
  715. UINT16_TO_STREAM (pp, HCI_WRITE_POLICY_SETTINGS);
  716. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_POLICY_SET);
  717. UINT16_TO_STREAM (pp, handle);
  718. UINT16_TO_STREAM (pp, settings);
  719. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  720. return (TRUE);
  721. }
  722. BOOLEAN btsnd_hcic_read_def_policy_set (void)
  723. {
  724. BT_HDR *p;
  725. UINT8 *pp;
  726. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_DEF_POLICY_SET)) == NULL)
  727. return (FALSE);
  728. pp = (UINT8 *)(p + 1);
  729. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_DEF_POLICY_SET;
  730. p->offset = 0;
  731. UINT16_TO_STREAM (pp, HCI_READ_DEF_POLICY_SETTINGS);
  732. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_DEF_POLICY_SET);
  733. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  734. return (TRUE);
  735. }
  736. BOOLEAN btsnd_hcic_write_def_policy_set (UINT16 settings)
  737. {
  738. BT_HDR *p;
  739. UINT8 *pp;
  740. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET)) == NULL)
  741. return (FALSE);
  742. pp = (UINT8 *)(p + 1);
  743. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET;
  744. p->offset = 0;
  745. UINT16_TO_STREAM (pp, HCI_WRITE_DEF_POLICY_SETTINGS);
  746. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET);
  747. UINT16_TO_STREAM (pp, settings);
  748. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  749. return (TRUE);
  750. }
  751. BOOLEAN btsnd_hcic_flow_specification(UINT16 handle, UINT8 flags, UINT8 flow_direct,
  752. UINT8 service_type, UINT32 token_rate,
  753. UINT32 token_bucket_size, UINT32 peak,
  754. UINT32 latency)
  755. {
  756. BT_HDR *p;
  757. UINT8 *pp;
  758. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_FLOW_SPEC)) == NULL)
  759. return (FALSE);
  760. pp = (UINT8 *)(p + 1);
  761. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_FLOW_SPEC;
  762. p->offset = 0;
  763. UINT16_TO_STREAM (pp, HCI_FLOW_SPECIFICATION);
  764. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_FLOW_SPEC);
  765. UINT16_TO_STREAM (pp, handle);
  766. UINT8_TO_STREAM (pp, flags);
  767. UINT8_TO_STREAM (pp, flow_direct);
  768. UINT8_TO_STREAM (pp, service_type);
  769. UINT32_TO_STREAM (pp, token_rate);
  770. UINT32_TO_STREAM (pp, token_bucket_size);
  771. UINT32_TO_STREAM (pp, peak);
  772. UINT32_TO_STREAM (pp, latency);
  773. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  774. return (TRUE);
  775. }
  776. BOOLEAN btsnd_hcic_set_event_mask(UINT8 local_controller_id, BT_EVENT_MASK event_mask)
  777. {
  778. BT_HDR *p;
  779. UINT8 *pp;
  780. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_EVENT_MASK)) == NULL)
  781. return (FALSE);
  782. pp = (UINT8 *)(p + 1);
  783. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_EVENT_MASK;
  784. p->offset = 0;
  785. UINT16_TO_STREAM (pp, HCI_SET_EVENT_MASK);
  786. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_EVENT_MASK);
  787. ARRAY8_TO_STREAM (pp, event_mask);
  788. btu_hcif_send_cmd (local_controller_id, p);
  789. return (TRUE);
  790. }
  791. BOOLEAN btsnd_hcic_set_event_mask_page_2 (UINT8 local_controller_id, BT_EVENT_MASK event_mask)
  792. {
  793. BT_HDR *p;
  794. UINT8 *pp;
  795. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_EVENT_MASK_PAGE_2)) == NULL)
  796. return (FALSE);
  797. pp = (UINT8 *)(p + 1);
  798. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_EVENT_MASK_PAGE_2;
  799. p->offset = 0;
  800. UINT16_TO_STREAM (pp, HCI_SET_EVENT_MASK_PAGE_2);
  801. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_EVENT_MASK_PAGE_2);
  802. ARRAY8_TO_STREAM (pp, event_mask);
  803. btu_hcif_send_cmd (local_controller_id, p);
  804. return (TRUE);
  805. }
  806. BOOLEAN btsnd_hcic_reset (UINT8 local_controller_id)
  807. {
  808. BT_HDR *p;
  809. UINT8 *pp;
  810. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_RESET)) == NULL)
  811. return (FALSE);
  812. pp = (UINT8 *)(p + 1);
  813. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RESET;
  814. p->offset = 0;
  815. UINT16_TO_STREAM (pp, HCI_RESET);
  816. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_RESET);
  817. btu_hcif_send_cmd (local_controller_id, p);
  818. /* If calling from LMP_TEST or ScriptEngine, then send HCI command immediately */
  819. #if (!defined (LMP_TEST) && !defined(BTISE))
  820. if (local_controller_id == LOCAL_BR_EDR_CONTROLLER_ID)
  821. {
  822. btm_acl_reset_paging ();
  823. btm_acl_set_discing (FALSE);
  824. }
  825. #endif
  826. return (TRUE);
  827. }
  828. BOOLEAN btsnd_hcic_set_event_filter (UINT8 filt_type, UINT8 filt_cond_type,
  829. UINT8 *filt_cond, UINT8 filt_cond_len)
  830. {
  831. BT_HDR *p;
  832. UINT8 *pp;
  833. /* Use buffer large enough to hold all sizes in this command */
  834. if ((p = HCI_GET_CMD_BUF(2 + filt_cond_len)) == NULL)
  835. return (FALSE);
  836. pp = (UINT8 *)(p + 1);
  837. p->offset = 0;
  838. UINT16_TO_STREAM (pp, HCI_SET_EVENT_FILTER);
  839. if (filt_type)
  840. {
  841. p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len);
  842. UINT8_TO_STREAM (pp, (UINT8)(2 + filt_cond_len));
  843. UINT8_TO_STREAM (pp, filt_type);
  844. UINT8_TO_STREAM (pp, filt_cond_type);
  845. if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS)
  846. {
  847. DEVCLASS_TO_STREAM (pp, filt_cond);
  848. filt_cond += DEV_CLASS_LEN;
  849. DEVCLASS_TO_STREAM (pp, filt_cond);
  850. filt_cond += DEV_CLASS_LEN;
  851. filt_cond_len -= (2 * DEV_CLASS_LEN);
  852. }
  853. else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR)
  854. {
  855. BDADDR_TO_STREAM (pp, filt_cond);
  856. filt_cond += BD_ADDR_LEN;
  857. filt_cond_len -= BD_ADDR_LEN;
  858. }
  859. if (filt_cond_len)
  860. ARRAY_TO_STREAM (pp, filt_cond, filt_cond_len);
  861. }
  862. else
  863. {
  864. p->len = (UINT16)(HCIC_PREAMBLE_SIZE + 1);
  865. UINT8_TO_STREAM (pp, 1);
  866. UINT8_TO_STREAM (pp, filt_type);
  867. }
  868. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  869. return (TRUE);
  870. }
  871. BOOLEAN btsnd_hcic_flush (UINT8 local_controller_id, UINT16 handle)
  872. {
  873. BT_HDR *p;
  874. UINT8 *pp;
  875. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  876. return (FALSE);
  877. pp = (UINT8 *)(p + 1);
  878. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  879. p->offset = 0;
  880. UINT16_TO_STREAM (pp, HCI_FLUSH);
  881. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  882. UINT16_TO_STREAM (pp, handle);
  883. btu_hcif_send_cmd (local_controller_id, p);
  884. return (TRUE);
  885. }
  886. BOOLEAN btsnd_hcic_read_pin_type (void)
  887. {
  888. BT_HDR *p;
  889. UINT8 *pp;
  890. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  891. return (FALSE);
  892. pp = (UINT8 *)(p + 1);
  893. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  894. p->offset = 0;
  895. UINT16_TO_STREAM (pp, HCI_READ_PIN_TYPE);
  896. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  897. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  898. return (TRUE);
  899. }
  900. BOOLEAN btsnd_hcic_write_pin_type (UINT8 type)
  901. {
  902. BT_HDR *p;
  903. UINT8 *pp;
  904. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  905. return (FALSE);
  906. pp = (UINT8 *)(p + 1);
  907. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  908. p->offset = 0;
  909. UINT16_TO_STREAM (pp, HCI_WRITE_PIN_TYPE);
  910. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  911. UINT8_TO_STREAM (pp, type);
  912. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  913. return (TRUE);
  914. }
  915. BOOLEAN btsnd_hcic_new_unit_key (void)
  916. {
  917. BT_HDR *p;
  918. UINT8 *pp;
  919. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_NEW_UNIT_KEY)) == NULL)
  920. return (FALSE);
  921. pp = (UINT8 *)(p + 1);
  922. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_NEW_UNIT_KEY;
  923. p->offset = 0;
  924. UINT16_TO_STREAM (pp, HCI_CREATE_NEW_UNIT_KEY);
  925. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_NEW_UNIT_KEY);
  926. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  927. return (TRUE);
  928. }
  929. BOOLEAN btsnd_hcic_read_stored_key (BD_ADDR bd_addr, BOOLEAN read_all_flag)
  930. {
  931. BT_HDR *p;
  932. UINT8 *pp;
  933. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_STORED_KEY)) == NULL)
  934. return (FALSE);
  935. pp = (UINT8 *)(p + 1);
  936. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_STORED_KEY;
  937. p->offset = 0;
  938. UINT16_TO_STREAM (pp, HCI_READ_STORED_LINK_KEY);
  939. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_STORED_KEY);
  940. BDADDR_TO_STREAM (pp, bd_addr);
  941. UINT8_TO_STREAM (pp, read_all_flag);
  942. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  943. return (TRUE);
  944. }
  945. BOOLEAN btsnd_hcic_write_stored_key (UINT8 num_keys, BD_ADDR *bd_addr,
  946. LINK_KEY *link_key)
  947. {
  948. BT_HDR *p;
  949. UINT8 *pp;
  950. int j;
  951. if ((p = HCI_GET_CMD_BUF(1 + (num_keys * (BD_ADDR_LEN + LINK_KEY_LEN)))) == NULL)
  952. return (FALSE);
  953. pp = (UINT8 *)(p + 1);
  954. p->len = HCIC_PREAMBLE_SIZE + 1 + (num_keys * (BD_ADDR_LEN + LINK_KEY_LEN));
  955. p->offset = 0;
  956. UINT16_TO_STREAM (pp, HCI_WRITE_STORED_LINK_KEY);
  957. UINT8_TO_STREAM (pp, p->len - HCIC_PREAMBLE_SIZE);
  958. if(num_keys > HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD)
  959. num_keys = HCI_MAX_NUM_OF_LINK_KEYS_PER_CMMD;
  960. UINT8_TO_STREAM (pp, num_keys);
  961. for (j = 0; j < num_keys; j++)
  962. {
  963. BDADDR_TO_STREAM (pp, bd_addr[j]);
  964. ARRAY16_TO_STREAM (pp, link_key[j]);
  965. }
  966. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  967. return (TRUE);
  968. }
  969. BOOLEAN btsnd_hcic_delete_stored_key (BD_ADDR bd_addr, BOOLEAN delete_all_flag)
  970. {
  971. BT_HDR *p;
  972. UINT8 *pp;
  973. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_DELETE_STORED_KEY)) == NULL)
  974. return (FALSE);
  975. pp = (UINT8 *)(p + 1);
  976. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DELETE_STORED_KEY;
  977. p->offset = 0;
  978. UINT16_TO_STREAM (pp, HCI_DELETE_STORED_LINK_KEY);
  979. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_DELETE_STORED_KEY);
  980. BDADDR_TO_STREAM (pp, bd_addr);
  981. UINT8_TO_STREAM (pp, delete_all_flag);
  982. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  983. return (TRUE);
  984. }
  985. BOOLEAN btsnd_hcic_change_name (BD_NAME name)
  986. {
  987. BT_HDR *p;
  988. UINT8 *pp;
  989. UINT16 len = strlen ((char *)name) + 1;
  990. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CHANGE_NAME)) == NULL)
  991. return (FALSE);
  992. pp = (UINT8 *)(p + 1);
  993. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
  994. p->offset = 0;
  995. UINT16_TO_STREAM (pp, HCI_CHANGE_LOCAL_NAME);
  996. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CHANGE_NAME);
  997. ARRAY_TO_STREAM (pp, name, len);
  998. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  999. return (TRUE);
  1000. }
  1001. BOOLEAN btsnd_hcic_read_name (void)
  1002. {
  1003. BT_HDR *p;
  1004. UINT8 *pp;
  1005. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1006. return (FALSE);
  1007. pp = (UINT8 *)(p + 1);
  1008. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1009. p->offset = 0;
  1010. UINT16_TO_STREAM (pp, HCI_READ_LOCAL_NAME);
  1011. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1012. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1013. return (TRUE);
  1014. }
  1015. BOOLEAN btsnd_hcic_read_conn_acc_tout (UINT8 local_controller_id)
  1016. {
  1017. BT_HDR *p;
  1018. UINT8 *pp;
  1019. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1020. return (FALSE);
  1021. pp = (UINT8 *)(p + 1);
  1022. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1023. p->offset = 0;
  1024. UINT16_TO_STREAM (pp, HCI_READ_CONN_ACCEPT_TOUT);
  1025. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1026. btu_hcif_send_cmd (local_controller_id, p);
  1027. return (TRUE);
  1028. }
  1029. BOOLEAN btsnd_hcic_write_conn_acc_tout (UINT8 local_controller_id, UINT16 timeout)
  1030. {
  1031. BT_HDR *p;
  1032. UINT8 *pp;
  1033. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
  1034. return (FALSE);
  1035. pp = (UINT8 *)(p + 1);
  1036. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
  1037. p->offset = 0;
  1038. UINT16_TO_STREAM (pp, HCI_WRITE_CONN_ACCEPT_TOUT);
  1039. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
  1040. UINT16_TO_STREAM (pp, timeout);
  1041. btu_hcif_send_cmd (local_controller_id, p);
  1042. return (TRUE);
  1043. }
  1044. BOOLEAN btsnd_hcic_read_page_tout (void)
  1045. {
  1046. BT_HDR *p;
  1047. UINT8 *pp;
  1048. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1049. return (FALSE);
  1050. pp = (UINT8 *)(p + 1);
  1051. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1052. p->offset = 0;
  1053. UINT16_TO_STREAM (pp, HCI_READ_PAGE_TOUT);
  1054. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1055. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1056. return (TRUE);
  1057. }
  1058. BOOLEAN btsnd_hcic_write_page_tout (UINT16 timeout)
  1059. {
  1060. BT_HDR *p;
  1061. UINT8 *pp;
  1062. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
  1063. return (FALSE);
  1064. pp = (UINT8 *)(p + 1);
  1065. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
  1066. p->offset = 0;
  1067. UINT16_TO_STREAM (pp, HCI_WRITE_PAGE_TOUT);
  1068. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
  1069. UINT16_TO_STREAM (pp, timeout);
  1070. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1071. return (TRUE);
  1072. }
  1073. BOOLEAN btsnd_hcic_read_scan_enable (void)
  1074. {
  1075. BT_HDR *p;
  1076. UINT8 *pp;
  1077. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1078. return (FALSE);
  1079. pp = (UINT8 *)(p + 1);
  1080. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1081. p->offset = 0;
  1082. UINT16_TO_STREAM (pp, HCI_READ_SCAN_ENABLE);
  1083. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1084. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1085. return (TRUE);
  1086. }
  1087. BOOLEAN btsnd_hcic_write_scan_enable (UINT8 flag)
  1088. {
  1089. BT_HDR *p;
  1090. UINT8 *pp;
  1091. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  1092. return (FALSE);
  1093. pp = (UINT8 *)(p + 1);
  1094. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  1095. p->offset = 0;
  1096. UINT16_TO_STREAM (pp, HCI_WRITE_SCAN_ENABLE);
  1097. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  1098. UINT8_TO_STREAM (pp, flag);
  1099. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1100. return (TRUE);
  1101. }
  1102. BOOLEAN btsnd_hcic_read_pagescan_cfg(void)
  1103. {
  1104. BT_HDR *p;
  1105. UINT8 *pp;
  1106. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1107. return (FALSE);
  1108. pp = (UINT8 *)(p + 1);
  1109. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1110. p->offset = 0;
  1111. UINT16_TO_STREAM (pp, HCI_READ_PAGESCAN_CFG);
  1112. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1113. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1114. return (TRUE);
  1115. }
  1116. BOOLEAN btsnd_hcic_write_pagescan_cfg(UINT16 interval, UINT16 window)
  1117. {
  1118. BT_HDR *p;
  1119. UINT8 *pp;
  1120. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG)) == NULL)
  1121. return (FALSE);
  1122. pp = (UINT8 *)(p + 1);
  1123. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG;
  1124. p->offset = 0;
  1125. UINT16_TO_STREAM (pp, HCI_WRITE_PAGESCAN_CFG);
  1126. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG);
  1127. UINT16_TO_STREAM (pp, interval);
  1128. UINT16_TO_STREAM (pp, window);
  1129. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1130. return (TRUE);
  1131. }
  1132. BOOLEAN btsnd_hcic_read_inqscan_cfg(void)
  1133. {
  1134. BT_HDR *p;
  1135. UINT8 *pp;
  1136. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1137. return (FALSE);
  1138. pp = (UINT8 *)(p + 1);
  1139. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1140. p->offset = 0;
  1141. UINT16_TO_STREAM (pp, HCI_READ_INQUIRYSCAN_CFG);
  1142. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1143. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1144. return (TRUE);
  1145. }
  1146. BOOLEAN btsnd_hcic_write_inqscan_cfg(UINT16 interval, UINT16 window)
  1147. {
  1148. BT_HDR *p;
  1149. UINT8 *pp;
  1150. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG)) == NULL)
  1151. return (FALSE);
  1152. pp = (UINT8 *)(p + 1);
  1153. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG;
  1154. p->offset = 0;
  1155. UINT16_TO_STREAM (pp, HCI_WRITE_INQUIRYSCAN_CFG);
  1156. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG);
  1157. UINT16_TO_STREAM (pp, interval);
  1158. UINT16_TO_STREAM (pp, window);
  1159. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1160. return (TRUE);
  1161. }
  1162. BOOLEAN btsnd_hcic_read_auth_enable (void)
  1163. {
  1164. BT_HDR *p;
  1165. UINT8 *pp;
  1166. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1167. return (FALSE);
  1168. pp = (UINT8 *)(p + 1);
  1169. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1170. p->offset = 0;
  1171. UINT16_TO_STREAM (pp, HCI_READ_AUTHENTICATION_ENABLE);
  1172. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1173. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1174. return (TRUE);
  1175. }
  1176. BOOLEAN btsnd_hcic_write_auth_enable (UINT8 flag)
  1177. {
  1178. BT_HDR *p;
  1179. UINT8 *pp;
  1180. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  1181. return (FALSE);
  1182. pp = (UINT8 *)(p + 1);
  1183. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  1184. p->offset = 0;
  1185. UINT16_TO_STREAM (pp, HCI_WRITE_AUTHENTICATION_ENABLE);
  1186. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  1187. UINT8_TO_STREAM (pp, flag);
  1188. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1189. return (TRUE);
  1190. }
  1191. BOOLEAN btsnd_hcic_read_encr_mode (void)
  1192. {
  1193. BT_HDR *p;
  1194. UINT8 *pp;
  1195. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1196. return (FALSE);
  1197. pp = (UINT8 *)(p + 1);
  1198. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1199. p->offset = 0;
  1200. UINT16_TO_STREAM (pp, HCI_READ_ENCRYPTION_MODE);
  1201. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1202. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1203. return (TRUE);
  1204. }
  1205. BOOLEAN btsnd_hcic_write_encr_mode (UINT8 mode)
  1206. {
  1207. BT_HDR *p;
  1208. UINT8 *pp;
  1209. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  1210. return (FALSE);
  1211. pp = (UINT8 *)(p + 1);
  1212. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  1213. p->offset = 0;
  1214. UINT16_TO_STREAM (pp, HCI_WRITE_ENCRYPTION_MODE);
  1215. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  1216. UINT8_TO_STREAM (pp, mode);
  1217. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1218. return (TRUE);
  1219. }
  1220. BOOLEAN btsnd_hcic_read_dev_class(void)
  1221. {
  1222. BT_HDR *p;
  1223. UINT8 *pp;
  1224. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1225. return (FALSE);
  1226. pp = (UINT8 *)(p + 1);
  1227. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1228. p->offset = 0;
  1229. UINT16_TO_STREAM (pp, HCI_READ_CLASS_OF_DEVICE);
  1230. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1231. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1232. return (TRUE);
  1233. }
  1234. BOOLEAN btsnd_hcic_write_dev_class(DEV_CLASS dev_class)
  1235. {
  1236. BT_HDR *p;
  1237. UINT8 *pp;
  1238. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL)
  1239. return (FALSE);
  1240. pp = (UINT8 *)(p + 1);
  1241. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
  1242. p->offset = 0;
  1243. UINT16_TO_STREAM (pp, HCI_WRITE_CLASS_OF_DEVICE);
  1244. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
  1245. DEVCLASS_TO_STREAM (pp, dev_class);
  1246. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1247. return (TRUE);
  1248. }
  1249. BOOLEAN btsnd_hcic_read_voice_settings(void)
  1250. {
  1251. BT_HDR *p;
  1252. UINT8 *pp;
  1253. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1254. return (FALSE);
  1255. pp = (UINT8 *)(p + 1);
  1256. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1257. p->offset = 0;
  1258. UINT16_TO_STREAM (pp, HCI_READ_VOICE_SETTINGS);
  1259. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1260. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1261. return (TRUE);
  1262. }
  1263. BOOLEAN btsnd_hcic_write_voice_settings(UINT16 flags)
  1264. {
  1265. BT_HDR *p;
  1266. UINT8 *pp;
  1267. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM2)) == NULL)
  1268. return (FALSE);
  1269. pp = (UINT8 *)(p + 1);
  1270. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
  1271. p->offset = 0;
  1272. UINT16_TO_STREAM (pp, HCI_WRITE_VOICE_SETTINGS);
  1273. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
  1274. UINT16_TO_STREAM (pp, flags);
  1275. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1276. return (TRUE);
  1277. }
  1278. BOOLEAN btsnd_hcic_read_auto_flush_tout (UINT16 handle)
  1279. {
  1280. BT_HDR *p;
  1281. UINT8 *pp;
  1282. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CMD_HANDLE)) == NULL)
  1283. return (FALSE);
  1284. pp = (UINT8 *)(p + 1);
  1285. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
  1286. p->offset = 0;
  1287. UINT16_TO_STREAM (pp, HCI_READ_AUTO_FLUSH_TOUT);
  1288. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CMD_HANDLE);
  1289. UINT16_TO_STREAM (pp, handle);
  1290. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1291. return (TRUE);
  1292. }
  1293. BOOLEAN btsnd_hcic_write_auto_flush_tout (UINT16 handle, UINT16 tout)
  1294. {
  1295. BT_HDR *p;
  1296. UINT8 *pp;
  1297. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT)) == NULL)
  1298. return (FALSE);
  1299. pp = (UINT8 *)(p + 1);
  1300. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT;
  1301. p->offset = 0;
  1302. UINT16_TO_STREAM (pp, HCI_WRITE_AUTO_FLUSH_TOUT);
  1303. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_AUTO_FLUSH_TOUT);
  1304. UINT16_TO_STREAM (pp, handle);
  1305. UINT16_TO_STREAM (pp, tout);
  1306. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1307. return (TRUE);
  1308. }
  1309. BOOLEAN btsnd_hcic_read_num_bcast_xmit (void)
  1310. {
  1311. BT_HDR *p;
  1312. UINT8 *pp;
  1313. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1314. return (FALSE);
  1315. pp = (UINT8 *)(p + 1);
  1316. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1317. p->offset = 0;
  1318. UINT16_TO_STREAM (pp, HCI_READ_NUM_BCAST_REXMITS);
  1319. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1320. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1321. return (TRUE);
  1322. }
  1323. BOOLEAN btsnd_hcic_write_num_bcast_xmit (UINT8 num)
  1324. {
  1325. BT_HDR *p;
  1326. UINT8 *pp;
  1327. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  1328. return (FALSE);
  1329. pp = (UINT8 *)(p + 1);
  1330. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  1331. p->offset = 0;
  1332. UINT16_TO_STREAM (pp, HCI_WRITE_NUM_BCAST_REXMITS);
  1333. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  1334. UINT8_TO_STREAM (pp, num);
  1335. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1336. return (TRUE);
  1337. }
  1338. BOOLEAN btsnd_hcic_read_hold_mode_act (void)
  1339. {
  1340. BT_HDR *p;
  1341. UINT8 *pp;
  1342. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1343. return (FALSE);
  1344. pp = (UINT8 *)(p + 1);
  1345. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1346. p->offset = 0;
  1347. UINT16_TO_STREAM (pp, HCI_READ_HOLD_MODE_ACTIVITY);
  1348. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1349. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1350. return (TRUE);
  1351. }
  1352. BOOLEAN btsnd_hcic_write_hold_mode_act (UINT8 flags)
  1353. {
  1354. BT_HDR *p;
  1355. UINT8 *pp;
  1356. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  1357. return (FALSE);
  1358. pp = (UINT8 *)(p + 1);
  1359. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  1360. p->offset = 0;
  1361. UINT16_TO_STREAM (pp, HCI_WRITE_HOLD_MODE_ACTIVITY);
  1362. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  1363. UINT8_TO_STREAM (pp, flags);
  1364. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1365. return (TRUE);
  1366. }
  1367. BOOLEAN btsnd_hcic_read_tx_power (UINT16 handle, UINT8 type)
  1368. {
  1369. BT_HDR *p;
  1370. UINT8 *pp;
  1371. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_TX_POWER)) == NULL)
  1372. return (FALSE);
  1373. pp = (UINT8 *)(p + 1);
  1374. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_TX_POWER;
  1375. p->offset = 0;
  1376. UINT16_TO_STREAM (pp, HCI_READ_TRANSMIT_POWER_LEVEL);
  1377. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_TX_POWER);
  1378. UINT16_TO_STREAM (pp, handle);
  1379. UINT8_TO_STREAM (pp, type);
  1380. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1381. return (TRUE);
  1382. }
  1383. BOOLEAN btsnd_hcic_read_sco_flow_enable (void)
  1384. {
  1385. BT_HDR *p;
  1386. UINT8 *pp;
  1387. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL)
  1388. return (FALSE);
  1389. pp = (UINT8 *)(p + 1);
  1390. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  1391. p->offset = 0;
  1392. UINT16_TO_STREAM (pp, HCI_READ_SCO_FLOW_CTRL_ENABLE);
  1393. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  1394. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1395. return (TRUE);
  1396. }
  1397. BOOLEAN btsnd_hcic_write_sco_flow_enable (UINT8 flag)
  1398. {
  1399. BT_HDR *p;
  1400. UINT8 *pp;
  1401. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL)
  1402. return (FALSE);
  1403. pp = (UINT8 *)(p + 1);
  1404. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  1405. p->offset = 0;
  1406. UINT16_TO_STREAM (pp, HCI_WRITE_SCO_FLOW_CTRL_ENABLE);
  1407. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  1408. UINT8_TO_STREAM (pp, flag