BLE_API wrapper library for STMicroelectronics' BlueNRG Bluetooth Low Energy expansion board shield (Component)
Dependents: Nucleo_Zumo_BLE_IDB04A1 contest_IOT5 contest_IOT6 contest_IOT_10 ... more
Fork of X_NUCLEO_IDB0XA1 by
bluenrg_gap_aci.c
00001 /******************** (C) COPYRIGHT 2014 STMicroelectronics ******************** 00002 * File Name : bluenrg_hci.c 00003 * Author : AMS - HEA&RF BU 00004 * Version : V1.0.0 00005 * Date : 4-Oct-2013 00006 * Description : File with HCI commands for BlueNRG FW6.0 and above. 00007 ******************************************************************************** 00008 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 00009 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. 00010 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE 00012 * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING 00013 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 00014 *******************************************************************************/ 00015 00016 #include "ble_hal_types.h" 00017 #include "ble_osal.h" 00018 #include "ble_status.h" 00019 #include "ble_hal.h" 00020 #include "ble_osal.h" 00021 #include "ble_hci_const.h" 00022 #include "bluenrg_aci_const.h" 00023 #include "bluenrg_gap_aci.h" 00024 #include "bluenrg_gatt_server.h" 00025 #include "bluenrg_gap.h" 00026 00027 #define MIN(a,b) ((a) < (b) )? (a) : (b) 00028 #define MAX(a,b) ((a) > (b) )? (a) : (b) 00029 00030 tBleStatus aci_gap_init_IDB05A1(uint8_t role, uint8_t privacy_enabled, uint8_t device_name_char_len, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle) 00031 { 00032 struct hci_request rq; 00033 gap_init_cp_IDB05A1 cp; 00034 gap_init_rp resp; 00035 00036 cp.role = role; 00037 cp.privacy_enabled = privacy_enabled; 00038 cp.device_name_char_len = device_name_char_len; 00039 00040 Osal_MemSet(&resp, 0, sizeof(resp)); 00041 00042 Osal_MemSet(&rq, 0, sizeof(rq)); 00043 rq.ogf = OGF_VENDOR_CMD; 00044 rq.ocf = OCF_GAP_INIT; 00045 rq.cparam = &cp; 00046 rq.clen = sizeof(cp); 00047 rq.rparam = &resp; 00048 rq.rlen = GAP_INIT_RP_SIZE; 00049 00050 if (hci_send_req(&rq, FALSE) < 0) 00051 return BLE_STATUS_TIMEOUT; 00052 00053 if (resp.status) { 00054 return resp.status; 00055 } 00056 00057 *service_handle = btohs(resp.service_handle); 00058 *dev_name_char_handle = btohs(resp.dev_name_char_handle); 00059 *appearance_char_handle = btohs(resp.appearance_char_handle); 00060 00061 return 0; 00062 } 00063 tBleStatus aci_gap_init_IDB04A1(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle) 00064 { 00065 struct hci_request rq; 00066 gap_init_cp_IDB04A1 cp; 00067 gap_init_rp resp; 00068 00069 cp.role = role; 00070 00071 Osal_MemSet(&resp, 0, sizeof(resp)); 00072 00073 Osal_MemSet(&rq, 0, sizeof(rq)); 00074 rq.ogf = OGF_VENDOR_CMD; 00075 rq.ocf = OCF_GAP_INIT; 00076 rq.cparam = &cp; 00077 rq.clen = sizeof(cp); 00078 rq.rparam = &resp; 00079 rq.rlen = GAP_INIT_RP_SIZE; 00080 00081 if (hci_send_req(&rq, FALSE) < 0) 00082 return BLE_STATUS_TIMEOUT; 00083 00084 if (resp.status) { 00085 return resp.status; 00086 } 00087 00088 *service_handle = btohs(resp.service_handle); 00089 *dev_name_char_handle = btohs(resp.dev_name_char_handle); 00090 *appearance_char_handle = btohs(resp.appearance_char_handle); 00091 00092 return 0; 00093 } 00094 00095 tBleStatus aci_gap_set_non_discoverable(void) 00096 { 00097 struct hci_request rq; 00098 uint8_t status; 00099 00100 Osal_MemSet(&rq, 0, sizeof(rq)); 00101 rq.ogf = OGF_VENDOR_CMD; 00102 rq.ocf = OCF_GAP_SET_NON_DISCOVERABLE; 00103 rq.rparam = &status; 00104 rq.rlen = 1; 00105 00106 if (hci_send_req(&rq, FALSE) < 0) 00107 return BLE_STATUS_TIMEOUT; 00108 00109 return status; 00110 } 00111 00112 tBleStatus aci_gap_set_limited_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax, 00113 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen, 00114 const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList, 00115 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax) 00116 { 00117 struct hci_request rq; 00118 uint8_t status; 00119 uint8_t buffer[40]; 00120 uint8_t indx = 0; 00121 00122 if((unsigned int)(LocalNameLen+ServiceUUIDLen+14) > sizeof(buffer)) 00123 return BLE_STATUS_INVALID_PARAMS; 00124 00125 buffer[indx] = AdvType; 00126 indx++; 00127 00128 AdvIntervMin = htobs(AdvIntervMin); 00129 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2); 00130 indx += 2; 00131 00132 AdvIntervMax = htobs(AdvIntervMax); 00133 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2); 00134 indx += 2; 00135 00136 buffer[indx] = OwnAddrType; 00137 indx++; 00138 00139 buffer[indx] = AdvFilterPolicy; 00140 indx++; 00141 00142 buffer[indx] = LocalNameLen; 00143 indx++; 00144 00145 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen); 00146 indx += LocalNameLen; 00147 00148 buffer[indx] = ServiceUUIDLen; 00149 indx++; 00150 00151 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen); 00152 indx += ServiceUUIDLen; 00153 00154 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2); 00155 indx += 2; 00156 00157 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2); 00158 indx += 2; 00159 00160 Osal_MemSet(&rq, 0, sizeof(rq)); 00161 rq.ogf = OGF_VENDOR_CMD; 00162 rq.ocf = OCF_GAP_SET_LIMITED_DISCOVERABLE; 00163 rq.cparam = (void *)buffer; 00164 rq.clen = indx; 00165 rq.event = EVT_CMD_STATUS; 00166 rq.rparam = &status; 00167 rq.rlen = 1; 00168 00169 if (hci_send_req(&rq, FALSE) < 0) 00170 return BLE_STATUS_TIMEOUT; 00171 00172 return status; 00173 } 00174 00175 tBleStatus aci_gap_set_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax, 00176 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen, 00177 const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList, 00178 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax) 00179 { 00180 struct hci_request rq; 00181 uint8_t status; 00182 uint8_t buffer[40]; 00183 uint8_t indx = 0; 00184 00185 if ((unsigned int)(LocalNameLen+ServiceUUIDLen+14) > sizeof(buffer)) 00186 return BLE_STATUS_INVALID_PARAMS; 00187 00188 buffer[indx] = AdvType; 00189 indx++; 00190 00191 AdvIntervMin = htobs(AdvIntervMin); 00192 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2); 00193 indx += 2; 00194 00195 AdvIntervMax = htobs(AdvIntervMax); 00196 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2); 00197 indx += 2; 00198 00199 buffer[indx] = OwnAddrType; 00200 indx++; 00201 00202 buffer[indx] = AdvFilterPolicy; 00203 indx++; 00204 00205 buffer[indx] = LocalNameLen; 00206 indx++; 00207 00208 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen); 00209 indx += LocalNameLen; 00210 00211 buffer[indx] = ServiceUUIDLen; 00212 indx++; 00213 00214 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen); 00215 indx += ServiceUUIDLen; 00216 00217 SlaveConnIntervMin = htobs(SlaveConnIntervMin); 00218 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2); 00219 indx += 2; 00220 00221 SlaveConnIntervMax = htobs(SlaveConnIntervMax); 00222 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2); 00223 indx += 2; 00224 00225 Osal_MemSet(&rq, 0, sizeof(rq)); 00226 rq.ogf = OGF_VENDOR_CMD; 00227 rq.ocf = OCF_GAP_SET_DISCOVERABLE; 00228 rq.cparam = (void *)buffer; 00229 rq.clen = indx; 00230 rq.rparam = &status; 00231 rq.rlen = 1; 00232 00233 if (hci_send_req(&rq, FALSE) < 0) 00234 return BLE_STATUS_TIMEOUT; 00235 00236 if (status) { 00237 return status; 00238 } 00239 00240 return 0; 00241 } 00242 00243 tBleStatus aci_gap_set_direct_connectable_IDB05A1(uint8_t own_addr_type, uint8_t directed_adv_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) 00244 { 00245 struct hci_request rq; 00246 gap_set_direct_conectable_cp_IDB05A1 cp; 00247 uint8_t status; 00248 00249 cp.own_bdaddr_type = own_addr_type; 00250 cp.directed_adv_type = directed_adv_type; 00251 cp.direct_bdaddr_type = initiator_addr_type; 00252 Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6); 00253 00254 Osal_MemSet(&rq, 0, sizeof(rq)); 00255 rq.ogf = OGF_VENDOR_CMD; 00256 rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE; 00257 rq.cparam = &cp; 00258 rq.clen = sizeof(cp); 00259 rq.rparam = &status; 00260 rq.rlen = 1; 00261 00262 if (hci_send_req(&rq, FALSE) < 0) 00263 return BLE_STATUS_TIMEOUT; 00264 00265 return status; 00266 } 00267 00268 tBleStatus aci_gap_set_direct_connectable_IDB04A1(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr) 00269 { 00270 struct hci_request rq; 00271 gap_set_direct_conectable_cp_IDB04A1 cp; 00272 uint8_t status; 00273 00274 cp.own_bdaddr_type = own_addr_type; 00275 cp.direct_bdaddr_type = initiator_addr_type; 00276 Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6); 00277 00278 Osal_MemSet(&rq, 0, sizeof(rq)); 00279 rq.ogf = OGF_VENDOR_CMD; 00280 rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE; 00281 rq.cparam = &cp; 00282 rq.clen = sizeof(cp); 00283 rq.rparam = &status; 00284 rq.rlen = 1; 00285 00286 if (hci_send_req(&rq, FALSE) < 0) 00287 return BLE_STATUS_TIMEOUT; 00288 00289 return status; 00290 } 00291 00292 tBleStatus aci_gap_set_io_capability(uint8_t io_capability) 00293 { 00294 struct hci_request rq; 00295 uint8_t status; 00296 gap_set_io_capability_cp cp; 00297 00298 cp.io_capability = io_capability; 00299 00300 Osal_MemSet(&rq, 0, sizeof(rq)); 00301 rq.ogf = OGF_VENDOR_CMD; 00302 rq.ocf = OCF_GAP_SET_IO_CAPABILITY; 00303 rq.cparam = &cp; 00304 rq.clen = sizeof(cp); 00305 rq.rparam = &status; 00306 rq.rlen = 1; 00307 00308 if (hci_send_req(&rq, FALSE) < 0) 00309 return BLE_STATUS_TIMEOUT; 00310 00311 return status; 00312 } 00313 00314 tBleStatus aci_gap_set_auth_requirement(uint8_t mitm_mode, 00315 uint8_t oob_enable, 00316 uint8_t oob_data[16], 00317 uint8_t min_encryption_key_size, 00318 uint8_t max_encryption_key_size, 00319 uint8_t use_fixed_pin, 00320 uint32_t fixed_pin, 00321 uint8_t bonding_mode) 00322 { 00323 struct hci_request rq; 00324 gap_set_auth_requirement_cp cp; 00325 uint8_t status; 00326 00327 cp.mitm_mode = mitm_mode; 00328 cp.oob_enable = oob_enable; 00329 Osal_MemCpy(cp.oob_data, oob_data, 16); 00330 cp.min_encryption_key_size = min_encryption_key_size; 00331 cp.max_encryption_key_size = max_encryption_key_size; 00332 cp.use_fixed_pin = use_fixed_pin; 00333 cp.fixed_pin = htobl(fixed_pin); 00334 cp.bonding_mode = bonding_mode; 00335 00336 Osal_MemSet(&rq, 0, sizeof(rq)); 00337 rq.ogf = OGF_VENDOR_CMD; 00338 rq.ocf = OCF_GAP_SET_AUTH_REQUIREMENT; 00339 rq.cparam = &cp; 00340 rq.clen = sizeof(cp); 00341 rq.rparam = &status; 00342 rq.rlen = 1; 00343 00344 if (hci_send_req(&rq, FALSE) < 0) 00345 return BLE_STATUS_TIMEOUT; 00346 00347 if (status) { 00348 return status; 00349 } 00350 00351 return 0; 00352 } 00353 00354 tBleStatus aci_gap_set_author_requirement(uint16_t conn_handle, uint8_t authorization_enable) 00355 { 00356 struct hci_request rq; 00357 gap_set_author_requirement_cp cp; 00358 uint8_t status; 00359 00360 cp.conn_handle = htobs(conn_handle); 00361 cp.authorization_enable = authorization_enable; 00362 00363 Osal_MemSet(&rq, 0, sizeof(rq)); 00364 rq.ogf = OGF_VENDOR_CMD; 00365 rq.ocf = OCF_GAP_SET_AUTHOR_REQUIREMENT; 00366 rq.cparam = &cp; 00367 rq.clen = sizeof(cp); 00368 rq.rparam = &status; 00369 rq.rlen = 1; 00370 00371 if (hci_send_req(&rq, FALSE) < 0) 00372 return BLE_STATUS_TIMEOUT; 00373 00374 return status; 00375 } 00376 00377 tBleStatus aci_gap_pass_key_response(uint16_t conn_handle, uint32_t passkey) 00378 { 00379 struct hci_request rq; 00380 gap_passkey_response_cp cp; 00381 uint8_t status; 00382 00383 cp.conn_handle = htobs(conn_handle); 00384 cp.passkey = htobl(passkey); 00385 00386 Osal_MemSet(&rq, 0, sizeof(rq)); 00387 rq.ogf = OGF_VENDOR_CMD; 00388 rq.ocf = OCF_GAP_PASSKEY_RESPONSE; 00389 rq.cparam = &cp; 00390 rq.clen = sizeof(cp); 00391 rq.event = EVT_CMD_STATUS; 00392 rq.rparam = &status; 00393 rq.rlen = 1; 00394 00395 if (hci_send_req(&rq, FALSE) < 0) 00396 return BLE_STATUS_TIMEOUT; 00397 00398 return status; 00399 } 00400 00401 tBleStatus aci_gap_authorization_response(uint16_t conn_handle, uint8_t authorize) 00402 { 00403 struct hci_request rq; 00404 gap_authorization_response_cp cp; 00405 uint8_t status; 00406 00407 cp.conn_handle = htobs(conn_handle); 00408 cp.authorize = authorize; 00409 00410 Osal_MemSet(&rq, 0, sizeof(rq)); 00411 rq.ogf = OGF_VENDOR_CMD; 00412 rq.ocf = OCF_GAP_AUTHORIZATION_RESPONSE; 00413 rq.cparam = &cp; 00414 rq.clen = sizeof(cp); 00415 rq.rparam = &status; 00416 rq.rlen = 1; 00417 00418 if (hci_send_req(&rq, FALSE) < 0) 00419 return BLE_STATUS_TIMEOUT; 00420 00421 return status; 00422 } 00423 00424 tBleStatus aci_gap_set_non_connectable_IDB05A1(uint8_t adv_type, uint8_t own_address_type) 00425 { 00426 struct hci_request rq; 00427 gap_set_non_connectable_cp_IDB05A1 cp; 00428 uint8_t status; 00429 00430 cp.advertising_event_type = adv_type; 00431 cp.own_address_type = own_address_type; 00432 Osal_MemSet(&rq, 0, sizeof(rq)); 00433 rq.ogf = OGF_VENDOR_CMD; 00434 rq.ocf = OCF_GAP_SET_NON_CONNECTABLE; 00435 rq.cparam = &cp; 00436 rq.clen = sizeof(cp); 00437 rq.rparam = &status; 00438 rq.rlen = 1; 00439 00440 if (hci_send_req(&rq, FALSE) < 0) 00441 return BLE_STATUS_TIMEOUT; 00442 00443 return status; 00444 } 00445 00446 tBleStatus aci_gap_set_non_connectable_IDB04A1(uint8_t adv_type) 00447 { 00448 struct hci_request rq; 00449 gap_set_non_connectable_cp_IDB04A1 cp; 00450 uint8_t status; 00451 00452 cp.advertising_event_type = adv_type; 00453 00454 Osal_MemSet(&rq, 0, sizeof(rq)); 00455 rq.ogf = OGF_VENDOR_CMD; 00456 rq.ocf = OCF_GAP_SET_NON_CONNECTABLE; 00457 rq.cparam = &cp; 00458 rq.clen = sizeof(cp); 00459 rq.rparam = &status; 00460 rq.rlen = 1; 00461 00462 if (hci_send_req(&rq, FALSE) < 0) 00463 return BLE_STATUS_TIMEOUT; 00464 00465 return status; 00466 } 00467 00468 tBleStatus aci_gap_set_undirected_connectable(uint8_t own_addr_type, uint8_t adv_filter_policy) 00469 { 00470 struct hci_request rq; 00471 gap_set_undirected_connectable_cp cp; 00472 uint8_t status; 00473 00474 cp.own_addr_type = own_addr_type; 00475 cp.adv_filter_policy = adv_filter_policy; 00476 00477 Osal_MemSet(&rq, 0, sizeof(rq)); 00478 rq.ogf = OGF_VENDOR_CMD; 00479 rq.ocf = OCF_GAP_SET_UNDIRECTED_CONNECTABLE; 00480 rq.cparam = &cp; 00481 rq.clen = sizeof(cp); 00482 rq.rparam = &status; 00483 rq.rlen = 1; 00484 00485 if (hci_send_req(&rq, FALSE) < 0) 00486 return BLE_STATUS_TIMEOUT; 00487 00488 return status; 00489 } 00490 00491 tBleStatus aci_gap_slave_security_request(uint16_t conn_handle, uint8_t bonding, uint8_t mitm_protection) 00492 { 00493 struct hci_request rq; 00494 gap_slave_security_request_cp cp; 00495 uint8_t status; 00496 00497 cp.conn_handle = htobs(conn_handle); 00498 cp.bonding = bonding; 00499 cp.mitm_protection = mitm_protection; 00500 00501 Osal_MemSet(&rq, 0, sizeof(rq)); 00502 rq.ogf = OGF_VENDOR_CMD; 00503 rq.ocf = OCF_GAP_SLAVE_SECURITY_REQUEST; 00504 rq.cparam = &cp; 00505 rq.clen = sizeof(cp); 00506 rq.event = EVT_CMD_STATUS; 00507 rq.rparam = &status; 00508 rq.rlen = 1; 00509 00510 if (hci_send_req(&rq, FALSE) < 0) 00511 return BLE_STATUS_TIMEOUT; 00512 00513 return status; 00514 00515 } 00516 00517 tBleStatus aci_gap_update_adv_data(uint8_t AdvLen, const uint8_t *AdvData) 00518 { 00519 struct hci_request rq; 00520 uint8_t status; 00521 uint8_t buffer[32]; 00522 uint8_t indx = 0; 00523 00524 if (AdvLen > (sizeof(buffer)-1)) 00525 return BLE_STATUS_INVALID_PARAMS; 00526 00527 buffer[indx] = AdvLen; 00528 indx++; 00529 00530 Osal_MemCpy(buffer + indx, AdvData, AdvLen); 00531 indx += AdvLen; 00532 00533 Osal_MemSet(&rq, 0, sizeof(rq)); 00534 rq.ogf = OGF_VENDOR_CMD; 00535 rq.ocf = OCF_GAP_UPDATE_ADV_DATA; 00536 rq.cparam = (void *)buffer; 00537 rq.clen = indx; 00538 rq.rparam = &status; 00539 rq.rlen = 1; 00540 00541 if (hci_send_req(&rq, FALSE) < 0) 00542 return BLE_STATUS_TIMEOUT; 00543 00544 return status; 00545 } 00546 00547 tBleStatus aci_gap_delete_ad_type(uint8_t ad_type) 00548 { 00549 struct hci_request rq; 00550 gap_delete_ad_type_cp cp; 00551 uint8_t status; 00552 00553 cp.ad_type = ad_type; 00554 00555 Osal_MemSet(&rq, 0, sizeof(rq)); 00556 rq.ogf = OGF_VENDOR_CMD; 00557 rq.ocf = OCF_GAP_DELETE_AD_TYPE; 00558 rq.cparam = &cp; 00559 rq.clen = sizeof(cp); 00560 rq.rparam = &status; 00561 rq.rlen = 1; 00562 00563 if (hci_send_req(&rq, FALSE) < 0) 00564 return BLE_STATUS_TIMEOUT; 00565 00566 return status; 00567 } 00568 00569 tBleStatus aci_gap_get_security_level(uint8_t* mitm_protection, uint8_t* bonding, 00570 uint8_t* oob_data, uint8_t* passkey_required) 00571 { 00572 struct hci_request rq; 00573 gap_get_security_level_rp resp; 00574 00575 Osal_MemSet(&resp, 0, sizeof(resp)); 00576 00577 Osal_MemSet(&rq, 0, sizeof(rq)); 00578 rq.ogf = OGF_VENDOR_CMD; 00579 rq.ocf = OCF_GAP_GET_SECURITY_LEVEL; 00580 rq.rparam = &resp; 00581 rq.rlen = GAP_GET_SECURITY_LEVEL_RP_SIZE; 00582 00583 if (hci_send_req(&rq, FALSE) < 0) 00584 return BLE_STATUS_TIMEOUT; 00585 00586 if (resp.status) { 00587 return resp.status; 00588 } 00589 00590 *mitm_protection = resp.mitm_protection; 00591 *bonding = resp.bonding; 00592 *oob_data = resp.oob_data; 00593 *passkey_required = resp.passkey_required; 00594 00595 return resp.status; 00596 } 00597 00598 tBleStatus aci_gap_configure_whitelist(void) 00599 { 00600 struct hci_request rq; 00601 uint8_t status; 00602 00603 Osal_MemSet(&rq, 0, sizeof(rq)); 00604 rq.ogf = OGF_VENDOR_CMD; 00605 rq.ocf = OCF_GAP_CONFIGURE_WHITELIST; 00606 rq.rparam = &status; 00607 rq.rlen = 1; 00608 00609 if (hci_send_req(&rq, FALSE) < 0) 00610 return BLE_STATUS_TIMEOUT; 00611 00612 return status; 00613 } 00614 00615 tBleStatus aci_gap_terminate(uint16_t conn_handle, uint8_t reason) 00616 { 00617 struct hci_request rq; 00618 gap_terminate_cp cp; 00619 uint8_t status; 00620 00621 cp.handle = htobs(conn_handle); 00622 cp.reason = reason; 00623 00624 Osal_MemSet(&rq, 0, sizeof(rq)); 00625 rq.ogf = OGF_VENDOR_CMD; 00626 rq.ocf = OCF_GAP_TERMINATE; 00627 rq.cparam = &cp; 00628 rq.clen = sizeof(cp); 00629 rq.event = EVT_CMD_STATUS; 00630 rq.rparam = &status; 00631 rq.rlen = 1; 00632 00633 if (hci_send_req(&rq, FALSE) < 0) 00634 return BLE_STATUS_TIMEOUT; 00635 00636 return status; 00637 } 00638 00639 tBleStatus aci_gap_clear_security_database(void) 00640 { 00641 struct hci_request rq; 00642 uint8_t status; 00643 00644 Osal_MemSet(&rq, 0, sizeof(rq)); 00645 rq.ogf = OGF_VENDOR_CMD; 00646 rq.ocf = OCF_GAP_CLEAR_SECURITY_DB; 00647 rq.rparam = &status; 00648 rq.rlen = 1; 00649 00650 if (hci_send_req(&rq, FALSE) < 0) 00651 return BLE_STATUS_TIMEOUT; 00652 00653 return status; 00654 } 00655 00656 tBleStatus aci_gap_allow_rebond_IDB05A1(uint16_t conn_handle) 00657 { 00658 struct hci_request rq; 00659 gap_allow_rebond_cp_IDB05A1 cp; 00660 uint8_t status; 00661 00662 cp.conn_handle = conn_handle; 00663 00664 Osal_MemSet(&rq, 0, sizeof(rq)); 00665 rq.ogf = OGF_VENDOR_CMD; 00666 rq.ocf = OCF_GAP_ALLOW_REBOND_DB; 00667 rq.cparam = &cp; 00668 rq.clen = sizeof(cp); 00669 rq.rparam = &status; 00670 rq.rlen = 1; 00671 00672 if (hci_send_req(&rq, FALSE) < 0) 00673 return BLE_STATUS_TIMEOUT; 00674 00675 return status; 00676 } 00677 tBleStatus aci_gap_allow_rebond_IDB04A1(void) 00678 { 00679 struct hci_request rq; 00680 uint8_t status; 00681 00682 Osal_MemSet(&rq, 0, sizeof(rq)); 00683 rq.ogf = OGF_VENDOR_CMD; 00684 rq.ocf = OCF_GAP_ALLOW_REBOND_DB; 00685 rq.rparam = &status; 00686 rq.rlen = 1; 00687 00688 if (hci_send_req(&rq, FALSE) < 0) 00689 return BLE_STATUS_TIMEOUT; 00690 00691 return status; 00692 } 00693 00694 tBleStatus aci_gap_start_limited_discovery_proc(uint16_t scanInterval, uint16_t scanWindow, 00695 uint8_t own_address_type, uint8_t filterDuplicates) 00696 { 00697 struct hci_request rq; 00698 gap_start_limited_discovery_proc_cp cp; 00699 uint8_t status; 00700 00701 cp.scanInterval = htobs(scanInterval); 00702 cp.scanWindow = htobs(scanWindow); 00703 cp.own_address_type = own_address_type; 00704 cp.filterDuplicates = filterDuplicates; 00705 00706 Osal_MemSet(&rq, 0, sizeof(rq)); 00707 rq.ogf = OGF_VENDOR_CMD; 00708 rq.ocf = OCF_GAP_START_LIMITED_DISCOVERY_PROC; 00709 rq.cparam = &cp; 00710 rq.clen = sizeof(cp); 00711 rq.event = EVT_CMD_STATUS; 00712 rq.rparam = &status; 00713 rq.rlen = 1; 00714 00715 if (hci_send_req(&rq, FALSE) < 0) 00716 return BLE_STATUS_TIMEOUT; 00717 00718 return status; 00719 } 00720 00721 tBleStatus aci_gap_start_general_discovery_proc(uint16_t scanInterval, uint16_t scanWindow, 00722 uint8_t own_address_type, uint8_t filterDuplicates) 00723 { 00724 struct hci_request rq; 00725 gap_start_general_discovery_proc_cp cp; 00726 uint8_t status; 00727 00728 cp.scanInterval = htobs(scanInterval); 00729 cp.scanWindow = htobs(scanWindow); 00730 cp.own_address_type = own_address_type; 00731 cp.filterDuplicates = filterDuplicates; 00732 00733 Osal_MemSet(&rq, 0, sizeof(rq)); 00734 rq.ogf = OGF_VENDOR_CMD; 00735 rq.ocf = OCF_GAP_START_GENERAL_DISCOVERY_PROC; 00736 rq.cparam = &cp; 00737 rq.clen = sizeof(cp); 00738 rq.event = EVT_CMD_STATUS; 00739 rq.rparam = &status; 00740 rq.rlen = 1; 00741 00742 if (hci_send_req(&rq, FALSE) < 0) 00743 return BLE_STATUS_TIMEOUT; 00744 00745 return status; 00746 } 00747 00748 00749 tBleStatus aci_gap_start_name_discovery_proc(uint16_t scanInterval, uint16_t scanWindow, 00750 uint8_t peer_bdaddr_type, tBDAddr peer_bdaddr, 00751 uint8_t own_bdaddr_type, uint16_t conn_min_interval, 00752 uint16_t conn_max_interval, uint16_t conn_latency, 00753 uint16_t supervision_timeout, uint16_t min_conn_length, 00754 uint16_t max_conn_length) 00755 { 00756 struct hci_request rq; 00757 gap_start_name_discovery_proc_cp cp; 00758 uint8_t status; 00759 00760 cp.scanInterval = htobs(scanInterval); 00761 cp.scanWindow = htobs(scanWindow); 00762 cp.peer_bdaddr_type = peer_bdaddr_type; 00763 Osal_MemCpy(cp.peer_bdaddr, peer_bdaddr, 6); 00764 cp.own_bdaddr_type = own_bdaddr_type; 00765 cp.conn_min_interval = htobs(conn_min_interval); 00766 cp.conn_max_interval = htobs(conn_max_interval); 00767 cp.conn_latency = htobs(conn_latency); 00768 cp.supervision_timeout = htobs(supervision_timeout); 00769 cp.min_conn_length = htobs(min_conn_length); 00770 cp.max_conn_length = htobs(max_conn_length); 00771 00772 Osal_MemSet(&rq, 0, sizeof(rq)); 00773 rq.ogf = OGF_VENDOR_CMD; 00774 rq.ocf = OCF_GAP_START_NAME_DISCOVERY_PROC; 00775 rq.cparam = &cp; 00776 rq.clen = sizeof(cp); 00777 rq.event = EVT_CMD_STATUS; 00778 rq.rparam = &status; 00779 rq.rlen = 1; 00780 00781 if (hci_send_req(&rq, FALSE) < 0) 00782 return BLE_STATUS_TIMEOUT; 00783 00784 return status; 00785 } 00786 00787 tBleStatus aci_gap_start_auto_conn_establish_proc_IDB05A1(uint16_t scanInterval, uint16_t scanWindow, 00788 uint8_t own_bdaddr_type, uint16_t conn_min_interval, 00789 uint16_t conn_max_interval, uint16_t conn_latency, 00790 uint16_t supervision_timeout, uint16_t min_conn_length, 00791 uint16_t max_conn_length, 00792 uint8_t num_whitelist_entries, 00793 const uint8_t *addr_array) 00794 { 00795 struct hci_request rq; 00796 uint8_t status; 00797 uint8_t buffer[HCI_MAX_PAYLOAD_SIZE]; 00798 uint8_t indx = 0; 00799 00800 if (((num_whitelist_entries*7)+25) > HCI_MAX_PAYLOAD_SIZE) 00801 return BLE_STATUS_INVALID_PARAMS; 00802 00803 scanInterval = htobs(scanInterval); 00804 Osal_MemCpy(buffer + indx, &scanInterval, 2); 00805 indx += 2; 00806 00807 scanWindow = htobs(scanWindow); 00808 Osal_MemCpy(buffer + indx, &scanWindow, 2); 00809 indx += 2; 00810 00811 buffer[indx] = own_bdaddr_type; 00812 indx++; 00813 00814 conn_min_interval = htobs(conn_min_interval); 00815 Osal_MemCpy(buffer + indx, &conn_min_interval, 2); 00816 indx += 2; 00817 00818 conn_max_interval = htobs(conn_max_interval); 00819 Osal_MemCpy(buffer + indx, &conn_max_interval, 2); 00820 indx += 2; 00821 00822 conn_latency = htobs(conn_latency); 00823 Osal_MemCpy(buffer + indx, &conn_latency, 2); 00824 indx += 2; 00825 00826 supervision_timeout = htobs(supervision_timeout); 00827 Osal_MemCpy(buffer + indx, &supervision_timeout, 2); 00828 indx += 2; 00829 00830 min_conn_length = htobs(min_conn_length); 00831 Osal_MemCpy(buffer + indx, &min_conn_length, 2); 00832 indx += 2; 00833 00834 max_conn_length = htobs(max_conn_length); 00835 Osal_MemCpy(buffer + indx, &max_conn_length, 2); 00836 indx += 2; 00837 00838 buffer[indx] = num_whitelist_entries; 00839 indx++; 00840 00841 Osal_MemCpy(buffer + indx, addr_array, (num_whitelist_entries*7)); 00842 indx += num_whitelist_entries * 7; 00843 00844 Osal_MemSet(&rq, 0, sizeof(rq)); 00845 rq.ogf = OGF_VENDOR_CMD; 00846 rq.ocf = OCF_GAP_START_AUTO_CONN_ESTABLISH_PROC; 00847 rq.cparam = (void *)buffer; 00848 rq.clen = indx; 00849 rq.event = EVT_CMD_STATUS; 00850 rq.rparam = &status; 00851 rq.rlen = 1; 00852 00853 if (hci_send_req(&rq, FALSE) < 0) 00854 return BLE_STATUS_TIMEOUT; 00855 00856 return status; 00857 } 00858 00859 tBleStatus aci_gap_start_auto_conn_establish_proc_IDB04A1(uint16_t scanInterval, uint16_t scanWindow, 00860 uint8_t own_bdaddr_type, uint16_t conn_min_interval, 00861 uint16_t conn_max_interval, uint16_t conn_latency, 00862 uint16_t supervision_timeout, uint16_t min_conn_length, 00863 uint16_t max_conn_length, 00864 uint8_t use_reconn_addr, 00865 const tBDAddr reconn_addr, 00866 uint8_t num_whitelist_entries, 00867 const uint8_t *addr_array) 00868 { 00869 struct hci_request rq; 00870 uint8_t status; 00871 uint8_t buffer[HCI_MAX_PAYLOAD_SIZE]; 00872 uint8_t indx = 0; 00873 00874 if (((num_whitelist_entries*7)+25) > HCI_MAX_PAYLOAD_SIZE) 00875 return BLE_STATUS_INVALID_PARAMS; 00876 00877 scanInterval = htobs(scanInterval); 00878 Osal_MemCpy(buffer + indx, &scanInterval, 2); 00879 indx += 2; 00880 00881 scanWindow = htobs(scanWindow); 00882 Osal_MemCpy(buffer + indx, &scanWindow, 2); 00883 indx += 2; 00884 00885 buffer[indx] = own_bdaddr_type; 00886 indx++; 00887 00888 conn_min_interval = htobs(conn_min_interval); 00889 Osal_MemCpy(buffer + indx, &conn_min_interval, 2); 00890 indx += 2; 00891 00892 conn_max_interval = htobs(conn_max_interval); 00893 Osal_MemCpy(buffer + indx, &conn_max_interval, 2); 00894 indx += 2; 00895 00896 conn_latency = htobs(conn_latency); 00897 Osal_MemCpy(buffer + indx, &conn_latency, 2); 00898 indx += 2; 00899 00900 supervision_timeout = htobs(supervision_timeout); 00901 Osal_MemCpy(buffer + indx, &supervision_timeout, 2); 00902 indx += 2; 00903 00904 min_conn_length = htobs(min_conn_length); 00905 Osal_MemCpy(buffer + indx, &min_conn_length, 2); 00906 indx += 2; 00907 00908 max_conn_length = htobs(max_conn_length); 00909 Osal_MemCpy(buffer + indx, &max_conn_length, 2); 00910 indx += 2; 00911 00912 buffer[indx] = use_reconn_addr; 00913 indx++; 00914 00915 Osal_MemCpy(buffer + indx, reconn_addr, 6); 00916 indx += 6; 00917 00918 buffer[indx] = num_whitelist_entries; 00919 indx++; 00920 00921 Osal_MemCpy(buffer + indx, addr_array, (num_whitelist_entries*7)); 00922 indx += num_whitelist_entries * 7; 00923 00924 Osal_MemSet(&rq, 0, sizeof(rq)); 00925 rq.ogf = OGF_VENDOR_CMD; 00926 rq.ocf = OCF_GAP_START_AUTO_CONN_ESTABLISH_PROC; 00927 rq.cparam = (void *)buffer; 00928 rq.clen = indx; 00929 rq.event = EVT_CMD_STATUS; 00930 rq.rparam = &status; 00931 rq.rlen = 1; 00932 00933 if (hci_send_req(&rq, FALSE) < 0) 00934 return BLE_STATUS_TIMEOUT; 00935 00936 return status; 00937 } 00938 00939 tBleStatus aci_gap_start_general_conn_establish_proc_IDB05A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, 00940 uint8_t own_address_type, uint8_t filter_duplicates) 00941 { 00942 struct hci_request rq; 00943 gap_start_general_conn_establish_proc_cp_IDB05A1 cp; 00944 uint8_t status; 00945 00946 cp.scan_type = scan_type; 00947 cp.scan_interval = htobs(scan_interval); 00948 cp.scan_window = htobs(scan_window); 00949 cp.own_address_type = own_address_type; 00950 cp.filter_duplicates = filter_duplicates; 00951 00952 Osal_MemSet(&rq, 0, sizeof(rq)); 00953 rq.ogf = OGF_VENDOR_CMD; 00954 rq.ocf = OCF_GAP_START_GENERAL_CONN_ESTABLISH_PROC; 00955 rq.cparam = &cp; 00956 rq.clen = sizeof(cp); 00957 rq.event = EVT_CMD_STATUS; 00958 rq.rparam = &status; 00959 rq.rlen = 1; 00960 00961 if (hci_send_req(&rq, FALSE) < 0) 00962 return BLE_STATUS_TIMEOUT; 00963 00964 return status; 00965 } 00966 tBleStatus aci_gap_start_general_conn_establish_proc_IDB04A1(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, 00967 uint8_t own_address_type, uint8_t filter_duplicates, uint8_t use_reconn_addr, const tBDAddr reconn_addr) 00968 { 00969 struct hci_request rq; 00970 gap_start_general_conn_establish_proc_cp_IDB04A1 cp; 00971 uint8_t status; 00972 00973 cp.scan_type = scan_type; 00974 cp.scan_interval = htobs(scan_interval); 00975 cp.scan_window = htobs(scan_window); 00976 cp.own_address_type = own_address_type; 00977 cp.filter_duplicates = filter_duplicates; 00978 cp.use_reconn_addr = use_reconn_addr; 00979 Osal_MemCpy(cp.reconn_addr, reconn_addr, 6); 00980 00981 Osal_MemSet(&rq, 0, sizeof(rq)); 00982 rq.ogf = OGF_VENDOR_CMD; 00983 rq.ocf = OCF_GAP_START_GENERAL_CONN_ESTABLISH_PROC; 00984 rq.cparam = &cp; 00985 rq.clen = sizeof(cp); 00986 rq.event = EVT_CMD_STATUS; 00987 rq.rparam = &status; 00988 rq.rlen = 1; 00989 00990 if (hci_send_req(&rq, FALSE) < 0) 00991 return BLE_STATUS_TIMEOUT; 00992 00993 return status; 00994 } 00995 00996 tBleStatus aci_gap_start_selective_conn_establish_proc(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window, 00997 uint8_t own_address_type, uint8_t filter_duplicates, uint8_t num_whitelist_entries, 00998 const uint8_t *addr_array) 00999 { 01000 struct hci_request rq; 01001 gap_start_selective_conn_establish_proc_cp cp; 01002 uint8_t status; 01003 01004 if (((num_whitelist_entries*7)+GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE) > HCI_MAX_PAYLOAD_SIZE) 01005 return BLE_STATUS_INVALID_PARAMS; 01006 01007 cp.scan_type = scan_type; 01008 cp.scan_interval = htobs(scan_interval); 01009 cp.scan_window = htobs(scan_window); 01010 cp.own_address_type = own_address_type; 01011 cp.filter_duplicates = filter_duplicates; 01012 cp.num_whitelist_entries = num_whitelist_entries; 01013 01014 Osal_MemCpy(cp.addr_array, addr_array, (num_whitelist_entries*7)); 01015 01016 Osal_MemSet(&rq, 0, sizeof(rq)); 01017 rq.ogf = OGF_VENDOR_CMD; 01018 rq.ocf = OCF_GAP_START_SELECTIVE_CONN_ESTABLISH_PROC; 01019 rq.cparam = &cp; 01020 rq.clen = GAP_START_SELECTIVE_CONN_ESTABLISH_PROC_CP_SIZE + (num_whitelist_entries*7); 01021 rq.event = EVT_CMD_STATUS; 01022 rq.rparam = &status; 01023 rq.rlen = 1; 01024 01025 if (hci_send_req(&rq, FALSE) < 0) 01026 return BLE_STATUS_TIMEOUT; 01027 01028 return status; 01029 } 01030 01031 tBleStatus aci_gap_create_connection(uint16_t scanInterval, uint16_t scanWindow, 01032 uint8_t peer_bdaddr_type, tBDAddr peer_bdaddr, 01033 uint8_t own_bdaddr_type, uint16_t conn_min_interval, 01034 uint16_t conn_max_interval, uint16_t conn_latency, 01035 uint16_t supervision_timeout, uint16_t min_conn_length, 01036 uint16_t max_conn_length) 01037 { 01038 struct hci_request rq; 01039 gap_create_connection_cp cp; 01040 uint8_t status; 01041 01042 cp.scanInterval = htobs(scanInterval); 01043 cp.scanWindow = htobs(scanWindow); 01044 cp.peer_bdaddr_type = peer_bdaddr_type; 01045 Osal_MemCpy(cp.peer_bdaddr, peer_bdaddr, 6); 01046 cp.own_bdaddr_type = own_bdaddr_type; 01047 cp.conn_min_interval = htobs(conn_min_interval); 01048 cp.conn_max_interval = htobs(conn_max_interval); 01049 cp.conn_latency = htobs(conn_latency); 01050 cp.supervision_timeout = htobs(supervision_timeout); 01051 cp.min_conn_length = htobs(min_conn_length); 01052 cp.max_conn_length = htobs(max_conn_length); 01053 01054 Osal_MemSet(&rq, 0, sizeof(rq)); 01055 rq.ogf = OGF_VENDOR_CMD; 01056 rq.ocf = OCF_GAP_CREATE_CONNECTION; 01057 rq.cparam = &cp; 01058 rq.clen = sizeof(cp); 01059 rq.event = EVT_CMD_STATUS; 01060 rq.rparam = &status; 01061 rq.rlen = 1; 01062 01063 if (hci_send_req(&rq, FALSE) < 0) 01064 return BLE_STATUS_TIMEOUT; 01065 01066 return status; 01067 } 01068 01069 tBleStatus aci_gap_terminate_gap_procedure(uint8_t procedure_code) 01070 { 01071 struct hci_request rq; 01072 uint8_t status; 01073 01074 Osal_MemSet(&rq, 0, sizeof(rq)); 01075 rq.ogf = OGF_VENDOR_CMD; 01076 rq.ocf = OCF_GAP_TERMINATE_GAP_PROCEDURE; 01077 rq.cparam = &procedure_code; 01078 rq.clen = 1; 01079 rq.rparam = &status; 01080 rq.rlen = 1; 01081 01082 if (hci_send_req(&rq, FALSE) < 0) 01083 return BLE_STATUS_TIMEOUT; 01084 01085 return status; 01086 01087 } 01088 01089 tBleStatus aci_gap_start_connection_update(uint16_t conn_handle, uint16_t conn_min_interval, 01090 uint16_t conn_max_interval, uint16_t conn_latency, 01091 uint16_t supervision_timeout, uint16_t min_conn_length, 01092 uint16_t max_conn_length) 01093 { 01094 struct hci_request rq; 01095 gap_start_connection_update_cp cp; 01096 uint8_t status; 01097 01098 cp.conn_handle = htobs(conn_handle); 01099 cp.conn_min_interval = htobs(conn_min_interval); 01100 cp.conn_max_interval = htobs(conn_max_interval); 01101 cp.conn_latency = htobs(conn_latency); 01102 cp.supervision_timeout = htobs(supervision_timeout); 01103 cp.min_conn_length = htobs(min_conn_length); 01104 cp.max_conn_length = htobs(max_conn_length); 01105 01106 Osal_MemSet(&rq, 0, sizeof(rq)); 01107 rq.ogf = OGF_VENDOR_CMD; 01108 rq.ocf = OCF_GAP_START_CONNECTION_UPDATE; 01109 rq.cparam = &cp; 01110 rq.clen = sizeof(cp); 01111 rq.event = EVT_CMD_STATUS; 01112 rq.rparam = &status; 01113 rq.rlen = 1; 01114 01115 if (hci_send_req(&rq, FALSE) < 0) 01116 return BLE_STATUS_TIMEOUT; 01117 01118 return status; 01119 } 01120 01121 tBleStatus aci_gap_send_pairing_request(uint16_t conn_handle, uint8_t force_rebond) 01122 { 01123 struct hci_request rq; 01124 gap_send_pairing_request_cp cp; 01125 uint8_t status; 01126 01127 cp.conn_handle = htobs(conn_handle); 01128 cp.force_rebond = force_rebond; 01129 01130 Osal_MemSet(&rq, 0, sizeof(rq)); 01131 rq.ogf = OGF_VENDOR_CMD; 01132 rq.ocf = OCF_GAP_SEND_PAIRING_REQUEST; 01133 rq.cparam = &cp; 01134 rq.clen = sizeof(cp); 01135 rq.event = EVT_CMD_STATUS; 01136 rq.rparam = &status; 01137 rq.rlen = 1; 01138 01139 if (hci_send_req(&rq, FALSE) < 0) 01140 return BLE_STATUS_TIMEOUT; 01141 01142 return status; 01143 } 01144 01145 tBleStatus aci_gap_resolve_private_address_IDB05A1(const tBDAddr private_address, tBDAddr actual_address) 01146 { 01147 struct hci_request rq; 01148 gap_resolve_private_address_cp cp; 01149 gap_resolve_private_address_rp rp; 01150 01151 Osal_MemCpy(cp.address, private_address, 6); 01152 01153 Osal_MemSet(&rq, 0, sizeof(rq)); 01154 rq.ogf = OGF_VENDOR_CMD; 01155 rq.ocf = OCF_GAP_RESOLVE_PRIVATE_ADDRESS; 01156 rq.cparam = &cp; 01157 rq.clen = sizeof(cp); 01158 rq.rparam = &rp; 01159 rq.rlen = sizeof(rp); 01160 01161 if (hci_send_req(&rq, FALSE) < 0) 01162 return BLE_STATUS_TIMEOUT; 01163 01164 if(rp.status) 01165 return rp.status; 01166 01167 Osal_MemCpy(actual_address, rp.address, 6); 01168 01169 return 0; 01170 } 01171 tBleStatus aci_gap_resolve_private_address_IDB04A1(const tBDAddr address) 01172 { 01173 struct hci_request rq; 01174 gap_resolve_private_address_cp cp; 01175 uint8_t status; 01176 01177 Osal_MemCpy(cp.address, address, 6); 01178 01179 Osal_MemSet(&rq, 0, sizeof(rq)); 01180 rq.ogf = OGF_VENDOR_CMD; 01181 rq.ocf = OCF_GAP_RESOLVE_PRIVATE_ADDRESS; 01182 rq.cparam = &cp; 01183 rq.clen = sizeof(cp); 01184 rq.rparam = &status; 01185 rq.rlen = 1; 01186 01187 if (hci_send_req(&rq, FALSE) < 0) 01188 return BLE_STATUS_TIMEOUT; 01189 01190 return status; 01191 } 01192 01193 tBleStatus aci_gap_set_broadcast_mode(uint16_t adv_interv_min, uint16_t adv_interv_max, uint8_t adv_type, 01194 uint8_t own_addr_type, uint8_t adv_data_length, const uint8_t *adv_data, uint8_t num_whitelist_entries, 01195 const uint8_t *addr_array) 01196 { 01197 struct hci_request rq; 01198 gap_set_broadcast_mode_cp cp; 01199 uint8_t status; 01200 uint8_t indx = 0; 01201 uint8_t variable_size = 1 + adv_data_length + 1 + num_whitelist_entries*7; 01202 01203 if (variable_size > sizeof(cp.var_len_data) ) 01204 return BLE_STATUS_INVALID_PARAMS; 01205 01206 cp.adv_interv_min = htobs(adv_interv_min); 01207 cp.adv_interv_max = htobs(adv_interv_max); 01208 cp.adv_type = adv_type; 01209 cp.own_addr_type = own_addr_type; 01210 01211 cp.var_len_data[indx] = adv_data_length; 01212 indx++; 01213 Osal_MemCpy(cp.var_len_data + indx, adv_data, adv_data_length); 01214 indx += adv_data_length; 01215 cp.var_len_data[indx] = num_whitelist_entries; 01216 indx ++; 01217 Osal_MemCpy(cp.var_len_data + indx, addr_array, num_whitelist_entries*7); 01218 01219 Osal_MemSet(&rq, 0, sizeof(rq)); 01220 rq.ogf = OGF_VENDOR_CMD; 01221 rq.ocf = OCF_GAP_SET_BROADCAST_MODE; 01222 rq.cparam = &cp; 01223 rq.clen = GAP_SET_BROADCAST_MODE_CP_SIZE + variable_size; 01224 rq.rparam = &status; 01225 rq.rlen = 1; 01226 01227 if (hci_send_req(&rq, FALSE) < 0) 01228 return BLE_STATUS_TIMEOUT; 01229 01230 return status; 01231 } 01232 01233 tBleStatus aci_gap_start_observation_procedure(uint16_t scan_interval, uint16_t scan_window, uint8_t scan_type, 01234 uint8_t own_address_type, uint8_t filter_duplicates) 01235 { 01236 struct hci_request rq; 01237 gap_start_observation_proc_cp cp; 01238 uint8_t status; 01239 01240 cp.scan_interval = scan_interval; 01241 cp.scan_window = scan_window; 01242 cp.scan_type = scan_type; 01243 cp.own_address_type = own_address_type; 01244 cp.filter_duplicates = filter_duplicates; 01245 01246 Osal_MemSet(&rq, 0, sizeof(rq)); 01247 rq.ogf = OGF_VENDOR_CMD; 01248 rq.ocf = OCF_GAP_START_OBSERVATION_PROC; 01249 rq.cparam = &cp; 01250 rq.clen = sizeof(cp); 01251 rq.event = EVT_CMD_STATUS; 01252 rq.rparam = &status; 01253 rq.rlen = 1; 01254 01255 if (hci_send_req(&rq, FALSE) < 0) 01256 return BLE_STATUS_TIMEOUT; 01257 01258 return status; 01259 } 01260 01261 tBleStatus aci_gap_is_device_bonded(uint8_t peer_address_type, const tBDAddr peer_address) 01262 { 01263 struct hci_request rq; 01264 gap_is_device_bonded_cp cp; 01265 uint8_t status; 01266 01267 cp.peer_address_type = peer_address_type; 01268 Osal_MemCpy(cp.peer_address, peer_address, sizeof(cp.peer_address)); 01269 01270 Osal_MemSet(&rq, 0, sizeof(rq)); 01271 rq.ogf = OGF_VENDOR_CMD; 01272 rq.ocf = OCF_GAP_IS_DEVICE_BONDED; 01273 rq.cparam = &cp; 01274 rq.clen = sizeof(cp); 01275 rq.rparam = &status; 01276 rq.rlen = 1; 01277 01278 if (hci_send_req(&rq, FALSE) < 0) 01279 return BLE_STATUS_TIMEOUT; 01280 01281 return status; 01282 } 01283 01284 tBleStatus aci_gap_get_bonded_devices(uint8_t *num_devices, uint8_t *device_list, uint8_t device_list_size) 01285 { 01286 struct hci_request rq; 01287 gap_get_bonded_devices_rp rp; 01288 01289 Osal_MemSet(&rq, 0, sizeof(rq)); 01290 rq.ogf = OGF_VENDOR_CMD; 01291 rq.ocf = OCF_GAP_GET_BONDED_DEVICES; 01292 rq.rparam = &rp; 01293 rq.rlen = sizeof(rp); 01294 01295 if (hci_send_req(&rq, FALSE) < 0) 01296 return BLE_STATUS_TIMEOUT; 01297 01298 if (rp.status) { 01299 return rp.status; 01300 } 01301 01302 *num_devices = rp.num_addr; 01303 if(device_list != NULL) 01304 Osal_MemCpy(device_list, rp.dev_list, MIN(device_list_size,rp.num_addr*7)); 01305 01306 return 0; 01307 }
Generated on Tue Jul 12 2022 18:15:59 by 1.7.2