esp_gap_ble_api.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270
  1. // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #include <string.h>
  14. #include "esp_bt_device.h"
  15. #include "esp_bt_main.h"
  16. #include "esp_gap_ble_api.h"
  17. #include "bta/bta_api.h"
  18. #include "common/bt_trace.h"
  19. #include "btc/btc_manage.h"
  20. #include "btc_gap_ble.h"
  21. #include "btc/btc_ble_storage.h"
  22. esp_err_t esp_ble_gap_register_callback(esp_gap_ble_cb_t callback)
  23. {
  24. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  25. return (btc_profile_cb_set(BTC_PID_GAP_BLE, callback) == 0 ? ESP_OK : ESP_FAIL);
  26. }
  27. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  28. esp_err_t esp_ble_gap_config_adv_data(esp_ble_adv_data_t *adv_data)
  29. {
  30. btc_msg_t msg;
  31. btc_ble_gap_args_t arg;
  32. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  33. if (adv_data == NULL) {
  34. return ESP_ERR_INVALID_ARG;
  35. }
  36. if (adv_data->service_uuid_len & 0xf) { //not 16*n
  37. return ESP_ERR_INVALID_ARG;
  38. }
  39. msg.sig = BTC_SIG_API_CALL;
  40. msg.pid = BTC_PID_GAP_BLE;
  41. msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA;
  42. memcpy(&arg.cfg_adv_data.adv_data, adv_data, sizeof(esp_ble_adv_data_t));
  43. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  44. }
  45. esp_err_t esp_ble_gap_set_scan_params(esp_ble_scan_params_t *scan_params)
  46. {
  47. btc_msg_t msg;
  48. btc_ble_gap_args_t arg;
  49. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  50. if (scan_params == NULL) {
  51. return ESP_ERR_INVALID_ARG;
  52. }
  53. msg.sig = BTC_SIG_API_CALL;
  54. msg.pid = BTC_PID_GAP_BLE;
  55. msg.act = BTC_GAP_BLE_ACT_SET_SCAN_PARAM;
  56. memcpy(&arg.set_scan_param.scan_params, scan_params, sizeof(esp_ble_scan_params_t));
  57. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  58. }
  59. esp_err_t esp_ble_gap_start_scanning(uint32_t duration)
  60. {
  61. btc_msg_t msg;
  62. btc_ble_gap_args_t arg;
  63. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  64. msg.sig = BTC_SIG_API_CALL;
  65. msg.pid = BTC_PID_GAP_BLE;
  66. msg.act = BTC_GAP_BLE_ACT_START_SCAN;
  67. arg.start_scan.duration = duration;
  68. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  69. }
  70. esp_err_t esp_ble_gap_stop_scanning(void)
  71. {
  72. btc_msg_t msg;
  73. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  74. msg.sig = BTC_SIG_API_CALL;
  75. msg.pid = BTC_PID_GAP_BLE;
  76. msg.act = BTC_GAP_BLE_ACT_STOP_SCAN;
  77. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  78. }
  79. esp_err_t esp_ble_gap_start_advertising(esp_ble_adv_params_t *adv_params)
  80. {
  81. btc_msg_t msg;
  82. btc_ble_gap_args_t arg;
  83. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  84. msg.sig = BTC_SIG_API_CALL;
  85. msg.pid = BTC_PID_GAP_BLE;
  86. msg.act = BTC_GAP_BLE_ACT_START_ADV;
  87. memcpy(&arg.start_adv.adv_params, adv_params, sizeof(esp_ble_adv_params_t));
  88. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  89. }
  90. esp_err_t esp_ble_gap_stop_advertising(void)
  91. {
  92. btc_msg_t msg;
  93. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  94. msg.sig = BTC_SIG_API_CALL;
  95. msg.pid = BTC_PID_GAP_BLE;
  96. msg.act = BTC_GAP_BLE_ACT_STOP_ADV;
  97. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  98. }
  99. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  100. esp_err_t esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t *params)
  101. {
  102. btc_msg_t msg;
  103. btc_ble_gap_args_t arg;
  104. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  105. if(!params) {
  106. LOG_ERROR("%s,params is NULL", __func__);
  107. return ESP_FAIL;
  108. }
  109. if (ESP_BLE_IS_VALID_PARAM(params->min_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
  110. ESP_BLE_IS_VALID_PARAM(params->max_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
  111. ESP_BLE_IS_VALID_PARAM(params->timeout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
  112. (params->latency <= ESP_BLE_CONN_LATENCY_MAX || params->latency == ESP_BLE_CONN_PARAM_UNDEF) &&
  113. ((params->timeout * 10) >= ((1 + params->latency) * ((params->max_int * 5) >> 1))) && params->min_int <= params->max_int) {
  114. msg.sig = BTC_SIG_API_CALL;
  115. msg.pid = BTC_PID_GAP_BLE;
  116. msg.act = BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM;
  117. memcpy(&arg.conn_update_params.conn_params, params, sizeof(esp_ble_conn_update_params_t));
  118. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  119. } else {
  120. LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d",\
  121. __func__, params->min_int, params->max_int, params->latency, params->timeout);
  122. return ESP_FAIL;
  123. }
  124. }
  125. esp_err_t esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device, uint16_t tx_data_length)
  126. {
  127. btc_msg_t msg;
  128. btc_ble_gap_args_t arg;
  129. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  130. msg.sig = BTC_SIG_API_CALL;
  131. msg.pid = BTC_PID_GAP_BLE;
  132. msg.act = BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN;
  133. arg.set_pkt_data_len.tx_data_length = tx_data_length;
  134. memcpy(arg.set_pkt_data_len.remote_device, remote_device, ESP_BD_ADDR_LEN);
  135. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  136. }
  137. esp_err_t esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr)
  138. {
  139. btc_msg_t msg;
  140. btc_ble_gap_args_t arg;
  141. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  142. msg.sig = BTC_SIG_API_CALL;
  143. msg.pid = BTC_PID_GAP_BLE;
  144. msg.act = BTC_GAP_BLE_ACT_SET_RAND_ADDRESS;
  145. memcpy(arg.set_rand_addr.rand_addr, rand_addr, ESP_BD_ADDR_LEN);
  146. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  147. }
  148. esp_err_t esp_ble_gap_clear_rand_addr(void)
  149. {
  150. btc_msg_t msg;
  151. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  152. msg.sig = BTC_SIG_API_CALL;
  153. msg.pid = BTC_PID_GAP_BLE;
  154. msg.act = BTC_GAP_BLE_ACT_CLEAR_RAND_ADDRESS;
  155. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  156. }
  157. esp_err_t esp_ble_gap_config_local_privacy (bool privacy_enable)
  158. {
  159. btc_msg_t msg;
  160. btc_ble_gap_args_t arg;
  161. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  162. msg.sig = BTC_SIG_API_CALL;
  163. msg.pid = BTC_PID_GAP_BLE;
  164. msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY;
  165. arg.cfg_local_privacy.privacy_enable = privacy_enable;
  166. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  167. }
  168. esp_err_t esp_ble_gap_config_local_icon (uint16_t icon)
  169. {
  170. esp_err_t ret;
  171. btc_msg_t msg;
  172. btc_ble_gap_args_t arg;
  173. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  174. switch (icon) {
  175. case ESP_BLE_APPEARANCE_GENERIC_PHONE:
  176. case ESP_BLE_APPEARANCE_GENERIC_COMPUTER:
  177. case ESP_BLE_APPEARANCE_GENERIC_REMOTE:
  178. case ESP_BLE_APPEARANCE_GENERIC_THERMOMETER:
  179. case ESP_BLE_APPEARANCE_THERMOMETER_EAR:
  180. case ESP_BLE_APPEARANCE_GENERIC_HEART_RATE:
  181. case ESP_BLE_APPEARANCE_HEART_RATE_BELT:
  182. case ESP_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
  183. case ESP_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
  184. case ESP_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
  185. case ESP_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
  186. case ESP_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
  187. case ESP_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
  188. case ESP_BLE_APPEARANCE_GENERIC_GLUCOSE:
  189. case ESP_BLE_APPEARANCE_GENERIC_WEIGHT:
  190. case ESP_BLE_APPEARANCE_GENERIC_WALKING:
  191. case ESP_BLE_APPEARANCE_WALKING_IN_SHOE:
  192. case ESP_BLE_APPEARANCE_WALKING_ON_SHOE:
  193. case ESP_BLE_APPEARANCE_WALKING_ON_HIP:
  194. case ESP_BLE_APPEARANCE_GENERIC_WATCH:
  195. case ESP_BLE_APPEARANCE_SPORTS_WATCH:
  196. case ESP_BLE_APPEARANCE_GENERIC_EYEGLASSES:
  197. case ESP_BLE_APPEARANCE_GENERIC_DISPLAY:
  198. case ESP_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
  199. case ESP_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
  200. case ESP_BLE_APPEARANCE_HID_BARCODE_SCANNER:
  201. case ESP_BLE_APPEARANCE_GENERIC_HID:
  202. case ESP_BLE_APPEARANCE_HID_KEYBOARD:
  203. case ESP_BLE_APPEARANCE_HID_MOUSE:
  204. case ESP_BLE_APPEARANCE_HID_JOYSTICK:
  205. case ESP_BLE_APPEARANCE_HID_GAMEPAD:
  206. case ESP_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
  207. case ESP_BLE_APPEARANCE_HID_CARD_READER:
  208. case ESP_BLE_APPEARANCE_HID_DIGITAL_PEN:
  209. case ESP_BLE_APPEARANCE_UNKNOWN:
  210. case ESP_BLE_APPEARANCE_GENERIC_CLOCK:
  211. case ESP_BLE_APPEARANCE_GENERIC_TAG:
  212. case ESP_BLE_APPEARANCE_GENERIC_KEYRING:
  213. case ESP_BLE_APPEARANCE_GENERIC_CYCLING:
  214. case ESP_BLE_APPEARANCE_CYCLING_COMPUTER:
  215. case ESP_BLE_APPEARANCE_CYCLING_SPEED:
  216. case ESP_BLE_APPEARANCE_CYCLING_CADENCE:
  217. case ESP_BLE_APPEARANCE_CYCLING_POWER:
  218. case ESP_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
  219. case ESP_BLE_APPEARANCE_GENERIC_PERSONAL_MOBILITY_DEVICE:
  220. case ESP_BLE_APPEARANCE_POWERED_WHEELCHAIR:
  221. case ESP_BLE_APPEARANCE_MOBILITY_SCOOTER:
  222. case ESP_BLE_APPEARANCE_GENERIC_CONTINUOUS_GLUCOSE_MONITOR:
  223. case ESP_BLE_APPEARANCE_GENERIC_INSULIN_PUMP:
  224. case ESP_BLE_APPEARANCE_INSULIN_PUMP_DURABLE_PUMP:
  225. case ESP_BLE_APPEARANCE_INSULIN_PUMP_PATCH_PUMP:
  226. case ESP_BLE_APPEARANCE_INSULIN_PEN:
  227. case ESP_BLE_APPEARANCE_GENERIC_MEDICATION_DELIVERY:
  228. case ESP_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
  229. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
  230. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
  231. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
  232. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
  233. msg.sig = BTC_SIG_API_CALL;
  234. msg.pid = BTC_PID_GAP_BLE;
  235. msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_ICON;
  236. arg.cfg_local_icon.icon = icon;
  237. ret = (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  238. break;
  239. default:
  240. ret = ESP_ERR_INVALID_ARG;
  241. break;
  242. }
  243. return ret;
  244. }
  245. esp_err_t esp_ble_gap_update_whitelist(bool add_remove, esp_bd_addr_t remote_bda, esp_ble_wl_addr_type_t wl_addr_type)
  246. {
  247. btc_msg_t msg;
  248. btc_ble_gap_args_t arg;
  249. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  250. return ESP_ERR_INVALID_STATE;
  251. }
  252. if (!remote_bda){
  253. return ESP_ERR_INVALID_SIZE;
  254. }
  255. msg.sig = BTC_SIG_API_CALL;
  256. msg.pid = BTC_PID_GAP_BLE;
  257. msg.act = BTC_GAP_BLE_ACT_UPDATE_WHITE_LIST;
  258. arg.update_white_list.add_remove = add_remove;
  259. arg.update_white_list.wl_addr_type = wl_addr_type;
  260. memcpy(arg.update_white_list.remote_bda, remote_bda, sizeof(esp_bd_addr_t));
  261. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  262. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  263. }
  264. esp_err_t esp_ble_gap_clear_whitelist(void)
  265. {
  266. btc_msg_t msg;
  267. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  268. return ESP_ERR_INVALID_STATE;
  269. }
  270. msg.sig = BTC_SIG_API_CALL;
  271. msg.pid = BTC_PID_GAP_BLE;
  272. msg.act = BTC_GAP_BLE_ACT_CLEAR_WHITE_LIST;
  273. return (btc_transfer_context(&msg, NULL, 0, NULL)
  274. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  275. }
  276. esp_err_t esp_ble_gap_get_whitelist_size(uint16_t *length)
  277. {
  278. if (length == NULL) {
  279. return ESP_FAIL;
  280. }
  281. btc_get_whitelist_size(length);
  282. return ESP_OK;
  283. }
  284. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  285. esp_err_t esp_ble_gap_set_prefer_conn_params(esp_bd_addr_t bd_addr,
  286. uint16_t min_conn_int, uint16_t max_conn_int,
  287. uint16_t slave_latency, uint16_t supervision_tout)
  288. {
  289. btc_msg_t msg;
  290. btc_ble_gap_args_t arg;
  291. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  292. return ESP_ERR_INVALID_STATE;
  293. }
  294. if (ESP_BLE_IS_VALID_PARAM(min_conn_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
  295. ESP_BLE_IS_VALID_PARAM(max_conn_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
  296. ESP_BLE_IS_VALID_PARAM(supervision_tout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
  297. (slave_latency <= ESP_BLE_CONN_LATENCY_MAX || slave_latency == ESP_BLE_CONN_PARAM_UNDEF) &&
  298. ((supervision_tout * 10) >= ((1 + slave_latency) * ((max_conn_int * 5) >> 1))) && min_conn_int <= max_conn_int) {
  299. msg.sig = BTC_SIG_API_CALL;
  300. msg.pid = BTC_PID_GAP_BLE;
  301. msg.act = BTC_GAP_BLE_ACT_SET_CONN_PARAMS;
  302. arg.set_conn_params.min_conn_int = min_conn_int;
  303. arg.set_conn_params.max_conn_int = max_conn_int;
  304. arg.set_conn_params.slave_latency = slave_latency;
  305. arg.set_conn_params.supervision_tout = supervision_tout;
  306. memcpy(arg.set_conn_params.bd_addr, bd_addr, sizeof(esp_bd_addr_t));
  307. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  308. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  309. } else {
  310. LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d",\
  311. __func__, min_conn_int, max_conn_int, slave_latency, supervision_tout);
  312. return ESP_FAIL;
  313. }
  314. }
  315. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  316. esp_err_t esp_ble_gap_set_device_name(const char *name)
  317. {
  318. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  319. return esp_bt_dev_set_device_name(name);
  320. }
  321. esp_err_t esp_ble_gap_get_local_used_addr(esp_bd_addr_t local_used_addr, uint8_t * addr_type)
  322. {
  323. if(esp_bluedroid_get_status() != (ESP_BLUEDROID_STATUS_ENABLED)) {
  324. LOG_ERROR("%s, bluedroid status error", __func__);
  325. return ESP_FAIL;
  326. }
  327. if(!BTM_BleGetCurrentAddress(local_used_addr, addr_type)) {
  328. return ESP_FAIL;
  329. }
  330. return ESP_OK;
  331. }
  332. uint8_t *esp_ble_resolve_adv_data( uint8_t *adv_data, uint8_t type, uint8_t *length)
  333. {
  334. if (((type < ESP_BLE_AD_TYPE_FLAG) || (type > ESP_BLE_AD_TYPE_128SERVICE_DATA)) &&
  335. (type != ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE)) {
  336. LOG_ERROR("the eir type not define, type = %x\n", type);
  337. return NULL;
  338. }
  339. if (adv_data == NULL) {
  340. LOG_ERROR("Invalid p_eir data.\n");
  341. return NULL;
  342. }
  343. return (BTM_CheckAdvData( adv_data, type, length));
  344. }
  345. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  346. esp_err_t esp_ble_gap_config_adv_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
  347. {
  348. btc_msg_t msg;
  349. btc_ble_gap_args_t arg;
  350. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  351. if (raw_data == NULL
  352. || (raw_data_len <= 0 || raw_data_len > ESP_BLE_ADV_DATA_LEN_MAX)) {
  353. return ESP_ERR_INVALID_ARG;
  354. }
  355. msg.sig = BTC_SIG_API_CALL;
  356. msg.pid = BTC_PID_GAP_BLE;
  357. msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA_RAW;
  358. arg.cfg_adv_data_raw.raw_adv = raw_data;
  359. arg.cfg_adv_data_raw.raw_adv_len = raw_data_len;
  360. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  361. }
  362. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  363. esp_err_t esp_ble_gap_read_rssi(esp_bd_addr_t remote_addr)
  364. {
  365. btc_msg_t msg;
  366. btc_ble_gap_args_t arg;
  367. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  368. return ESP_ERR_INVALID_STATE;
  369. }
  370. msg.sig = BTC_SIG_API_CALL;
  371. msg.pid = BTC_PID_GAP_BLE;
  372. msg.act = BTC_GAP_BLE_ACT_READ_RSSI;
  373. memcpy(arg.read_rssi.remote_addr, remote_addr, sizeof(esp_bd_addr_t));
  374. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  375. }
  376. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  377. esp_err_t esp_ble_gap_config_scan_rsp_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
  378. {
  379. btc_msg_t msg;
  380. btc_ble_gap_args_t arg;
  381. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  382. if (raw_data == NULL
  383. || (raw_data_len <= 0 || raw_data_len > ESP_BLE_SCAN_RSP_DATA_LEN_MAX)) {
  384. return ESP_ERR_INVALID_ARG;
  385. }
  386. msg.sig = BTC_SIG_API_CALL;
  387. msg.pid = BTC_PID_GAP_BLE;
  388. msg.act = BTC_GAP_BLE_ACT_CFG_SCAN_RSP_DATA_RAW;
  389. arg.cfg_scan_rsp_data_raw.raw_scan_rsp = raw_data;
  390. arg.cfg_scan_rsp_data_raw.raw_scan_rsp_len = raw_data_len;
  391. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  392. }
  393. esp_err_t esp_ble_gap_add_duplicate_scan_exceptional_device(esp_ble_duplicate_exceptional_info_type_t type, esp_duplicate_info_t device_info)
  394. {
  395. btc_msg_t msg;
  396. btc_ble_gap_args_t arg;
  397. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  398. return ESP_ERR_INVALID_STATE;
  399. }
  400. if (!device_info && type <= ESP_BLE_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID) {
  401. return ESP_ERR_INVALID_SIZE;
  402. }
  403. msg.sig = BTC_SIG_API_CALL;
  404. msg.pid = BTC_PID_GAP_BLE;
  405. msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
  406. arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_ADD;
  407. arg.update_duplicate_exceptional_list.info_type = type;
  408. if (device_info) {
  409. memcpy(arg.update_duplicate_exceptional_list.device_info, device_info, sizeof(esp_bd_addr_t));
  410. }
  411. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  412. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  413. }
  414. esp_err_t esp_ble_gap_remove_duplicate_scan_exceptional_device(esp_ble_duplicate_exceptional_info_type_t type, esp_duplicate_info_t device_info)
  415. {
  416. btc_msg_t msg;
  417. btc_ble_gap_args_t arg;
  418. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  419. return ESP_ERR_INVALID_STATE;
  420. }
  421. if (!device_info && type <= ESP_BLE_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID) {
  422. return ESP_ERR_INVALID_SIZE;
  423. }
  424. msg.sig = BTC_SIG_API_CALL;
  425. msg.pid = BTC_PID_GAP_BLE;
  426. msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
  427. arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_REMOVE;
  428. arg.update_duplicate_exceptional_list.info_type = type;
  429. if (device_info) {
  430. memcpy(arg.update_duplicate_exceptional_list.device_info, device_info, sizeof(esp_bd_addr_t));
  431. }
  432. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  433. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  434. }
  435. esp_err_t esp_ble_gap_clean_duplicate_scan_exceptional_list(esp_duplicate_scan_exceptional_list_type_t list_type)
  436. {
  437. btc_msg_t msg;
  438. btc_ble_gap_args_t arg;
  439. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  440. return ESP_ERR_INVALID_STATE;
  441. }
  442. msg.sig = BTC_SIG_API_CALL;
  443. msg.pid = BTC_PID_GAP_BLE;
  444. msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
  445. arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_CLEAN;
  446. arg.update_duplicate_exceptional_list.info_type = list_type;
  447. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  448. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  449. }
  450. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  451. #if (SMP_INCLUDED == TRUE)
  452. esp_err_t esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type,
  453. void *value, uint8_t len)
  454. {
  455. if(param_type >= ESP_BLE_SM_MAX_PARAM) {
  456. return ESP_ERR_INVALID_ARG;
  457. }
  458. if((param_type != ESP_BLE_SM_CLEAR_STATIC_PASSKEY) && ( value == NULL || len < sizeof(uint8_t) || len > sizeof(uint32_t))) {
  459. return ESP_ERR_INVALID_ARG;
  460. }
  461. if((param_type == ESP_BLE_SM_SET_STATIC_PASSKEY)) {
  462. uint32_t passkey = 0;
  463. for(uint8_t i = 0; i < len; i++)
  464. {
  465. passkey += (((uint8_t *)value)[i]<<(8*i));
  466. }
  467. if(passkey > 999999) {
  468. return ESP_ERR_INVALID_ARG;
  469. }
  470. }
  471. btc_msg_t msg;
  472. btc_ble_gap_args_t arg;
  473. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  474. msg.sig = BTC_SIG_API_CALL;
  475. msg.pid = BTC_PID_GAP_BLE;
  476. msg.act = BTC_GAP_BLE_SET_SECURITY_PARAM_EVT;
  477. arg.set_security_param.param_type = param_type;
  478. arg.set_security_param.len = len;
  479. arg.set_security_param.value = value;
  480. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy)
  481. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  482. }
  483. esp_err_t esp_ble_set_encryption(esp_bd_addr_t bd_addr, esp_ble_sec_act_t sec_act)
  484. {
  485. btc_msg_t msg;
  486. btc_ble_gap_args_t arg;
  487. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  488. msg.sig = BTC_SIG_API_CALL;
  489. msg.pid = BTC_PID_GAP_BLE;
  490. msg.act = BTC_GAP_BLE_SET_ENCRYPTION_EVT;
  491. arg.set_encryption.sec_act = sec_act;
  492. memcpy(arg.set_encryption.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  493. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  494. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  495. }
  496. esp_err_t esp_ble_gap_security_rsp(esp_bd_addr_t bd_addr, bool accept)
  497. {
  498. btc_msg_t msg;
  499. btc_ble_gap_args_t arg;
  500. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  501. msg.sig = BTC_SIG_API_CALL;
  502. msg.pid = BTC_PID_GAP_BLE;
  503. msg.act = BTC_GAP_BLE_SECURITY_RSP_EVT;
  504. arg.sec_rsp.accept = accept;
  505. memcpy(arg.sec_rsp.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  506. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  507. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  508. }
  509. esp_err_t esp_ble_passkey_reply(esp_bd_addr_t bd_addr, bool accept, uint32_t passkey)
  510. {
  511. btc_msg_t msg;
  512. btc_ble_gap_args_t arg;
  513. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  514. msg.sig = BTC_SIG_API_CALL;
  515. msg.pid = BTC_PID_GAP_BLE;
  516. msg.act = BTC_GAP_BLE_PASSKEY_REPLY_EVT;
  517. arg.enc_passkey_replay.accept = accept;
  518. arg.enc_passkey_replay.passkey = passkey;
  519. memcpy(arg.enc_passkey_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  520. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  521. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  522. }
  523. esp_err_t esp_ble_confirm_reply(esp_bd_addr_t bd_addr, bool accept)
  524. {
  525. btc_msg_t msg;
  526. btc_ble_gap_args_t arg;
  527. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  528. msg.sig = BTC_SIG_API_CALL;
  529. msg.pid = BTC_PID_GAP_BLE;
  530. msg.act = BTC_GAP_BLE_CONFIRM_REPLY_EVT;
  531. arg.enc_comfirm_replay.accept = accept;
  532. memcpy(arg.enc_comfirm_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  533. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  534. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  535. }
  536. esp_err_t esp_ble_remove_bond_device(esp_bd_addr_t bd_addr)
  537. {
  538. btc_msg_t msg;
  539. btc_ble_gap_args_t arg;
  540. msg.sig = BTC_SIG_API_CALL;
  541. msg.pid = BTC_PID_GAP_BLE;
  542. msg.act = BTC_GAP_BLE_REMOVE_BOND_DEV_EVT;
  543. memcpy(arg.remove_bond_device.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  544. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  545. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  546. }
  547. int esp_ble_get_bond_device_num(void)
  548. {
  549. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  550. return ESP_FAIL;
  551. }
  552. return btc_storage_get_num_ble_bond_devices();
  553. }
  554. esp_err_t esp_ble_get_bond_device_list(int *dev_num, esp_ble_bond_dev_t *dev_list)
  555. {
  556. int ret;
  557. int dev_num_total;
  558. if (dev_num == NULL || dev_list == NULL) {
  559. return ESP_ERR_INVALID_ARG;
  560. }
  561. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  562. dev_num_total = btc_storage_get_num_ble_bond_devices();
  563. if (*dev_num > dev_num_total) {
  564. *dev_num = dev_num_total;
  565. }
  566. ret = btc_storage_get_bonded_ble_devices_list(dev_list, *dev_num);
  567. return (ret == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  568. }
  569. esp_err_t esp_ble_oob_req_reply(esp_bd_addr_t bd_addr, uint8_t *TK, uint8_t len)
  570. {
  571. if(len != ESP_BT_OCTET16_LEN) {
  572. return ESP_ERR_INVALID_ARG;
  573. }
  574. btc_msg_t msg;
  575. btc_ble_gap_args_t arg;
  576. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  577. msg.sig = BTC_SIG_API_CALL;
  578. msg.pid = BTC_PID_GAP_BLE;
  579. msg.act = BTC_GAP_BLE_OOB_REQ_REPLY_EVT;
  580. memcpy(arg.oob_req_reply.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  581. arg.oob_req_reply.len = len;
  582. arg.oob_req_reply.p_value = TK;
  583. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy)
  584. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  585. }
  586. #endif /* #if (SMP_INCLUDED == TRUE) */
  587. esp_err_t esp_ble_gap_disconnect(esp_bd_addr_t remote_device)
  588. {
  589. btc_msg_t msg;
  590. btc_ble_gap_args_t arg;
  591. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  592. msg.sig = BTC_SIG_API_CALL;
  593. msg.pid = BTC_PID_GAP_BLE;
  594. msg.act = BTC_GAP_BLE_DISCONNECT_EVT;
  595. memcpy(arg.disconnect.remote_device, remote_device, ESP_BD_ADDR_LEN);
  596. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  597. }
  598. esp_err_t esp_ble_get_current_conn_params(esp_bd_addr_t bd_addr, esp_gap_conn_params_t *conn_params)
  599. {
  600. if(!bd_addr || !conn_params) {
  601. return ESP_ERR_INVALID_ARG;
  602. }
  603. if(BTM_GetCurrentConnParams(bd_addr, &conn_params->interval, &conn_params->latency, &conn_params->timeout)) {
  604. return ESP_OK;
  605. }
  606. return ESP_ERR_NOT_FOUND;
  607. }
  608. esp_err_t esp_gap_ble_set_channels(esp_gap_ble_channels channels)
  609. {
  610. btc_msg_t msg;
  611. btc_ble_gap_args_t arg;
  612. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  613. return ESP_ERR_INVALID_STATE;
  614. }
  615. msg.sig = BTC_SIG_API_CALL;
  616. msg.pid = BTC_PID_GAP_BLE;
  617. msg.act = BTC_GAP_BLE_SET_AFH_CHANNELS;
  618. memcpy(&arg.set_channels.channels, channels, ESP_GAP_BLE_CHANNELS_LEN);
  619. arg.set_channels.channels[ESP_GAP_BLE_CHANNELS_LEN -1] &= 0x1F;
  620. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  621. }
  622. esp_err_t esp_gap_ble_set_authorization(esp_bd_addr_t bd_addr, bool authorize)
  623. {
  624. if (!bd_addr) {
  625. return ESP_ERR_INVALID_ARG;
  626. }
  627. if (BTM_Ble_Authorization(bd_addr, authorize)) {
  628. return ESP_OK;
  629. }
  630. return ESP_FAIL;
  631. }
  632. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  633. esp_err_t esp_ble_gap_read_phy(esp_bd_addr_t bd_addr)
  634. {
  635. btc_msg_t msg;
  636. btc_ble_5_gap_args_t arg;
  637. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  638. msg.sig = BTC_SIG_API_CALL;
  639. msg.pid = BTC_PID_GAP_BLE;
  640. msg.act = BTC_GAP_BLE_READ_PHY;
  641. memcpy(arg.read_phy.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  642. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  643. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  644. }
  645. esp_err_t esp_ble_gap_set_prefered_default_phy(esp_ble_gap_phy_mask_t tx_phy_mask,
  646. esp_ble_gap_phy_mask_t rx_phy_mask)
  647. {
  648. btc_msg_t msg;
  649. btc_ble_5_gap_args_t arg;
  650. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  651. msg.sig = BTC_SIG_API_CALL;
  652. msg.pid = BTC_PID_GAP_BLE;
  653. msg.act = BTC_GAP_BLE_SET_PREFERED_DEF_PHY;
  654. arg.set_perf_def_phy.tx_phy_mask = tx_phy_mask;
  655. arg.set_perf_def_phy.rx_phy_mask = rx_phy_mask;
  656. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  657. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  658. }
  659. esp_err_t esp_ble_gap_set_prefered_phy(esp_bd_addr_t bd_addr,
  660. esp_ble_gap_all_phys_t all_phys_mask,
  661. esp_ble_gap_phy_mask_t tx_phy_mask,
  662. esp_ble_gap_phy_mask_t rx_phy_mask,
  663. esp_ble_gap_prefer_phy_options_t phy_options)
  664. {
  665. btc_msg_t msg;
  666. btc_ble_5_gap_args_t arg;
  667. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  668. msg.sig = BTC_SIG_API_CALL;
  669. msg.pid = BTC_PID_GAP_BLE;
  670. msg.act = BTC_GAP_BLE_SET_DEF_PHY;
  671. memcpy(arg.set_def_phy.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  672. arg.set_def_phy.all_phys_mask = all_phys_mask;
  673. arg.set_def_phy.tx_phy_mask = tx_phy_mask;
  674. arg.set_def_phy.rx_phy_mask = rx_phy_mask;
  675. arg.set_def_phy.phy_options = phy_options;
  676. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  677. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  678. }
  679. esp_err_t esp_ble_gap_ext_adv_set_rand_addr(uint8_t instance, esp_bd_addr_t rand_addr)
  680. {
  681. btc_msg_t msg;
  682. btc_ble_5_gap_args_t arg;
  683. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  684. msg.sig = BTC_SIG_API_CALL;
  685. msg.pid = BTC_PID_GAP_BLE;
  686. msg.act = BTC_GAP_BLE_SET_EXT_ADV_RAND_ADDR;
  687. arg.ext_adv_set_rand_addr.instance = instance;
  688. memcpy(arg.ext_adv_set_rand_addr.rand_addr, rand_addr, BD_ADDR_LEN);
  689. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  690. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  691. }
  692. esp_err_t esp_ble_gap_ext_adv_set_params(uint8_t instance,
  693. const esp_ble_gap_ext_adv_params_t *params)
  694. {
  695. btc_msg_t msg;
  696. btc_ble_5_gap_args_t arg;
  697. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  698. msg.sig = BTC_SIG_API_CALL;
  699. msg.pid = BTC_PID_GAP_BLE;
  700. msg.act = BTC_GAP_BLE_SET_EXT_ADV_PARAMS;
  701. arg.ext_adv_set_params.instance = instance;
  702. memcpy(&arg.ext_adv_set_params.params, params, sizeof(esp_ble_gap_ext_adv_params_t));
  703. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  704. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  705. }
  706. esp_err_t esp_ble_gap_config_ext_adv_data_raw(uint8_t instance, uint16_t length,
  707. const uint8_t *data)
  708. {
  709. btc_msg_t msg;
  710. btc_ble_5_gap_args_t arg;
  711. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  712. msg.sig = BTC_SIG_API_CALL;
  713. msg.pid = BTC_PID_GAP_BLE;
  714. msg.act = BTC_GAP_BLE_CFG_EXT_ADV_DATA_RAW;
  715. arg.ext_adv_cfg_data.instance = instance;
  716. arg.ext_adv_cfg_data.length = length;
  717. arg.ext_adv_cfg_data.data = (uint8_t *)data;
  718. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  719. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  720. }
  721. esp_err_t esp_ble_gap_config_ext_scan_rsp_data_raw(uint8_t instance, uint16_t length,
  722. const uint8_t *scan_rsp_data)
  723. {
  724. btc_msg_t msg;
  725. btc_ble_5_gap_args_t arg;
  726. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  727. msg.sig = BTC_SIG_API_CALL;
  728. msg.pid = BTC_PID_GAP_BLE;
  729. msg.act = BTC_GAP_BLE_CFG_EXT_SCAN_RSP_DATA_RAW;
  730. arg.cfg_scan_rsp.instance = instance;
  731. arg.cfg_scan_rsp.length = length;
  732. arg.cfg_scan_rsp.data = (uint8_t *)scan_rsp_data;
  733. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  734. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  735. }
  736. esp_err_t esp_ble_gap_ext_adv_start(uint8_t num_adv, const esp_ble_gap_ext_adv_t *ext_adv)
  737. {
  738. btc_msg_t msg;
  739. btc_ble_5_gap_args_t arg;
  740. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  741. msg.sig = BTC_SIG_API_CALL;
  742. msg.pid = BTC_PID_GAP_BLE;
  743. msg.act = BTC_GAP_BLE_EXT_ADV_START;
  744. arg.ext_adv_start.num_adv = num_adv;
  745. arg.ext_adv_start.ext_adv = (esp_ble_gap_ext_adv_t *)ext_adv;
  746. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  747. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  748. }
  749. esp_err_t esp_ble_gap_ext_adv_stop(uint8_t num_adv, const uint8_t *ext_adv_inst)
  750. {
  751. btc_msg_t msg;
  752. btc_ble_5_gap_args_t arg;
  753. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  754. msg.sig = BTC_SIG_API_CALL;
  755. msg.pid = BTC_PID_GAP_BLE;
  756. msg.act = BTC_GAP_BLE_EXT_ADV_STOP;
  757. arg.ext_adv_stop.num_adv = num_adv;
  758. arg.ext_adv_stop.ext_adv_inst = (uint8_t *)ext_adv_inst;
  759. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  760. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  761. }
  762. esp_err_t esp_ble_gap_ext_adv_set_remove(uint8_t instance)
  763. {
  764. btc_msg_t msg;
  765. btc_ble_5_gap_args_t arg;
  766. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  767. msg.sig = BTC_SIG_API_CALL;
  768. msg.pid = BTC_PID_GAP_BLE;
  769. msg.act = BTC_GAP_BLE_EXT_ADV_SET_REMOVE;
  770. arg.ext_adv_set_remove.instance = instance;
  771. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  772. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  773. }
  774. esp_err_t esp_ble_gap_ext_adv_set_clear(void)
  775. {
  776. btc_msg_t msg;
  777. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  778. msg.sig = BTC_SIG_API_CALL;
  779. msg.pid = BTC_PID_GAP_BLE;
  780. msg.act = BTC_GAP_BLE_EXT_ADV_SET_CLEAR;
  781. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  782. }
  783. esp_err_t esp_ble_gap_periodic_adv_set_params(uint8_t instance, const esp_ble_gap_periodic_adv_params_t *params)
  784. {
  785. btc_msg_t msg;
  786. btc_ble_5_gap_args_t arg;
  787. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  788. msg.sig = BTC_SIG_API_CALL;
  789. msg.pid = BTC_PID_GAP_BLE;
  790. msg.act = BTC_GAP_BLE_SET_PERIODIC_ADV_PARAMS;
  791. arg.peridic_adv_set_params.instance = instance;
  792. memcpy(&arg.peridic_adv_set_params.params, params, sizeof(esp_ble_gap_periodic_adv_params_t));
  793. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  794. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  795. }
  796. esp_err_t esp_ble_gap_config_periodic_adv_data_raw(uint8_t instance, uint16_t length,
  797. const uint8_t *data)
  798. {
  799. btc_msg_t msg;
  800. btc_ble_5_gap_args_t arg;
  801. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  802. msg.sig = BTC_SIG_API_CALL;
  803. msg.pid = BTC_PID_GAP_BLE;
  804. msg.act = BTC_GAP_BLE_CFG_PERIODIC_ADV_DATA_RAW;
  805. arg.periodic_adv_cfg_data.instance = instance;
  806. arg.periodic_adv_cfg_data.len = length;
  807. arg.periodic_adv_cfg_data.data = (uint8_t *)data;
  808. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  809. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  810. }
  811. esp_err_t esp_ble_gap_periodic_adv_start(uint8_t instance)
  812. {
  813. btc_msg_t msg;
  814. btc_ble_5_gap_args_t arg;
  815. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  816. msg.sig = BTC_SIG_API_CALL;
  817. msg.pid = BTC_PID_GAP_BLE;
  818. msg.act = BTC_GAP_BLE_PERIODIC_ADV_START;
  819. arg.periodic_adv_start.instance = instance;
  820. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  821. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  822. }
  823. esp_err_t esp_ble_gap_periodic_adv_stop(uint8_t instance)
  824. {
  825. btc_msg_t msg;
  826. btc_ble_5_gap_args_t arg;
  827. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  828. msg.sig = BTC_SIG_API_CALL;
  829. msg.pid = BTC_PID_GAP_BLE;
  830. msg.act = BTC_GAP_BLE_PERIODIC_ADV_STOP;
  831. arg.periodic_adv_stop.instance = instance;
  832. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  833. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  834. }
  835. esp_err_t esp_ble_gap_periodic_adv_create_sync(const esp_ble_gap_periodic_adv_sync_params_t *params)
  836. {
  837. btc_msg_t msg;
  838. btc_ble_5_gap_args_t arg;
  839. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  840. msg.sig = BTC_SIG_API_CALL;
  841. msg.pid = BTC_PID_GAP_BLE;
  842. msg.act = BTC_GAP_BLE_PERIODIC_ADV_CREATE_SYNC;
  843. memcpy(&arg.periodic_adv_create_sync.params, params, sizeof(esp_ble_gap_periodic_adv_sync_params_t));
  844. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  845. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  846. }
  847. esp_err_t esp_ble_gap_periodic_adv_sync_cancel(void)
  848. {
  849. btc_msg_t msg;
  850. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  851. msg.sig = BTC_SIG_API_CALL;
  852. msg.pid = BTC_PID_GAP_BLE;
  853. msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_CANCEL;
  854. return (btc_transfer_context(&msg, NULL, 0, NULL)
  855. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  856. }
  857. esp_err_t esp_ble_gap_periodic_adv_sync_terminate(uint16_t sync_handle)
  858. {
  859. btc_msg_t msg;
  860. btc_ble_5_gap_args_t arg;
  861. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  862. msg.sig = BTC_SIG_API_CALL;
  863. msg.pid = BTC_PID_GAP_BLE;
  864. msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_TERMINATE;
  865. arg.periodic_adv_sync_term.sync_handle = sync_handle;
  866. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  867. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  868. }
  869. esp_err_t esp_ble_gap_periodic_adv_add_dev_to_list(esp_ble_addr_type_t addr_type,
  870. esp_bd_addr_t addr,
  871. uint8_t sid)
  872. {
  873. btc_msg_t msg;
  874. btc_ble_5_gap_args_t arg;
  875. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  876. msg.sig = BTC_SIG_API_CALL;
  877. msg.pid = BTC_PID_GAP_BLE;
  878. msg.act = BTC_GAP_BLE_PERIODIC_ADV_ADD_DEV_TO_LIST;
  879. arg.periodic_adv_add_dev.addr_type = addr_type;
  880. arg.periodic_adv_add_dev.sid = sid;
  881. memcpy(arg.periodic_adv_add_dev.addr, addr, sizeof(esp_bd_addr_t));
  882. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  883. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  884. }
  885. esp_err_t esp_ble_gap_periodic_adv_remove_dev_from_list(esp_ble_addr_type_t addr_type,
  886. esp_bd_addr_t addr,
  887. uint8_t sid)
  888. {
  889. btc_msg_t msg;
  890. btc_ble_5_gap_args_t arg;
  891. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  892. msg.sig = BTC_SIG_API_CALL;
  893. msg.pid = BTC_PID_GAP_BLE;
  894. msg.act = BTC_GAP_BLE_PERIODIC_REMOVE_ADD_DEV_FROM_LIST;
  895. arg.periodic_adv_remove_dev.addr_type = addr_type;
  896. arg.periodic_adv_remove_dev.sid = sid;
  897. memcpy(arg.periodic_adv_remove_dev.addr, addr, sizeof(esp_bd_addr_t));
  898. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  899. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  900. }
  901. esp_err_t esp_ble_gap_periodic_adv_clear_dev(void)
  902. {
  903. btc_msg_t msg;
  904. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  905. msg.sig = BTC_SIG_API_CALL;
  906. msg.pid = BTC_PID_GAP_BLE;
  907. msg.act = BTC_GAP_BLE_PERIODIC_CLEAR_DEV;
  908. return (btc_transfer_context(&msg, NULL, 0, NULL)
  909. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  910. }
  911. esp_err_t esp_ble_gap_set_ext_scan_params(const esp_ble_ext_scan_params_t *params)
  912. {
  913. btc_msg_t msg;
  914. btc_ble_5_gap_args_t arg;
  915. if (!params) {
  916. return ESP_ERR_INVALID_ARG;
  917. }
  918. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  919. msg.sig = BTC_SIG_API_CALL;
  920. msg.pid = BTC_PID_GAP_BLE;
  921. msg.act = BTC_GAP_BLE_SET_EXT_SCAN_PARAMS;
  922. memcpy(&arg.set_ext_scan_params.params, params, sizeof(esp_ble_ext_scan_params_t));
  923. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  924. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  925. }
  926. esp_err_t esp_ble_gap_start_ext_scan(uint32_t duration, uint16_t period)
  927. {
  928. btc_msg_t msg;
  929. btc_ble_5_gap_args_t arg;
  930. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  931. msg.sig = BTC_SIG_API_CALL;
  932. msg.pid = BTC_PID_GAP_BLE;
  933. msg.act = BTC_GAP_BLE_START_EXT_SCAN;
  934. arg.start_ext_scan.duration = duration;
  935. arg.start_ext_scan.period = period;
  936. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  937. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  938. }
  939. esp_err_t esp_ble_gap_stop_ext_scan(void)
  940. {
  941. btc_msg_t msg;
  942. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  943. msg.sig = BTC_SIG_API_CALL;
  944. msg.pid = BTC_PID_GAP_BLE;
  945. msg.act = BTC_GAP_BLE_STOP_EXT_SCAN;
  946. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  947. }
  948. esp_err_t esp_ble_gap_prefer_ext_connect_params_set(esp_bd_addr_t addr,
  949. esp_ble_gap_phy_mask_t phy_mask,
  950. const esp_ble_gap_conn_params_t *phy_1m_conn_params,
  951. const esp_ble_gap_conn_params_t *phy_2m_conn_params,
  952. const esp_ble_gap_conn_params_t *phy_coded_conn_params)
  953. {
  954. btc_msg_t msg;
  955. btc_ble_5_gap_args_t arg;
  956. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  957. msg.sig = BTC_SIG_API_CALL;
  958. msg.pid = BTC_PID_GAP_BLE;
  959. msg.act = BTC_GAP_BLE_SET_EXT_PEFER_CONNET_PARAMS;
  960. arg.set_ext_conn_params.phy_mask = phy_mask;
  961. if (phy_mask & ESP_BLE_GAP_PHY_1M_PREF_MASK) {
  962. if (!phy_1m_conn_params) {
  963. return BT_STATUS_PARM_INVALID;
  964. }
  965. memcpy(&arg.set_ext_conn_params.phy_1m_conn_params,
  966. phy_1m_conn_params, sizeof(esp_ble_gap_conn_params_t));
  967. }
  968. if (phy_mask & ESP_BLE_GAP_PHY_2M_PREF_MASK) {
  969. if (!phy_2m_conn_params) {
  970. return BT_STATUS_PARM_INVALID;
  971. }
  972. memcpy(&arg.set_ext_conn_params.phy_2m_conn_params,
  973. phy_2m_conn_params, sizeof(esp_ble_gap_conn_params_t));
  974. }
  975. if (phy_mask & ESP_BLE_GAP_PHY_CODED_PREF_MASK) {
  976. if (!phy_coded_conn_params) {
  977. return BT_STATUS_PARM_INVALID;
  978. }
  979. memcpy(&arg.set_ext_conn_params.phy_coded_conn_params,
  980. phy_coded_conn_params, sizeof(esp_ble_gap_conn_params_t));
  981. }
  982. memcpy(arg.set_ext_conn_params.addr, addr, sizeof(esp_bd_addr_t));
  983. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  984. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  985. }
  986. #endif //#if (BLE_50_FEATURE_SUPPORT == TRUE)