hciblecmds.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  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 "common/bt_target.h"
  25. #include "osi/allocator.h"
  26. #include "stack/hcidefs.h"
  27. #include "stack/hcimsgs.h"
  28. #include "stack/hcidefs.h"
  29. #include "stack/btu.h"
  30. #include <stddef.h>
  31. #include <string.h>
  32. #define HCI_GET_CMD_BUF(paramlen) ((BT_HDR *)osi_malloc(HCIC_PREAMBLE_SIZE + sizeof(BT_HDR) + paramlen))
  33. #if (defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
  34. BOOLEAN btsnd_hcic_ble_set_local_used_feat (UINT8 feat_set[8])
  35. {
  36. BT_HDR *p;
  37. UINT8 *pp;
  38. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_USED_FEAT_CMD)) == NULL) {
  39. return (FALSE);
  40. }
  41. pp = (UINT8 *)(p + 1);
  42. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_USED_FEAT_CMD;
  43. p->offset = 0;
  44. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_LOCAL_SPT_FEAT);
  45. ARRAY_TO_STREAM (pp, feat_set, HCIC_PARAM_SIZE_SET_USED_FEAT_CMD);
  46. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  47. return (TRUE);
  48. }
  49. BOOLEAN btsnd_hcic_ble_set_random_addr (BD_ADDR random_bda)
  50. {
  51. BT_HDR *p;
  52. UINT8 *pp;
  53. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD)) == NULL) {
  54. return (FALSE);
  55. }
  56. pp = (UINT8 *)(p + 1);
  57. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD;
  58. p->offset = 0;
  59. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_RANDOM_ADDR);
  60. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD);
  61. BDADDR_TO_STREAM (pp, random_bda);
  62. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  63. return (TRUE);
  64. }
  65. BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
  66. UINT8 adv_type, UINT8 addr_type_own,
  67. UINT8 addr_type_dir, BD_ADDR direct_bda,
  68. UINT8 channel_map, UINT8 adv_filter_policy)
  69. {
  70. BT_HDR *p;
  71. UINT8 *pp;
  72. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS)) == NULL) {
  73. return (FALSE);
  74. }
  75. pp = (UINT8 *)(p + 1);
  76. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS ;
  77. p->offset = 0;
  78. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_PARAMS);
  79. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS );
  80. UINT16_TO_STREAM (pp, adv_int_min);
  81. UINT16_TO_STREAM (pp, adv_int_max);
  82. UINT8_TO_STREAM (pp, adv_type);
  83. UINT8_TO_STREAM (pp, addr_type_own);
  84. UINT8_TO_STREAM (pp, addr_type_dir);
  85. BDADDR_TO_STREAM (pp, direct_bda);
  86. UINT8_TO_STREAM (pp, channel_map);
  87. UINT8_TO_STREAM (pp, adv_filter_policy);
  88. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  89. return (TRUE);
  90. }
  91. BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void)
  92. {
  93. BT_HDR *p;
  94. UINT8 *pp;
  95. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) {
  96. return (FALSE);
  97. }
  98. pp = (UINT8 *)(p + 1);
  99. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  100. p->offset = 0;
  101. UINT16_TO_STREAM (pp, HCI_BLE_READ_ADV_CHNL_TX_POWER);
  102. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  103. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  104. return (TRUE);
  105. }
  106. BOOLEAN btsnd_hcic_ble_set_adv_data (UINT8 data_len, UINT8 *p_data)
  107. {
  108. BT_HDR *p;
  109. UINT8 *pp;
  110. for (int i = 0; i < data_len; i++) {
  111. HCI_TRACE_DEBUG("p_data[%d] = %x\n", i, p_data[i]);
  112. }
  113. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1)) == NULL) {
  114. return (FALSE);
  115. }
  116. pp = (UINT8 *)(p + 1);
  117. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1;
  118. p->offset = 0;
  119. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_DATA);
  120. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1);
  121. memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA);
  122. if (p_data != NULL && data_len > 0) {
  123. if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA) {
  124. data_len = HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA;
  125. HCI_TRACE_WARNING("Data length exceeds 31 bytes, only the first 31 bytes are used.\n");
  126. }
  127. UINT8_TO_STREAM (pp, data_len);
  128. ARRAY_TO_STREAM (pp, p_data, data_len);
  129. }
  130. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  131. return (TRUE);
  132. }
  133. BOOLEAN btsnd_hcic_ble_set_scan_rsp_data (UINT8 data_len, UINT8 *p_scan_rsp)
  134. {
  135. BT_HDR *p;
  136. UINT8 *pp;
  137. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1)) == NULL) {
  138. return (FALSE);
  139. }
  140. pp = (UINT8 *)(p + 1);
  141. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1;
  142. p->offset = 0;
  143. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_RSP_DATA);
  144. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1);
  145. memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP);
  146. if (p_scan_rsp != NULL && data_len > 0) {
  147. if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP ) {
  148. data_len = HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP;
  149. HCI_TRACE_WARNING("Data length exceeds 31 bytes, only the first 31 bytes are used.\n");
  150. }
  151. UINT8_TO_STREAM (pp, data_len);
  152. ARRAY_TO_STREAM (pp, p_scan_rsp, data_len);
  153. }
  154. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  155. return (TRUE);
  156. }
  157. BOOLEAN btsnd_hcic_ble_set_adv_enable (UINT8 adv_enable)
  158. {
  159. BT_HDR *p;
  160. UINT8 *pp;
  161. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_ADV_ENABLE)) == NULL) {
  162. return (FALSE);
  163. }
  164. pp = (UINT8 *)(p + 1);
  165. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_ADV_ENABLE;
  166. p->offset = 0;
  167. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_ENABLE);
  168. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_ADV_ENABLE);
  169. UINT8_TO_STREAM (pp, adv_enable);
  170. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  171. return (TRUE);
  172. }
  173. BOOLEAN btsnd_hcic_ble_set_scan_params (UINT8 scan_type,
  174. UINT16 scan_int, UINT16 scan_win,
  175. UINT8 addr_type_own, UINT8 scan_filter_policy)
  176. {
  177. BT_HDR *p;
  178. UINT8 *pp;
  179. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM)) == NULL) {
  180. return (FALSE);
  181. }
  182. pp = (UINT8 *)(p + 1);
  183. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM;
  184. p->offset = 0;
  185. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_PARAMS);
  186. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM);
  187. UINT8_TO_STREAM (pp, scan_type);
  188. UINT16_TO_STREAM (pp, scan_int);
  189. UINT16_TO_STREAM (pp, scan_win);
  190. UINT8_TO_STREAM (pp, addr_type_own);
  191. UINT8_TO_STREAM (pp, scan_filter_policy);
  192. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  193. return (TRUE);
  194. }
  195. BOOLEAN btsnd_hcic_ble_set_scan_enable (UINT8 scan_enable, UINT8 duplicate)
  196. {
  197. BT_HDR *p;
  198. UINT8 *pp;
  199. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE)) == NULL) {
  200. return (FALSE);
  201. }
  202. pp = (UINT8 *)(p + 1);
  203. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE;
  204. p->offset = 0;
  205. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_ENABLE);
  206. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE);
  207. UINT8_TO_STREAM (pp, scan_enable);
  208. UINT8_TO_STREAM (pp, duplicate);
  209. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  210. return (TRUE);
  211. }
  212. /* link layer connection management commands */
  213. BOOLEAN btsnd_hcic_ble_create_ll_conn (UINT16 scan_int, UINT16 scan_win,
  214. UINT8 init_filter_policy,
  215. UINT8 addr_type_peer, BD_ADDR bda_peer,
  216. UINT8 addr_type_own,
  217. UINT16 conn_int_min, UINT16 conn_int_max,
  218. UINT16 conn_latency, UINT16 conn_timeout,
  219. UINT16 min_ce_len, UINT16 max_ce_len)
  220. {
  221. BT_HDR *p;
  222. UINT8 *pp;
  223. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN)) == NULL) {
  224. return (FALSE);
  225. }
  226. pp = (UINT8 *)(p + 1);
  227. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN;
  228. p->offset = 0;
  229. UINT16_TO_STREAM (pp, HCI_BLE_CREATE_LL_CONN);
  230. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN);
  231. UINT16_TO_STREAM (pp, scan_int);
  232. UINT16_TO_STREAM (pp, scan_win);
  233. UINT8_TO_STREAM (pp, init_filter_policy);
  234. UINT8_TO_STREAM (pp, addr_type_peer);
  235. BDADDR_TO_STREAM (pp, bda_peer);
  236. UINT8_TO_STREAM (pp, addr_type_own);
  237. UINT16_TO_STREAM (pp, conn_int_min);
  238. UINT16_TO_STREAM (pp, conn_int_max);
  239. UINT16_TO_STREAM (pp, conn_latency);
  240. UINT16_TO_STREAM (pp, conn_timeout);
  241. UINT16_TO_STREAM (pp, min_ce_len);
  242. UINT16_TO_STREAM (pp, max_ce_len);
  243. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  244. return (TRUE);
  245. }
  246. BOOLEAN btsnd_hcic_ble_create_conn_cancel (void)
  247. {
  248. BT_HDR *p;
  249. UINT8 *pp;
  250. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL)) == NULL) {
  251. return (FALSE);
  252. }
  253. pp = (UINT8 *)(p + 1);
  254. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL;
  255. p->offset = 0;
  256. UINT16_TO_STREAM (pp, HCI_BLE_CREATE_CONN_CANCEL);
  257. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL);
  258. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  259. return (TRUE);
  260. }
  261. BOOLEAN btsnd_hcic_ble_clear_white_list (void)
  262. {
  263. BT_HDR *p;
  264. UINT8 *pp;
  265. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CLEAR_WHITE_LIST)) == NULL) {
  266. return (FALSE);
  267. }
  268. pp = (UINT8 *)(p + 1);
  269. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CLEAR_WHITE_LIST;
  270. p->offset = 0;
  271. UINT16_TO_STREAM (pp, HCI_BLE_CLEAR_WHITE_LIST);
  272. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CLEAR_WHITE_LIST);
  273. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  274. return (TRUE);
  275. }
  276. BOOLEAN btsnd_hcic_ble_add_white_list (UINT8 addr_type, BD_ADDR bda)
  277. {
  278. BT_HDR *p;
  279. UINT8 *pp;
  280. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_WHITE_LIST)) == NULL) {
  281. return (FALSE);
  282. }
  283. pp = (UINT8 *)(p + 1);
  284. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_WHITE_LIST;
  285. p->offset = 0;
  286. UINT16_TO_STREAM (pp, HCI_BLE_ADD_WHITE_LIST);
  287. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ADD_WHITE_LIST);
  288. UINT8_TO_STREAM (pp, addr_type);
  289. BDADDR_TO_STREAM (pp, bda);
  290. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  291. return (TRUE);
  292. }
  293. BOOLEAN btsnd_hcic_ble_remove_from_white_list (UINT8 addr_type, BD_ADDR bda)
  294. {
  295. BT_HDR *p;
  296. UINT8 *pp;
  297. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REMOVE_WHITE_LIST)) == NULL) {
  298. return (FALSE);
  299. }
  300. pp = (UINT8 *)(p + 1);
  301. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REMOVE_WHITE_LIST;
  302. p->offset = 0;
  303. UINT16_TO_STREAM (pp, HCI_BLE_REMOVE_WHITE_LIST);
  304. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REMOVE_WHITE_LIST);
  305. UINT8_TO_STREAM (pp, addr_type);
  306. BDADDR_TO_STREAM (pp, bda);
  307. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  308. return (TRUE);
  309. }
  310. BOOLEAN btsnd_hcic_ble_upd_ll_conn_params (UINT16 handle,
  311. UINT16 conn_int_min, UINT16 conn_int_max,
  312. UINT16 conn_latency, UINT16 conn_timeout,
  313. UINT16 min_ce_len, UINT16 max_ce_len)
  314. {
  315. BT_HDR *p;
  316. UINT8 *pp;
  317. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS)) == NULL) {
  318. return (FALSE);
  319. }
  320. pp = (UINT8 *)(p + 1);
  321. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS;
  322. p->offset = 0;
  323. UINT16_TO_STREAM (pp, HCI_BLE_UPD_LL_CONN_PARAMS);
  324. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS);
  325. UINT16_TO_STREAM (pp, handle);
  326. UINT16_TO_STREAM (pp, conn_int_min);
  327. UINT16_TO_STREAM (pp, conn_int_max);
  328. UINT16_TO_STREAM (pp, conn_latency);
  329. UINT16_TO_STREAM (pp, conn_timeout);
  330. UINT16_TO_STREAM (pp, min_ce_len);
  331. UINT16_TO_STREAM (pp, max_ce_len);
  332. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  333. return (TRUE);
  334. }
  335. BOOLEAN btsnd_hcic_ble_set_host_chnl_class (UINT8 chnl_map[HCIC_BLE_CHNL_MAP_SIZE])
  336. {
  337. BT_HDR *p;
  338. UINT8 *pp;
  339. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS)) == NULL) {
  340. return (FALSE);
  341. }
  342. pp = (UINT8 *)(p + 1);
  343. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS;
  344. p->offset = 0;
  345. UINT16_TO_STREAM (pp, HCI_BLE_SET_HOST_CHNL_CLASS);
  346. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS);
  347. ARRAY_TO_STREAM (pp, chnl_map, HCIC_BLE_CHNL_MAP_SIZE);
  348. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  349. return (TRUE);
  350. }
  351. BOOLEAN btsnd_hcic_ble_read_chnl_map (UINT16 handle)
  352. {
  353. BT_HDR *p;
  354. UINT8 *pp;
  355. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CHNL_MAP)) == NULL) {
  356. return (FALSE);
  357. }
  358. pp = (UINT8 *)(p + 1);
  359. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CHNL_MAP;
  360. p->offset = 0;
  361. UINT16_TO_STREAM (pp, HCI_BLE_READ_CHNL_MAP);
  362. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CHNL_MAP);
  363. UINT16_TO_STREAM (pp, handle);
  364. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  365. return (TRUE);
  366. }
  367. BOOLEAN btsnd_hcic_ble_read_remote_feat (UINT16 handle)
  368. {
  369. BT_HDR *p;
  370. UINT8 *pp;
  371. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT)) == NULL) {
  372. return (FALSE);
  373. }
  374. pp = (UINT8 *)(p + 1);
  375. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT;
  376. p->offset = 0;
  377. UINT16_TO_STREAM (pp, HCI_BLE_READ_REMOTE_FEAT);
  378. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT);
  379. UINT16_TO_STREAM (pp, handle);
  380. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  381. return (TRUE);
  382. }
  383. /* security management commands */
  384. BOOLEAN btsnd_hcic_ble_encrypt (UINT8 *key, UINT8 key_len,
  385. UINT8 *plain_text, UINT8 pt_len,
  386. void *p_cmd_cplt_cback)
  387. {
  388. BT_HDR *p;
  389. UINT8 *pp;
  390. if ((p = HCI_GET_CMD_BUF(sizeof (void *) +
  391. HCIC_PARAM_SIZE_BLE_ENCRYPT)) == NULL) {
  392. return (FALSE);
  393. }
  394. pp = (UINT8 *)(p + 1);
  395. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENCRYPT;
  396. p->offset = sizeof(void *);
  397. *((void **)pp) = p_cmd_cplt_cback; /* Store command complete callback in buffer */
  398. pp += sizeof(void *); /* Skip over callback pointer */
  399. UINT16_TO_STREAM (pp, HCI_BLE_ENCRYPT);
  400. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_ENCRYPT);
  401. memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT);
  402. if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) {
  403. key_len = HCIC_BLE_ENCRYT_KEY_SIZE;
  404. }
  405. if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) {
  406. pt_len = HCIC_BLE_ENCRYT_KEY_SIZE;
  407. }
  408. ARRAY_TO_STREAM (pp, key, key_len);
  409. pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len);
  410. ARRAY_TO_STREAM (pp, plain_text, pt_len);
  411. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  412. return (TRUE);
  413. }
  414. BOOLEAN btsnd_hcic_ble_rand (void *p_cmd_cplt_cback)
  415. {
  416. BT_HDR *p;
  417. UINT8 *pp;
  418. if ((p = HCI_GET_CMD_BUF(sizeof (void *) +
  419. HCIC_PARAM_SIZE_BLE_RAND)) == NULL) {
  420. return (FALSE);
  421. }
  422. pp = (UINT8 *)(p + 1);
  423. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RAND;
  424. p->offset = sizeof(void *);
  425. *((void **)pp) = p_cmd_cplt_cback; /* Store command complete callback in buffer */
  426. pp += sizeof(void *); /* Skip over callback pointer */
  427. UINT16_TO_STREAM (pp, HCI_BLE_RAND);
  428. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RAND);
  429. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  430. return (TRUE);
  431. }
  432. BOOLEAN btsnd_hcic_ble_start_enc (UINT16 handle, UINT8 rand[HCIC_BLE_RAND_DI_SIZE],
  433. UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE])
  434. {
  435. BT_HDR *p;
  436. UINT8 *pp;
  437. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_START_ENC)) == NULL) {
  438. return (FALSE);
  439. }
  440. pp = (UINT8 *)(p + 1);
  441. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_START_ENC;
  442. p->offset = 0;
  443. UINT16_TO_STREAM (pp, HCI_BLE_START_ENC);
  444. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_START_ENC);
  445. UINT16_TO_STREAM (pp, handle);
  446. ARRAY_TO_STREAM (pp, rand, HCIC_BLE_RAND_DI_SIZE);
  447. UINT16_TO_STREAM (pp, ediv);
  448. ARRAY_TO_STREAM (pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
  449. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  450. return (TRUE);
  451. }
  452. BOOLEAN btsnd_hcic_ble_ltk_req_reply (UINT16 handle, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE])
  453. {
  454. BT_HDR *p;
  455. UINT8 *pp;
  456. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_REPLY)) == NULL) {
  457. return (FALSE);
  458. }
  459. pp = (UINT8 *)(p + 1);
  460. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_REPLY;
  461. p->offset = 0;
  462. UINT16_TO_STREAM (pp, HCI_BLE_LTK_REQ_REPLY);
  463. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LTK_REQ_REPLY);
  464. UINT16_TO_STREAM (pp, handle);
  465. ARRAY_TO_STREAM (pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
  466. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  467. return (TRUE);
  468. }
  469. BOOLEAN btsnd_hcic_ble_ltk_req_neg_reply (UINT16 handle)
  470. {
  471. BT_HDR *p;
  472. UINT8 *pp;
  473. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY)) == NULL) {
  474. return (FALSE);
  475. }
  476. pp = (UINT8 *)(p + 1);
  477. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY;
  478. p->offset = 0;
  479. UINT16_TO_STREAM (pp, HCI_BLE_LTK_REQ_NEG_REPLY);
  480. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY);
  481. UINT16_TO_STREAM (pp, handle);
  482. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  483. return (TRUE);
  484. }
  485. BOOLEAN btsnd_hcic_ble_receiver_test(UINT8 rx_freq)
  486. {
  487. BT_HDR *p;
  488. UINT8 *pp;
  489. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) {
  490. return (FALSE);
  491. }
  492. pp = (UINT8 *)(p + 1);
  493. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  494. p->offset = 0;
  495. UINT16_TO_STREAM (pp, HCI_BLE_RECEIVER_TEST);
  496. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  497. UINT8_TO_STREAM (pp, rx_freq);
  498. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  499. return (TRUE);
  500. }
  501. BOOLEAN btsnd_hcic_ble_transmitter_test(UINT8 tx_freq, UINT8 test_data_len, UINT8 payload)
  502. {
  503. BT_HDR *p;
  504. UINT8 *pp;
  505. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) {
  506. return (FALSE);
  507. }
  508. pp = (UINT8 *)(p + 1);
  509. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
  510. p->offset = 0;
  511. UINT16_TO_STREAM (pp, HCI_BLE_TRANSMITTER_TEST);
  512. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
  513. UINT8_TO_STREAM (pp, tx_freq);
  514. UINT8_TO_STREAM (pp, test_data_len);
  515. UINT8_TO_STREAM (pp, payload);
  516. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  517. return (TRUE);
  518. }
  519. BOOLEAN btsnd_hcic_ble_test_end(void)
  520. {
  521. BT_HDR *p;
  522. UINT8 *pp;
  523. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) {
  524. return (FALSE);
  525. }
  526. pp = (UINT8 *)(p + 1);
  527. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  528. p->offset = 0;
  529. UINT16_TO_STREAM (pp, HCI_BLE_TEST_END);
  530. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  531. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  532. return (TRUE);
  533. }
  534. BOOLEAN btsnd_hcic_ble_read_host_supported (void)
  535. {
  536. BT_HDR *p;
  537. UINT8 *pp;
  538. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) {
  539. return (FALSE);
  540. }
  541. pp = (UINT8 *)(p + 1);
  542. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  543. p->offset = 0;
  544. UINT16_TO_STREAM (pp, HCI_READ_LE_HOST_SUPPORT);
  545. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  546. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  547. return (TRUE);
  548. }
  549. #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
  550. BOOLEAN btsnd_hcic_ble_rc_param_req_reply( UINT16 handle,
  551. UINT16 conn_int_min, UINT16 conn_int_max,
  552. UINT16 conn_latency, UINT16 conn_timeout,
  553. UINT16 min_ce_len, UINT16 max_ce_len )
  554. {
  555. BT_HDR *p;
  556. UINT8 *pp;
  557. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL) {
  558. return (FALSE);
  559. }
  560. pp = (UINT8 *)(p + 1);
  561. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
  562. p->offset = 0;
  563. UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_REPLY);
  564. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
  565. UINT16_TO_STREAM (pp, handle);
  566. UINT16_TO_STREAM (pp, conn_int_min);
  567. UINT16_TO_STREAM (pp, conn_int_max);
  568. UINT16_TO_STREAM (pp, conn_latency);
  569. UINT16_TO_STREAM (pp, conn_timeout);
  570. UINT16_TO_STREAM (pp, min_ce_len);
  571. UINT16_TO_STREAM (pp, max_ce_len);
  572. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  573. return (TRUE);
  574. }
  575. BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason)
  576. {
  577. BT_HDR *p;
  578. UINT8 *pp;
  579. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL) {
  580. return (FALSE);
  581. }
  582. pp = (UINT8 *)(p + 1);
  583. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
  584. p->offset = 0;
  585. UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
  586. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
  587. UINT16_TO_STREAM (pp, handle);
  588. UINT8_TO_STREAM (pp, reason);
  589. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  590. return (TRUE);
  591. }
  592. #endif
  593. BOOLEAN btsnd_hcic_ble_add_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer,
  594. UINT8 irk_peer[HCIC_BLE_IRK_SIZE],
  595. UINT8 irk_local[HCIC_BLE_IRK_SIZE])
  596. {
  597. BT_HDR *p;
  598. UINT8 *pp;
  599. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST)) == NULL) {
  600. return (FALSE);
  601. }
  602. pp = (UINT8 *)(p + 1);
  603. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST;
  604. p->offset = 0;
  605. UINT16_TO_STREAM (pp, HCI_BLE_ADD_DEV_RESOLVING_LIST);
  606. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST);
  607. UINT8_TO_STREAM (pp, addr_type_peer);
  608. BDADDR_TO_STREAM (pp, bda_peer);
  609. ARRAY_TO_STREAM (pp, irk_peer, HCIC_BLE_ENCRYT_KEY_SIZE);
  610. ARRAY_TO_STREAM (pp, irk_local, HCIC_BLE_ENCRYT_KEY_SIZE);
  611. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  612. return (TRUE);
  613. }
  614. BOOLEAN btsnd_hcic_ble_rm_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer)
  615. {
  616. BT_HDR *p;
  617. UINT8 *pp;
  618. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST)) == NULL) {
  619. return (FALSE);
  620. }
  621. pp = (UINT8 *)(p + 1);
  622. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST;
  623. p->offset = 0;
  624. UINT16_TO_STREAM (pp, HCI_BLE_RM_DEV_RESOLVING_LIST);
  625. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST);
  626. UINT8_TO_STREAM (pp, addr_type_peer);
  627. BDADDR_TO_STREAM (pp, bda_peer);
  628. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  629. return (TRUE);
  630. }
  631. BOOLEAN btsnd_hcic_ble_clear_resolving_list (void)
  632. {
  633. BT_HDR *p;
  634. UINT8 *pp;
  635. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST)) == NULL) {
  636. return (FALSE);
  637. }
  638. pp = (UINT8 *)(p + 1);
  639. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST;
  640. p->offset = 0;
  641. UINT16_TO_STREAM (pp, HCI_BLE_CLEAR_RESOLVING_LIST);
  642. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST);
  643. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  644. return (TRUE);
  645. }
  646. BOOLEAN btsnd_hcic_ble_read_resolvable_addr_peer (UINT8 addr_type_peer, BD_ADDR bda_peer)
  647. {
  648. BT_HDR *p;
  649. UINT8 *pp;
  650. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER)) == NULL) {
  651. return (FALSE);
  652. }
  653. pp = (UINT8 *)(p + 1);
  654. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER;
  655. p->offset = 0;
  656. UINT16_TO_STREAM (pp, HCI_BLE_READ_RESOLVABLE_ADDR_PEER);
  657. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER);
  658. UINT8_TO_STREAM (pp, addr_type_peer);
  659. BDADDR_TO_STREAM (pp, bda_peer);
  660. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  661. return (TRUE);
  662. }
  663. BOOLEAN btsnd_hcic_ble_read_resolvable_addr_local (UINT8 addr_type_peer, BD_ADDR bda_peer)
  664. {
  665. BT_HDR *p;
  666. UINT8 *pp;
  667. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL)) == NULL) {
  668. return (FALSE);
  669. }
  670. pp = (UINT8 *)(p + 1);
  671. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL;
  672. p->offset = 0;
  673. UINT16_TO_STREAM (pp, HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL);
  674. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL);
  675. UINT8_TO_STREAM (pp, addr_type_peer);
  676. BDADDR_TO_STREAM (pp, bda_peer);
  677. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  678. return (TRUE);
  679. }
  680. BOOLEAN btsnd_hcic_ble_set_addr_resolution_enable (UINT8 addr_resolution_enable)
  681. {
  682. BT_HDR *p;
  683. UINT8 *pp;
  684. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE)) == NULL) {
  685. return (FALSE);
  686. }
  687. pp = (UINT8 *)(p + 1);
  688. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE;
  689. p->offset = 0;
  690. UINT16_TO_STREAM (pp, HCI_BLE_SET_ADDR_RESOLUTION_ENABLE);
  691. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE);
  692. UINT8_TO_STREAM (pp, addr_resolution_enable);
  693. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  694. return (TRUE);
  695. }
  696. BOOLEAN btsnd_hcic_ble_set_rand_priv_addr_timeout (UINT16 rpa_timout)
  697. {
  698. BT_HDR *p;
  699. UINT8 *pp;
  700. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT)) == NULL) {
  701. return (FALSE);
  702. }
  703. pp = (UINT8 *)(p + 1);
  704. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT;
  705. p->offset = 0;
  706. UINT16_TO_STREAM (pp, HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
  707. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
  708. UINT16_TO_STREAM (pp, rpa_timout);
  709. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  710. return (TRUE);
  711. }
  712. BOOLEAN btsnd_hcic_ble_set_data_length(UINT16 conn_handle, UINT16 tx_octets, UINT16 tx_time)
  713. {
  714. BT_HDR *p;
  715. UINT8 *pp;
  716. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH)) == NULL) {
  717. return FALSE;
  718. }
  719. pp = p->data;
  720. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH;
  721. p->offset = 0;
  722. UINT16_TO_STREAM(pp, HCI_BLE_SET_DATA_LENGTH);
  723. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH);
  724. UINT16_TO_STREAM(pp, conn_handle);
  725. UINT16_TO_STREAM(pp, tx_octets);
  726. UINT16_TO_STREAM(pp, tx_time);
  727. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  728. return TRUE;
  729. }
  730. BOOLEAN btsnd_hcic_ble_update_adv_report_flow_control (UINT16 num)
  731. {
  732. BT_HDR *p;
  733. UINT8 *pp;
  734. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_UPDATE_ADV_FLOW_CONTROL)) == NULL) {
  735. return (FALSE);
  736. }
  737. pp = (UINT8 *)(p + 1);
  738. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPDATE_ADV_FLOW_CONTROL;
  739. p->offset = 0;
  740. UINT16_TO_STREAM (pp, HCI_VENDOR_BLE_ADV_REPORT_FLOW_CONTROL);
  741. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_UPDATE_ADV_FLOW_CONTROL);
  742. UINT16_TO_STREAM (pp, num);
  743. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  744. return TRUE;
  745. }
  746. BOOLEAN btsnd_hcic_ble_set_channels (BLE_CHANNELS channels)
  747. {
  748. BT_HDR *p;
  749. UINT8 *pp;
  750. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_CHANNELS)) == NULL) {
  751. return (FALSE);
  752. }
  753. pp = (UINT8 *)(p + 1);
  754. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_CHANNELS;
  755. p->offset = 0;
  756. UINT16_TO_STREAM (pp, HCI_BLE_SET_HOST_CHNL_CLASS);
  757. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_CHANNELS);
  758. ARRAY_TO_STREAM (pp, channels, HCIC_PARAM_SIZE_BLE_SET_CHANNELS);
  759. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  760. return (TRUE);
  761. }
  762. #endif