1 /*
2 * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <string.h>
8 #include "esp_bt_device.h"
9 #include "esp_bt_main.h"
10 #include "esp_gap_ble_api.h"
11 #include "bta/bta_api.h"
12 #include "common/bt_trace.h"
13 #include "btc/btc_manage.h"
14 #include "btc_gap_ble.h"
15 #include "btc/btc_ble_storage.h"
16 #include "esp_random.h"
17
esp_ble_gap_register_callback(esp_gap_ble_cb_t callback)18 esp_err_t esp_ble_gap_register_callback(esp_gap_ble_cb_t callback)
19 {
20 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
21
22 return (btc_profile_cb_set(BTC_PID_GAP_BLE, callback) == 0 ? ESP_OK : ESP_FAIL);
23 }
24
esp_ble_gap_get_callback(void)25 esp_gap_ble_cb_t esp_ble_gap_get_callback(void)
26 {
27 return (esp_gap_ble_cb_t) btc_profile_cb_get(BTC_PID_GAP_BLE);
28 }
29
30 #if (BLE_42_FEATURE_SUPPORT == TRUE)
esp_ble_gap_config_adv_data(esp_ble_adv_data_t * adv_data)31 esp_err_t esp_ble_gap_config_adv_data(esp_ble_adv_data_t *adv_data)
32 {
33 btc_msg_t msg = {0};
34 btc_ble_gap_args_t arg;
35
36 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
37
38 if (adv_data == NULL) {
39 return ESP_ERR_INVALID_ARG;
40 }
41
42 if (adv_data->service_uuid_len & 0xf) { //not 16*n
43 return ESP_ERR_INVALID_ARG;
44 }
45
46 msg.sig = BTC_SIG_API_CALL;
47 msg.pid = BTC_PID_GAP_BLE;
48 msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA;
49 memcpy(&arg.cfg_adv_data.adv_data, adv_data, sizeof(esp_ble_adv_data_t));
50
51 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy,
52 btc_gap_ble_arg_deep_free)== BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
53 }
54
55
esp_ble_gap_set_scan_params(esp_ble_scan_params_t * scan_params)56 esp_err_t esp_ble_gap_set_scan_params(esp_ble_scan_params_t *scan_params)
57 {
58 btc_msg_t msg = {0};
59 btc_ble_gap_args_t arg;
60
61 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
62
63 if (scan_params == NULL) {
64 return ESP_ERR_INVALID_ARG;
65 }
66
67 msg.sig = BTC_SIG_API_CALL;
68 msg.pid = BTC_PID_GAP_BLE;
69 msg.act = BTC_GAP_BLE_ACT_SET_SCAN_PARAM;
70 memcpy(&arg.set_scan_param.scan_params, scan_params, sizeof(esp_ble_scan_params_t));
71
72 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
73 }
74
esp_ble_gap_start_scanning(uint32_t duration)75 esp_err_t esp_ble_gap_start_scanning(uint32_t duration)
76 {
77 btc_msg_t msg = {0};
78 btc_ble_gap_args_t arg;
79
80 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
81
82 msg.sig = BTC_SIG_API_CALL;
83 msg.pid = BTC_PID_GAP_BLE;
84 msg.act = BTC_GAP_BLE_ACT_START_SCAN;
85 arg.start_scan.duration = duration;
86
87 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
88 }
89
90
esp_ble_gap_stop_scanning(void)91 esp_err_t esp_ble_gap_stop_scanning(void)
92 {
93 btc_msg_t msg;
94
95 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
96
97 msg.sig = BTC_SIG_API_CALL;
98 msg.pid = BTC_PID_GAP_BLE;
99 msg.act = BTC_GAP_BLE_ACT_STOP_SCAN;
100 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
101 }
102
esp_ble_gap_start_advertising(esp_ble_adv_params_t * adv_params)103 esp_err_t esp_ble_gap_start_advertising(esp_ble_adv_params_t *adv_params)
104 {
105 btc_msg_t msg = {0};
106 btc_ble_gap_args_t arg;
107
108 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
109
110 msg.sig = BTC_SIG_API_CALL;
111 msg.pid = BTC_PID_GAP_BLE;
112 msg.act = BTC_GAP_BLE_ACT_START_ADV;
113 memcpy(&arg.start_adv.adv_params, adv_params, sizeof(esp_ble_adv_params_t));
114
115 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
116 }
117
esp_ble_gap_stop_advertising(void)118 esp_err_t esp_ble_gap_stop_advertising(void)
119 {
120 btc_msg_t msg;
121
122 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
123
124 msg.sig = BTC_SIG_API_CALL;
125 msg.pid = BTC_PID_GAP_BLE;
126 msg.act = BTC_GAP_BLE_ACT_STOP_ADV;
127
128 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
129 }
130
esp_ble_gap_clear_advertising(void)131 esp_err_t esp_ble_gap_clear_advertising(void)
132 {
133 btc_msg_t msg;
134
135 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
136
137 msg.sig = BTC_SIG_API_CALL;
138 msg.pid = BTC_PID_GAP_BLE;
139 msg.act = BTC_GAP_BLE_ACT_CLEAR_ADV;
140
141 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
142 }
143 #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
144
esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t * params)145 esp_err_t esp_ble_gap_update_conn_params(esp_ble_conn_update_params_t *params)
146 {
147 btc_msg_t msg = {0};
148 btc_ble_gap_args_t arg;
149
150 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
151 if(!params) {
152 LOG_ERROR("%s,params is NULL", __func__);
153 return ESP_FAIL;
154 }
155
156 if (ESP_BLE_IS_VALID_PARAM(params->min_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
157 ESP_BLE_IS_VALID_PARAM(params->max_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
158 ESP_BLE_IS_VALID_PARAM(params->timeout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
159 (params->latency <= ESP_BLE_CONN_LATENCY_MAX) &&
160 ((params->timeout * 10) >= ((1 + params->latency) * ((params->max_int * 5) >> 1))) && params->min_int <= params->max_int) {
161
162 msg.sig = BTC_SIG_API_CALL;
163 msg.pid = BTC_PID_GAP_BLE;
164 msg.act = BTC_GAP_BLE_ACT_UPDATE_CONN_PARAM;
165 memcpy(&arg.conn_update_params.conn_params, params, sizeof(esp_ble_conn_update_params_t));
166
167 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
168 } else {
169 LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d",\
170 __func__, params->min_int, params->max_int, params->latency, params->timeout);
171 return ESP_FAIL;
172 }
173 }
174
esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device,uint16_t tx_data_length)175 esp_err_t esp_ble_gap_set_pkt_data_len(esp_bd_addr_t remote_device, uint16_t tx_data_length)
176 {
177 btc_msg_t msg = {0};
178 btc_ble_gap_args_t arg;
179
180 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
181
182 msg.sig = BTC_SIG_API_CALL;
183 msg.pid = BTC_PID_GAP_BLE;
184 msg.act = BTC_GAP_BLE_ACT_SET_PKT_DATA_LEN;
185 arg.set_pkt_data_len.tx_data_length = tx_data_length;
186 memcpy(arg.set_pkt_data_len.remote_device, remote_device, ESP_BD_ADDR_LEN);
187
188 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
189 }
190
esp_ble_gap_addr_create_static(esp_bd_addr_t rand_addr)191 esp_err_t esp_ble_gap_addr_create_static(esp_bd_addr_t rand_addr)
192 {
193 // Static device address: First two bits are '11', rest is random
194 rand_addr[0] = 0xC0 | (esp_random() & 0x3F);
195 for (int i = 1; i < 6; i++) {
196 rand_addr[i] = esp_random() & 0xFF; // Randomize remaining bits
197 }
198 return ESP_OK;
199 }
200
esp_ble_gap_addr_create_nrpa(esp_bd_addr_t rand_addr)201 esp_err_t esp_ble_gap_addr_create_nrpa(esp_bd_addr_t rand_addr)
202 {
203 // Non-resolvable private address: First two bits are '00', rest is random
204 rand_addr[0] = (esp_random() & 0x3F);
205 for (int i = 1; i < 6; i++) {
206 rand_addr[i] = esp_random() & 0xFF; // Randomize remaining bits
207 }
208 return ESP_OK;
209 }
210
esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr)211 esp_err_t esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr)
212 {
213 btc_msg_t msg = {0};
214 btc_ble_gap_args_t arg;
215
216 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
217
218 msg.sig = BTC_SIG_API_CALL;
219 msg.pid = BTC_PID_GAP_BLE;
220 msg.act = BTC_GAP_BLE_ACT_SET_RAND_ADDRESS;
221 memcpy(arg.set_rand_addr.rand_addr, rand_addr, ESP_BD_ADDR_LEN);
222
223 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
224 }
225
esp_ble_gap_set_resolvable_private_address_timeout(uint16_t rpa_timeout)226 esp_err_t esp_ble_gap_set_resolvable_private_address_timeout(uint16_t rpa_timeout)
227 {
228 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
229
230 if (rpa_timeout < 0x0001 || rpa_timeout > 0x0E10) {
231 return ESP_ERR_INVALID_ARG;
232 }
233
234 btc_msg_t msg = {0};
235 btc_ble_gap_args_t arg;
236
237 msg.sig = BTC_SIG_API_CALL;
238 msg.pid = BTC_PID_GAP_BLE;
239 msg.act = BTC_GAP_BLE_ACT_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT;
240 arg.set_rpa_timeout.rpa_timeout = rpa_timeout;
241
242 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
243 }
244
245
esp_ble_gap_add_device_to_resolving_list(esp_bd_addr_t peer_addr,uint8_t addr_type,uint8_t * peer_irk)246 esp_err_t esp_ble_gap_add_device_to_resolving_list(esp_bd_addr_t peer_addr, uint8_t addr_type, uint8_t *peer_irk)
247 {
248 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
249
250 if (addr_type > BLE_ADDR_TYPE_RANDOM ||!peer_addr || (addr_type && ((peer_addr[0] & 0xC0) != 0xC0))) {
251 return ESP_ERR_INVALID_ARG;
252 }
253
254 btc_msg_t msg = {0};
255 btc_ble_gap_args_t arg;
256
257 msg.sig = BTC_SIG_API_CALL;
258 msg.pid = BTC_PID_GAP_BLE;
259 msg.act = BTC_GAP_BLE_ACT_ADD_DEVICE_TO_RESOLVING_LIST;
260
261 memcpy(arg.add_dev_to_resolving_list.addr, peer_addr, ESP_BD_ADDR_LEN);
262 arg.add_dev_to_resolving_list.addr_type = addr_type;
263 memcpy(arg.add_dev_to_resolving_list.irk, peer_irk, ESP_PEER_IRK_LEN);
264
265 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
266 }
267
esp_ble_gap_clear_rand_addr(void)268 esp_err_t esp_ble_gap_clear_rand_addr(void)
269 {
270 btc_msg_t msg;
271
272 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
273
274 msg.sig = BTC_SIG_API_CALL;
275 msg.pid = BTC_PID_GAP_BLE;
276 msg.act = BTC_GAP_BLE_ACT_CLEAR_RAND_ADDRESS;
277
278 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
279 }
280
esp_ble_gap_config_local_privacy(bool privacy_enable)281 esp_err_t esp_ble_gap_config_local_privacy (bool privacy_enable)
282 {
283 btc_msg_t msg = {0};
284 btc_ble_gap_args_t arg;
285
286 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
287
288 msg.sig = BTC_SIG_API_CALL;
289 msg.pid = BTC_PID_GAP_BLE;
290 msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY;
291 arg.cfg_local_privacy.privacy_enable = privacy_enable;
292
293 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
294 }
295
esp_ble_gap_config_local_icon(uint16_t icon)296 esp_err_t esp_ble_gap_config_local_icon (uint16_t icon)
297 {
298 esp_err_t ret;
299 btc_msg_t msg = {0};
300 btc_ble_gap_args_t arg;
301
302 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
303
304 switch (icon) {
305 case ESP_BLE_APPEARANCE_GENERIC_PHONE:
306 case ESP_BLE_APPEARANCE_GENERIC_COMPUTER:
307 case ESP_BLE_APPEARANCE_GENERIC_REMOTE:
308 case ESP_BLE_APPEARANCE_GENERIC_THERMOMETER:
309 case ESP_BLE_APPEARANCE_THERMOMETER_EAR:
310 case ESP_BLE_APPEARANCE_GENERIC_HEART_RATE:
311 case ESP_BLE_APPEARANCE_HEART_RATE_BELT:
312 case ESP_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
313 case ESP_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
314 case ESP_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
315 case ESP_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
316 case ESP_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
317 case ESP_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
318 case ESP_BLE_APPEARANCE_GENERIC_GLUCOSE:
319 case ESP_BLE_APPEARANCE_GENERIC_WEIGHT:
320 case ESP_BLE_APPEARANCE_GENERIC_WALKING:
321 case ESP_BLE_APPEARANCE_WALKING_IN_SHOE:
322 case ESP_BLE_APPEARANCE_WALKING_ON_SHOE:
323 case ESP_BLE_APPEARANCE_WALKING_ON_HIP:
324 case ESP_BLE_APPEARANCE_GENERIC_WATCH:
325 case ESP_BLE_APPEARANCE_SPORTS_WATCH:
326 case ESP_BLE_APPEARANCE_GENERIC_EYEGLASSES:
327 case ESP_BLE_APPEARANCE_GENERIC_DISPLAY:
328 case ESP_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
329 case ESP_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
330 case ESP_BLE_APPEARANCE_HID_BARCODE_SCANNER:
331 case ESP_BLE_APPEARANCE_GENERIC_HID:
332 case ESP_BLE_APPEARANCE_HID_KEYBOARD:
333 case ESP_BLE_APPEARANCE_HID_MOUSE:
334 case ESP_BLE_APPEARANCE_HID_JOYSTICK:
335 case ESP_BLE_APPEARANCE_HID_GAMEPAD:
336 case ESP_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
337 case ESP_BLE_APPEARANCE_HID_CARD_READER:
338 case ESP_BLE_APPEARANCE_HID_DIGITAL_PEN:
339 case ESP_BLE_APPEARANCE_UNKNOWN:
340 case ESP_BLE_APPEARANCE_GENERIC_CLOCK:
341 case ESP_BLE_APPEARANCE_GENERIC_TAG:
342 case ESP_BLE_APPEARANCE_GENERIC_KEYRING:
343 case ESP_BLE_APPEARANCE_GENERIC_CYCLING:
344 case ESP_BLE_APPEARANCE_CYCLING_COMPUTER:
345 case ESP_BLE_APPEARANCE_CYCLING_SPEED:
346 case ESP_BLE_APPEARANCE_CYCLING_CADENCE:
347 case ESP_BLE_APPEARANCE_CYCLING_POWER:
348 case ESP_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
349 case ESP_BLE_APPEARANCE_GENERIC_PERSONAL_MOBILITY_DEVICE:
350 case ESP_BLE_APPEARANCE_POWERED_WHEELCHAIR:
351 case ESP_BLE_APPEARANCE_MOBILITY_SCOOTER:
352 case ESP_BLE_APPEARANCE_GENERIC_CONTINUOUS_GLUCOSE_MONITOR:
353 case ESP_BLE_APPEARANCE_GENERIC_INSULIN_PUMP:
354 case ESP_BLE_APPEARANCE_INSULIN_PUMP_DURABLE_PUMP:
355 case ESP_BLE_APPEARANCE_INSULIN_PUMP_PATCH_PUMP:
356 case ESP_BLE_APPEARANCE_INSULIN_PEN:
357 case ESP_BLE_APPEARANCE_GENERIC_MEDICATION_DELIVERY:
358 case ESP_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
359 case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
360 case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
361 case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
362 case ESP_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
363 case ESP_BLE_APPEARANCE_STANDALONE_SPEAKER:
364 msg.sig = BTC_SIG_API_CALL;
365 msg.pid = BTC_PID_GAP_BLE;
366 msg.act = BTC_GAP_BLE_ACT_CONFIG_LOCAL_ICON;
367 arg.cfg_local_icon.icon = icon;
368 ret = (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
369 break;
370 default:
371 ret = ESP_ERR_INVALID_ARG;
372 break;
373 }
374 return ret;
375 }
376
esp_ble_gap_update_whitelist(bool add_remove,esp_bd_addr_t remote_bda,esp_ble_wl_addr_type_t wl_addr_type)377 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)
378 {
379 btc_msg_t msg = {0};
380 btc_ble_gap_args_t arg;
381
382 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
383 return ESP_ERR_INVALID_STATE;
384 }
385 if (!remote_bda){
386 return ESP_ERR_INVALID_SIZE;
387 }
388 msg.sig = BTC_SIG_API_CALL;
389 msg.pid = BTC_PID_GAP_BLE;
390 msg.act = BTC_GAP_BLE_ACT_UPDATE_WHITE_LIST;
391 arg.update_white_list.add_remove = add_remove;
392 arg.update_white_list.wl_addr_type = wl_addr_type;
393 memcpy(arg.update_white_list.remote_bda, remote_bda, sizeof(esp_bd_addr_t));
394
395 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
396 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
397 }
398
esp_ble_gap_clear_whitelist(void)399 esp_err_t esp_ble_gap_clear_whitelist(void)
400 {
401 btc_msg_t msg;
402
403 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
404 return ESP_ERR_INVALID_STATE;
405 }
406 msg.sig = BTC_SIG_API_CALL;
407 msg.pid = BTC_PID_GAP_BLE;
408 msg.act = BTC_GAP_BLE_ACT_CLEAR_WHITE_LIST;
409
410 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
411 }
412
esp_ble_gap_get_whitelist_size(uint16_t * length)413 esp_err_t esp_ble_gap_get_whitelist_size(uint16_t *length)
414 {
415 if (length == NULL) {
416 return ESP_FAIL;
417 }
418 btc_get_whitelist_size(length);
419
420 return ESP_OK;
421 }
422 #if (BLE_42_FEATURE_SUPPORT == TRUE)
esp_ble_gap_set_prefer_conn_params(esp_bd_addr_t bd_addr,uint16_t min_conn_int,uint16_t max_conn_int,uint16_t slave_latency,uint16_t supervision_tout)423 esp_err_t esp_ble_gap_set_prefer_conn_params(esp_bd_addr_t bd_addr,
424 uint16_t min_conn_int, uint16_t max_conn_int,
425 uint16_t slave_latency, uint16_t supervision_tout)
426 {
427 btc_msg_t msg = {0};
428 btc_ble_gap_args_t arg;
429
430 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
431 return ESP_ERR_INVALID_STATE;
432 }
433
434 if (ESP_BLE_IS_VALID_PARAM(min_conn_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
435 ESP_BLE_IS_VALID_PARAM(max_conn_int, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
436 ESP_BLE_IS_VALID_PARAM(supervision_tout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
437 (slave_latency <= ESP_BLE_CONN_LATENCY_MAX) &&
438 ((supervision_tout * 10) >= ((1 + slave_latency) * ((max_conn_int * 5) >> 1))) && min_conn_int <= max_conn_int) {
439
440 msg.sig = BTC_SIG_API_CALL;
441 msg.pid = BTC_PID_GAP_BLE;
442 msg.act = BTC_GAP_BLE_ACT_SET_CONN_PARAMS;
443 arg.set_conn_params.min_conn_int = min_conn_int;
444 arg.set_conn_params.max_conn_int = max_conn_int;
445 arg.set_conn_params.slave_latency = slave_latency;
446 arg.set_conn_params.supervision_tout = supervision_tout;
447 memcpy(arg.set_conn_params.bd_addr, bd_addr, sizeof(esp_bd_addr_t));
448
449 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
450 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
451 } else {
452 LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d",\
453 __func__, min_conn_int, max_conn_int, slave_latency, supervision_tout);
454 return ESP_FAIL;
455 }
456 }
457 #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
458
esp_ble_gap_set_device_name(const char * name)459 esp_err_t esp_ble_gap_set_device_name(const char *name)
460 {
461 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
462
463 return esp_bt_dev_set_device_name(name);
464 }
465
esp_ble_gap_get_device_name(void)466 esp_err_t esp_ble_gap_get_device_name(void)
467 {
468 btc_msg_t msg = {0};
469
470 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
471
472 msg.sig = BTC_SIG_API_CALL;
473 msg.pid = BTC_PID_GAP_BLE;
474 msg.act = BTC_GAP_BLE_ACT_GET_DEV_NAME;
475
476 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
477 }
478
esp_ble_gap_get_local_used_addr(esp_bd_addr_t local_used_addr,uint8_t * addr_type)479 esp_err_t esp_ble_gap_get_local_used_addr(esp_bd_addr_t local_used_addr, uint8_t * addr_type)
480 {
481 if(esp_bluedroid_get_status() != (ESP_BLUEDROID_STATUS_ENABLED)) {
482 LOG_ERROR("%s, bluedroid status error", __func__);
483 return ESP_FAIL;
484 }
485 if(!BTM_BleGetCurrentAddress(local_used_addr, addr_type)) {
486 return ESP_FAIL;
487 }
488 return ESP_OK;
489 }
490
esp_ble_resolve_adv_data_by_type(uint8_t * adv_data,uint16_t adv_data_len,esp_ble_adv_data_type type,uint8_t * length)491 uint8_t *esp_ble_resolve_adv_data_by_type( uint8_t *adv_data, uint16_t adv_data_len, esp_ble_adv_data_type type, uint8_t *length)
492 {
493 if (length == NULL) {
494 return NULL;
495 }
496
497 if (((type < ESP_BLE_AD_TYPE_FLAG) || (type > ESP_BLE_AD_TYPE_128SERVICE_DATA)) &&
498 (type != ESP_BLE_AD_MANUFACTURER_SPECIFIC_TYPE)) {
499 LOG_ERROR("The advertising data type is not defined, type = %x", type);
500 *length = 0;
501 return NULL;
502 }
503
504 if (adv_data_len == 0) {
505 *length = 0;
506 return NULL;
507 }
508 if (adv_data == NULL) {
509 LOG_ERROR("Invalid advertising data.");
510 *length = 0;
511 return NULL;
512 }
513
514 return (BTM_CheckAdvData( adv_data, adv_data_len, type, length));
515 }
516
esp_ble_resolve_adv_data(uint8_t * adv_data,uint8_t type,uint8_t * length)517 uint8_t *esp_ble_resolve_adv_data( uint8_t *adv_data, uint8_t type, uint8_t *length)
518 {
519 return esp_ble_resolve_adv_data_by_type( adv_data, ESP_BLE_ADV_DATA_LEN_MAX + ESP_BLE_SCAN_RSP_DATA_LEN_MAX, (esp_ble_adv_data_type) type, length);
520 }
521
522 #if (BLE_42_FEATURE_SUPPORT == TRUE)
esp_ble_gap_config_adv_data_raw(uint8_t * raw_data,uint32_t raw_data_len)523 esp_err_t esp_ble_gap_config_adv_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
524 {
525 btc_msg_t msg = {0};
526 btc_ble_gap_args_t arg;
527
528 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
529
530 if ((raw_data_len != 0 && raw_data == NULL) || raw_data_len > ESP_BLE_ADV_DATA_LEN_MAX) {
531 return ESP_ERR_INVALID_ARG;
532 }
533
534 msg.sig = BTC_SIG_API_CALL;
535 msg.pid = BTC_PID_GAP_BLE;
536 msg.act = BTC_GAP_BLE_ACT_CFG_ADV_DATA_RAW;
537 arg.cfg_adv_data_raw.raw_adv = raw_data;
538 arg.cfg_adv_data_raw.raw_adv_len = raw_data_len;
539
540 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy,
541 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
542
543 }
544 #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
esp_ble_gap_read_rssi(esp_bd_addr_t remote_addr)545 esp_err_t esp_ble_gap_read_rssi(esp_bd_addr_t remote_addr)
546 {
547 btc_msg_t msg = {0};
548 btc_ble_gap_args_t arg;
549
550 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
551 return ESP_ERR_INVALID_STATE;
552 }
553
554 msg.sig = BTC_SIG_API_CALL;
555 msg.pid = BTC_PID_GAP_BLE;
556 msg.act = BTC_GAP_BLE_ACT_READ_RSSI;
557 memcpy(arg.read_rssi.remote_addr, remote_addr, sizeof(esp_bd_addr_t));
558
559 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
560 }
561 #if (BLE_42_FEATURE_SUPPORT == TRUE)
esp_ble_gap_config_scan_rsp_data_raw(uint8_t * raw_data,uint32_t raw_data_len)562 esp_err_t esp_ble_gap_config_scan_rsp_data_raw(uint8_t *raw_data, uint32_t raw_data_len)
563 {
564 btc_msg_t msg = {0};
565 btc_ble_gap_args_t arg;
566
567 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
568
569 if ((raw_data_len != 0 && raw_data == NULL) || raw_data_len > ESP_BLE_ADV_DATA_LEN_MAX) {
570 return ESP_ERR_INVALID_ARG;
571 }
572
573 msg.sig = BTC_SIG_API_CALL;
574 msg.pid = BTC_PID_GAP_BLE;
575 msg.act = BTC_GAP_BLE_ACT_CFG_SCAN_RSP_DATA_RAW;
576 arg.cfg_scan_rsp_data_raw.raw_scan_rsp = raw_data;
577 arg.cfg_scan_rsp_data_raw.raw_scan_rsp_len = raw_data_len;
578
579 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy,
580 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
581
582 }
583
esp_ble_gap_add_duplicate_scan_exceptional_device(esp_ble_duplicate_exceptional_info_type_t type,esp_duplicate_info_t device_info)584 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)
585 {
586 btc_msg_t msg = {0};
587 btc_ble_gap_args_t arg;
588
589 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
590 return ESP_ERR_INVALID_STATE;
591 }
592 if (!device_info && type <= ESP_BLE_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID) {
593 return ESP_ERR_INVALID_SIZE;
594 }
595 msg.sig = BTC_SIG_API_CALL;
596 msg.pid = BTC_PID_GAP_BLE;
597 msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
598 arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_ADD;
599 arg.update_duplicate_exceptional_list.info_type = type;
600 if (device_info) {
601 memcpy(arg.update_duplicate_exceptional_list.device_info, device_info, sizeof(esp_bd_addr_t));
602 }
603
604 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
605 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
606 }
607
esp_ble_gap_remove_duplicate_scan_exceptional_device(esp_ble_duplicate_exceptional_info_type_t type,esp_duplicate_info_t device_info)608 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)
609 {
610 btc_msg_t msg = {0};
611 btc_ble_gap_args_t arg;
612
613 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
614 return ESP_ERR_INVALID_STATE;
615 }
616 if (!device_info && type <= ESP_BLE_DUPLICATE_SCAN_EXCEPTIONAL_INFO_MESH_LINK_ID) {
617 return ESP_ERR_INVALID_SIZE;
618 }
619 msg.sig = BTC_SIG_API_CALL;
620 msg.pid = BTC_PID_GAP_BLE;
621 msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
622 arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_REMOVE;
623 arg.update_duplicate_exceptional_list.info_type = type;
624 if (device_info) {
625 memcpy(arg.update_duplicate_exceptional_list.device_info, device_info, sizeof(esp_bd_addr_t));
626 }
627
628 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
629 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
630 }
631
esp_ble_gap_clean_duplicate_scan_exceptional_list(esp_duplicate_scan_exceptional_list_type_t list_type)632 esp_err_t esp_ble_gap_clean_duplicate_scan_exceptional_list(esp_duplicate_scan_exceptional_list_type_t list_type)
633 {
634 btc_msg_t msg = {0};
635 btc_ble_gap_args_t arg;
636
637 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
638 return ESP_ERR_INVALID_STATE;
639 }
640
641 msg.sig = BTC_SIG_API_CALL;
642 msg.pid = BTC_PID_GAP_BLE;
643 msg.act = BTC_GAP_BLE_UPDATE_DUPLICATE_SCAN_EXCEPTIONAL_LIST;
644 arg.update_duplicate_exceptional_list.subcode = ESP_BLE_DUPLICATE_EXCEPTIONAL_LIST_CLEAN;
645 arg.update_duplicate_exceptional_list.info_type = list_type;
646
647 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
648 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
649 }
650 #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
651 #if (SMP_INCLUDED == TRUE)
esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type,void * value,uint8_t len)652 esp_err_t esp_ble_gap_set_security_param(esp_ble_sm_param_t param_type,
653 void *value, uint8_t len)
654 {
655 if(param_type >= ESP_BLE_SM_MAX_PARAM) {
656 return ESP_ERR_INVALID_ARG;
657 }
658 if((param_type != ESP_BLE_SM_CLEAR_STATIC_PASSKEY) && ( value == NULL || len < sizeof(uint8_t) || len > sizeof(uint32_t))) {
659 return ESP_ERR_INVALID_ARG;
660 }
661 if(param_type == ESP_BLE_SM_SET_STATIC_PASSKEY) {
662 uint32_t passkey = 0;
663 for(uint8_t i = 0; i < len; i++)
664 {
665 passkey += (((uint8_t *)value)[i]<<(8*i));
666 }
667 if(passkey > 999999) {
668 return ESP_ERR_INVALID_ARG;
669 }
670 }
671 if (param_type == ESP_BLE_APP_ENC_KEY_SIZE) {
672 LOG_ERROR("ESP_BLE_APP_ENC_KEY_SIZE is deprecated, use ESP_GATT_PERM_ENCRYPT_KEY_SIZE in characteristic definition");
673 return ESP_ERR_NOT_SUPPORTED;
674 }
675 if (param_type == ESP_BLE_SM_MAX_KEY_SIZE || param_type == ESP_BLE_SM_MIN_KEY_SIZE) {
676 if (((uint8_t *)value)[0] > 16 || ((uint8_t *)value)[0] < 7) {
677 return ESP_ERR_INVALID_ARG;
678 }
679 }
680 btc_msg_t msg = {0};
681 btc_ble_gap_args_t arg;
682
683 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
684
685 msg.sig = BTC_SIG_API_CALL;
686 msg.pid = BTC_PID_GAP_BLE;
687 msg.act = BTC_GAP_BLE_SET_SECURITY_PARAM_EVT;
688 arg.set_security_param.param_type = param_type;
689 arg.set_security_param.len = len;
690 arg.set_security_param.value = value;
691
692 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy,
693 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
694 }
695
esp_ble_set_encryption(esp_bd_addr_t bd_addr,esp_ble_sec_act_t sec_act)696 esp_err_t esp_ble_set_encryption(esp_bd_addr_t bd_addr, esp_ble_sec_act_t sec_act)
697 {
698 btc_msg_t msg = {0};
699 btc_ble_gap_args_t arg;
700
701 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
702
703 msg.sig = BTC_SIG_API_CALL;
704 msg.pid = BTC_PID_GAP_BLE;
705 msg.act = BTC_GAP_BLE_SET_ENCRYPTION_EVT;
706 arg.set_encryption.sec_act = sec_act;
707 memcpy(arg.set_encryption.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
708
709 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
710 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
711 }
712
esp_ble_gap_security_rsp(esp_bd_addr_t bd_addr,bool accept)713 esp_err_t esp_ble_gap_security_rsp(esp_bd_addr_t bd_addr, bool accept)
714 {
715 btc_msg_t msg = {0};
716 btc_ble_gap_args_t arg;
717
718 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
719
720 msg.sig = BTC_SIG_API_CALL;
721 msg.pid = BTC_PID_GAP_BLE;
722 msg.act = BTC_GAP_BLE_SECURITY_RSP_EVT;
723 arg.sec_rsp.accept = accept;
724 memcpy(arg.sec_rsp.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
725
726 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
727 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
728
729 }
730
esp_ble_passkey_reply(esp_bd_addr_t bd_addr,bool accept,uint32_t passkey)731 esp_err_t esp_ble_passkey_reply(esp_bd_addr_t bd_addr, bool accept, uint32_t passkey)
732 {
733 btc_msg_t msg = {0};
734 btc_ble_gap_args_t arg;
735
736 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
737
738 msg.sig = BTC_SIG_API_CALL;
739 msg.pid = BTC_PID_GAP_BLE;
740 msg.act = BTC_GAP_BLE_PASSKEY_REPLY_EVT;
741 arg.enc_passkey_replay.accept = accept;
742 arg.enc_passkey_replay.passkey = passkey;
743 memcpy(arg.enc_passkey_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
744
745 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
746 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
747 }
748
esp_ble_confirm_reply(esp_bd_addr_t bd_addr,bool accept)749 esp_err_t esp_ble_confirm_reply(esp_bd_addr_t bd_addr, bool accept)
750 {
751 btc_msg_t msg = {0};
752 btc_ble_gap_args_t arg;
753
754 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
755
756 msg.sig = BTC_SIG_API_CALL;
757 msg.pid = BTC_PID_GAP_BLE;
758 msg.act = BTC_GAP_BLE_CONFIRM_REPLY_EVT;
759 arg.enc_comfirm_replay.accept = accept;
760 memcpy(arg.enc_comfirm_replay.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
761
762 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
763 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
764 }
765
esp_ble_remove_bond_device(esp_bd_addr_t bd_addr)766 esp_err_t esp_ble_remove_bond_device(esp_bd_addr_t bd_addr)
767 {
768 btc_msg_t msg = {0};
769 btc_ble_gap_args_t arg;
770 msg.sig = BTC_SIG_API_CALL;
771 msg.pid = BTC_PID_GAP_BLE;
772 msg.act = BTC_GAP_BLE_REMOVE_BOND_DEV_EVT;
773 memcpy(arg.remove_bond_device.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
774
775 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
776 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
777 }
778
esp_ble_get_bond_device_num(void)779 int esp_ble_get_bond_device_num(void)
780 {
781 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
782 return ESP_FAIL;
783 }
784
785 return btc_storage_get_num_ble_bond_devices();
786 }
787
esp_ble_get_bond_device_list(int * dev_num,esp_ble_bond_dev_t * dev_list)788 esp_err_t esp_ble_get_bond_device_list(int *dev_num, esp_ble_bond_dev_t *dev_list)
789 {
790 int ret;
791 int dev_num_total;
792
793 if (dev_num == NULL || dev_list == NULL) {
794 return ESP_ERR_INVALID_ARG;
795 }
796
797 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
798
799 dev_num_total = btc_storage_get_num_ble_bond_devices();
800 if (*dev_num > dev_num_total) {
801 *dev_num = dev_num_total;
802 }
803
804 ret = btc_storage_get_bonded_ble_devices_list(dev_list, *dev_num);
805
806 return (ret == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
807 }
808
esp_ble_oob_req_reply(esp_bd_addr_t bd_addr,uint8_t * TK,uint8_t len)809 esp_err_t esp_ble_oob_req_reply(esp_bd_addr_t bd_addr, uint8_t *TK, uint8_t len)
810 {
811 if(len != ESP_BT_OCTET16_LEN) {
812 return ESP_ERR_INVALID_ARG;
813 }
814
815 btc_msg_t msg = {0};
816 btc_ble_gap_args_t arg;
817
818 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
819
820 msg.sig = BTC_SIG_API_CALL;
821 msg.pid = BTC_PID_GAP_BLE;
822 msg.act = BTC_GAP_BLE_OOB_REQ_REPLY_EVT;
823 memcpy(arg.oob_req_reply.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
824 arg.oob_req_reply.len = len;
825 arg.oob_req_reply.p_value = TK;
826
827 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy,
828 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
829 }
830
esp_ble_sc_oob_req_reply(esp_bd_addr_t bd_addr,uint8_t p_c[16],uint8_t p_r[16])831 esp_err_t esp_ble_sc_oob_req_reply(esp_bd_addr_t bd_addr, uint8_t p_c[16], uint8_t p_r[16])
832 {
833 if (!p_c || !p_r) {
834 return ESP_ERR_INVALID_ARG;
835 }
836
837 btc_msg_t msg = {0};
838 btc_ble_gap_args_t arg;
839
840 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
841
842 msg.sig = BTC_SIG_API_CALL;
843 msg.pid = BTC_PID_GAP_BLE;
844 msg.act = BTC_GAP_BLE_SC_OOB_REQ_REPLY_EVT;
845 memcpy(arg.sc_oob_req_reply.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
846 arg.sc_oob_req_reply.p_c = p_c;
847 arg.sc_oob_req_reply.p_r = p_r;
848
849 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy,
850 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
851 }
852
esp_ble_create_sc_oob_data(void)853 esp_err_t esp_ble_create_sc_oob_data(void)
854 {
855 btc_msg_t msg = {0};
856
857 msg.sig = BTC_SIG_API_CALL;
858 msg.pid = BTC_PID_GAP_BLE;
859 msg.act = BTC_GAP_BLE_SC_CR_OOB_DATA_EVT;
860
861 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
862 }
863 #endif /* #if (SMP_INCLUDED == TRUE) */
864
esp_ble_gap_disconnect(esp_bd_addr_t remote_device)865 esp_err_t esp_ble_gap_disconnect(esp_bd_addr_t remote_device)
866 {
867 btc_msg_t msg = {0};
868 btc_ble_gap_args_t arg;
869
870 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
871
872 msg.sig = BTC_SIG_API_CALL;
873 msg.pid = BTC_PID_GAP_BLE;
874 msg.act = BTC_GAP_BLE_DISCONNECT_EVT;
875 memcpy(arg.disconnect.remote_device, remote_device, ESP_BD_ADDR_LEN);
876
877 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
878 }
879
esp_ble_get_current_conn_params(esp_bd_addr_t bd_addr,esp_gap_conn_params_t * conn_params)880 esp_err_t esp_ble_get_current_conn_params(esp_bd_addr_t bd_addr, esp_gap_conn_params_t *conn_params)
881 {
882 if(!bd_addr || !conn_params) {
883 return ESP_ERR_INVALID_ARG;
884 }
885 if(BTM_GetCurrentConnParams(bd_addr, &conn_params->interval, &conn_params->latency, &conn_params->timeout)) {
886 return ESP_OK;
887 }
888 return ESP_ERR_NOT_FOUND;
889 }
890
esp_gap_ble_set_channels(esp_gap_ble_channels channels)891 esp_err_t esp_gap_ble_set_channels(esp_gap_ble_channels channels)
892 {
893 btc_msg_t msg = {0};
894 btc_ble_gap_args_t arg;
895
896 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
897 return ESP_ERR_INVALID_STATE;
898 }
899
900 msg.sig = BTC_SIG_API_CALL;
901 msg.pid = BTC_PID_GAP_BLE;
902 msg.act = BTC_GAP_BLE_SET_AFH_CHANNELS;
903
904 memcpy(&arg.set_channels.channels, channels, ESP_GAP_BLE_CHANNELS_LEN);
905 arg.set_channels.channels[ESP_GAP_BLE_CHANNELS_LEN -1] &= 0x1F;
906 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
907 }
908
esp_gap_ble_set_authorization(esp_bd_addr_t bd_addr,bool authorize)909 esp_err_t esp_gap_ble_set_authorization(esp_bd_addr_t bd_addr, bool authorize)
910 {
911 if (!bd_addr) {
912 return ESP_ERR_INVALID_ARG;
913 }
914 if (BTM_Ble_Authorization(bd_addr, authorize)) {
915 return ESP_OK;
916 }
917 return ESP_FAIL;
918 }
919
920 #if (BLE_42_FEATURE_SUPPORT == TRUE)
esp_ble_dtm_tx_start(const esp_ble_dtm_tx_t * tx_params)921 esp_err_t esp_ble_dtm_tx_start(const esp_ble_dtm_tx_t *tx_params)
922 {
923 btc_msg_t msg = {0};
924 btc_ble_gap_args_t arg;
925
926 if (!tx_params) {
927 return ESP_ERR_INVALID_ARG;
928 }
929
930 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
931
932 msg.sig = BTC_SIG_API_CALL;
933 msg.pid = BTC_PID_GAP_BLE;
934 msg.act = BTC_GAP_BLE_DTM_TX_START;
935
936 memcpy(&arg.dtm_tx_start, tx_params, sizeof(esp_ble_dtm_tx_t));
937
938 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
939 }
940
esp_ble_dtm_rx_start(const esp_ble_dtm_rx_t * rx_params)941 esp_err_t esp_ble_dtm_rx_start(const esp_ble_dtm_rx_t *rx_params)
942 {
943 btc_msg_t msg = {0};
944 btc_ble_gap_args_t arg;
945
946 if (!rx_params) {
947 return ESP_ERR_INVALID_ARG;
948 }
949
950 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
951
952 msg.sig = BTC_SIG_API_CALL;
953 msg.pid = BTC_PID_GAP_BLE;
954 msg.act = BTC_GAP_BLE_DTM_RX_START;
955
956 memcpy(&arg.dtm_rx_start, rx_params, sizeof(esp_ble_dtm_rx_t));
957
958 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
959 }
960 #endif // #if (BLE_42_FEATURE_SUPPORT == TRUE)
961
962 #if (BLE_50_FEATURE_SUPPORT == TRUE)
esp_ble_dtm_enh_tx_start(const esp_ble_dtm_enh_tx_t * tx_params)963 esp_err_t esp_ble_dtm_enh_tx_start(const esp_ble_dtm_enh_tx_t *tx_params)
964 {
965 btc_msg_t msg = {0};
966 btc_ble_5_gap_args_t arg;
967
968 if (!tx_params) {
969 return ESP_ERR_INVALID_ARG;
970 }
971
972 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
973
974 msg.sig = BTC_SIG_API_CALL;
975 msg.pid = BTC_PID_GAP_BLE;
976 msg.act = BTC_GAP_BLE_DTM_ENH_TX_START;
977
978 memcpy(&arg.dtm_enh_tx_start, tx_params, sizeof(esp_ble_dtm_enh_tx_t));
979
980 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
981 }
982
esp_ble_dtm_enh_rx_start(const esp_ble_dtm_enh_rx_t * rx_params)983 esp_err_t esp_ble_dtm_enh_rx_start(const esp_ble_dtm_enh_rx_t *rx_params)
984 {
985 btc_msg_t msg = {0};
986 btc_ble_5_gap_args_t arg;
987
988 if (!rx_params) {
989 return ESP_ERR_INVALID_ARG;
990 }
991
992 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
993
994 msg.sig = BTC_SIG_API_CALL;
995 msg.pid = BTC_PID_GAP_BLE;
996 msg.act = BTC_GAP_BLE_DTM_ENH_RX_START;
997
998 memcpy(&arg.dtm_enh_rx_start, rx_params, sizeof(esp_ble_dtm_enh_rx_t));
999
1000 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1001 }
1002 #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
1003
esp_ble_dtm_stop(void)1004 esp_err_t esp_ble_dtm_stop(void)
1005 {
1006 btc_msg_t msg = {0};
1007
1008 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1009
1010 msg.sig = BTC_SIG_API_CALL;
1011 msg.pid = BTC_PID_GAP_BLE;
1012 msg.act = BTC_GAP_BLE_DTM_STOP;
1013
1014 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1015 }
1016
esp_ble_gap_set_privacy_mode(esp_ble_addr_type_t addr_type,esp_bd_addr_t addr,esp_ble_privacy_mode_t mode)1017 esp_err_t esp_ble_gap_set_privacy_mode(esp_ble_addr_type_t addr_type, esp_bd_addr_t addr, esp_ble_privacy_mode_t mode)
1018 {
1019 btc_msg_t msg;
1020 btc_ble_gap_args_t arg;
1021
1022 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1023
1024 msg.sig = BTC_SIG_API_CALL;
1025 msg.pid = BTC_PID_GAP_BLE;
1026 msg.act = BTC_GAP_BLE_SET_PRIVACY_MODE;
1027
1028 arg.set_privacy_mode.addr_type = addr_type;
1029 memcpy(arg.set_privacy_mode.addr, addr, sizeof(esp_bd_addr_t));
1030 arg.set_privacy_mode.privacy_mode = mode;
1031
1032 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
1033 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1034 }
1035
esp_ble_gap_set_csa_support(uint8_t csa_select)1036 esp_err_t esp_ble_gap_set_csa_support(uint8_t csa_select)
1037 {
1038 btc_msg_t msg;
1039 btc_ble_gap_args_t arg;
1040
1041 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1042
1043 msg.sig = BTC_SIG_API_CALL;
1044 msg.pid = BTC_PID_GAP_BLE;
1045 msg.act = BTC_GAP_BLE_SET_CSA_SUPPORT;
1046
1047 arg.set_csa_support.csa_select = csa_select;
1048
1049 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), NULL, NULL)
1050 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1051 }
1052
1053 #if (BLE_50_FEATURE_SUPPORT == TRUE)
1054
esp_ble_gap_read_phy(esp_bd_addr_t bd_addr)1055 esp_err_t esp_ble_gap_read_phy(esp_bd_addr_t bd_addr)
1056 {
1057 btc_msg_t msg;
1058 btc_ble_5_gap_args_t arg;
1059
1060 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1061
1062 msg.sig = BTC_SIG_API_CALL;
1063 msg.pid = BTC_PID_GAP_BLE;
1064 msg.act = BTC_GAP_BLE_READ_PHY;
1065
1066 memcpy(arg.read_phy.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
1067 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1068 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1069 }
1070
esp_ble_gap_set_preferred_default_phy(esp_ble_gap_phy_mask_t tx_phy_mask,esp_ble_gap_phy_mask_t rx_phy_mask)1071 esp_err_t esp_ble_gap_set_preferred_default_phy(esp_ble_gap_phy_mask_t tx_phy_mask,
1072 esp_ble_gap_phy_mask_t rx_phy_mask)
1073 {
1074 btc_msg_t msg;
1075 btc_ble_5_gap_args_t arg;
1076
1077 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1078
1079 msg.sig = BTC_SIG_API_CALL;
1080 msg.pid = BTC_PID_GAP_BLE;
1081 msg.act = BTC_GAP_BLE_SET_PREFERED_DEF_PHY;
1082 arg.set_perf_def_phy.tx_phy_mask = tx_phy_mask;
1083 arg.set_perf_def_phy.rx_phy_mask = rx_phy_mask;
1084
1085 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1086 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1087 }
1088
esp_ble_gap_set_preferred_phy(esp_bd_addr_t bd_addr,esp_ble_gap_all_phys_t all_phys_mask,esp_ble_gap_phy_mask_t tx_phy_mask,esp_ble_gap_phy_mask_t rx_phy_mask,esp_ble_gap_prefer_phy_options_t phy_options)1089 esp_err_t esp_ble_gap_set_preferred_phy(esp_bd_addr_t bd_addr,
1090 esp_ble_gap_all_phys_t all_phys_mask,
1091 esp_ble_gap_phy_mask_t tx_phy_mask,
1092 esp_ble_gap_phy_mask_t rx_phy_mask,
1093 esp_ble_gap_prefer_phy_options_t phy_options)
1094 {
1095 btc_msg_t msg;
1096 btc_ble_5_gap_args_t arg;
1097
1098 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1099
1100 msg.sig = BTC_SIG_API_CALL;
1101 msg.pid = BTC_PID_GAP_BLE;
1102 msg.act = BTC_GAP_BLE_SET_DEF_PHY;
1103 memcpy(arg.set_def_phy.bd_addr, bd_addr, ESP_BD_ADDR_LEN);
1104 arg.set_def_phy.all_phys_mask = all_phys_mask;
1105 arg.set_def_phy.tx_phy_mask = tx_phy_mask;
1106 arg.set_def_phy.rx_phy_mask = rx_phy_mask;
1107 arg.set_def_phy.phy_options = phy_options;
1108 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1109 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1110 }
1111
esp_ble_gap_ext_adv_set_rand_addr(uint8_t instance,esp_bd_addr_t rand_addr)1112 esp_err_t esp_ble_gap_ext_adv_set_rand_addr(uint8_t instance, esp_bd_addr_t rand_addr)
1113 {
1114 btc_msg_t msg;
1115 btc_ble_5_gap_args_t arg;
1116
1117 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1118
1119 msg.sig = BTC_SIG_API_CALL;
1120 msg.pid = BTC_PID_GAP_BLE;
1121 msg.act = BTC_GAP_BLE_SET_EXT_ADV_RAND_ADDR;
1122 arg.ext_adv_set_rand_addr.instance = instance;
1123 memcpy(arg.ext_adv_set_rand_addr.rand_addr, rand_addr, BD_ADDR_LEN);
1124
1125 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1126 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1127
1128 }
1129
esp_ble_gap_ext_adv_set_params(uint8_t instance,const esp_ble_gap_ext_adv_params_t * params)1130 esp_err_t esp_ble_gap_ext_adv_set_params(uint8_t instance,
1131 const esp_ble_gap_ext_adv_params_t *params)
1132 {
1133 btc_msg_t msg;
1134 btc_ble_5_gap_args_t arg;
1135
1136 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1137
1138 msg.sig = BTC_SIG_API_CALL;
1139 msg.pid = BTC_PID_GAP_BLE;
1140 msg.act = BTC_GAP_BLE_SET_EXT_ADV_PARAMS;
1141
1142 if (ESP_BLE_IS_VALID_PARAM(params->interval_min, ESP_BLE_PRIM_ADV_INT_MIN, ESP_BLE_PRIM_ADV_INT_MAX) &&
1143 ESP_BLE_IS_VALID_PARAM(params->interval_max, ESP_BLE_PRIM_ADV_INT_MIN, ESP_BLE_PRIM_ADV_INT_MAX) &&
1144 ESP_BLE_IS_VALID_PARAM(params->peer_addr_type, BLE_ADDR_TYPE_PUBLIC, BLE_ADDR_TYPE_RANDOM) &&
1145 ESP_BLE_IS_VALID_PARAM(params->own_addr_type, BLE_ADDR_TYPE_PUBLIC, BLE_ADDR_TYPE_RPA_RANDOM) &&
1146 ESP_BLE_IS_VALID_PARAM(params->filter_policy, ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST) &&
1147 (params->interval_min <= params->interval_max) && (params->channel_map > 0) && (params->channel_map <= ADV_CHNL_ALL) &&
1148 ((params->primary_phy == ESP_BLE_GAP_PRI_PHY_1M) || (params->primary_phy == ESP_BLE_GAP_PRI_PHY_CODED)) &&
1149 ((params->secondary_phy == ESP_BLE_GAP_PHY_1M) || (params->secondary_phy == ESP_BLE_GAP_PHY_2M) ||
1150 (params->secondary_phy == ESP_BLE_GAP_PHY_CODED))){
1151 memcpy(&arg.ext_adv_set_params.params, params, sizeof(esp_ble_gap_ext_adv_params_t));
1152 } else {
1153 LOG_ERROR("%s,invalid ext adv params", __func__);
1154 return ESP_ERR_INVALID_ARG;
1155 }
1156
1157 arg.ext_adv_set_params.instance = instance;
1158
1159 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1160 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1161 }
1162
esp_ble_gap_config_ext_adv_data_raw(uint8_t instance,uint16_t length,const uint8_t * data)1163 esp_err_t esp_ble_gap_config_ext_adv_data_raw(uint8_t instance, uint16_t length,
1164 const uint8_t *data)
1165 {
1166 btc_msg_t msg;
1167 btc_ble_5_gap_args_t arg;
1168
1169 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1170
1171 msg.sig = BTC_SIG_API_CALL;
1172 msg.pid = BTC_PID_GAP_BLE;
1173 msg.act = BTC_GAP_BLE_CFG_EXT_ADV_DATA_RAW;
1174
1175 arg.ext_adv_cfg_data.instance = instance;
1176 arg.ext_adv_cfg_data.length = length;
1177 arg.ext_adv_cfg_data.data = (uint8_t *)data;
1178
1179 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy,
1180 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1181 }
1182
esp_ble_gap_config_ext_scan_rsp_data_raw(uint8_t instance,uint16_t length,const uint8_t * scan_rsp_data)1183 esp_err_t esp_ble_gap_config_ext_scan_rsp_data_raw(uint8_t instance, uint16_t length,
1184 const uint8_t *scan_rsp_data)
1185 {
1186 btc_msg_t msg;
1187 btc_ble_5_gap_args_t arg;
1188
1189 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1190
1191 msg.sig = BTC_SIG_API_CALL;
1192 msg.pid = BTC_PID_GAP_BLE;
1193 msg.act = BTC_GAP_BLE_CFG_EXT_SCAN_RSP_DATA_RAW;
1194
1195 arg.cfg_scan_rsp.instance = instance;
1196 arg.cfg_scan_rsp.length = length;
1197 arg.cfg_scan_rsp.data = (uint8_t *)scan_rsp_data;
1198
1199 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy,
1200 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1201 }
1202
esp_ble_gap_ext_adv_start(uint8_t num_adv,const esp_ble_gap_ext_adv_t * ext_adv)1203 esp_err_t esp_ble_gap_ext_adv_start(uint8_t num_adv, const esp_ble_gap_ext_adv_t *ext_adv)
1204 {
1205 btc_msg_t msg;
1206 btc_ble_5_gap_args_t arg;
1207
1208 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1209
1210 msg.sig = BTC_SIG_API_CALL;
1211 msg.pid = BTC_PID_GAP_BLE;
1212 msg.act = BTC_GAP_BLE_EXT_ADV_START;
1213
1214 arg.ext_adv_start.num_adv = num_adv;
1215 arg.ext_adv_start.ext_adv = (esp_ble_gap_ext_adv_t *)ext_adv;
1216
1217 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy,
1218 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1219 }
1220
esp_ble_gap_ext_adv_stop(uint8_t num_adv,const uint8_t * ext_adv_inst)1221 esp_err_t esp_ble_gap_ext_adv_stop(uint8_t num_adv, const uint8_t *ext_adv_inst)
1222 {
1223 btc_msg_t msg;
1224 btc_ble_5_gap_args_t arg;
1225
1226 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1227
1228 msg.sig = BTC_SIG_API_CALL;
1229 msg.pid = BTC_PID_GAP_BLE;
1230 msg.act = BTC_GAP_BLE_EXT_ADV_STOP;
1231 arg.ext_adv_stop.num_adv = num_adv;
1232 arg.ext_adv_stop.ext_adv_inst = (uint8_t *)ext_adv_inst;
1233
1234 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy,
1235 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1236
1237 }
1238
esp_ble_gap_ext_adv_set_remove(uint8_t instance)1239 esp_err_t esp_ble_gap_ext_adv_set_remove(uint8_t instance)
1240 {
1241 btc_msg_t msg;
1242 btc_ble_5_gap_args_t arg;
1243
1244 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1245
1246 msg.sig = BTC_SIG_API_CALL;
1247 msg.pid = BTC_PID_GAP_BLE;
1248 msg.act = BTC_GAP_BLE_EXT_ADV_SET_REMOVE;
1249 arg.ext_adv_set_remove.instance = instance;
1250
1251 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1252 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1253 }
1254
esp_ble_gap_ext_adv_set_clear(void)1255 esp_err_t esp_ble_gap_ext_adv_set_clear(void)
1256 {
1257 btc_msg_t msg;
1258
1259 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1260
1261 msg.sig = BTC_SIG_API_CALL;
1262 msg.pid = BTC_PID_GAP_BLE;
1263 msg.act = BTC_GAP_BLE_EXT_ADV_SET_CLEAR;
1264
1265 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1266 }
1267
esp_ble_gap_periodic_adv_set_params(uint8_t instance,const esp_ble_gap_periodic_adv_params_t * params)1268 esp_err_t esp_ble_gap_periodic_adv_set_params(uint8_t instance, const esp_ble_gap_periodic_adv_params_t *params)
1269 {
1270 btc_msg_t msg;
1271 btc_ble_5_gap_args_t arg;
1272
1273 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1274
1275 msg.sig = BTC_SIG_API_CALL;
1276 msg.pid = BTC_PID_GAP_BLE;
1277 msg.act = BTC_GAP_BLE_SET_PERIODIC_ADV_PARAMS;
1278
1279 arg.peridic_adv_set_params.instance = instance;
1280 memcpy(&arg.peridic_adv_set_params.params, params, sizeof(esp_ble_gap_periodic_adv_params_t));
1281
1282 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1283 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1284
1285 }
1286
1287 #if (CONFIG_BT_BLE_FEAT_PERIODIC_ADV_ENH)
esp_ble_gap_config_periodic_adv_data_raw(uint8_t instance,uint16_t length,const uint8_t * data,bool only_update_did)1288 esp_err_t esp_ble_gap_config_periodic_adv_data_raw(uint8_t instance, uint16_t length,
1289 const uint8_t *data, bool only_update_did)
1290 #else
1291 esp_err_t esp_ble_gap_config_periodic_adv_data_raw(uint8_t instance, uint16_t length,
1292 const uint8_t *data)
1293 #endif
1294 {
1295 btc_msg_t msg;
1296 btc_ble_5_gap_args_t arg;
1297
1298 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1299
1300 msg.sig = BTC_SIG_API_CALL;
1301 msg.pid = BTC_PID_GAP_BLE;
1302 msg.act = BTC_GAP_BLE_CFG_PERIODIC_ADV_DATA_RAW;
1303
1304 arg.periodic_adv_cfg_data.instance = instance;
1305 arg.periodic_adv_cfg_data.len = length;
1306 arg.periodic_adv_cfg_data.data = (uint8_t *)data;
1307 #if (CONFIG_BT_BLE_FEAT_PERIODIC_ADV_ENH)
1308 arg.periodic_adv_cfg_data.only_update_did = only_update_did;
1309 #else
1310 arg.periodic_adv_cfg_data.only_update_did = false;
1311 #endif
1312
1313 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), btc_gap_ble_arg_deep_copy,
1314 btc_gap_ble_arg_deep_free) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1315
1316 }
1317
1318 #if (CONFIG_BT_BLE_FEAT_PERIODIC_ADV_ENH)
esp_ble_gap_periodic_adv_start(uint8_t instance,bool include_adi)1319 esp_err_t esp_ble_gap_periodic_adv_start(uint8_t instance,bool include_adi)
1320 #else
1321 esp_err_t esp_ble_gap_periodic_adv_start(uint8_t instance)
1322 #endif
1323 {
1324 btc_msg_t msg;
1325 btc_ble_5_gap_args_t arg;
1326
1327 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1328
1329 msg.sig = BTC_SIG_API_CALL;
1330 msg.pid = BTC_PID_GAP_BLE;
1331 msg.act = BTC_GAP_BLE_PERIODIC_ADV_START;
1332
1333 #if (CONFIG_BT_BLE_FEAT_PERIODIC_ADV_ENH)
1334 arg.periodic_adv_start.include_adi = include_adi;
1335 #else
1336 arg.periodic_adv_start.include_adi = false;
1337 #endif
1338 arg.periodic_adv_start.instance = instance;
1339
1340 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1341 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1342
1343 }
1344
esp_ble_gap_periodic_adv_stop(uint8_t instance)1345 esp_err_t esp_ble_gap_periodic_adv_stop(uint8_t instance)
1346 {
1347 btc_msg_t msg;
1348 btc_ble_5_gap_args_t arg;
1349
1350 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1351
1352 msg.sig = BTC_SIG_API_CALL;
1353 msg.pid = BTC_PID_GAP_BLE;
1354 msg.act = BTC_GAP_BLE_PERIODIC_ADV_STOP;
1355
1356 arg.periodic_adv_stop.instance = instance;
1357
1358 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1359 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1360
1361 }
1362
esp_ble_gap_periodic_adv_create_sync(const esp_ble_gap_periodic_adv_sync_params_t * params)1363 esp_err_t esp_ble_gap_periodic_adv_create_sync(const esp_ble_gap_periodic_adv_sync_params_t *params)
1364 {
1365 btc_msg_t msg;
1366 btc_ble_5_gap_args_t arg;
1367
1368 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1369
1370 msg.sig = BTC_SIG_API_CALL;
1371 msg.pid = BTC_PID_GAP_BLE;
1372 msg.act = BTC_GAP_BLE_PERIODIC_ADV_CREATE_SYNC;
1373
1374 memcpy(&arg.periodic_adv_create_sync.params, params, sizeof(esp_ble_gap_periodic_adv_sync_params_t));
1375
1376 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1377 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1378
1379 }
1380
esp_ble_gap_periodic_adv_sync_cancel(void)1381 esp_err_t esp_ble_gap_periodic_adv_sync_cancel(void)
1382 {
1383 btc_msg_t msg;
1384
1385 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1386
1387 msg.sig = BTC_SIG_API_CALL;
1388 msg.pid = BTC_PID_GAP_BLE;
1389 msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_CANCEL;
1390
1391 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL)
1392 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1393
1394 }
1395
esp_ble_gap_periodic_adv_sync_terminate(uint16_t sync_handle)1396 esp_err_t esp_ble_gap_periodic_adv_sync_terminate(uint16_t sync_handle)
1397 {
1398 btc_msg_t msg;
1399 btc_ble_5_gap_args_t arg;
1400
1401 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1402
1403 msg.sig = BTC_SIG_API_CALL;
1404 msg.pid = BTC_PID_GAP_BLE;
1405 msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_TERMINATE;
1406
1407 arg.periodic_adv_sync_term.sync_handle = sync_handle;
1408
1409 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1410 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1411 }
1412
esp_ble_gap_periodic_adv_add_dev_to_list(esp_ble_addr_type_t addr_type,esp_bd_addr_t addr,uint8_t sid)1413 esp_err_t esp_ble_gap_periodic_adv_add_dev_to_list(esp_ble_addr_type_t addr_type,
1414 esp_bd_addr_t addr,
1415 uint8_t sid)
1416 {
1417 btc_msg_t msg;
1418 btc_ble_5_gap_args_t arg;
1419
1420 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1421
1422 msg.sig = BTC_SIG_API_CALL;
1423 msg.pid = BTC_PID_GAP_BLE;
1424 msg.act = BTC_GAP_BLE_PERIODIC_ADV_ADD_DEV_TO_LIST;
1425
1426 arg.periodic_adv_add_dev.addr_type = addr_type;
1427 arg.periodic_adv_add_dev.sid = sid;
1428
1429
1430 memcpy(arg.periodic_adv_add_dev.addr, addr, sizeof(esp_bd_addr_t));
1431
1432 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1433 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1434
1435 }
1436
esp_ble_gap_periodic_adv_remove_dev_from_list(esp_ble_addr_type_t addr_type,esp_bd_addr_t addr,uint8_t sid)1437 esp_err_t esp_ble_gap_periodic_adv_remove_dev_from_list(esp_ble_addr_type_t addr_type,
1438 esp_bd_addr_t addr,
1439 uint8_t sid)
1440 {
1441 btc_msg_t msg;
1442 btc_ble_5_gap_args_t arg;
1443
1444 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1445
1446 msg.sig = BTC_SIG_API_CALL;
1447 msg.pid = BTC_PID_GAP_BLE;
1448 msg.act = BTC_GAP_BLE_PERIODIC_REMOVE_ADD_DEV_FROM_LIST;
1449
1450 arg.periodic_adv_remove_dev.addr_type = addr_type;
1451 arg.periodic_adv_remove_dev.sid = sid;
1452
1453
1454 memcpy(arg.periodic_adv_remove_dev.addr, addr, sizeof(esp_bd_addr_t));
1455
1456 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1457 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1458
1459 }
1460
esp_ble_gap_periodic_adv_clear_dev(void)1461 esp_err_t esp_ble_gap_periodic_adv_clear_dev(void)
1462 {
1463 btc_msg_t msg;
1464
1465 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1466
1467 msg.sig = BTC_SIG_API_CALL;
1468 msg.pid = BTC_PID_GAP_BLE;
1469 msg.act = BTC_GAP_BLE_PERIODIC_CLEAR_DEV;
1470
1471 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL)
1472 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1473
1474 }
1475
esp_ble_gap_set_ext_scan_params(const esp_ble_ext_scan_params_t * params)1476 esp_err_t esp_ble_gap_set_ext_scan_params(const esp_ble_ext_scan_params_t *params)
1477 {
1478 btc_msg_t msg;
1479 btc_ble_5_gap_args_t arg;
1480
1481 if (!params) {
1482 return ESP_ERR_INVALID_ARG;
1483 }
1484
1485 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1486
1487 msg.sig = BTC_SIG_API_CALL;
1488 msg.pid = BTC_PID_GAP_BLE;
1489 msg.act = BTC_GAP_BLE_SET_EXT_SCAN_PARAMS;
1490
1491 memcpy(&arg.set_ext_scan_params.params, params, sizeof(esp_ble_ext_scan_params_t));
1492
1493 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1494 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1495 }
1496
esp_ble_gap_start_ext_scan(uint32_t duration,uint16_t period)1497 esp_err_t esp_ble_gap_start_ext_scan(uint32_t duration, uint16_t period)
1498 {
1499 btc_msg_t msg;
1500 btc_ble_5_gap_args_t arg;
1501
1502 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1503
1504 msg.sig = BTC_SIG_API_CALL;
1505 msg.pid = BTC_PID_GAP_BLE;
1506 msg.act = BTC_GAP_BLE_START_EXT_SCAN;
1507
1508 arg.start_ext_scan.duration = duration;
1509 arg.start_ext_scan.period = period;
1510
1511 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1512 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1513 }
1514
esp_ble_gap_stop_ext_scan(void)1515 esp_err_t esp_ble_gap_stop_ext_scan(void)
1516 {
1517 btc_msg_t msg;
1518
1519 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1520
1521 msg.sig = BTC_SIG_API_CALL;
1522 msg.pid = BTC_PID_GAP_BLE;
1523 msg.act = BTC_GAP_BLE_STOP_EXT_SCAN;
1524
1525 return (btc_transfer_context(&msg, NULL, 0, NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1526 }
1527
esp_ble_gap_prefer_ext_connect_params_set(esp_bd_addr_t addr,esp_ble_gap_phy_mask_t phy_mask,const esp_ble_gap_conn_params_t * phy_1m_conn_params,const esp_ble_gap_conn_params_t * phy_2m_conn_params,const esp_ble_gap_conn_params_t * phy_coded_conn_params)1528 esp_err_t esp_ble_gap_prefer_ext_connect_params_set(esp_bd_addr_t addr,
1529 esp_ble_gap_phy_mask_t phy_mask,
1530 const esp_ble_gap_conn_params_t *phy_1m_conn_params,
1531 const esp_ble_gap_conn_params_t *phy_2m_conn_params,
1532 const esp_ble_gap_conn_params_t *phy_coded_conn_params)
1533 {
1534 btc_msg_t msg;
1535 btc_ble_5_gap_args_t arg;
1536
1537 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1538
1539 msg.sig = BTC_SIG_API_CALL;
1540 msg.pid = BTC_PID_GAP_BLE;
1541 msg.act = BTC_GAP_BLE_SET_EXT_PEFER_CONNET_PARAMS;
1542
1543 arg.set_ext_conn_params.phy_mask = phy_mask;
1544 if (phy_mask & ESP_BLE_GAP_PHY_1M_PREF_MASK) {
1545 if (!phy_1m_conn_params) {
1546 return BT_STATUS_PARM_INVALID;
1547 }
1548
1549 if (ESP_BLE_IS_VALID_PARAM(phy_1m_conn_params->interval_min, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
1550 ESP_BLE_IS_VALID_PARAM(phy_1m_conn_params->interval_max, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
1551 ESP_BLE_IS_VALID_PARAM(phy_1m_conn_params->supervision_timeout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
1552 (phy_1m_conn_params->latency <= ESP_BLE_CONN_LATENCY_MAX) &&
1553 ((phy_1m_conn_params->supervision_timeout * 10) >= ((1 + phy_1m_conn_params->latency) * ((phy_1m_conn_params->interval_max * 5) >> 1))) &&
1554 (phy_1m_conn_params->interval_min <= phy_1m_conn_params->interval_max)) {
1555
1556 memcpy(&arg.set_ext_conn_params.phy_1m_conn_params, phy_1m_conn_params, sizeof(esp_ble_gap_conn_params_t));
1557 } else {
1558 LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d", __func__,
1559 phy_1m_conn_params->interval_min,
1560 phy_1m_conn_params->interval_max,
1561 phy_1m_conn_params->latency,
1562 phy_1m_conn_params->supervision_timeout);
1563
1564 return ESP_ERR_INVALID_ARG;
1565 }
1566 }
1567
1568 if (phy_mask & ESP_BLE_GAP_PHY_2M_PREF_MASK) {
1569 if (!phy_2m_conn_params) {
1570 return BT_STATUS_PARM_INVALID;
1571 }
1572
1573 if (ESP_BLE_IS_VALID_PARAM(phy_2m_conn_params->interval_min, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
1574 ESP_BLE_IS_VALID_PARAM(phy_2m_conn_params->interval_max, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
1575 ESP_BLE_IS_VALID_PARAM(phy_2m_conn_params->supervision_timeout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
1576 (phy_2m_conn_params->latency <= ESP_BLE_CONN_LATENCY_MAX) &&
1577 ((phy_2m_conn_params->supervision_timeout * 10) >= ((1 + phy_2m_conn_params->latency) * ((phy_2m_conn_params->interval_max * 5) >> 1))) &&
1578 (phy_2m_conn_params->interval_min <= phy_2m_conn_params->interval_max)) {
1579
1580 memcpy(&arg.set_ext_conn_params.phy_2m_conn_params, phy_2m_conn_params, sizeof(esp_ble_gap_conn_params_t));
1581 } else {
1582 LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d", __func__,
1583 phy_2m_conn_params->interval_min,
1584 phy_2m_conn_params->interval_max,
1585 phy_2m_conn_params->latency,
1586 phy_2m_conn_params->supervision_timeout);
1587
1588 return ESP_ERR_INVALID_ARG;
1589 }
1590 }
1591
1592 if (phy_mask & ESP_BLE_GAP_PHY_CODED_PREF_MASK) {
1593 if (!phy_coded_conn_params) {
1594 return BT_STATUS_PARM_INVALID;
1595 }
1596
1597 if (ESP_BLE_IS_VALID_PARAM(phy_coded_conn_params->interval_min, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
1598 ESP_BLE_IS_VALID_PARAM(phy_coded_conn_params->interval_max, ESP_BLE_CONN_INT_MIN, ESP_BLE_CONN_INT_MAX) &&
1599 ESP_BLE_IS_VALID_PARAM(phy_coded_conn_params->supervision_timeout, ESP_BLE_CONN_SUP_TOUT_MIN, ESP_BLE_CONN_SUP_TOUT_MAX) &&
1600 (phy_coded_conn_params->latency <= ESP_BLE_CONN_LATENCY_MAX) &&
1601 ((phy_coded_conn_params->supervision_timeout * 10) >= ((1 + phy_coded_conn_params->latency) * ((phy_coded_conn_params->interval_max * 5) >> 1))) &&
1602 (phy_coded_conn_params->interval_min <= phy_coded_conn_params->interval_max)) {
1603
1604 memcpy(&arg.set_ext_conn_params.phy_coded_conn_params, phy_coded_conn_params, sizeof(esp_ble_gap_conn_params_t));
1605 } else {
1606 LOG_ERROR("%s,invalid connection params:min_int = %d, max_int = %d, latency = %d, timeout = %d", __func__,
1607 phy_coded_conn_params->interval_min,
1608 phy_coded_conn_params->interval_max,
1609 phy_coded_conn_params->latency,
1610 phy_coded_conn_params->supervision_timeout);
1611
1612 return ESP_ERR_INVALID_ARG;
1613 }
1614 }
1615
1616 memcpy(arg.set_ext_conn_params.addr, addr, sizeof(esp_bd_addr_t));
1617
1618 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1619 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1620
1621 }
1622
1623 #endif //#if (BLE_50_FEATURE_SUPPORT == TRUE)
1624
1625 #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
esp_ble_gap_periodic_adv_recv_enable(uint16_t sync_handle,uint8_t enable)1626 esp_err_t esp_ble_gap_periodic_adv_recv_enable(uint16_t sync_handle, uint8_t enable)
1627 {
1628 btc_msg_t msg;
1629 btc_ble_5_gap_args_t arg;
1630
1631 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1632
1633 msg.sig = BTC_SIG_API_CALL;
1634 msg.pid = BTC_PID_GAP_BLE;
1635 msg.act = BTC_GAP_BLE_PERIODIC_ADV_RECV_ENABLE;
1636
1637 arg.periodic_adv_recv_en.sync_handle = sync_handle;
1638 arg.periodic_adv_recv_en.enable = enable;
1639
1640 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1641 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1642 }
1643
esp_ble_gap_periodic_adv_sync_trans(esp_bd_addr_t addr,uint16_t service_data,uint16_t sync_handle)1644 esp_err_t esp_ble_gap_periodic_adv_sync_trans(esp_bd_addr_t addr, uint16_t service_data, uint16_t sync_handle)
1645 {
1646 btc_msg_t msg;
1647 btc_ble_5_gap_args_t arg;
1648
1649 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1650
1651 if (addr == NULL) {
1652 return ESP_ERR_INVALID_ARG;
1653 }
1654
1655 msg.sig = BTC_SIG_API_CALL;
1656 msg.pid = BTC_PID_GAP_BLE;
1657 msg.act = BTC_GAP_BLE_PERIODIC_ADV_SYNC_TRANS;
1658
1659 memcpy(arg.periodic_adv_sync_trans.addr, addr, sizeof(esp_bd_addr_t));
1660 arg.periodic_adv_sync_trans.service_data = service_data;
1661 arg.periodic_adv_sync_trans.sync_handle = sync_handle;
1662
1663 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1664 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1665 }
1666
esp_ble_gap_periodic_adv_set_info_trans(esp_bd_addr_t addr,uint16_t service_data,uint8_t adv_handle)1667 esp_err_t esp_ble_gap_periodic_adv_set_info_trans(esp_bd_addr_t addr, uint16_t service_data, uint8_t adv_handle)
1668 {
1669 btc_msg_t msg;
1670 btc_ble_5_gap_args_t arg;
1671
1672 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1673
1674 if (addr == NULL) {
1675 return ESP_ERR_INVALID_ARG;
1676 }
1677
1678 msg.sig = BTC_SIG_API_CALL;
1679 msg.pid = BTC_PID_GAP_BLE;
1680 msg.act = BTC_GAP_BLE_PERIODIC_ADV_SET_INFO_TRANS;
1681
1682 memcpy(arg.periodic_adv_set_info_trans.addr, addr, sizeof(esp_bd_addr_t));
1683 arg.periodic_adv_set_info_trans.service_data = service_data;
1684 arg.periodic_adv_set_info_trans.adv_handle = adv_handle;
1685
1686 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1687 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1688 }
1689
esp_ble_gap_set_periodic_adv_sync_trans_params(esp_bd_addr_t addr,const esp_ble_gap_past_params_t * params)1690 esp_err_t esp_ble_gap_set_periodic_adv_sync_trans_params(esp_bd_addr_t addr, const esp_ble_gap_past_params_t *params)
1691 {
1692 btc_msg_t msg;
1693 btc_ble_5_gap_args_t arg;
1694
1695 ESP_BLUEDROID_STATUS_CHECK(ESP_BLUEDROID_STATUS_ENABLED);
1696
1697 if (params == NULL) {
1698 return ESP_ERR_INVALID_ARG;
1699 }
1700
1701 msg.sig = BTC_SIG_API_CALL;
1702 msg.pid = BTC_PID_GAP_BLE;
1703 msg.act = BTC_GAP_BLE_SET_PERIODIC_ADV_SYNC_TRANS_PARAMS;
1704
1705 if (addr) {
1706 memcpy(arg.set_periodic_adv_sync_trans_params.addr, addr, sizeof(esp_bd_addr_t));
1707 } else {
1708 memset(arg.set_periodic_adv_sync_trans_params.addr, 0, sizeof(esp_bd_addr_t));
1709 }
1710 memcpy(&arg.set_periodic_adv_sync_trans_params.params, params, sizeof(esp_ble_gap_past_params_t));
1711
1712 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_5_gap_args_t), NULL, NULL)
1713 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1714 }
1715 #endif //#if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
1716
esp_ble_gap_vendor_command_send(esp_ble_vendor_cmd_params_t * vendor_cmd_param)1717 esp_err_t esp_ble_gap_vendor_command_send(esp_ble_vendor_cmd_params_t *vendor_cmd_param)
1718 {
1719 btc_msg_t msg = {0};
1720 btc_ble_gap_args_t arg;
1721
1722 if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
1723 return ESP_ERR_INVALID_STATE;
1724 }
1725
1726 if (!vendor_cmd_param || !vendor_cmd_param->p_param_buf || !vendor_cmd_param->param_len) {
1727 return ESP_ERR_INVALID_ARG;
1728 }
1729 // If command is not a VSC, return error
1730 if ((vendor_cmd_param->opcode & VENDOR_HCI_CMD_MASK) != VENDOR_HCI_CMD_MASK) {
1731 return ESP_ERR_INVALID_ARG;
1732 }
1733
1734 msg.sig = BTC_SIG_API_CALL;
1735 msg.pid = BTC_PID_GAP_BLE;
1736 msg.act = BTC_GAP_BLE_ACT_VENDOR_HCI_CMD_EVT;
1737 arg.vendor_cmd_send.opcode = vendor_cmd_param->opcode;
1738 arg.vendor_cmd_send.param_len = vendor_cmd_param->param_len;
1739 arg.vendor_cmd_send.p_param_buf = vendor_cmd_param->p_param_buf;
1740
1741 return (btc_transfer_context(&msg, &arg, sizeof(btc_ble_gap_args_t), btc_gap_ble_arg_deep_copy, btc_gap_ble_arg_deep_free)
1742 == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
1743 }
1744