esp_gap_ble_api.c 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255
  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. msg.sig = BTC_SIG_API_CALL;
  106. msg.pid = BTC_PID_GAP_BLE;
  107. msg.act = BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM;
  108. memcpy(&arg.conn_update_params.conn_params, params, sizeof(esp_ble_conn_update_params_t));
  109. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  110. }
  111. esp_err_t esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device, uint16_t tx_data_length)
  112. {
  113. btc_msg_t msg;
  114. btc_ble_gap_args_t arg;
  115. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  116. msg.sig = BTC_SIG_API_CALL;
  117. msg.pid = BTC_PID_GAP_BLE;
  118. msg.act = BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN;
  119. arg.set_pkt_data_len.tx_data_length = tx_data_length;
  120. memcpy(arg.set_pkt_data_len.remote_device, remote_device, ESP_BD_ADDR_LEN);
  121. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  122. }
  123. esp_err_t esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr)
  124. {
  125. btc_msg_t msg;
  126. btc_ble_gap_args_t arg;
  127. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  128. msg.sig = BTC_SIG_API_CALL;
  129. msg.pid = BTC_PID_GAP_BLE;
  130. msg.act = BTC_GAP_BLE_ACT_SET_RAND_ADDRESS;
  131. memcpy(arg.set_rand_addr.rand_addr, rand_addr, ESP_BD_ADDR_LEN);
  132. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  133. }
  134. esp_err_t esp_ble_gap_clear_rand_addr(void)
  135. {
  136. btc_msg_t msg;
  137. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  138. msg.sig = BTC_SIG_API_CALL;
  139. msg.pid = BTC_PID_GAP_BLE;
  140. msg.act = BTC_GAP_BLE_ACT_CLEAR_RAND_ADDRESS;
  141. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  142. }
  143. esp_err_t esp_ble_gap_config_local_privacy (bool privacy_enable)
  144. {
  145. btc_msg_t msg;
  146. btc_ble_gap_args_t arg;
  147. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  148. msg.sig = BTC_SIG_API_CALL;
  149. msg.pid = BTC_PID_GAP_BLE;
  150. msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY;
  151. arg.cfg_local_privacy.privacy_enable = privacy_enable;
  152. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  153. }
  154. esp_err_t esp_ble_gap_config_local_icon (uint16_t icon)
  155. {
  156. esp_err_t ret;
  157. btc_msg_t msg;
  158. btc_ble_gap_args_t arg;
  159. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  160. switch (icon) {
  161. case ESP_BLE_APPEARANCE_GENERIC_PHONE:
  162. case ESP_BLE_APPEARANCE_GENERIC_COMPUTER:
  163. case ESP_BLE_APPEARANCE_GENERIC_REMOTE:
  164. case ESP_BLE_APPEARANCE_GENERIC_THERMOMETER:
  165. case ESP_BLE_APPEARANCE_THERMOMETER_EAR:
  166. case ESP_BLE_APPEARANCE_GENERIC_HEART_RATE:
  167. case ESP_BLE_APPEARANCE_HEART_RATE_BELT:
  168. case ESP_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
  169. case ESP_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
  170. case ESP_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
  171. case ESP_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
  172. case ESP_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
  173. case ESP_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
  174. case ESP_BLE_APPEARANCE_GENERIC_GLUCOSE:
  175. case ESP_BLE_APPEARANCE_GENERIC_WEIGHT:
  176. case ESP_BLE_APPEARANCE_GENERIC_WALKING:
  177. case ESP_BLE_APPEARANCE_WALKING_IN_SHOE:
  178. case ESP_BLE_APPEARANCE_WALKING_ON_SHOE:
  179. case ESP_BLE_APPEARANCE_WALKING_ON_HIP:
  180. case ESP_BLE_APPEARANCE_GENERIC_WATCH:
  181. case ESP_BLE_APPEARANCE_SPORTS_WATCH:
  182. case ESP_BLE_APPEARANCE_GENERIC_EYEGLASSES:
  183. case ESP_BLE_APPEARANCE_GENERIC_DISPLAY:
  184. case ESP_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
  185. case ESP_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
  186. case ESP_BLE_APPEARANCE_HID_BARCODE_SCANNER:
  187. case ESP_BLE_APPEARANCE_GENERIC_HID:
  188. case ESP_BLE_APPEARANCE_HID_KEYBOARD:
  189. case ESP_BLE_APPEARANCE_HID_MOUSE:
  190. case ESP_BLE_APPEARANCE_HID_JOYSTICK:
  191. case ESP_BLE_APPEARANCE_HID_GAMEPAD:
  192. case ESP_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
  193. case ESP_BLE_APPEARANCE_HID_CARD_READER:
  194. case ESP_BLE_APPEARANCE_HID_DIGITAL_PEN:
  195. case ESP_BLE_APPEARANCE_UNKNOWN:
  196. case ESP_BLE_APPEARANCE_GENERIC_CLOCK:
  197. case ESP_BLE_APPEARANCE_GENERIC_TAG:
  198. case ESP_BLE_APPEARANCE_GENERIC_KEYRING:
  199. case ESP_BLE_APPEARANCE_GENERIC_CYCLING:
  200. case ESP_BLE_APPEARANCE_CYCLING_COMPUTER:
  201. case ESP_BLE_APPEARANCE_CYCLING_SPEED:
  202. case ESP_BLE_APPEARANCE_CYCLING_CADENCE:
  203. case ESP_BLE_APPEARANCE_CYCLING_POWER:
  204. case ESP_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
  205. case ESP_BLE_APPEARANCE_GENERIC_PERSONAL_MOBILITY_DEVICE:
  206. case ESP_BLE_APPEARANCE_POWERED_WHEELCHAIR:
  207. case ESP_BLE_APPEARANCE_MOBILITY_SCOOTER:
  208. case ESP_BLE_APPEARANCE_GENERIC_CONTINUOUS_GLUCOSE_MONITOR:
  209. case ESP_BLE_APPEARANCE_GENERIC_INSULIN_PUMP:
  210. case ESP_BLE_APPEARANCE_INSULIN_PUMP_DURABLE_PUMP:
  211. case ESP_BLE_APPEARANCE_INSULIN_PUMP_PATCH_PUMP:
  212. case ESP_BLE_APPEARANCE_INSULIN_PEN:
  213. case ESP_BLE_APPEARANCE_GENERIC_MEDICATION_DELIVERY:
  214. case ESP_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
  215. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
  216. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
  217. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
  218. case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
  219. msg.sig = BTC_SIG_API_CALL;
  220. msg.pid = BTC_PID_GAP_BLE;
  221. msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_ICON;
  222. arg.cfg_local_icon.icon = icon;
  223. ret = (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  224. break;
  225. default:
  226. ret = ESP_ERR_INVALID_ARG;
  227. break;
  228. }
  229. return ret;
  230. }
  231. 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)
  232. {
  233. btc_msg_t msg;
  234. btc_ble_gap_args_t arg;
  235. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  236. return ESP_ERR_INVALID_STATE;
  237. }
  238. if (!remote_bda){
  239. return ESP_ERR_INVALID_SIZE;
  240. }
  241. msg.sig = BTC_SIG_API_CALL;
  242. msg.pid = BTC_PID_GAP_BLE;
  243. msg.act = BTC_GAP_BLE_ACT_UPDATE_WHITE_LIST;
  244. arg.update_white_list.add_remove = add_remove;
  245. arg.update_white_list.wl_addr_type = wl_addr_type;
  246. memcpy(arg.update_white_list.remote_bda, remote_bda, sizeof(esp_bd_addr_t));
  247. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  248. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  249. }
  250. esp_err_t esp_ble_gap_clear_whitelist(void)
  251. {
  252. btc_msg_t msg;
  253. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  254. return ESP_ERR_INVALID_STATE;
  255. }
  256. msg.sig = BTC_SIG_API_CALL;
  257. msg.pid = BTC_PID_GAP_BLE;
  258. msg.act = BTC_GAP_BLE_ACT_CLEAR_WHITE_LIST;
  259. return (btc_transfer_context(&msg, NULL, 0, NULL)
  260. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  261. }
  262. esp_err_t esp_ble_gap_get_whitelist_size(uint16_t *length)
  263. {
  264. if (length == NULL) {
  265. return ESP_FAIL;
  266. }
  267. btc_get_whitelist_size(length);
  268. return ESP_OK;
  269. }
  270. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  271. esp_err_t esp_ble_gap_set_prefer_conn_params(esp_bd_addr_t bd_addr,
  272. uint16_t min_conn_int, uint16_t max_conn_int,
  273. uint16_t slave_latency, uint16_t supervision_tout)
  274. {
  275. btc_msg_t msg;
  276. btc_ble_gap_args_t arg;
  277. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  278. return ESP_ERR_INVALID_STATE;
  279. }
  280. if (ESP_BLE_IS_VALID_PARAM(min_conn_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
  281. ESP_BLE_IS_VALID_PARAM(max_conn_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
  282. ESP_BLE_IS_VALID_PARAM(supervision_tout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
  283. (slave_latency <= ESP_BLE_CONN_LATENCY_MAX || slave_latency == ESP_BLE_CONN_PARAM_UNDEF) &&
  284. ((supervision_tout * 10) >= ((1 + slave_latency) * ((max_conn_int * 5) >> 1))) && min_conn_int <= max_conn_int) {
  285. msg.sig = BTC_SIG_API_CALL;
  286. msg.pid = BTC_PID_GAP_BLE;
  287. msg.act = BTC_GAP_BLE_ACT_SET_CONN_PARAMS;
  288. arg.set_conn_params.min_conn_int = min_conn_int;
  289. arg.set_conn_params.max_conn_int = max_conn_int;
  290. arg.set_conn_params.slave_latency = slave_latency;
  291. arg.set_conn_params.supervision_tout = supervision_tout;
  292. memcpy(arg.set_conn_params.bd_addr, bd_addr, sizeof(esp_bd_addr_t));
  293. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  294. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  295. } else {
  296. LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d",\
  297. __func__, min_conn_int, max_conn_int, slave_latency, supervision_tout);
  298. return ESP_FAIL;
  299. }
  300. }
  301. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  302. esp_err_t esp_ble_gap_set_device_name(const char *name)
  303. {
  304. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  305. return esp_bt_dev_set_device_name(name);
  306. }
  307. esp_err_t esp_ble_gap_get_local_used_addr(esp_bd_addr_t local_used_addr, uint8_t * addr_type)
  308. {
  309. if(esp_bluedroid_get_status() != (ESP_BLUEDROID_STATUS_ENABLED)) {
  310. LOG_ERROR("%s, bluedroid status error", __func__);
  311. return ESP_FAIL;
  312. }
  313. if(!BTM_BleGetCurrentAddress(local_used_addr, addr_type)) {
  314. return ESP_FAIL;
  315. }
  316. return ESP_OK;
  317. }
  318. uint8_t *esp_ble_resolve_adv_data( uint8_t *adv_data, uint8_t type, uint8_t *length)
  319. {
  320. if (((type < ESP_BLE_AD_TYPE_FLAG) || (type > ESP_BLE_AD_TYPE_128SERVICE_DATA)) &&
  321. (type != ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE)) {
  322. LOG_ERROR("the eir type not define, type = %x\n", type);
  323. return NULL;
  324. }
  325. if (adv_data == NULL) {
  326. LOG_ERROR("Invalid p_eir data.\n");
  327. return NULL;
  328. }
  329. return (BTM_CheckAdvData( adv_data, type, length));
  330. }
  331. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  332. esp_err_t esp_ble_gap_config_adv_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
  333. {
  334. btc_msg_t msg;
  335. btc_ble_gap_args_t arg;
  336. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  337. if (raw_data == NULL
  338. || (raw_data_len <= 0 || raw_data_len > ESP_BLE_ADV_DATA_LEN_MAX)) {
  339. return ESP_ERR_INVALID_ARG;
  340. }
  341. msg.sig = BTC_SIG_API_CALL;
  342. msg.pid = BTC_PID_GAP_BLE;
  343. msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA_RAW;
  344. arg.cfg_adv_data_raw.raw_adv = raw_data;
  345. arg.cfg_adv_data_raw.raw_adv_len = raw_data_len;
  346. 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);
  347. }
  348. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  349. esp_err_t esp_ble_gap_read_rssi(esp_bd_addr_t remote_addr)
  350. {
  351. btc_msg_t msg;
  352. btc_ble_gap_args_t arg;
  353. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  354. return ESP_ERR_INVALID_STATE;
  355. }
  356. msg.sig = BTC_SIG_API_CALL;
  357. msg.pid = BTC_PID_GAP_BLE;
  358. msg.act = BTC_GAP_BLE_ACT_READ_RSSI;
  359. memcpy(arg.read_rssi.remote_addr, remote_addr, sizeof(esp_bd_addr_t));
  360. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  361. }
  362. #if (BLE_42_FEATURE_SUPPORT == TRUE)
  363. esp_err_t esp_ble_gap_config_scan_rsp_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
  364. {
  365. btc_msg_t msg;
  366. btc_ble_gap_args_t arg;
  367. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  368. if (raw_data == NULL
  369. || (raw_data_len <= 0 || raw_data_len > ESP_BLE_SCAN_RSP_DATA_LEN_MAX)) {
  370. return ESP_ERR_INVALID_ARG;
  371. }
  372. msg.sig = BTC_SIG_API_CALL;
  373. msg.pid = BTC_PID_GAP_BLE;
  374. msg.act = BTC_GAP_BLE_ACT_CFG_SCAN_RSP_DATA_RAW;
  375. arg.cfg_scan_rsp_data_raw.raw_scan_rsp = raw_data;
  376. arg.cfg_scan_rsp_data_raw.raw_scan_rsp_len = raw_data_len;
  377. 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);
  378. }
  379. 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)
  380. {
  381. btc_msg_t msg;
  382. btc_ble_gap_args_t arg;
  383. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  384. return ESP_ERR_INVALID_STATE;
  385. }
  386. if (!device_info && type <= ESP_BLE_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID) {
  387. return ESP_ERR_INVALID_SIZE;
  388. }
  389. msg.sig = BTC_SIG_API_CALL;
  390. msg.pid = BTC_PID_GAP_BLE;
  391. msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
  392. arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_ADD;
  393. arg.update_duplicate_exceptional_list.info_type = type;
  394. if (device_info) {
  395. memcpy(arg.update_duplicate_exceptional_list.device_info, device_info, sizeof(esp_bd_addr_t));
  396. }
  397. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  398. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  399. }
  400. 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)
  401. {
  402. btc_msg_t msg;
  403. btc_ble_gap_args_t arg;
  404. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  405. return ESP_ERR_INVALID_STATE;
  406. }
  407. if (!device_info && type <= ESP_BLE_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID) {
  408. return ESP_ERR_INVALID_SIZE;
  409. }
  410. msg.sig = BTC_SIG_API_CALL;
  411. msg.pid = BTC_PID_GAP_BLE;
  412. msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
  413. arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_REMOVE;
  414. arg.update_duplicate_exceptional_list.info_type = type;
  415. if (device_info) {
  416. memcpy(arg.update_duplicate_exceptional_list.device_info, device_info, sizeof(esp_bd_addr_t));
  417. }
  418. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  419. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  420. }
  421. esp_err_t esp_ble_gap_clean_duplicate_scan_exceptional_list(esp_duplicate_scan_exceptional_list_type_t list_type)
  422. {
  423. btc_msg_t msg;
  424. btc_ble_gap_args_t arg;
  425. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  426. return ESP_ERR_INVALID_STATE;
  427. }
  428. msg.sig = BTC_SIG_API_CALL;
  429. msg.pid = BTC_PID_GAP_BLE;
  430. msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
  431. arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_CLEAN;
  432. arg.update_duplicate_exceptional_list.info_type = list_type;
  433. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  434. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  435. }
  436. #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
  437. #if (SMP_INCLUDED == TRUE)
  438. esp_err_t esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type,
  439. void *value, uint8_t len)
  440. {
  441. if(param_type >= ESP_BLE_SM_MAX_PARAM) {
  442. return ESP_ERR_INVALID_ARG;
  443. }
  444. if((param_type != ESP_BLE_SM_CLEAR_STATIC_PASSKEY) && ( value == NULL || len < sizeof(uint8_t) || len > sizeof(uint32_t))) {
  445. return ESP_ERR_INVALID_ARG;
  446. }
  447. if((param_type == ESP_BLE_SM_SET_STATIC_PASSKEY)) {
  448. uint32_t passkey = 0;
  449. for(uint8_t i = 0; i < len; i++)
  450. {
  451. passkey += (((uint8_t *)value)[i]<<(8*i));
  452. }
  453. if(passkey > 999999) {
  454. return ESP_ERR_INVALID_ARG;
  455. }
  456. }
  457. btc_msg_t msg;
  458. btc_ble_gap_args_t arg;
  459. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  460. msg.sig = BTC_SIG_API_CALL;
  461. msg.pid = BTC_PID_GAP_BLE;
  462. msg.act = BTC_GAP_BLE_SET_SECURITY_PARAM_EVT;
  463. arg.set_security_param.param_type = param_type;
  464. arg.set_security_param.len = len;
  465. arg.set_security_param.value = value;
  466. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy)
  467. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  468. }
  469. esp_err_t esp_ble_set_encryption(esp_bd_addr_t bd_addr, esp_ble_sec_act_t sec_act)
  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_ENCRYPTION_EVT;
  477. arg.set_encryption.sec_act = sec_act;
  478. memcpy(arg.set_encryption.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  479. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  480. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  481. }
  482. esp_err_t esp_ble_gap_security_rsp(esp_bd_addr_t bd_addr, bool accept)
  483. {
  484. btc_msg_t msg;
  485. btc_ble_gap_args_t arg;
  486. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  487. msg.sig = BTC_SIG_API_CALL;
  488. msg.pid = BTC_PID_GAP_BLE;
  489. msg.act = BTC_GAP_BLE_SECURITY_RSP_EVT;
  490. arg.sec_rsp.accept = accept;
  491. memcpy(arg.sec_rsp.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  492. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  493. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  494. }
  495. esp_err_t esp_ble_passkey_reply(esp_bd_addr_t bd_addr, bool accept, uint32_t passkey)
  496. {
  497. btc_msg_t msg;
  498. btc_ble_gap_args_t arg;
  499. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  500. msg.sig = BTC_SIG_API_CALL;
  501. msg.pid = BTC_PID_GAP_BLE;
  502. msg.act = BTC_GAP_BLE_PASSKEY_REPLY_EVT;
  503. arg.enc_passkey_replay.accept = accept;
  504. arg.enc_passkey_replay.passkey = passkey;
  505. memcpy(arg.enc_passkey_replay.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_confirm_reply(esp_bd_addr_t bd_addr, bool accept)
  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_CONFIRM_REPLY_EVT;
  517. arg.enc_comfirm_replay.accept = accept;
  518. memcpy(arg.enc_comfirm_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  519. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  520. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  521. }
  522. esp_err_t esp_ble_remove_bond_device(esp_bd_addr_t bd_addr)
  523. {
  524. btc_msg_t msg;
  525. btc_ble_gap_args_t arg;
  526. msg.sig = BTC_SIG_API_CALL;
  527. msg.pid = BTC_PID_GAP_BLE;
  528. msg.act = BTC_GAP_BLE_REMOVE_BOND_DEV_EVT;
  529. memcpy(arg.remove_bond_device.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  530. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL)
  531. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  532. }
  533. int esp_ble_get_bond_device_num(void)
  534. {
  535. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  536. return ESP_FAIL;
  537. }
  538. return btc_storage_get_num_ble_bond_devices();
  539. }
  540. esp_err_t esp_ble_get_bond_device_list(int *dev_num, esp_ble_bond_dev_t *dev_list)
  541. {
  542. int ret;
  543. int dev_num_total;
  544. if (dev_num == NULL || dev_list == NULL) {
  545. return ESP_ERR_INVALID_ARG;
  546. }
  547. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  548. dev_num_total = btc_storage_get_num_ble_bond_devices();
  549. if (*dev_num > dev_num_total) {
  550. *dev_num = dev_num_total;
  551. }
  552. ret = btc_storage_get_bonded_ble_devices_list(dev_list, *dev_num);
  553. return (ret == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  554. }
  555. esp_err_t esp_ble_oob_req_reply(esp_bd_addr_t bd_addr, uint8_t *TK, uint8_t len)
  556. {
  557. if(len != ESP_BT_OCTET16_LEN) {
  558. return ESP_ERR_INVALID_ARG;
  559. }
  560. btc_msg_t msg;
  561. btc_ble_gap_args_t arg;
  562. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  563. msg.sig = BTC_SIG_API_CALL;
  564. msg.pid = BTC_PID_GAP_BLE;
  565. msg.act = BTC_GAP_BLE_OOB_REQ_REPLY_EVT;
  566. memcpy(arg.oob_req_reply.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  567. arg.oob_req_reply.len = len;
  568. arg.oob_req_reply.p_value = TK;
  569. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy)
  570. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  571. }
  572. #endif /* #if (SMP_INCLUDED == TRUE) */
  573. esp_err_t esp_ble_gap_disconnect(esp_bd_addr_t remote_device)
  574. {
  575. btc_msg_t msg;
  576. btc_ble_gap_args_t arg;
  577. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  578. msg.sig = BTC_SIG_API_CALL;
  579. msg.pid = BTC_PID_GAP_BLE;
  580. msg.act = BTC_GAP_BLE_DISCONNECT_EVT;
  581. memcpy(arg.disconnect.remote_device, remote_device, ESP_BD_ADDR_LEN);
  582. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  583. }
  584. esp_err_t esp_ble_get_current_conn_params(esp_bd_addr_t bd_addr, esp_gap_conn_params_t *conn_params)
  585. {
  586. if(!bd_addr || !conn_params) {
  587. return ESP_ERR_INVALID_ARG;
  588. }
  589. if(BTM_GetCurrentConnParams(bd_addr, &conn_params->interval, &conn_params->latency, &conn_params->timeout)) {
  590. return ESP_OK;
  591. }
  592. return ESP_ERR_NOT_FOUND;
  593. }
  594. esp_err_t esp_gap_ble_set_channels(esp_gap_ble_channels channels)
  595. {
  596. btc_msg_t msg;
  597. btc_ble_gap_args_t arg;
  598. if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
  599. return ESP_ERR_INVALID_STATE;
  600. }
  601. msg.sig = BTC_SIG_API_CALL;
  602. msg.pid = BTC_PID_GAP_BLE;
  603. msg.act = BTC_GAP_BLE_SET_AFH_CHANNELS;
  604. memcpy(&arg.set_channels.channels, channels, ESP_GAP_BLE_CHANNELS_LEN);
  605. arg.set_channels.channels[ESP_GAP_BLE_CHANNELS_LEN -1] &= 0x1F;
  606. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  607. }
  608. esp_err_t esp_gap_ble_set_authorization(esp_bd_addr_t bd_addr, bool authorize)
  609. {
  610. if (!bd_addr) {
  611. return ESP_ERR_INVALID_ARG;
  612. }
  613. if (BTM_Ble_Authorization(bd_addr, authorize)) {
  614. return ESP_OK;
  615. }
  616. return ESP_FAIL;
  617. }
  618. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  619. esp_err_t esp_ble_gap_read_phy(esp_bd_addr_t bd_addr)
  620. {
  621. btc_msg_t msg;
  622. btc_ble_5_gap_args_t arg;
  623. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  624. msg.sig = BTC_SIG_API_CALL;
  625. msg.pid = BTC_PID_GAP_BLE;
  626. msg.act = BTC_GAP_BLE_READ_PHY;
  627. memcpy(arg.read_phy.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  628. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  629. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  630. }
  631. esp_err_t esp_ble_gap_set_prefered_default_phy(esp_ble_gap_phy_mask_t tx_phy_mask,
  632. esp_ble_gap_phy_mask_t rx_phy_mask)
  633. {
  634. btc_msg_t msg;
  635. btc_ble_5_gap_args_t arg;
  636. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  637. msg.sig = BTC_SIG_API_CALL;
  638. msg.pid = BTC_PID_GAP_BLE;
  639. msg.act = BTC_GAP_BLE_SET_PREFERED_DEF_PHY;
  640. arg.set_perf_def_phy.tx_phy_mask = tx_phy_mask;
  641. arg.set_perf_def_phy.rx_phy_mask = rx_phy_mask;
  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_phy(esp_bd_addr_t bd_addr,
  646. esp_ble_gap_all_phys_t all_phys_mask,
  647. esp_ble_gap_phy_mask_t tx_phy_mask,
  648. esp_ble_gap_phy_mask_t rx_phy_mask,
  649. esp_ble_gap_prefer_phy_options_t phy_options)
  650. {
  651. btc_msg_t msg;
  652. btc_ble_5_gap_args_t arg;
  653. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  654. msg.sig = BTC_SIG_API_CALL;
  655. msg.pid = BTC_PID_GAP_BLE;
  656. msg.act = BTC_GAP_BLE_SET_DEF_PHY;
  657. memcpy(arg.set_def_phy.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
  658. arg.set_def_phy.all_phys_mask = all_phys_mask;
  659. arg.set_def_phy.tx_phy_mask = tx_phy_mask;
  660. arg.set_def_phy.rx_phy_mask = rx_phy_mask;
  661. arg.set_def_phy.phy_options = phy_options;
  662. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  663. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  664. }
  665. esp_err_t esp_ble_gap_ext_adv_set_rand_addr(uint8_t instance, esp_bd_addr_t rand_addr)
  666. {
  667. btc_msg_t msg;
  668. btc_ble_5_gap_args_t arg;
  669. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  670. msg.sig = BTC_SIG_API_CALL;
  671. msg.pid = BTC_PID_GAP_BLE;
  672. msg.act = BTC_GAP_BLE_SET_EXT_ADV_RAND_ADDR;
  673. arg.ext_adv_set_rand_addr.instance = instance;
  674. memcpy(arg.ext_adv_set_rand_addr.rand_addr, rand_addr, BD_ADDR_LEN);
  675. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  676. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  677. }
  678. esp_err_t esp_ble_gap_ext_adv_set_params(uint8_t instance,
  679. const esp_ble_gap_ext_adv_params_t *params)
  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_PARAMS;
  687. arg.ext_adv_set_params.instance = instance;
  688. memcpy(&arg.ext_adv_set_params.params, params, sizeof(esp_ble_gap_ext_adv_params_t));
  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_config_ext_adv_data_raw(uint8_t instance, uint16_t length,
  693. const uint8_t *data)
  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_CFG_EXT_ADV_DATA_RAW;
  701. arg.ext_adv_cfg_data.instance = instance;
  702. arg.ext_adv_cfg_data.length = length;
  703. arg.ext_adv_cfg_data.data = (uint8_t *)data;
  704. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  705. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  706. }
  707. esp_err_t esp_ble_gap_config_ext_scan_rsp_data_raw(uint8_t instance, uint16_t length,
  708. const uint8_t *scan_rsp_data)
  709. {
  710. btc_msg_t msg;
  711. btc_ble_5_gap_args_t arg;
  712. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  713. msg.sig = BTC_SIG_API_CALL;
  714. msg.pid = BTC_PID_GAP_BLE;
  715. msg.act = BTC_GAP_BLE_CFG_EXT_SCAN_RSP_DATA_RAW;
  716. arg.cfg_scan_rsp.instance = instance;
  717. arg.cfg_scan_rsp.length = length;
  718. arg.cfg_scan_rsp.data = (uint8_t *)scan_rsp_data;
  719. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  720. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  721. }
  722. esp_err_t esp_ble_gap_ext_adv_start(uint8_t num_adv, const esp_ble_gap_ext_adv_t *ext_adv)
  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_EXT_ADV_START;
  730. arg.ext_adv_start.num_adv = num_adv;
  731. arg.ext_adv_start.ext_adv = (esp_ble_gap_ext_adv_t *)ext_adv;
  732. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  733. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  734. }
  735. esp_err_t esp_ble_gap_ext_adv_stop(uint8_t num_adv, const uint8_t *ext_adv_inst)
  736. {
  737. btc_msg_t msg;
  738. btc_ble_5_gap_args_t arg;
  739. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  740. msg.sig = BTC_SIG_API_CALL;
  741. msg.pid = BTC_PID_GAP_BLE;
  742. msg.act = BTC_GAP_BLE_EXT_ADV_STOP;
  743. arg.ext_adv_stop.num_adv = num_adv;
  744. arg.ext_adv_stop.ext_adv_inst = (uint8_t *)ext_adv_inst;
  745. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  746. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  747. }
  748. esp_err_t esp_ble_gap_ext_adv_set_remove(uint8_t instance)
  749. {
  750. btc_msg_t msg;
  751. btc_ble_5_gap_args_t arg;
  752. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  753. msg.sig = BTC_SIG_API_CALL;
  754. msg.pid = BTC_PID_GAP_BLE;
  755. msg.act = BTC_GAP_BLE_EXT_ADV_SET_REMOVE;
  756. arg.ext_adv_set_remove.instance = instance;
  757. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  758. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  759. }
  760. esp_err_t esp_ble_gap_ext_adv_set_clear(void)
  761. {
  762. btc_msg_t msg;
  763. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  764. msg.sig = BTC_SIG_API_CALL;
  765. msg.pid = BTC_PID_GAP_BLE;
  766. msg.act = BTC_GAP_BLE_EXT_ADV_SET_CLEAR;
  767. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  768. }
  769. esp_err_t esp_ble_gap_periodic_adv_set_params(uint8_t instance, const esp_ble_gap_periodic_adv_params_t *params)
  770. {
  771. btc_msg_t msg;
  772. btc_ble_5_gap_args_t arg;
  773. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  774. msg.sig = BTC_SIG_API_CALL;
  775. msg.pid = BTC_PID_GAP_BLE;
  776. msg.act = BTC_GAP_BLE_SET_PERIODIC_ADV_PARAMS;
  777. arg.peridic_adv_set_params.instance = instance;
  778. memcpy(&arg.peridic_adv_set_params.params, params, sizeof(esp_ble_gap_periodic_adv_params_t));
  779. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  780. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  781. }
  782. esp_err_t esp_ble_gap_config_periodic_adv_data_raw(uint8_t instance, uint16_t length,
  783. const uint8_t *data)
  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_CFG_PERIODIC_ADV_DATA_RAW;
  791. arg.periodic_adv_cfg_data.instance = instance;
  792. arg.periodic_adv_cfg_data.len = length;
  793. arg.periodic_adv_cfg_data.data = (uint8_t *)data;
  794. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy)
  795. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  796. }
  797. esp_err_t esp_ble_gap_periodic_adv_start(uint8_t instance)
  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_PERIODIC_ADV_START;
  805. arg.periodic_adv_start.instance = instance;
  806. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  807. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  808. }
  809. esp_err_t esp_ble_gap_periodic_adv_stop(uint8_t instance)
  810. {
  811. btc_msg_t msg;
  812. btc_ble_5_gap_args_t arg;
  813. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  814. msg.sig = BTC_SIG_API_CALL;
  815. msg.pid = BTC_PID_GAP_BLE;
  816. msg.act = BTC_GAP_BLE_PERIODIC_ADV_STOP;
  817. arg.periodic_adv_stop.instance = instance;
  818. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  819. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  820. }
  821. esp_err_t esp_ble_gap_periodic_adv_create_sync(const esp_ble_gap_periodic_adv_sync_params_t *params)
  822. {
  823. btc_msg_t msg;
  824. btc_ble_5_gap_args_t arg;
  825. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  826. msg.sig = BTC_SIG_API_CALL;
  827. msg.pid = BTC_PID_GAP_BLE;
  828. msg.act = BTC_GAP_BLE_PERIODIC_ADV_CREATE_SYNC;
  829. memcpy(&arg.periodic_adv_create_sync.params, params, sizeof(esp_ble_gap_periodic_adv_sync_params_t));
  830. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  831. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  832. }
  833. esp_err_t esp_ble_gap_periodic_adv_sync_cancel(void)
  834. {
  835. btc_msg_t msg;
  836. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  837. msg.sig = BTC_SIG_API_CALL;
  838. msg.pid = BTC_PID_GAP_BLE;
  839. msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_CANCEL;
  840. return (btc_transfer_context(&msg, NULL, 0, NULL)
  841. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  842. }
  843. esp_err_t esp_ble_gap_periodic_adv_sync_terminate(uint16_t sync_handle)
  844. {
  845. btc_msg_t msg;
  846. btc_ble_5_gap_args_t arg;
  847. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  848. msg.sig = BTC_SIG_API_CALL;
  849. msg.pid = BTC_PID_GAP_BLE;
  850. msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_TERMINATE;
  851. arg.periodic_adv_sync_term.sync_handle = sync_handle;
  852. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  853. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  854. }
  855. esp_err_t esp_ble_gap_periodic_adv_add_dev_to_list(esp_ble_addr_type_t addr_type,
  856. esp_bd_addr_t addr,
  857. uint8_t sid)
  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_ADD_DEV_TO_LIST;
  865. arg.periodic_adv_add_dev.addr_type = addr_type;
  866. arg.periodic_adv_add_dev.sid = sid;
  867. memcpy(arg.periodic_adv_add_dev.addr, addr, sizeof(esp_bd_addr_t));
  868. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  869. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  870. }
  871. esp_err_t esp_ble_gap_periodic_adv_remove_dev_from_list(esp_ble_addr_type_t addr_type,
  872. esp_bd_addr_t addr,
  873. uint8_t sid)
  874. {
  875. btc_msg_t msg;
  876. btc_ble_5_gap_args_t arg;
  877. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  878. msg.sig = BTC_SIG_API_CALL;
  879. msg.pid = BTC_PID_GAP_BLE;
  880. msg.act = BTC_GAP_BLE_PERIODIC_REMOVE_ADD_DEV_FROM_LIST;
  881. arg.periodic_adv_remove_dev.addr_type = addr_type;
  882. arg.periodic_adv_remove_dev.sid = sid;
  883. memcpy(arg.periodic_adv_remove_dev.addr, addr, sizeof(esp_bd_addr_t));
  884. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  885. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  886. }
  887. esp_err_t esp_ble_gap_periodic_adv_clear_dev(void)
  888. {
  889. btc_msg_t msg;
  890. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  891. msg.sig = BTC_SIG_API_CALL;
  892. msg.pid = BTC_PID_GAP_BLE;
  893. msg.act = BTC_GAP_BLE_PERIODIC_CLEAR_DEV;
  894. return (btc_transfer_context(&msg, NULL, 0, NULL)
  895. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  896. }
  897. esp_err_t esp_ble_gap_set_ext_scan_params(const esp_ble_ext_scan_params_t *params)
  898. {
  899. btc_msg_t msg;
  900. btc_ble_5_gap_args_t arg;
  901. if (!params) {
  902. return ESP_ERR_INVALID_ARG;
  903. }
  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_SET_EXT_SCAN_PARAMS;
  908. memcpy(&arg.set_ext_scan_params.params, params, sizeof(esp_ble_ext_scan_params_t));
  909. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  910. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  911. }
  912. esp_err_t esp_ble_gap_start_ext_scan(uint32_t duration, uint16_t period)
  913. {
  914. btc_msg_t msg;
  915. btc_ble_5_gap_args_t arg;
  916. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  917. msg.sig = BTC_SIG_API_CALL;
  918. msg.pid = BTC_PID_GAP_BLE;
  919. msg.act = BTC_GAP_BLE_START_EXT_SCAN;
  920. arg.start_ext_scan.duration = duration;
  921. arg.start_ext_scan.period = period;
  922. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  923. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  924. }
  925. esp_err_t esp_ble_gap_stop_ext_scan(void)
  926. {
  927. btc_msg_t msg;
  928. ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
  929. msg.sig = BTC_SIG_API_CALL;
  930. msg.pid = BTC_PID_GAP_BLE;
  931. msg.act = BTC_GAP_BLE_STOP_EXT_SCAN;
  932. return (btc_transfer_context(&msg, NULL, 0, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  933. }
  934. esp_err_t esp_ble_gap_prefer_ext_connect_params_set(esp_bd_addr_t addr,
  935. esp_ble_gap_phy_mask_t phy_mask,
  936. const esp_ble_gap_conn_params_t *phy_1m_conn_params,
  937. const esp_ble_gap_conn_params_t *phy_2m_conn_params,
  938. const esp_ble_gap_conn_params_t *phy_coded_conn_params)
  939. {
  940. btc_msg_t msg;
  941. btc_ble_5_gap_args_t arg;
  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_SET_EXT_PEFER_CONNET_PARAMS;
  946. arg.set_ext_conn_params.phy_mask = phy_mask;
  947. if (phy_mask & ESP_BLE_GAP_PHY_1M_PREF_MASK) {
  948. if (!phy_1m_conn_params) {
  949. return BT_STATUS_PARM_INVALID;
  950. }
  951. memcpy(&arg.set_ext_conn_params.phy_1m_conn_params,
  952. phy_1m_conn_params, sizeof(esp_ble_gap_conn_params_t));
  953. }
  954. if (phy_mask & ESP_BLE_GAP_PHY_2M_PREF_MASK) {
  955. if (!phy_2m_conn_params) {
  956. return BT_STATUS_PARM_INVALID;
  957. }
  958. memcpy(&arg.set_ext_conn_params.phy_2m_conn_params,
  959. phy_2m_conn_params, sizeof(esp_ble_gap_conn_params_t));
  960. }
  961. if (phy_mask & ESP_BLE_GAP_PHY_CODED_PREF_MASK) {
  962. if (!phy_coded_conn_params) {
  963. return BT_STATUS_PARM_INVALID;
  964. }
  965. memcpy(&arg.set_ext_conn_params.phy_coded_conn_params,
  966. phy_coded_conn_params, sizeof(esp_ble_gap_conn_params_t));
  967. }
  968. memcpy(arg.set_ext_conn_params.addr, addr, sizeof(esp_bd_addr_t));
  969. return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL)
  970. == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
  971. }
  972. #endif //#if (BLE_50_FEATURE_SUPPORT == TRUE)