hciblecmds.c 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912
  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. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  33. static BlE_SYNC ble_sync_info;
  34. void btsnd_hcic_ble_sync_sem_init(void)
  35. {
  36. ble_sync_info.opcode = 0;
  37. osi_sem_new(&ble_sync_info.sync_sem, 1, 0);
  38. }
  39. void btsnd_hcic_ble_sync_sem_deinit(void)
  40. {
  41. ble_sync_info.opcode = 0;
  42. osi_sem_free(&ble_sync_info.sync_sem);
  43. }
  44. BlE_SYNC *btsnd_hcic_ble_get_sync_info(void)
  45. {
  46. return &ble_sync_info;
  47. }
  48. uint8_t btsnd_hcic_ble_get_status(void)
  49. {
  50. return ble_sync_info.status;
  51. }
  52. void btsnd_hci_ble_set_status(UINT8 hci_status)
  53. {
  54. ble_sync_info.status = hci_status;
  55. return;
  56. }
  57. #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
  58. #if (defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)
  59. BOOLEAN btsnd_hcic_ble_set_local_used_feat (UINT8 feat_set[8])
  60. {
  61. BT_HDR *p;
  62. UINT8 *pp;
  63. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_USED_FEAT_CMD)) == NULL) {
  64. return (FALSE);
  65. }
  66. pp = (UINT8 *)(p + 1);
  67. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_USED_FEAT_CMD;
  68. p->offset = 0;
  69. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_LOCAL_SPT_FEAT);
  70. ARRAY_TO_STREAM (pp, feat_set, HCIC_PARAM_SIZE_SET_USED_FEAT_CMD);
  71. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  72. return (TRUE);
  73. }
  74. BOOLEAN btsnd_hcic_ble_set_random_addr (BD_ADDR random_bda)
  75. {
  76. BT_HDR *p;
  77. UINT8 *pp;
  78. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD)) == NULL) {
  79. return (FALSE);
  80. }
  81. pp = (UINT8 *)(p + 1);
  82. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD;
  83. p->offset = 0;
  84. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_RANDOM_ADDR);
  85. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD);
  86. BDADDR_TO_STREAM (pp, random_bda);
  87. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  88. return (TRUE);
  89. }
  90. BOOLEAN btsnd_hcic_ble_write_adv_params (UINT16 adv_int_min, UINT16 adv_int_max,
  91. UINT8 adv_type, UINT8 addr_type_own,
  92. UINT8 addr_type_dir, BD_ADDR direct_bda,
  93. UINT8 channel_map, UINT8 adv_filter_policy)
  94. {
  95. BT_HDR *p;
  96. UINT8 *pp;
  97. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS)) == NULL) {
  98. return (FALSE);
  99. }
  100. pp = (UINT8 *)(p + 1);
  101. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS ;
  102. p->offset = 0;
  103. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_PARAMS);
  104. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS );
  105. UINT16_TO_STREAM (pp, adv_int_min);
  106. UINT16_TO_STREAM (pp, adv_int_max);
  107. UINT8_TO_STREAM (pp, adv_type);
  108. UINT8_TO_STREAM (pp, addr_type_own);
  109. UINT8_TO_STREAM (pp, addr_type_dir);
  110. BDADDR_TO_STREAM (pp, direct_bda);
  111. UINT8_TO_STREAM (pp, channel_map);
  112. UINT8_TO_STREAM (pp, adv_filter_policy);
  113. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  114. return (TRUE);
  115. }
  116. BOOLEAN btsnd_hcic_ble_read_adv_chnl_tx_power (void)
  117. {
  118. BT_HDR *p;
  119. UINT8 *pp;
  120. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) {
  121. return (FALSE);
  122. }
  123. pp = (UINT8 *)(p + 1);
  124. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  125. p->offset = 0;
  126. UINT16_TO_STREAM (pp, HCI_BLE_READ_ADV_CHNL_TX_POWER);
  127. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  128. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  129. return (TRUE);
  130. }
  131. BOOLEAN btsnd_hcic_ble_set_adv_data (UINT8 data_len, UINT8 *p_data)
  132. {
  133. BT_HDR *p;
  134. UINT8 *pp;
  135. for (int i = 0; i < data_len; i++) {
  136. HCI_TRACE_DEBUG("p_data[%d] = %x\n", i, p_data[i]);
  137. }
  138. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1)) == NULL) {
  139. return (FALSE);
  140. }
  141. pp = (UINT8 *)(p + 1);
  142. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1;
  143. p->offset = 0;
  144. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_DATA);
  145. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1);
  146. memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA);
  147. if (p_data != NULL && data_len > 0) {
  148. if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA) {
  149. data_len = HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA;
  150. HCI_TRACE_WARNING("Data length exceeds 31 bytes, only the first 31 bytes are used.\n");
  151. }
  152. UINT8_TO_STREAM (pp, data_len);
  153. ARRAY_TO_STREAM (pp, p_data, data_len);
  154. }
  155. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  156. return (TRUE);
  157. }
  158. BOOLEAN btsnd_hcic_ble_set_scan_rsp_data (UINT8 data_len, UINT8 *p_scan_rsp)
  159. {
  160. BT_HDR *p;
  161. UINT8 *pp;
  162. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1)) == NULL) {
  163. return (FALSE);
  164. }
  165. pp = (UINT8 *)(p + 1);
  166. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1;
  167. p->offset = 0;
  168. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_RSP_DATA);
  169. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1);
  170. memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP);
  171. if (p_scan_rsp != NULL && data_len > 0) {
  172. if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP ) {
  173. data_len = HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP;
  174. HCI_TRACE_WARNING("Data length exceeds 31 bytes, only the first 31 bytes are used.\n");
  175. }
  176. UINT8_TO_STREAM (pp, data_len);
  177. ARRAY_TO_STREAM (pp, p_scan_rsp, data_len);
  178. }
  179. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  180. return (TRUE);
  181. }
  182. BOOLEAN btsnd_hcic_ble_set_adv_enable (UINT8 adv_enable)
  183. {
  184. BT_HDR *p;
  185. UINT8 *pp;
  186. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_ADV_ENABLE)) == NULL) {
  187. return (FALSE);
  188. }
  189. pp = (UINT8 *)(p + 1);
  190. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_ADV_ENABLE;
  191. p->offset = 0;
  192. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_ADV_ENABLE);
  193. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_ADV_ENABLE);
  194. UINT8_TO_STREAM (pp, adv_enable);
  195. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  196. return (TRUE);
  197. }
  198. BOOLEAN btsnd_hcic_ble_set_scan_params (UINT8 scan_type,
  199. UINT16 scan_int, UINT16 scan_win,
  200. UINT8 addr_type_own, UINT8 scan_filter_policy)
  201. {
  202. BT_HDR *p;
  203. UINT8 *pp;
  204. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM)) == NULL) {
  205. return (FALSE);
  206. }
  207. pp = (UINT8 *)(p + 1);
  208. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM;
  209. p->offset = 0;
  210. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_PARAMS);
  211. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM);
  212. UINT8_TO_STREAM (pp, scan_type);
  213. UINT16_TO_STREAM (pp, scan_int);
  214. UINT16_TO_STREAM (pp, scan_win);
  215. UINT8_TO_STREAM (pp, addr_type_own);
  216. UINT8_TO_STREAM (pp, scan_filter_policy);
  217. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  218. return (TRUE);
  219. }
  220. BOOLEAN btsnd_hcic_ble_set_scan_enable (UINT8 scan_enable, UINT8 duplicate)
  221. {
  222. BT_HDR *p;
  223. UINT8 *pp;
  224. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE)) == NULL) {
  225. return (FALSE);
  226. }
  227. pp = (UINT8 *)(p + 1);
  228. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE;
  229. p->offset = 0;
  230. UINT16_TO_STREAM (pp, HCI_BLE_WRITE_SCAN_ENABLE);
  231. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE);
  232. UINT8_TO_STREAM (pp, scan_enable);
  233. UINT8_TO_STREAM (pp, duplicate);
  234. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  235. return (TRUE);
  236. }
  237. /* link layer connection management commands */
  238. BOOLEAN btsnd_hcic_ble_create_ll_conn (UINT16 scan_int, UINT16 scan_win,
  239. UINT8 init_filter_policy,
  240. UINT8 addr_type_peer, BD_ADDR bda_peer,
  241. UINT8 addr_type_own,
  242. UINT16 conn_int_min, UINT16 conn_int_max,
  243. UINT16 conn_latency, UINT16 conn_timeout,
  244. UINT16 min_ce_len, UINT16 max_ce_len)
  245. {
  246. BT_HDR *p;
  247. UINT8 *pp;
  248. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN)) == NULL) {
  249. return (FALSE);
  250. }
  251. pp = (UINT8 *)(p + 1);
  252. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN;
  253. p->offset = 0;
  254. UINT16_TO_STREAM (pp, HCI_BLE_CREATE_LL_CONN);
  255. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN);
  256. UINT16_TO_STREAM (pp, scan_int);
  257. UINT16_TO_STREAM (pp, scan_win);
  258. UINT8_TO_STREAM (pp, init_filter_policy);
  259. UINT8_TO_STREAM (pp, addr_type_peer);
  260. BDADDR_TO_STREAM (pp, bda_peer);
  261. UINT8_TO_STREAM (pp, addr_type_own);
  262. UINT16_TO_STREAM (pp, conn_int_min);
  263. UINT16_TO_STREAM (pp, conn_int_max);
  264. UINT16_TO_STREAM (pp, conn_latency);
  265. UINT16_TO_STREAM (pp, conn_timeout);
  266. UINT16_TO_STREAM (pp, min_ce_len);
  267. UINT16_TO_STREAM (pp, max_ce_len);
  268. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  269. return (TRUE);
  270. }
  271. BOOLEAN btsnd_hcic_ble_create_conn_cancel (void)
  272. {
  273. BT_HDR *p;
  274. UINT8 *pp;
  275. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL)) == NULL) {
  276. return (FALSE);
  277. }
  278. pp = (UINT8 *)(p + 1);
  279. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL;
  280. p->offset = 0;
  281. UINT16_TO_STREAM (pp, HCI_BLE_CREATE_CONN_CANCEL);
  282. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL);
  283. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  284. return (TRUE);
  285. }
  286. BOOLEAN btsnd_hcic_ble_clear_white_list (void)
  287. {
  288. BT_HDR *p;
  289. UINT8 *pp;
  290. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_CLEAR_WHITE_LIST)) == NULL) {
  291. return (FALSE);
  292. }
  293. pp = (UINT8 *)(p + 1);
  294. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CLEAR_WHITE_LIST;
  295. p->offset = 0;
  296. UINT16_TO_STREAM (pp, HCI_BLE_CLEAR_WHITE_LIST);
  297. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_CLEAR_WHITE_LIST);
  298. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  299. return (TRUE);
  300. }
  301. BOOLEAN btsnd_hcic_ble_add_white_list (UINT8 addr_type, BD_ADDR bda)
  302. {
  303. BT_HDR *p;
  304. UINT8 *pp;
  305. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_ADD_WHITE_LIST)) == NULL) {
  306. return (FALSE);
  307. }
  308. pp = (UINT8 *)(p + 1);
  309. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_WHITE_LIST;
  310. p->offset = 0;
  311. UINT16_TO_STREAM (pp, HCI_BLE_ADD_WHITE_LIST);
  312. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_ADD_WHITE_LIST);
  313. UINT8_TO_STREAM (pp, addr_type);
  314. BDADDR_TO_STREAM (pp, bda);
  315. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  316. return (TRUE);
  317. }
  318. BOOLEAN btsnd_hcic_ble_remove_from_white_list (UINT8 addr_type, BD_ADDR bda)
  319. {
  320. BT_HDR *p;
  321. UINT8 *pp;
  322. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_REMOVE_WHITE_LIST)) == NULL) {
  323. return (FALSE);
  324. }
  325. pp = (UINT8 *)(p + 1);
  326. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REMOVE_WHITE_LIST;
  327. p->offset = 0;
  328. UINT16_TO_STREAM (pp, HCI_BLE_REMOVE_WHITE_LIST);
  329. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_REMOVE_WHITE_LIST);
  330. UINT8_TO_STREAM (pp, addr_type);
  331. BDADDR_TO_STREAM (pp, bda);
  332. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  333. return (TRUE);
  334. }
  335. BOOLEAN btsnd_hcic_ble_upd_ll_conn_params (UINT16 handle,
  336. UINT16 conn_int_min, UINT16 conn_int_max,
  337. UINT16 conn_latency, UINT16 conn_timeout,
  338. UINT16 min_ce_len, UINT16 max_ce_len)
  339. {
  340. BT_HDR *p;
  341. UINT8 *pp;
  342. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS)) == NULL) {
  343. return (FALSE);
  344. }
  345. pp = (UINT8 *)(p + 1);
  346. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS;
  347. p->offset = 0;
  348. UINT16_TO_STREAM (pp, HCI_BLE_UPD_LL_CONN_PARAMS);
  349. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS);
  350. UINT16_TO_STREAM (pp, handle);
  351. UINT16_TO_STREAM (pp, conn_int_min);
  352. UINT16_TO_STREAM (pp, conn_int_max);
  353. UINT16_TO_STREAM (pp, conn_latency);
  354. UINT16_TO_STREAM (pp, conn_timeout);
  355. UINT16_TO_STREAM (pp, min_ce_len);
  356. UINT16_TO_STREAM (pp, max_ce_len);
  357. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  358. return (TRUE);
  359. }
  360. BOOLEAN btsnd_hcic_ble_set_host_chnl_class (UINT8 chnl_map[HCIC_BLE_CHNL_MAP_SIZE])
  361. {
  362. BT_HDR *p;
  363. UINT8 *pp;
  364. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS)) == NULL) {
  365. return (FALSE);
  366. }
  367. pp = (UINT8 *)(p + 1);
  368. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS;
  369. p->offset = 0;
  370. UINT16_TO_STREAM (pp, HCI_BLE_SET_HOST_CHNL_CLASS);
  371. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS);
  372. ARRAY_TO_STREAM (pp, chnl_map, HCIC_BLE_CHNL_MAP_SIZE);
  373. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  374. return (TRUE);
  375. }
  376. BOOLEAN btsnd_hcic_ble_read_chnl_map (UINT16 handle)
  377. {
  378. BT_HDR *p;
  379. UINT8 *pp;
  380. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CHNL_MAP)) == NULL) {
  381. return (FALSE);
  382. }
  383. pp = (UINT8 *)(p + 1);
  384. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CHNL_MAP;
  385. p->offset = 0;
  386. UINT16_TO_STREAM (pp, HCI_BLE_READ_CHNL_MAP);
  387. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CHNL_MAP);
  388. UINT16_TO_STREAM (pp, handle);
  389. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  390. return (TRUE);
  391. }
  392. BOOLEAN btsnd_hcic_ble_read_remote_feat (UINT16 handle)
  393. {
  394. BT_HDR *p;
  395. UINT8 *pp;
  396. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT)) == NULL) {
  397. return (FALSE);
  398. }
  399. pp = (UINT8 *)(p + 1);
  400. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT;
  401. p->offset = 0;
  402. UINT16_TO_STREAM (pp, HCI_BLE_READ_REMOTE_FEAT);
  403. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT);
  404. UINT16_TO_STREAM (pp, handle);
  405. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  406. return (TRUE);
  407. }
  408. /* security management commands */
  409. BOOLEAN btsnd_hcic_ble_encrypt (UINT8 *key, UINT8 key_len,
  410. UINT8 *plain_text, UINT8 pt_len,
  411. void *p_cmd_cplt_cback)
  412. {
  413. BT_HDR *p;
  414. UINT8 *pp;
  415. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_ENCRYPT)) == NULL) {
  416. return (FALSE);
  417. }
  418. pp = (UINT8 *)(p + 1);
  419. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENCRYPT;
  420. p->offset = 0;
  421. hci_cmd_metadata_t *metadata = HCI_GET_CMD_METAMSG(p);
  422. metadata->context = p_cmd_cplt_cback;
  423. UINT16_TO_STREAM (pp, HCI_BLE_ENCRYPT);
  424. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_ENCRYPT);
  425. memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT);
  426. if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) {
  427. key_len = HCIC_BLE_ENCRYT_KEY_SIZE;
  428. }
  429. if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) {
  430. pt_len = HCIC_BLE_ENCRYT_KEY_SIZE;
  431. }
  432. ARRAY_TO_STREAM (pp, key, key_len);
  433. pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len);
  434. ARRAY_TO_STREAM (pp, plain_text, pt_len);
  435. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  436. return (TRUE);
  437. }
  438. BOOLEAN btsnd_hcic_ble_rand (void *p_cmd_cplt_cback)
  439. {
  440. BT_HDR *p;
  441. UINT8 *pp;
  442. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RAND)) == NULL) {
  443. return (FALSE);
  444. }
  445. pp = (UINT8 *)(p + 1);
  446. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RAND;
  447. p->offset = 0;
  448. hci_cmd_metadata_t *metadata = HCI_GET_CMD_METAMSG(p);
  449. metadata->context = p_cmd_cplt_cback;
  450. UINT16_TO_STREAM (pp, HCI_BLE_RAND);
  451. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RAND);
  452. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  453. return (TRUE);
  454. }
  455. BOOLEAN btsnd_hcic_ble_start_enc (UINT16 handle, UINT8 rand[HCIC_BLE_RAND_DI_SIZE],
  456. UINT16 ediv, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE])
  457. {
  458. BT_HDR *p;
  459. UINT8 *pp;
  460. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_START_ENC)) == NULL) {
  461. return (FALSE);
  462. }
  463. pp = (UINT8 *)(p + 1);
  464. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_START_ENC;
  465. p->offset = 0;
  466. UINT16_TO_STREAM (pp, HCI_BLE_START_ENC);
  467. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_START_ENC);
  468. UINT16_TO_STREAM (pp, handle);
  469. ARRAY_TO_STREAM (pp, rand, HCIC_BLE_RAND_DI_SIZE);
  470. UINT16_TO_STREAM (pp, ediv);
  471. ARRAY_TO_STREAM (pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
  472. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  473. return (TRUE);
  474. }
  475. BOOLEAN btsnd_hcic_ble_ltk_req_reply (UINT16 handle, UINT8 ltk[HCIC_BLE_ENCRYT_KEY_SIZE])
  476. {
  477. BT_HDR *p;
  478. UINT8 *pp;
  479. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_REPLY)) == NULL) {
  480. return (FALSE);
  481. }
  482. pp = (UINT8 *)(p + 1);
  483. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_REPLY;
  484. p->offset = 0;
  485. UINT16_TO_STREAM (pp, HCI_BLE_LTK_REQ_REPLY);
  486. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LTK_REQ_REPLY);
  487. UINT16_TO_STREAM (pp, handle);
  488. ARRAY_TO_STREAM (pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
  489. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  490. return (TRUE);
  491. }
  492. BOOLEAN btsnd_hcic_ble_ltk_req_neg_reply (UINT16 handle)
  493. {
  494. BT_HDR *p;
  495. UINT8 *pp;
  496. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY)) == NULL) {
  497. return (FALSE);
  498. }
  499. pp = (UINT8 *)(p + 1);
  500. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY;
  501. p->offset = 0;
  502. UINT16_TO_STREAM (pp, HCI_BLE_LTK_REQ_NEG_REPLY);
  503. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY);
  504. UINT16_TO_STREAM (pp, handle);
  505. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  506. return (TRUE);
  507. }
  508. BOOLEAN btsnd_hcic_ble_receiver_test(UINT8 rx_freq)
  509. {
  510. BT_HDR *p;
  511. UINT8 *pp;
  512. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM1)) == NULL) {
  513. return (FALSE);
  514. }
  515. pp = (UINT8 *)(p + 1);
  516. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
  517. p->offset = 0;
  518. UINT16_TO_STREAM (pp, HCI_BLE_RECEIVER_TEST);
  519. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
  520. UINT8_TO_STREAM (pp, rx_freq);
  521. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  522. return (TRUE);
  523. }
  524. BOOLEAN btsnd_hcic_ble_transmitter_test(UINT8 tx_freq, UINT8 test_data_len, UINT8 payload)
  525. {
  526. BT_HDR *p;
  527. UINT8 *pp;
  528. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_WRITE_PARAM3)) == NULL) {
  529. return (FALSE);
  530. }
  531. pp = (UINT8 *)(p + 1);
  532. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
  533. p->offset = 0;
  534. UINT16_TO_STREAM (pp, HCI_BLE_TRANSMITTER_TEST);
  535. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
  536. UINT8_TO_STREAM (pp, tx_freq);
  537. UINT8_TO_STREAM (pp, test_data_len);
  538. UINT8_TO_STREAM (pp, payload);
  539. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  540. return (TRUE);
  541. }
  542. BOOLEAN btsnd_hcic_ble_test_end(void)
  543. {
  544. BT_HDR *p;
  545. UINT8 *pp;
  546. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) {
  547. return (FALSE);
  548. }
  549. pp = (UINT8 *)(p + 1);
  550. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  551. p->offset = 0;
  552. UINT16_TO_STREAM (pp, HCI_BLE_TEST_END);
  553. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  554. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  555. return (TRUE);
  556. }
  557. BOOLEAN btsnd_hcic_ble_read_host_supported (void)
  558. {
  559. BT_HDR *p;
  560. UINT8 *pp;
  561. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_READ_CMD)) == NULL) {
  562. return (FALSE);
  563. }
  564. pp = (UINT8 *)(p + 1);
  565. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
  566. p->offset = 0;
  567. UINT16_TO_STREAM (pp, HCI_READ_LE_HOST_SUPPORT);
  568. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_READ_CMD);
  569. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  570. return (TRUE);
  571. }
  572. #if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
  573. BOOLEAN btsnd_hcic_ble_rc_param_req_reply( UINT16 handle,
  574. UINT16 conn_int_min, UINT16 conn_int_max,
  575. UINT16 conn_latency, UINT16 conn_timeout,
  576. UINT16 min_ce_len, UINT16 max_ce_len )
  577. {
  578. BT_HDR *p;
  579. UINT8 *pp;
  580. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY)) == NULL) {
  581. return (FALSE);
  582. }
  583. pp = (UINT8 *)(p + 1);
  584. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
  585. p->offset = 0;
  586. UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_REPLY);
  587. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
  588. UINT16_TO_STREAM (pp, handle);
  589. UINT16_TO_STREAM (pp, conn_int_min);
  590. UINT16_TO_STREAM (pp, conn_int_max);
  591. UINT16_TO_STREAM (pp, conn_latency);
  592. UINT16_TO_STREAM (pp, conn_timeout);
  593. UINT16_TO_STREAM (pp, min_ce_len);
  594. UINT16_TO_STREAM (pp, max_ce_len);
  595. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  596. return (TRUE);
  597. }
  598. BOOLEAN btsnd_hcic_ble_rc_param_req_neg_reply(UINT16 handle, UINT8 reason)
  599. {
  600. BT_HDR *p;
  601. UINT8 *pp;
  602. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY)) == NULL) {
  603. return (FALSE);
  604. }
  605. pp = (UINT8 *)(p + 1);
  606. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
  607. p->offset = 0;
  608. UINT16_TO_STREAM (pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
  609. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
  610. UINT16_TO_STREAM (pp, handle);
  611. UINT8_TO_STREAM (pp, reason);
  612. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  613. return (TRUE);
  614. }
  615. #endif
  616. BOOLEAN btsnd_hcic_ble_add_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer,
  617. UINT8 irk_peer[HCIC_BLE_IRK_SIZE],
  618. UINT8 irk_local[HCIC_BLE_IRK_SIZE])
  619. {
  620. BT_HDR *p;
  621. UINT8 *pp;
  622. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST)) == NULL) {
  623. return (FALSE);
  624. }
  625. pp = (UINT8 *)(p + 1);
  626. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST;
  627. p->offset = 0;
  628. UINT16_TO_STREAM (pp, HCI_BLE_ADD_DEV_RESOLVING_LIST);
  629. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST);
  630. UINT8_TO_STREAM (pp, addr_type_peer);
  631. BDADDR_TO_STREAM (pp, bda_peer);
  632. ARRAY_TO_STREAM (pp, irk_peer, HCIC_BLE_ENCRYT_KEY_SIZE);
  633. ARRAY_TO_STREAM (pp, irk_local, HCIC_BLE_ENCRYT_KEY_SIZE);
  634. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  635. return (TRUE);
  636. }
  637. BOOLEAN btsnd_hcic_ble_rm_device_resolving_list (UINT8 addr_type_peer, BD_ADDR bda_peer)
  638. {
  639. BT_HDR *p;
  640. UINT8 *pp;
  641. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST)) == NULL) {
  642. return (FALSE);
  643. }
  644. pp = (UINT8 *)(p + 1);
  645. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST;
  646. p->offset = 0;
  647. UINT16_TO_STREAM (pp, HCI_BLE_RM_DEV_RESOLVING_LIST);
  648. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST);
  649. UINT8_TO_STREAM (pp, addr_type_peer);
  650. BDADDR_TO_STREAM (pp, bda_peer);
  651. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  652. return (TRUE);
  653. }
  654. BOOLEAN btsnd_hcic_ble_clear_resolving_list (void)
  655. {
  656. BT_HDR *p;
  657. UINT8 *pp;
  658. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST)) == NULL) {
  659. return (FALSE);
  660. }
  661. pp = (UINT8 *)(p + 1);
  662. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST;
  663. p->offset = 0;
  664. UINT16_TO_STREAM (pp, HCI_BLE_CLEAR_RESOLVING_LIST);
  665. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST);
  666. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  667. return (TRUE);
  668. }
  669. BOOLEAN btsnd_hcic_ble_read_resolvable_addr_peer (UINT8 addr_type_peer, BD_ADDR bda_peer)
  670. {
  671. BT_HDR *p;
  672. UINT8 *pp;
  673. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER)) == NULL) {
  674. return (FALSE);
  675. }
  676. pp = (UINT8 *)(p + 1);
  677. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER;
  678. p->offset = 0;
  679. UINT16_TO_STREAM (pp, HCI_BLE_READ_RESOLVABLE_ADDR_PEER);
  680. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER);
  681. UINT8_TO_STREAM (pp, addr_type_peer);
  682. BDADDR_TO_STREAM (pp, bda_peer);
  683. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  684. return (TRUE);
  685. }
  686. BOOLEAN btsnd_hcic_ble_read_resolvable_addr_local (UINT8 addr_type_peer, BD_ADDR bda_peer)
  687. {
  688. BT_HDR *p;
  689. UINT8 *pp;
  690. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL)) == NULL) {
  691. return (FALSE);
  692. }
  693. pp = (UINT8 *)(p + 1);
  694. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL;
  695. p->offset = 0;
  696. UINT16_TO_STREAM (pp, HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL);
  697. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL);
  698. UINT8_TO_STREAM (pp, addr_type_peer);
  699. BDADDR_TO_STREAM (pp, bda_peer);
  700. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  701. return (TRUE);
  702. }
  703. BOOLEAN btsnd_hcic_ble_set_addr_resolution_enable (UINT8 addr_resolution_enable)
  704. {
  705. BT_HDR *p;
  706. UINT8 *pp;
  707. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE)) == NULL) {
  708. return (FALSE);
  709. }
  710. pp = (UINT8 *)(p + 1);
  711. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE;
  712. p->offset = 0;
  713. UINT16_TO_STREAM (pp, HCI_BLE_SET_ADDR_RESOLUTION_ENABLE);
  714. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE);
  715. UINT8_TO_STREAM (pp, addr_resolution_enable);
  716. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  717. return (TRUE);
  718. }
  719. BOOLEAN btsnd_hcic_ble_set_rand_priv_addr_timeout (UINT16 rpa_timout)
  720. {
  721. BT_HDR *p;
  722. UINT8 *pp;
  723. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT)) == NULL) {
  724. return (FALSE);
  725. }
  726. pp = (UINT8 *)(p + 1);
  727. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT;
  728. p->offset = 0;
  729. UINT16_TO_STREAM (pp, HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
  730. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
  731. UINT16_TO_STREAM (pp, rpa_timout);
  732. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  733. return (TRUE);
  734. }
  735. BOOLEAN btsnd_hcic_ble_set_data_length(UINT16 conn_handle, UINT16 tx_octets, UINT16 tx_time)
  736. {
  737. BT_HDR *p;
  738. UINT8 *pp;
  739. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH)) == NULL) {
  740. return FALSE;
  741. }
  742. pp = p->data;
  743. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH;
  744. p->offset = 0;
  745. UINT16_TO_STREAM(pp, HCI_BLE_SET_DATA_LENGTH);
  746. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH);
  747. UINT16_TO_STREAM(pp, conn_handle);
  748. UINT16_TO_STREAM(pp, tx_octets);
  749. UINT16_TO_STREAM(pp, tx_time);
  750. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  751. return TRUE;
  752. }
  753. BOOLEAN btsnd_hcic_ble_update_adv_report_flow_control (UINT16 num, BT_HDR *static_buf)
  754. {
  755. BT_HDR *p;
  756. UINT8 *pp;
  757. if (static_buf != NULL) {
  758. p = static_buf;
  759. } else {
  760. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_UPDATE_ADV_FLOW_CONTROL)) == NULL) {
  761. return (FALSE);
  762. }
  763. }
  764. hci_cmd_metadata_t *metadata = HCI_GET_CMD_METAMSG(p);
  765. metadata->flags_src = HCI_CMD_MSG_F_SRC_NOACK;
  766. if (static_buf == p) {
  767. assert(metadata->command_free_cb != NULL);
  768. }
  769. p->layer_specific = HCI_CMD_BUF_TYPE_METADATA;
  770. pp = (UINT8 *)(p + 1);
  771. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPDATE_ADV_FLOW_CONTROL;
  772. p->offset = 0;
  773. UINT16_TO_STREAM (pp, HCI_VENDOR_BLE_ADV_REPORT_FLOW_CONTROL);
  774. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_UPDATE_ADV_FLOW_CONTROL);
  775. UINT16_TO_STREAM (pp, num);
  776. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  777. return TRUE;
  778. }
  779. BOOLEAN btsnd_hcic_ble_set_channels (BLE_CHANNELS channels)
  780. {
  781. BT_HDR *p;
  782. UINT8 *pp;
  783. if ((p = HCI_GET_CMD_BUF(HCIC_PARAM_SIZE_BLE_SET_CHANNELS)) == NULL) {
  784. return (FALSE);
  785. }
  786. pp = (UINT8 *)(p + 1);
  787. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_CHANNELS;
  788. p->offset = 0;
  789. UINT16_TO_STREAM (pp, HCI_BLE_SET_HOST_CHNL_CLASS);
  790. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_SET_CHANNELS);
  791. ARRAY_TO_STREAM (pp, channels, HCIC_PARAM_SIZE_BLE_SET_CHANNELS);
  792. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  793. return (TRUE);
  794. }
  795. BOOLEAN btsnd_hcic_ble_clear_adv (void)
  796. {
  797. BT_HDR *p;
  798. UINT8 *pp;
  799. if ((p = HCI_GET_CMD_BUF (HCIC_PARAM_SIZE_BLE_CLEAR_ADV)) == NULL) {
  800. return (FALSE);
  801. }
  802. pp = (UINT8 *)(p + 1);
  803. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_ADV;
  804. p->offset = 0;
  805. UINT16_TO_STREAM (pp, HCI_VENDOR_BLE_CLEAR_ADV);
  806. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_BLE_CLEAR_ADV);
  807. btu_hcif_send_cmd (LOCAL_BR_EDR_CONTROLLER_ID, p);
  808. return TRUE;
  809. }
  810. #define HCIC_BLE_CMD_CREATED(p, pp, size) do{\
  811. if ((p = HCI_GET_CMD_BUF(size)) == NULL) { \
  812. return FALSE; \
  813. } \
  814. pp = p->data; \
  815. p->len = HCIC_PREAMBLE_SIZE + size;\
  816. p->offset = 0; \
  817. } while(0)
  818. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  819. BOOLEAN btsnd_hcic_ble_read_phy(UINT16 conn_handle)
  820. {
  821. BT_HDR *p;
  822. UINT8 *pp;
  823. HCI_TRACE_EVENT("%s, conn_handle = %d", __func__, conn_handle);
  824. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_BLE_READ_PHY);
  825. UINT16_TO_STREAM(pp, HCI_BLE_READ_PHY);
  826. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_PHY);
  827. UINT16_TO_STREAM(pp, conn_handle);
  828. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  829. return TRUE;
  830. }
  831. UINT8 btsnd_hcic_ble_set_prefered_default_phy(UINT8 all_phys,
  832. UINT8 tx_phys,
  833. UINT8 rx_phys)
  834. {
  835. BT_HDR *p;
  836. UINT8 *pp;
  837. HCI_TRACE_EVENT("%s, all_phys = %d, tx_phys = %d, rx_phys = %d", __func__, all_phys, tx_phys, rx_phys);
  838. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_BLE_SET_DEF_PHY);
  839. UINT16_TO_STREAM(pp, HCI_BLE_SET_DEFAULT_PHY);
  840. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DEF_PHY);
  841. UINT8_TO_STREAM(pp, all_phys);
  842. UINT8_TO_STREAM(pp, tx_phys);
  843. UINT8_TO_STREAM(pp, rx_phys);
  844. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  845. }
  846. BOOLEAN btsnd_hcic_ble_set_phy(UINT16 conn_handle,
  847. UINT8 all_phys, UINT8 tx_phys,
  848. UINT8 rx_phys, UINT16 phy_options)
  849. {
  850. BT_HDR *p;
  851. UINT8 *pp;
  852. HCI_TRACE_EVENT("%s, conn_handle = %d, all_phys = %d, tx_phys = %d, rx_phys = %d, phy_options = %d", __func__,
  853. conn_handle, all_phys, tx_phys, rx_phys, phy_options);
  854. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_BLE_SET_PHY);
  855. UINT16_TO_STREAM(pp, HCI_BLE_SET_PHY);
  856. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_PHY);
  857. UINT16_TO_STREAM(pp, conn_handle);
  858. UINT8_TO_STREAM(pp, all_phys);
  859. UINT8_TO_STREAM(pp, tx_phys);
  860. UINT8_TO_STREAM(pp, rx_phys);
  861. UINT16_TO_STREAM(pp, phy_options);
  862. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  863. return TRUE;
  864. }
  865. UINT8 btsnd_hcic_ble_enhand_rx_test(UINT8 rx_channel, UINT8 phy,
  866. UINT8 modulation_idx)
  867. {
  868. BT_HDR *p;
  869. UINT8 *pp;
  870. HCI_TRACE_EVENT("%s, rx_channel = %d, phy = %d, modulation_idx = %d", __func__,
  871. rx_channel, phy, modulation_idx);
  872. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_ENH_RX_TEST);
  873. UINT16_TO_STREAM(pp, HCI_BLE_ENH_RX_TEST);
  874. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_RX_TEST);
  875. UINT8_TO_STREAM(pp, rx_channel);
  876. UINT8_TO_STREAM(pp, phy);
  877. UINT8_TO_STREAM(pp, modulation_idx);
  878. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  879. return TRUE;
  880. }
  881. UINT8 btsnd_hcic_ble_enhand_tx_test(UINT8 tx_channel, UINT8 len,
  882. UINT8 packect,
  883. UINT8 phy)
  884. {
  885. BT_HDR *p;
  886. UINT8 *pp;
  887. HCI_TRACE_EVENT("%s, tx_channel = %d, len = %d, packect = %d, phy = %d", __func__,
  888. tx_channel, len, packect, phy);
  889. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_ENH_TX_TEST);
  890. UINT16_TO_STREAM(pp, HCI_BLE_ENH_TX_TEST);
  891. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_TX_TEST);
  892. UINT8_TO_STREAM(pp, tx_channel);
  893. UINT8_TO_STREAM(pp, len);
  894. UINT8_TO_STREAM(pp, packect);
  895. UINT8_TO_STREAM(pp, phy);
  896. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  897. return TRUE;
  898. }
  899. UINT8 btsnd_hcic_ble_set_extend_rand_address(UINT8 adv_handle, BD_ADDR rand_addr)
  900. {
  901. BT_HDR *p;
  902. UINT8 *pp;
  903. HCI_TRACE_EVENT("%s, adv_handle = %d", __func__, adv_handle);
  904. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_EXT_RAND_ADDR);
  905. UINT16_TO_STREAM (pp, HCI_BLE_SET_ADV_RAND_ADDR);
  906. UINT8_TO_STREAM (pp, HCIC_PARAM_SIZE_EXT_RAND_ADDR);
  907. UINT8_TO_STREAM(pp, adv_handle);
  908. BDADDR_TO_STREAM (pp, rand_addr);
  909. return btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  910. }
  911. UINT8 btsnd_hcic_ble_set_ext_adv_params(UINT8 adv_handle, UINT16 properties, UINT32 interval_min,
  912. UINT32 interval_max, UINT8 channel_map, UINT8 own_addr_type,
  913. UINT8 peer_addr_type, BD_ADDR peer_addr,
  914. UINT8 adv_filter_policy, INT8 adv_tx_power,
  915. UINT8 primary_adv_phy, UINT8 secondary_adv_max_skip,
  916. UINT8 secondary_adv_phy,
  917. UINT8 adv_sid, UINT8 scan_req_ntf_enable)
  918. {
  919. BT_HDR *p;
  920. UINT8 *pp;
  921. HCI_TRACE_EVENT("%s, adv_handle = %d, properties = %d, interval_min = %d, interval_max = %d, channel_map = %d,\n\
  922. own_addr_type = %d, peer_addr_type = %d, adv_filter_policy = %d,\n\
  923. adv_tx_power = %d, primary_adv_phy = %d, secondary_adv_max_skip = %d, secondary_adv_phy = %d,\n\
  924. adv_sid = %d, scan_req_ntf_enable = %d", __func__, adv_handle, properties, interval_min, interval_max,
  925. channel_map, own_addr_type, peer_addr_type, adv_filter_policy, adv_tx_power,
  926. primary_adv_phy, secondary_adv_max_skip, secondary_adv_phy, adv_sid, scan_req_ntf_enable);
  927. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_EXT_ADV_SET_PARAMS);
  928. UINT16_TO_STREAM(pp, HCI_BLE_SET_EXT_ADV_PARAM);
  929. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_EXT_ADV_SET_PARAMS);
  930. UINT8_TO_STREAM(pp, adv_handle);
  931. UINT16_TO_STREAM(pp, properties);
  932. UINT24_TO_STREAM(pp, interval_min);
  933. UINT24_TO_STREAM(pp, interval_max);
  934. UINT8_TO_STREAM(pp, channel_map);
  935. UINT8_TO_STREAM(pp, own_addr_type);
  936. UINT8_TO_STREAM(pp, peer_addr_type);
  937. BDADDR_TO_STREAM (pp, peer_addr);
  938. UINT8_TO_STREAM(pp, adv_filter_policy);
  939. INT8_TO_STREAM(pp, adv_tx_power);
  940. UINT8_TO_STREAM(pp, primary_adv_phy);
  941. UINT8_TO_STREAM(pp, secondary_adv_max_skip);
  942. UINT8_TO_STREAM(pp, secondary_adv_phy);
  943. UINT8_TO_STREAM(pp, adv_sid);
  944. UINT8_TO_STREAM(pp, scan_req_ntf_enable);
  945. return btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  946. }
  947. bool ext_adv_flag = false;
  948. UINT8 btsnd_hcic_ble_set_ext_adv_data(UINT8 adv_handle,
  949. UINT8 operation, UINT8 fragment_prefrence,
  950. UINT8 data_len, UINT8 *p_data)
  951. {
  952. BT_HDR *p;
  953. UINT8 *pp;
  954. HCI_TRACE_EVENT("%s, adv_handle = %d, operation = %d, fragment_prefrence = %d,\
  955. data_len = %d", __func__, adv_handle, operation, fragment_prefrence, data_len);
  956. ext_adv_flag = true;
  957. HCIC_BLE_CMD_CREATED(p, pp, data_len + 4);
  958. UINT16_TO_STREAM(pp, HCI_BLE_SET_EXT_ADV_DATA);
  959. UINT8_TO_STREAM(pp, data_len + 4);
  960. UINT8_TO_STREAM(pp, adv_handle);
  961. UINT8_TO_STREAM(pp, operation);
  962. UINT8_TO_STREAM(pp, fragment_prefrence);
  963. if (data_len > HCIC_PARAM_SIZE_EXT_ADV_WRITE_DATA) {
  964. data_len = HCIC_PARAM_SIZE_EXT_ADV_WRITE_DATA;
  965. }
  966. UINT8_TO_STREAM (pp, data_len);
  967. if (p_data != NULL && data_len > 0){
  968. ARRAY_TO_STREAM (pp, p_data, data_len);
  969. }
  970. uint8_t status = btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  971. return status;
  972. }
  973. UINT8 btsnd_hcic_ble_set_ext_adv_scan_rsp_data(UINT8 adv_handle,
  974. UINT8 operation, UINT8 fragment_prefrence,
  975. UINT8 data_len, UINT8 *p_data)
  976. {
  977. BT_HDR *p;
  978. UINT8 *pp;
  979. HCI_TRACE_EVENT("%s, adv_handle = %d, operation = %d, fragment_prefrence = %d,\n\
  980. data_len = %d", __func__, adv_handle, operation, fragment_prefrence, data_len);
  981. HCIC_BLE_CMD_CREATED(p, pp, data_len + 4);
  982. UINT16_TO_STREAM(pp, HCI_BLE_SET_EXT_SCAN_RSP_DATA);
  983. UINT8_TO_STREAM(pp, data_len + 4);
  984. UINT8_TO_STREAM(pp, adv_handle);
  985. UINT8_TO_STREAM(pp, operation);
  986. UINT8_TO_STREAM(pp, fragment_prefrence);
  987. memset(pp, 0, data_len);
  988. if (data_len > HCIC_PARAM_SIZE_EXT_ADV_WRITE_DATA) {
  989. data_len = HCIC_PARAM_SIZE_EXT_ADV_WRITE_DATA;
  990. }
  991. UINT8_TO_STREAM (pp, data_len);
  992. if (p_data != NULL && data_len > 0) {
  993. ARRAY_TO_STREAM (pp, p_data, data_len);
  994. }
  995. return btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  996. }
  997. UINT8 btsnd_hcic_ble_ext_adv_enable(UINT8 enable, UINT8 num_of_sets, UINT8 *adv_handle,
  998. UINT16 *duration, UINT8 *max_adv_evt)
  999. {
  1000. BT_HDR *p;
  1001. UINT8 *pp;
  1002. UINT8 ext_adv_size = num_of_sets*4 + 2;
  1003. HCIC_BLE_CMD_CREATED(p, pp, ext_adv_size);
  1004. HCI_TRACE_EVENT("%s, enable = %d, num_of_sets = %d", __func__, enable, num_of_sets);
  1005. for (int k = 0; k < num_of_sets; k++) {
  1006. HCI_TRACE_EVENT("adv_handle[%d] = %d, duration[%d] = %d, max_adv_evt[%d] = %d", k, adv_handle[k],
  1007. k, duration[k], k, max_adv_evt[k]);
  1008. }
  1009. UINT16_TO_STREAM(pp, HCI_BLE_SET_EXT_ADV_ENABLE);
  1010. UINT8_TO_STREAM(pp, ext_adv_size);
  1011. UINT8_TO_STREAM(pp, enable);
  1012. UINT8_TO_STREAM(pp, num_of_sets);
  1013. for (int i = 0; i < num_of_sets; i++) {
  1014. UINT8_TO_STREAM(pp, adv_handle[i]);
  1015. UINT16_TO_STREAM(pp, duration[i]);
  1016. UINT8_TO_STREAM(pp, max_adv_evt[i]);
  1017. }
  1018. return btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1019. }
  1020. UINT8 btsnd_hcic_ble_read_max_adv_len(void)
  1021. {
  1022. BT_HDR *p;
  1023. UINT8 *pp;
  1024. HCI_TRACE_EVENT("%s", __func__);
  1025. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_READ_MAX_ADV_SIZE + 1);
  1026. UINT16_TO_STREAM(pp, HCI_BLE_RD_MAX_ADV_DATA_LEN);
  1027. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_MAX_ADV_SIZE);
  1028. return btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1029. }
  1030. UINT8 btsnd_hcic_ble_read_num_support_adv_set(void)
  1031. {
  1032. BT_HDR *p;
  1033. UINT8 *pp;
  1034. HCI_TRACE_EVENT("%s", __func__);
  1035. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_NUM_SUPPORT_ADV_SET + 1);
  1036. UINT16_TO_STREAM(pp, HCI_BLE_RD_NUM_OF_ADV_SETS);
  1037. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_NUM_SUPPORT_ADV_SET);
  1038. return btu_hcif_send_cmd_sync (LOCAL_BR_EDR_CONTROLLER_ID, p);
  1039. }
  1040. UINT8 btsnd_hcic_ble_remove_adv_set(UINT8 adv_handle)
  1041. {
  1042. BT_HDR *p;
  1043. UINT8 *pp;
  1044. HCI_TRACE_EVENT("%s, adv_handle = %d", __func__, adv_handle);
  1045. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_REMOVE_ADV_SET + 1);
  1046. UINT16_TO_STREAM(pp, HCI_BLE_REMOVE_ADV_SET);
  1047. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REMOVE_ADV_SET);
  1048. UINT8_TO_STREAM(pp, adv_handle);
  1049. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1050. }
  1051. UINT8 btsnd_hcic_ble_clear_adv_set(void)
  1052. {
  1053. BT_HDR *p;
  1054. UINT8 *pp;
  1055. HCI_TRACE_EVENT("%s", __func__);
  1056. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_CLEAR_ADV_SET + 1);
  1057. UINT16_TO_STREAM(pp, HCI_BLE_CLEAR_ADV_SETS);
  1058. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CLEAR_ADV_SET);
  1059. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1060. }
  1061. UINT8 btsnd_hcic_ble_set_periodic_adv_params(UINT8 adv_handle,
  1062. UINT16 interval_min,
  1063. UINT16 interval_max,
  1064. UINT8 propertics)
  1065. {
  1066. BT_HDR *p;
  1067. UINT8 *pp;
  1068. HCI_TRACE_EVENT("%s, adv_handle = %d, interval_min = %d, interval_max = %d, propertics = %d",
  1069. __func__, adv_handle, interval_min, interval_max, propertics);
  1070. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_SET_PERIODIC_ADV_PARAMS);
  1071. UINT16_TO_STREAM(pp, HCI_BLE_SET_PERIOD_ADV_PARAMS);
  1072. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_PERIODIC_ADV_PARAMS);
  1073. UINT8_TO_STREAM(pp, adv_handle);
  1074. UINT16_TO_STREAM(pp, interval_min);
  1075. UINT16_TO_STREAM(pp, interval_max);
  1076. UINT16_TO_STREAM(pp, propertics);
  1077. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1078. }
  1079. UINT8 btsnd_hcic_ble_set_periodic_adv_data(UINT8 adv_handle,
  1080. UINT8 operation,
  1081. UINT8 len,
  1082. UINT8 *p_data)
  1083. {
  1084. BT_HDR *p;
  1085. UINT8 *pp;
  1086. HCI_TRACE_EVENT("%s, adv_handle = %d, operation = %d, len = %d",
  1087. __func__, adv_handle, operation, len);
  1088. HCIC_BLE_CMD_CREATED(p, pp, len + 3);
  1089. UINT16_TO_STREAM(pp, HCI_BLE_SET_PERIOD_ADV_DATA);
  1090. UINT8_TO_STREAM(pp, len + 3);
  1091. UINT8_TO_STREAM(pp, adv_handle);
  1092. UINT8_TO_STREAM(pp, operation);
  1093. //memset(pp, 0, len);
  1094. if (len > HCIC_PARAM_SIZE_WRITE_PERIODIC_ADV_DATA) {
  1095. len = HCIC_PARAM_SIZE_WRITE_PERIODIC_ADV_DATA;
  1096. }
  1097. UINT8_TO_STREAM (pp, len);
  1098. if (p_data != NULL && len > 0) {
  1099. ARRAY_TO_STREAM (pp, p_data, len);
  1100. }
  1101. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1102. }
  1103. UINT8 btsnd_hcic_ble_periodic_adv_enable(UINT8 enable, UINT8 adv_handle)
  1104. {
  1105. BT_HDR *p;
  1106. UINT8 *pp;
  1107. HCI_TRACE_EVENT("%s, enable = %d, adv_handle = %d",
  1108. __func__, enable, adv_handle);
  1109. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_ENABLE);
  1110. UINT16_TO_STREAM(pp, HCI_BLE_SET_PERIOD_ADV_ENABLE);
  1111. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_ENABLE);
  1112. UINT8_TO_STREAM(pp, enable);
  1113. UINT8_TO_STREAM(pp, adv_handle);
  1114. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1115. }
  1116. UINT8 btsnd_hcic_ble_set_ext_scan_params(UINT8 own_addr_type, UINT8 filter_policy,
  1117. UINT8 phy_mask, UINT8 phy_count,
  1118. tHCI_EXT_SCAN_PARAMS *params)
  1119. {
  1120. BT_HDR *p;
  1121. UINT8 *pp;
  1122. HCI_TRACE_EVENT("%s, own_addr_type = %d, filter_policy = %d, phy_mask = %d, phy_count = %d",
  1123. __func__, own_addr_type, filter_policy, phy_mask, phy_count);
  1124. UINT8 params_size = HCIC_PARAM_SIZE_SET_EXT_SCAN_PARAMS + phy_count*5;
  1125. HCIC_BLE_CMD_CREATED(p, pp, params_size);
  1126. UINT16_TO_STREAM(pp, HCI_BLE_SET_EXT_SCAN_PARAMS);
  1127. UINT8_TO_STREAM(pp, params_size);
  1128. UINT8_TO_STREAM(pp, own_addr_type);
  1129. UINT8_TO_STREAM(pp, filter_policy);
  1130. UINT8_TO_STREAM(pp, phy_mask);
  1131. for (int i = 0; i < phy_count; i++) {
  1132. UINT8_TO_STREAM(pp, params[i].scan_type);
  1133. UINT16_TO_STREAM(pp, params[i].scan_interval);
  1134. UINT16_TO_STREAM(pp, params[i].scan_window);
  1135. }
  1136. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1137. }
  1138. UINT8 btsnd_hcic_ble_ext_scan_enable(UINT8 enable, UINT8 filter_dups,
  1139. UINT16 duration, UINT16 period)
  1140. {
  1141. BT_HDR *p;
  1142. UINT8 *pp;
  1143. HCI_TRACE_EVENT("%s, enable = %d, filter_dups = %d, duration = %d, period = %d",
  1144. __func__, enable, filter_dups, duration, period);
  1145. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_EXT_SCAN_ENABLE);
  1146. UINT16_TO_STREAM(pp, HCI_BLE_SET_EXT_SCAN_ENABLE);
  1147. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_EXT_SCAN_ENABLE);
  1148. UINT8_TO_STREAM(pp, enable);
  1149. UINT8_TO_STREAM(pp, filter_dups);
  1150. UINT16_TO_STREAM(pp, duration);
  1151. UINT16_TO_STREAM(pp, period);
  1152. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1153. }
  1154. BOOLEAN btsnd_hcic_ble_create_ext_conn(tHCI_CreatExtConn *p_conn)
  1155. {
  1156. BT_HDR *p;
  1157. UINT8 *pp;
  1158. tHCI_ExtConnParams *params;
  1159. HCI_TRACE_EVENT("%s", __func__);
  1160. uint8_t size = HCIC_PARAM_SIZE_EXT_CONN_CREATE_BASE;
  1161. if (p_conn->init_phy_mask & 0x01) {
  1162. size += sizeof(tHCI_ExtConnParams);
  1163. }
  1164. if (p_conn->init_phy_mask & 0x02) {
  1165. size += sizeof(tHCI_ExtConnParams);
  1166. }
  1167. if (p_conn->init_phy_mask & 0x04) {
  1168. size += sizeof(tHCI_ExtConnParams);
  1169. }
  1170. HCIC_BLE_CMD_CREATED(p, pp, size);
  1171. UINT16_TO_STREAM(pp, HCI_BLE_EXT_CREATE_CONN);
  1172. UINT8_TO_STREAM(pp, size);
  1173. UINT8_TO_STREAM(pp, p_conn->filter_policy);
  1174. UINT8_TO_STREAM(pp, p_conn->own_addr_type);
  1175. UINT8_TO_STREAM(pp, p_conn->peer_addr_type);
  1176. BDADDR_TO_STREAM(pp, p_conn->peer_addr);
  1177. UINT8_TO_STREAM(pp, p_conn->init_phy_mask);
  1178. if (p_conn->init_phy_mask & 0x01) {
  1179. params = &p_conn->params[0];
  1180. UINT16_TO_STREAM(pp, params->scan_interval);
  1181. UINT16_TO_STREAM(pp, params->scan_window);
  1182. UINT16_TO_STREAM(pp, params->conn_interval_min);
  1183. UINT16_TO_STREAM(pp, params->conn_interval_max);
  1184. UINT16_TO_STREAM(pp, params->conn_latency);
  1185. UINT16_TO_STREAM(pp, params->sup_timeout);
  1186. UINT16_TO_STREAM(pp, BLE_CE_LEN_MIN);
  1187. UINT16_TO_STREAM(pp, BLE_CE_LEN_MIN);
  1188. }
  1189. if (p_conn->init_phy_mask & 0x02) {
  1190. params = &p_conn->params[1];
  1191. UINT16_TO_STREAM(pp, params->scan_interval);
  1192. UINT16_TO_STREAM(pp, params->scan_window);
  1193. UINT16_TO_STREAM(pp, params->conn_interval_min);
  1194. UINT16_TO_STREAM(pp, params->conn_interval_max);
  1195. UINT16_TO_STREAM(pp, params->conn_latency);
  1196. UINT16_TO_STREAM(pp, params->sup_timeout);
  1197. UINT16_TO_STREAM(pp, BLE_CE_LEN_MIN);
  1198. UINT16_TO_STREAM(pp, BLE_CE_LEN_MIN);
  1199. }
  1200. if (p_conn->init_phy_mask & 0x04) {
  1201. params = &p_conn->params[2];
  1202. UINT16_TO_STREAM(pp, params->scan_interval);
  1203. UINT16_TO_STREAM(pp, params->scan_window);
  1204. UINT16_TO_STREAM(pp, params->conn_interval_min);
  1205. UINT16_TO_STREAM(pp, params->conn_interval_max);
  1206. UINT16_TO_STREAM(pp, params->conn_latency);
  1207. UINT16_TO_STREAM(pp, params->sup_timeout);
  1208. UINT16_TO_STREAM(pp, BLE_CE_LEN_MIN);
  1209. UINT16_TO_STREAM(pp, BLE_CE_LEN_MIN);
  1210. }
  1211. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1212. return TRUE;
  1213. }
  1214. BOOLEAN btsnd_hcic_ble_periodic_adv_create_sync(UINT8 filter_policy, UINT8 adv_sid,
  1215. UINT8 adv_addr_type, BD_ADDR adv_addr,
  1216. UINT16 sync_timeout, UINT8 unused)
  1217. {
  1218. BT_HDR *p;
  1219. UINT8 *pp;
  1220. HCI_TRACE_EVENT("%s, filter_policy = %d, adv_sid = %d, adv_addr_type = %d, sync_timeout = %d, unused = %d",
  1221. __func__, filter_policy, adv_sid, adv_addr_type, sync_timeout, unused);
  1222. HCI_TRACE_EVENT("addr %02x %02x %02x %02x %02x %02x", adv_addr[0], adv_addr[1], adv_addr[2], adv_addr[3], adv_addr[4], adv_addr[5]);
  1223. uint16_t skip = 0;
  1224. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_CREATE_SYNC + 2);
  1225. UINT16_TO_STREAM(pp, HCI_BLE_PERIOD_ADV_CREATE_SYNC);
  1226. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_CREATE_SYNC + 2);
  1227. UINT8_TO_STREAM(pp, filter_policy);
  1228. UINT8_TO_STREAM(pp, adv_sid);
  1229. UINT8_TO_STREAM(pp, adv_addr_type);
  1230. BDADDR_TO_STREAM(pp, adv_addr);
  1231. UINT16_TO_STREAM(pp, skip);
  1232. UINT16_TO_STREAM(pp, sync_timeout);
  1233. UINT8_TO_STREAM(pp, unused);
  1234. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1235. return TRUE;
  1236. }
  1237. UINT8 btsnd_hcic_ble_periodic_adv_create_sync_cancel(void)
  1238. {
  1239. BT_HDR *p;
  1240. UINT8 *pp;
  1241. HCI_TRACE_EVENT("%s", __func__);
  1242. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_CREATE_SYNC_CANCEL);
  1243. UINT16_TO_STREAM(pp, HCI_BLE_PERIOD_ADV_CREATE_SYNC_CANCEL);
  1244. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_CREATE_SYNC_CANCEL);
  1245. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1246. }
  1247. UINT8 btsnd_hcic_ble_periodic_adv_term_sync(UINT16 sync_handle)
  1248. {
  1249. BT_HDR *p;
  1250. UINT8 *pp;
  1251. HCI_TRACE_EVENT("%s, sync_handle = %d", __func__, sync_handle);
  1252. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_TERM_SYNC);
  1253. UINT16_TO_STREAM(pp, HCI_BLE_PERIOD_ADV_TERM_SYNC);
  1254. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_TERM_SYNC);
  1255. UINT16_TO_STREAM(pp, sync_handle);
  1256. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1257. }
  1258. UINT8 btsnd_hcic_ble_add_dev_to_periodic_adv_list(UINT8 adv_addr_type, BD_ADDR adv_addr,
  1259. UINT8 adv_sid)
  1260. {
  1261. BT_HDR *p;
  1262. UINT8 *pp;
  1263. HCI_TRACE_EVENT("%s, adv_addr_type = %d, adv_sid = %d", __func__, adv_addr_type, adv_sid);
  1264. esp_log_buffer_hex_internal("addr", adv_addr, sizeof(BD_ADDR), ESP_LOG_WARN);
  1265. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_ADD_DEV_TO_PERIODIC_ADV_LIST);
  1266. UINT16_TO_STREAM(pp, HCI_BLE_ADV_DEV_TO_PERIOD_ADV_LIST);
  1267. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ADD_DEV_TO_PERIODIC_ADV_LIST);
  1268. UINT8_TO_STREAM(pp, adv_addr_type);
  1269. BDADDR_TO_STREAM(pp, adv_addr);
  1270. UINT8_TO_STREAM(pp, adv_sid);
  1271. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1272. }
  1273. UINT8 btsnd_hcic_ble_rm_dev_from_periodic_adv_list(UINT8 adv_addr_type, BD_ADDR adv_addr,
  1274. UINT8 adv_sid)
  1275. {
  1276. BT_HDR *p;
  1277. UINT8 *pp;
  1278. HCI_TRACE_EVENT("%s, adv_addr_type = %d, adv_sid = %d", __func__, adv_addr_type, adv_sid);
  1279. esp_log_buffer_hex_internal("addr", adv_addr, sizeof(BD_ADDR), ESP_LOG_WARN);
  1280. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_RM_DEV_FROM_PERIODIC_ADV_LIST);
  1281. UINT16_TO_STREAM(pp, HCI_BLE_REMOVE_DEV_FROM_PERIOD_ADV_LIST);
  1282. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RM_DEV_FROM_PERIODIC_ADV_LIST);
  1283. UINT8_TO_STREAM(pp, adv_addr_type);
  1284. BDADDR_TO_STREAM(pp, adv_addr);
  1285. UINT8_TO_STREAM(pp, adv_sid);
  1286. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1287. }
  1288. UINT8 btsnd_hcic_ble_clear_periodic_adv_list(void)
  1289. {
  1290. BT_HDR *p;
  1291. UINT8 *pp;
  1292. HCI_TRACE_EVENT("%s", __func__);
  1293. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_CLEAR_PERIODIC_ADV_LIST);
  1294. UINT16_TO_STREAM(pp, HCI_BLE_CLEAR_PERIOD_ADV_LIST);
  1295. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CLEAR_PERIODIC_ADV_LIST);
  1296. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1297. }
  1298. UINT8 btsnd_hcic_ble_read_periodic_adv_list_size(void)
  1299. {
  1300. BT_HDR *p;
  1301. UINT8 *pp;
  1302. HCI_TRACE_EVENT("%s", __func__);
  1303. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_READ_PERIODIC_ADV_LIST);
  1304. UINT16_TO_STREAM(pp, HCI_BLE_RD_PERIOD_ADV_LIST_SIZE);
  1305. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_PERIODIC_ADV_LIST);
  1306. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1307. }
  1308. UINT8 btsnd_hcic_ble_read_trans_power(void)
  1309. {
  1310. BT_HDR *p;
  1311. UINT8 *pp;
  1312. HCI_TRACE_EVENT("%s", __func__);
  1313. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_READ_TRANS_POWER);
  1314. UINT16_TO_STREAM(pp, HCI_BLE_RD_TRANSMIT_POWER);
  1315. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_TRANS_POWER);
  1316. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1317. }
  1318. UINT8 btsnd_hcic_ble_read_rf_path_compensation(void)
  1319. {
  1320. BT_HDR *p;
  1321. UINT8 *pp;
  1322. HCI_TRACE_EVENT("%s", __func__);
  1323. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_READ_RF_PATH_COMPENSATION);
  1324. UINT16_TO_STREAM(pp, HCI_BLE_RD_RF_PATH_COMPENSATION);
  1325. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_RF_PATH_COMPENSATION);
  1326. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1327. }
  1328. UINT8 btsnd_hcic_ble_write_rf_path_compensation(UINT16 rf_tx_path, UINT16 rf_rx_path)
  1329. {
  1330. BT_HDR *p;
  1331. UINT8 *pp;
  1332. HCI_TRACE_EVENT("%s, rf_tx_path = %d, rf_rx_path = %d", __func__, rf_tx_path, rf_rx_path);
  1333. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_WRITE_RF_PATH_COMPENSATION);
  1334. pp = (UINT8 *)(p + 1);
  1335. p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_RF_PATH_COMPENSATION;
  1336. p->offset = 0;
  1337. UINT16_TO_STREAM(pp, HCI_BLE_WR_RF_PATH_COMPENSATION);
  1338. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_RF_PATH_COMPENSATION);
  1339. UINT16_TO_STREAM(pp, rf_tx_path);
  1340. UINT16_TO_STREAM(pp, rf_tx_path);
  1341. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1342. }
  1343. #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
  1344. #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
  1345. UINT8 btsnd_hcic_ble_set_periodic_adv_recv_enable(UINT16 sync_handle, UINT8 enable)
  1346. {
  1347. BT_HDR *p;
  1348. UINT8 *pp;
  1349. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_RECV_ENABLE);
  1350. pp = (UINT8 *)(p + 1);
  1351. UINT16_TO_STREAM(pp, HCI_BLE_SET_PERIOD_ADV_RECV_ENABLE);
  1352. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_RECV_ENABLE);
  1353. UINT16_TO_STREAM(pp, sync_handle);
  1354. UINT8_TO_STREAM(pp, enable);
  1355. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1356. }
  1357. BOOLEAN btsnd_hcic_ble_periodic_adv_sync_trans(UINT16 conn_handle, UINT16 service_data, UINT16 sync_handle)
  1358. {
  1359. BT_HDR *p;
  1360. UINT8 *pp;
  1361. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_SYNC_TRANS);
  1362. pp = (UINT8 *)(p + 1);
  1363. UINT16_TO_STREAM(pp, HCI_BLE_PERIOD_ADV_SYNC_TRANS);
  1364. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_SYNC_TRANS);
  1365. UINT16_TO_STREAM(pp, conn_handle);
  1366. UINT16_TO_STREAM(pp, service_data);
  1367. UINT16_TO_STREAM(pp, sync_handle);
  1368. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1369. return TRUE;
  1370. }
  1371. BOOLEAN btsnd_hcic_ble_periodic_adv_set_info_trans(UINT16 conn_handle, UINT16 service_data, UINT8 adv_handle)
  1372. {
  1373. BT_HDR *p;
  1374. UINT8 *pp;
  1375. HCI_TRACE_DEBUG("%s conn handle %x, adv handle %x", __func__, conn_handle, adv_handle);
  1376. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_PERIODIC_ADV_SET_INFO_TRANS);
  1377. pp = (UINT8 *)(p + 1);
  1378. UINT16_TO_STREAM(pp, HCI_BLE_PERIOD_ADV_SET_INFO_TRANS);
  1379. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PERIODIC_ADV_SET_INFO_TRANS);
  1380. UINT16_TO_STREAM(pp, conn_handle);
  1381. UINT16_TO_STREAM(pp, service_data);
  1382. UINT8_TO_STREAM(pp, adv_handle);
  1383. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1384. return TRUE;
  1385. }
  1386. BOOLEAN btsnd_hcic_ble_set_periodic_adv_sync_trans_params(UINT16 conn_handle, UINT8 mode, UINT16 skip, UINT16 sync_timeout, UINT8 cte_type)
  1387. {
  1388. BT_HDR *p;
  1389. UINT8 *pp;
  1390. HCI_TRACE_DEBUG("%s conn handle %x, mode %x, sync timeout %x", __func__, conn_handle, mode, sync_timeout);
  1391. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_SET_PAST_PARAMS);
  1392. pp = (UINT8 *)(p + 1);
  1393. UINT16_TO_STREAM(pp, HCI_BLE_SET_PAST_PARAMS);
  1394. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_PAST_PARAMS);
  1395. UINT16_TO_STREAM(pp, conn_handle);
  1396. UINT8_TO_STREAM(pp, mode);
  1397. UINT16_TO_STREAM(pp, skip);
  1398. UINT16_TO_STREAM(pp, sync_timeout);
  1399. UINT8_TO_STREAM(pp, cte_type);
  1400. btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1401. return TRUE;
  1402. }
  1403. UINT8 btsnd_hcic_ble_set_default_periodic_adv_sync_trans_params(UINT8 mode, UINT16 skip, UINT16 sync_timeout, UINT8 cte_type)
  1404. {
  1405. BT_HDR *p;
  1406. UINT8 *pp;
  1407. HCI_TRACE_DEBUG("%s mode %x, skip %x, sync timeout %x", __func__, mode, skip, sync_timeout);
  1408. HCIC_BLE_CMD_CREATED(p, pp, HCIC_PARAM_SIZE_SET_DEFAULT_PAST_PARAMS);
  1409. pp = (UINT8 *)(p + 1);
  1410. UINT16_TO_STREAM(pp, HCI_BLE_SET_DEFAULT_PAST_PARAMS);
  1411. UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_DEFAULT_PAST_PARAMS);
  1412. UINT8_TO_STREAM(pp, mode);
  1413. UINT16_TO_STREAM(pp, skip);
  1414. UINT16_TO_STREAM(pp, sync_timeout);
  1415. UINT8_TO_STREAM(pp, cte_type);
  1416. return btu_hcif_send_cmd_sync(LOCAL_BR_EDR_CONTROLLER_ID, p);
  1417. }
  1418. #endif // #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
  1419. #endif