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