my fork

Dependencies:   mbed

Committer:
filartrix
Date:
Wed Apr 08 14:17:20 2015 +0000
Revision:
4:987b201ec4b1
first

Who changed what in which revision?

UserRevisionLine numberNew contents of line
filartrix 4:987b201ec4b1 1 /******************** (C) COPYRIGHT 2014 STMicroelectronics ********************
filartrix 4:987b201ec4b1 2 * File Name : bluenrg_hci.c
filartrix 4:987b201ec4b1 3 * Author : AMS - HEA&RF BU
filartrix 4:987b201ec4b1 4 * Version : V1.0.0
filartrix 4:987b201ec4b1 5 * Date : 4-Oct-2013
filartrix 4:987b201ec4b1 6 * Description : File with HCI commands for BlueNRG FW6.0 and above.
filartrix 4:987b201ec4b1 7 ********************************************************************************
filartrix 4:987b201ec4b1 8 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
filartrix 4:987b201ec4b1 9 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
filartrix 4:987b201ec4b1 10 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
filartrix 4:987b201ec4b1 11 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
filartrix 4:987b201ec4b1 12 * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
filartrix 4:987b201ec4b1 13 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
filartrix 4:987b201ec4b1 14 *******************************************************************************/
filartrix 4:987b201ec4b1 15
filartrix 4:987b201ec4b1 16 #include "hal_types.h"
filartrix 4:987b201ec4b1 17 #include "osal.h"
filartrix 4:987b201ec4b1 18 #include "ble_status.h"
filartrix 4:987b201ec4b1 19 #include "hal.h"
filartrix 4:987b201ec4b1 20 #include "osal.h"
filartrix 4:987b201ec4b1 21 #include "hci_const.h"
filartrix 4:987b201ec4b1 22 #include "bluenrg_aci_const.h"
filartrix 4:987b201ec4b1 23 #include "bluenrg_gap_aci.h"
filartrix 4:987b201ec4b1 24 #include "gatt_server.h"
filartrix 4:987b201ec4b1 25 #include "gap.h"
filartrix 4:987b201ec4b1 26
filartrix 4:987b201ec4b1 27 #define MIN(a,b) ((a) < (b) )? (a) : (b)
filartrix 4:987b201ec4b1 28 #define MAX(a,b) ((a) > (b) )? (a) : (b)
filartrix 4:987b201ec4b1 29
filartrix 4:987b201ec4b1 30
filartrix 4:987b201ec4b1 31 tBleStatus aci_gap_init(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle)
filartrix 4:987b201ec4b1 32 {
filartrix 4:987b201ec4b1 33 struct hci_request rq;
filartrix 4:987b201ec4b1 34 gap_init_cp cp;
filartrix 4:987b201ec4b1 35 gap_init_rp resp;
filartrix 4:987b201ec4b1 36
filartrix 4:987b201ec4b1 37 cp.role = role;
filartrix 4:987b201ec4b1 38
filartrix 4:987b201ec4b1 39 Osal_MemSet(&resp, 0, sizeof(resp));
filartrix 4:987b201ec4b1 40
filartrix 4:987b201ec4b1 41 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 42 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 43 rq.ocf = OCF_GAP_INIT;
filartrix 4:987b201ec4b1 44 rq.cparam = &cp;
filartrix 4:987b201ec4b1 45 rq.clen = GAP_INIT_CP_SIZE;
filartrix 4:987b201ec4b1 46 rq.rparam = &resp;
filartrix 4:987b201ec4b1 47 rq.rlen = GAP_INIT_RP_SIZE;
filartrix 4:987b201ec4b1 48
filartrix 4:987b201ec4b1 49 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 50 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 51
filartrix 4:987b201ec4b1 52 if (resp.status) {
filartrix 4:987b201ec4b1 53 return resp.status;
filartrix 4:987b201ec4b1 54 }
filartrix 4:987b201ec4b1 55
filartrix 4:987b201ec4b1 56 *service_handle = btohs(resp.service_handle);
filartrix 4:987b201ec4b1 57 *dev_name_char_handle = btohs(resp.dev_name_char_handle);
filartrix 4:987b201ec4b1 58 *appearance_char_handle = btohs(resp.appearance_char_handle);
filartrix 4:987b201ec4b1 59
filartrix 4:987b201ec4b1 60 return 0;
filartrix 4:987b201ec4b1 61 }
filartrix 4:987b201ec4b1 62
filartrix 4:987b201ec4b1 63 tBleStatus aci_gap_set_non_discoverable(void)
filartrix 4:987b201ec4b1 64 {
filartrix 4:987b201ec4b1 65 struct hci_request rq;
filartrix 4:987b201ec4b1 66 uint8_t status;
filartrix 4:987b201ec4b1 67
filartrix 4:987b201ec4b1 68 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 69 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 70 rq.ocf = OCF_GAP_SET_NON_DISCOVERABLE;
filartrix 4:987b201ec4b1 71 rq.rparam = &status;
filartrix 4:987b201ec4b1 72 rq.rlen = 1;
filartrix 4:987b201ec4b1 73
filartrix 4:987b201ec4b1 74 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 75 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 76
filartrix 4:987b201ec4b1 77 return status;
filartrix 4:987b201ec4b1 78 }
filartrix 4:987b201ec4b1 79
filartrix 4:987b201ec4b1 80 tBleStatus aci_gap_set_limited_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax,
filartrix 4:987b201ec4b1 81 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen,
filartrix 4:987b201ec4b1 82 const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList,
filartrix 4:987b201ec4b1 83 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax)
filartrix 4:987b201ec4b1 84 {
filartrix 4:987b201ec4b1 85 struct hci_request rq;
filartrix 4:987b201ec4b1 86 uint8_t status;
filartrix 4:987b201ec4b1 87 uint8_t buffer[40];
filartrix 4:987b201ec4b1 88 uint8_t indx = 0;
filartrix 4:987b201ec4b1 89
filartrix 4:987b201ec4b1 90 if ((LocalNameLen+ServiceUUIDLen+14) > sizeof(buffer))
filartrix 4:987b201ec4b1 91 return BLE_STATUS_INVALID_PARAMS;
filartrix 4:987b201ec4b1 92
filartrix 4:987b201ec4b1 93 buffer[indx] = AdvType;
filartrix 4:987b201ec4b1 94 indx++;
filartrix 4:987b201ec4b1 95
filartrix 4:987b201ec4b1 96 AdvIntervMin = htobs(AdvIntervMin);
filartrix 4:987b201ec4b1 97 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2);
filartrix 4:987b201ec4b1 98 indx += 2;
filartrix 4:987b201ec4b1 99
filartrix 4:987b201ec4b1 100 AdvIntervMax = htobs(AdvIntervMax);
filartrix 4:987b201ec4b1 101 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2);
filartrix 4:987b201ec4b1 102 indx += 2;
filartrix 4:987b201ec4b1 103
filartrix 4:987b201ec4b1 104 buffer[indx] = OwnAddrType;
filartrix 4:987b201ec4b1 105 indx++;
filartrix 4:987b201ec4b1 106
filartrix 4:987b201ec4b1 107 buffer[indx] = AdvFilterPolicy;
filartrix 4:987b201ec4b1 108 indx++;
filartrix 4:987b201ec4b1 109
filartrix 4:987b201ec4b1 110 buffer[indx] = LocalNameLen;
filartrix 4:987b201ec4b1 111 indx++;
filartrix 4:987b201ec4b1 112
filartrix 4:987b201ec4b1 113 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen);
filartrix 4:987b201ec4b1 114 indx += LocalNameLen;
filartrix 4:987b201ec4b1 115
filartrix 4:987b201ec4b1 116 buffer[indx] = ServiceUUIDLen;
filartrix 4:987b201ec4b1 117 indx++;
filartrix 4:987b201ec4b1 118
filartrix 4:987b201ec4b1 119 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen);
filartrix 4:987b201ec4b1 120 indx += ServiceUUIDLen;
filartrix 4:987b201ec4b1 121
filartrix 4:987b201ec4b1 122 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2);
filartrix 4:987b201ec4b1 123 indx += 2;
filartrix 4:987b201ec4b1 124
filartrix 4:987b201ec4b1 125 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2);
filartrix 4:987b201ec4b1 126 indx += 2;
filartrix 4:987b201ec4b1 127
filartrix 4:987b201ec4b1 128 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 129 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 130 rq.ocf = OCF_GAP_SET_LIMITED_DISCOVERABLE;
filartrix 4:987b201ec4b1 131 rq.cparam = (void *)buffer;
filartrix 4:987b201ec4b1 132 rq.clen = indx;
filartrix 4:987b201ec4b1 133 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 134 rq.rparam = &status;
filartrix 4:987b201ec4b1 135 rq.rlen = 1;
filartrix 4:987b201ec4b1 136
filartrix 4:987b201ec4b1 137 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 138 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 139
filartrix 4:987b201ec4b1 140 return status;
filartrix 4:987b201ec4b1 141 }
filartrix 4:987b201ec4b1 142
filartrix 4:987b201ec4b1 143 tBleStatus aci_gap_set_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax,
filartrix 4:987b201ec4b1 144 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen,
filartrix 4:987b201ec4b1 145 const char *LocalName, uint8_t ServiceUUIDLen, uint8_t* ServiceUUIDList,
filartrix 4:987b201ec4b1 146 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax)
filartrix 4:987b201ec4b1 147 {
filartrix 4:987b201ec4b1 148 struct hci_request rq;
filartrix 4:987b201ec4b1 149 uint8_t status;
filartrix 4:987b201ec4b1 150 uint8_t buffer[40];
filartrix 4:987b201ec4b1 151 uint8_t indx = 0;
filartrix 4:987b201ec4b1 152
filartrix 4:987b201ec4b1 153 if ((LocalNameLen+ServiceUUIDLen+14) > sizeof(buffer))
filartrix 4:987b201ec4b1 154 return BLE_STATUS_INVALID_PARAMS;
filartrix 4:987b201ec4b1 155
filartrix 4:987b201ec4b1 156 buffer[indx] = AdvType;
filartrix 4:987b201ec4b1 157 indx++;
filartrix 4:987b201ec4b1 158
filartrix 4:987b201ec4b1 159 AdvIntervMin = htobs(AdvIntervMin);
filartrix 4:987b201ec4b1 160 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2);
filartrix 4:987b201ec4b1 161 indx += 2;
filartrix 4:987b201ec4b1 162
filartrix 4:987b201ec4b1 163 AdvIntervMax = htobs(AdvIntervMax);
filartrix 4:987b201ec4b1 164 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2);
filartrix 4:987b201ec4b1 165 indx += 2;
filartrix 4:987b201ec4b1 166
filartrix 4:987b201ec4b1 167 buffer[indx] = OwnAddrType;
filartrix 4:987b201ec4b1 168 indx++;
filartrix 4:987b201ec4b1 169
filartrix 4:987b201ec4b1 170 buffer[indx] = AdvFilterPolicy;
filartrix 4:987b201ec4b1 171 indx++;
filartrix 4:987b201ec4b1 172
filartrix 4:987b201ec4b1 173 buffer[indx] = LocalNameLen;
filartrix 4:987b201ec4b1 174 indx++;
filartrix 4:987b201ec4b1 175
filartrix 4:987b201ec4b1 176 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen);
filartrix 4:987b201ec4b1 177 indx += LocalNameLen;
filartrix 4:987b201ec4b1 178
filartrix 4:987b201ec4b1 179 buffer[indx] = ServiceUUIDLen;
filartrix 4:987b201ec4b1 180 indx++;
filartrix 4:987b201ec4b1 181
filartrix 4:987b201ec4b1 182 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen);
filartrix 4:987b201ec4b1 183 indx += ServiceUUIDLen;
filartrix 4:987b201ec4b1 184
filartrix 4:987b201ec4b1 185 SlaveConnIntervMin = htobs(SlaveConnIntervMin);
filartrix 4:987b201ec4b1 186 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2);
filartrix 4:987b201ec4b1 187 indx += 2;
filartrix 4:987b201ec4b1 188
filartrix 4:987b201ec4b1 189 SlaveConnIntervMax = htobs(SlaveConnIntervMax);
filartrix 4:987b201ec4b1 190 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2);
filartrix 4:987b201ec4b1 191 indx += 2;
filartrix 4:987b201ec4b1 192
filartrix 4:987b201ec4b1 193 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 194 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 195 rq.ocf = OCF_GAP_SET_DISCOVERABLE;
filartrix 4:987b201ec4b1 196 rq.cparam = (void *)buffer;
filartrix 4:987b201ec4b1 197 rq.clen = indx;
filartrix 4:987b201ec4b1 198 rq.rparam = &status;
filartrix 4:987b201ec4b1 199 rq.rlen = 1;
filartrix 4:987b201ec4b1 200
filartrix 4:987b201ec4b1 201 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 202 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 203
filartrix 4:987b201ec4b1 204 if (status) {
filartrix 4:987b201ec4b1 205 return status;
filartrix 4:987b201ec4b1 206 }
filartrix 4:987b201ec4b1 207
filartrix 4:987b201ec4b1 208 return 0;
filartrix 4:987b201ec4b1 209 }
filartrix 4:987b201ec4b1 210
filartrix 4:987b201ec4b1 211 tBleStatus aci_gap_set_direct_connectable(uint8_t own_addr_type, uint8_t initiator_addr_type, const uint8_t *initiator_addr)
filartrix 4:987b201ec4b1 212 {
filartrix 4:987b201ec4b1 213 struct hci_request rq;
filartrix 4:987b201ec4b1 214 gap_set_direct_conectable_cp cp;
filartrix 4:987b201ec4b1 215 uint8_t status;
filartrix 4:987b201ec4b1 216
filartrix 4:987b201ec4b1 217 cp.own_bdaddr_type = own_addr_type;
filartrix 4:987b201ec4b1 218 cp.direct_bdaddr_type = initiator_addr_type;
filartrix 4:987b201ec4b1 219 Osal_MemCpy(cp.direct_bdaddr, initiator_addr, 6);
filartrix 4:987b201ec4b1 220
filartrix 4:987b201ec4b1 221 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 222 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 223 rq.ocf = OCF_GAP_SET_DIRECT_CONNECTABLE;
filartrix 4:987b201ec4b1 224 rq.cparam = &cp;
filartrix 4:987b201ec4b1 225 rq.clen = GAP_SET_DIRECT_CONNECTABLE_CP_SIZE;
filartrix 4:987b201ec4b1 226 rq.rparam = &status;
filartrix 4:987b201ec4b1 227 rq.rlen = 1;
filartrix 4:987b201ec4b1 228
filartrix 4:987b201ec4b1 229 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 230 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 231
filartrix 4:987b201ec4b1 232 return status;
filartrix 4:987b201ec4b1 233 }
filartrix 4:987b201ec4b1 234
filartrix 4:987b201ec4b1 235 tBleStatus aci_gap_set_io_capabilitiy(uint8_t io_capability)
filartrix 4:987b201ec4b1 236 {
filartrix 4:987b201ec4b1 237 struct hci_request rq;
filartrix 4:987b201ec4b1 238 uint8_t status;
filartrix 4:987b201ec4b1 239 gap_set_io_capability_cp cp;
filartrix 4:987b201ec4b1 240
filartrix 4:987b201ec4b1 241 cp.io_capability = io_capability;
filartrix 4:987b201ec4b1 242
filartrix 4:987b201ec4b1 243 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 244 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 245 rq.ocf = OCF_GAP_SET_IO_CAPABILITY;
filartrix 4:987b201ec4b1 246 rq.cparam = &cp;
filartrix 4:987b201ec4b1 247 rq.clen = GAP_SET_IO_CAPABILITY_CP_SIZE;
filartrix 4:987b201ec4b1 248 rq.rparam = &status;
filartrix 4:987b201ec4b1 249 rq.rlen = 1;
filartrix 4:987b201ec4b1 250
filartrix 4:987b201ec4b1 251 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 252 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 253
filartrix 4:987b201ec4b1 254 return status;
filartrix 4:987b201ec4b1 255 }
filartrix 4:987b201ec4b1 256
filartrix 4:987b201ec4b1 257 tBleStatus aci_gap_set_auth_requirement(uint8_t mitm_mode,
filartrix 4:987b201ec4b1 258 uint8_t oob_enable,
filartrix 4:987b201ec4b1 259 uint8_t oob_data[16],
filartrix 4:987b201ec4b1 260 uint8_t min_encryption_key_size,
filartrix 4:987b201ec4b1 261 uint8_t max_encryption_key_size,
filartrix 4:987b201ec4b1 262 uint8_t use_fixed_pin,
filartrix 4:987b201ec4b1 263 uint32_t fixed_pin,
filartrix 4:987b201ec4b1 264 uint8_t bonding_mode)
filartrix 4:987b201ec4b1 265 {
filartrix 4:987b201ec4b1 266 struct hci_request rq;
filartrix 4:987b201ec4b1 267 gap_set_auth_requirement_cp cp;
filartrix 4:987b201ec4b1 268 uint8_t status;
filartrix 4:987b201ec4b1 269
filartrix 4:987b201ec4b1 270 cp.mitm_mode = mitm_mode;
filartrix 4:987b201ec4b1 271 cp.oob_enable = oob_enable;
filartrix 4:987b201ec4b1 272 Osal_MemCpy(cp.oob_data, oob_data, 16);
filartrix 4:987b201ec4b1 273 cp.min_encryption_key_size = min_encryption_key_size;
filartrix 4:987b201ec4b1 274 cp.max_encryption_key_size = max_encryption_key_size;
filartrix 4:987b201ec4b1 275 cp.use_fixed_pin = use_fixed_pin;
filartrix 4:987b201ec4b1 276 cp.fixed_pin = htobl(fixed_pin);
filartrix 4:987b201ec4b1 277 cp.bonding_mode = bonding_mode;
filartrix 4:987b201ec4b1 278
filartrix 4:987b201ec4b1 279 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 280 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 281 rq.ocf = OCF_GAP_SET_AUTH_REQUIREMENT;
filartrix 4:987b201ec4b1 282 rq.cparam = &cp;
filartrix 4:987b201ec4b1 283 rq.clen = GAP_SET_AUTH_REQUIREMENT_CP_SIZE;
filartrix 4:987b201ec4b1 284 rq.rparam = &status;
filartrix 4:987b201ec4b1 285 rq.rlen = 1;
filartrix 4:987b201ec4b1 286
filartrix 4:987b201ec4b1 287 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 288 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 289
filartrix 4:987b201ec4b1 290 if (status) {
filartrix 4:987b201ec4b1 291 return status;
filartrix 4:987b201ec4b1 292 }
filartrix 4:987b201ec4b1 293
filartrix 4:987b201ec4b1 294 return 0;
filartrix 4:987b201ec4b1 295 }
filartrix 4:987b201ec4b1 296
filartrix 4:987b201ec4b1 297 tBleStatus aci_gap_set_author_requirement(uint16_t conn_handle, uint8_t authorization_enable)
filartrix 4:987b201ec4b1 298 {
filartrix 4:987b201ec4b1 299 struct hci_request rq;
filartrix 4:987b201ec4b1 300 gap_set_author_requirement_cp cp;
filartrix 4:987b201ec4b1 301 uint8_t status;
filartrix 4:987b201ec4b1 302
filartrix 4:987b201ec4b1 303 cp.conn_handle = htobs(conn_handle);
filartrix 4:987b201ec4b1 304 cp.authorization_enable = authorization_enable;
filartrix 4:987b201ec4b1 305
filartrix 4:987b201ec4b1 306 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 307 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 308 rq.ocf = OCF_GAP_SET_AUTHOR_REQUIREMENT;
filartrix 4:987b201ec4b1 309 rq.cparam = &cp;
filartrix 4:987b201ec4b1 310 rq.clen = GAP_SET_AUTHOR_REQUIREMENT_CP_SIZE;
filartrix 4:987b201ec4b1 311 rq.rparam = &status;
filartrix 4:987b201ec4b1 312 rq.rlen = 1;
filartrix 4:987b201ec4b1 313
filartrix 4:987b201ec4b1 314 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 315 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 316
filartrix 4:987b201ec4b1 317 return status;
filartrix 4:987b201ec4b1 318 }
filartrix 4:987b201ec4b1 319
filartrix 4:987b201ec4b1 320 tBleStatus aci_gap_pass_key_response(uint16_t conn_handle, uint32_t passkey)
filartrix 4:987b201ec4b1 321 {
filartrix 4:987b201ec4b1 322 struct hci_request rq;
filartrix 4:987b201ec4b1 323 gap_passkey_response_cp cp;
filartrix 4:987b201ec4b1 324 uint8_t status;
filartrix 4:987b201ec4b1 325
filartrix 4:987b201ec4b1 326 cp.conn_handle = htobs(conn_handle);
filartrix 4:987b201ec4b1 327 cp.passkey = htobl(passkey);
filartrix 4:987b201ec4b1 328
filartrix 4:987b201ec4b1 329 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 330 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 331 rq.ocf = OCF_GAP_PASSKEY_RESPONSE;
filartrix 4:987b201ec4b1 332 rq.cparam = &cp;
filartrix 4:987b201ec4b1 333 rq.clen = GAP_PASSKEY_RESPONSE_CP_SIZE;
filartrix 4:987b201ec4b1 334 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 335 rq.rparam = &status;
filartrix 4:987b201ec4b1 336 rq.rlen = 1;
filartrix 4:987b201ec4b1 337
filartrix 4:987b201ec4b1 338 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 339 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 340
filartrix 4:987b201ec4b1 341 return status;
filartrix 4:987b201ec4b1 342 }
filartrix 4:987b201ec4b1 343
filartrix 4:987b201ec4b1 344 tBleStatus aci_gap_authorization_response(uint16_t conn_handle, uint8_t authorize)
filartrix 4:987b201ec4b1 345 {
filartrix 4:987b201ec4b1 346 struct hci_request rq;
filartrix 4:987b201ec4b1 347 gap_authorization_response_cp cp;
filartrix 4:987b201ec4b1 348 uint8_t status;
filartrix 4:987b201ec4b1 349
filartrix 4:987b201ec4b1 350 cp.conn_handle = htobs(conn_handle);
filartrix 4:987b201ec4b1 351 cp.authorize = authorize;
filartrix 4:987b201ec4b1 352
filartrix 4:987b201ec4b1 353 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 354 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 355 rq.ocf = OCF_GAP_AUTHORIZATION_RESPONSE;
filartrix 4:987b201ec4b1 356 rq.cparam = &cp;
filartrix 4:987b201ec4b1 357 rq.clen = GAP_AUTHORIZATION_RESPONSE_CP_SIZE;
filartrix 4:987b201ec4b1 358 rq.rparam = &status;
filartrix 4:987b201ec4b1 359 rq.rlen = 1;
filartrix 4:987b201ec4b1 360
filartrix 4:987b201ec4b1 361 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 362 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 363
filartrix 4:987b201ec4b1 364 return status;
filartrix 4:987b201ec4b1 365 }
filartrix 4:987b201ec4b1 366
filartrix 4:987b201ec4b1 367 tBleStatus aci_gap_set_non_connectable(uint8_t adv_type)
filartrix 4:987b201ec4b1 368 {
filartrix 4:987b201ec4b1 369 struct hci_request rq;
filartrix 4:987b201ec4b1 370 gap_set_non_connectable_cp cp;
filartrix 4:987b201ec4b1 371 uint8_t status;
filartrix 4:987b201ec4b1 372
filartrix 4:987b201ec4b1 373 cp.advertising_event_type = adv_type;
filartrix 4:987b201ec4b1 374
filartrix 4:987b201ec4b1 375 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 376 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 377 rq.ocf = OCF_GAP_SET_NON_CONNECTABLE;
filartrix 4:987b201ec4b1 378 rq.cparam = &cp;
filartrix 4:987b201ec4b1 379 rq.clen = GAP_SET_NON_CONNECTABLE_CP_SIZE;
filartrix 4:987b201ec4b1 380 rq.rparam = &status;
filartrix 4:987b201ec4b1 381 rq.rlen = 1;
filartrix 4:987b201ec4b1 382
filartrix 4:987b201ec4b1 383 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 384 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 385
filartrix 4:987b201ec4b1 386 return status;
filartrix 4:987b201ec4b1 387 }
filartrix 4:987b201ec4b1 388
filartrix 4:987b201ec4b1 389 tBleStatus aci_gap_set_undirected_connectable(uint8_t own_addr_type, uint8_t adv_filter_policy)
filartrix 4:987b201ec4b1 390 {
filartrix 4:987b201ec4b1 391 struct hci_request rq;
filartrix 4:987b201ec4b1 392 gap_set_undirected_connectable_cp cp;
filartrix 4:987b201ec4b1 393 uint8_t status;
filartrix 4:987b201ec4b1 394
filartrix 4:987b201ec4b1 395 cp.own_addr_type = own_addr_type;
filartrix 4:987b201ec4b1 396 cp.adv_filter_policy = adv_filter_policy;
filartrix 4:987b201ec4b1 397
filartrix 4:987b201ec4b1 398 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 399 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 400 rq.ocf = OCF_GAP_SET_UNDIRECTED_CONNECTABLE;
filartrix 4:987b201ec4b1 401 rq.cparam = &cp;
filartrix 4:987b201ec4b1 402 rq.clen = GAP_SET_UNDIRECTED_CONNECTABLE_CP_SIZE;
filartrix 4:987b201ec4b1 403 rq.rparam = &status;
filartrix 4:987b201ec4b1 404 rq.rlen = 1;
filartrix 4:987b201ec4b1 405
filartrix 4:987b201ec4b1 406 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 407 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 408
filartrix 4:987b201ec4b1 409 return status;
filartrix 4:987b201ec4b1 410 }
filartrix 4:987b201ec4b1 411
filartrix 4:987b201ec4b1 412 tBleStatus aci_gap_slave_security_request(uint16_t conn_handle, uint8_t bonding, uint8_t mitm_protection)
filartrix 4:987b201ec4b1 413 {
filartrix 4:987b201ec4b1 414 struct hci_request rq;
filartrix 4:987b201ec4b1 415 gap_slave_security_request_cp cp;
filartrix 4:987b201ec4b1 416 uint8_t status;
filartrix 4:987b201ec4b1 417
filartrix 4:987b201ec4b1 418 cp.conn_handle = htobs(conn_handle);
filartrix 4:987b201ec4b1 419 cp.bonding = bonding;
filartrix 4:987b201ec4b1 420 cp.mitm_protection = mitm_protection;
filartrix 4:987b201ec4b1 421
filartrix 4:987b201ec4b1 422 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 423 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 424 rq.ocf = OCF_GAP_SLAVE_SECURITY_REQUEST;
filartrix 4:987b201ec4b1 425 rq.cparam = &cp;
filartrix 4:987b201ec4b1 426 rq.clen = GAP_SLAVE_SECURITY_REQUEST_CP_SIZE;
filartrix 4:987b201ec4b1 427 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 428 rq.rparam = &status;
filartrix 4:987b201ec4b1 429 rq.rlen = 1;
filartrix 4:987b201ec4b1 430
filartrix 4:987b201ec4b1 431 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 432 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 433
filartrix 4:987b201ec4b1 434 return status;
filartrix 4:987b201ec4b1 435
filartrix 4:987b201ec4b1 436 }
filartrix 4:987b201ec4b1 437
filartrix 4:987b201ec4b1 438 tBleStatus aci_gap_update_adv_data(uint8_t AdvLen, uint8_t *AdvData)
filartrix 4:987b201ec4b1 439 {
filartrix 4:987b201ec4b1 440 struct hci_request rq;
filartrix 4:987b201ec4b1 441 uint8_t status;
filartrix 4:987b201ec4b1 442 uint8_t buffer[32];
filartrix 4:987b201ec4b1 443 uint8_t indx = 0;
filartrix 4:987b201ec4b1 444
filartrix 4:987b201ec4b1 445 if (AdvLen > (sizeof(buffer)-1))
filartrix 4:987b201ec4b1 446 return BLE_STATUS_INVALID_PARAMS;
filartrix 4:987b201ec4b1 447
filartrix 4:987b201ec4b1 448 buffer[indx] = AdvLen;
filartrix 4:987b201ec4b1 449 indx++;
filartrix 4:987b201ec4b1 450
filartrix 4:987b201ec4b1 451 Osal_MemCpy(buffer + indx, AdvData, AdvLen);
filartrix 4:987b201ec4b1 452 indx += AdvLen;
filartrix 4:987b201ec4b1 453
filartrix 4:987b201ec4b1 454 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 455 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 456 rq.ocf = OCF_GAP_UPDATE_ADV_DATA;
filartrix 4:987b201ec4b1 457 rq.cparam = (void *)buffer;
filartrix 4:987b201ec4b1 458 rq.clen = indx;
filartrix 4:987b201ec4b1 459 rq.rparam = &status;
filartrix 4:987b201ec4b1 460 rq.rlen = 1;
filartrix 4:987b201ec4b1 461
filartrix 4:987b201ec4b1 462 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 463 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 464
filartrix 4:987b201ec4b1 465 return status;
filartrix 4:987b201ec4b1 466 }
filartrix 4:987b201ec4b1 467
filartrix 4:987b201ec4b1 468 tBleStatus aci_gap_configure_whitelist(void)
filartrix 4:987b201ec4b1 469 {
filartrix 4:987b201ec4b1 470 struct hci_request rq;
filartrix 4:987b201ec4b1 471 uint8_t status, dummy;
filartrix 4:987b201ec4b1 472
filartrix 4:987b201ec4b1 473 dummy = 0;
filartrix 4:987b201ec4b1 474
filartrix 4:987b201ec4b1 475 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 476 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 477 rq.ocf = OCF_GAP_CONFIGURE_WHITELIST;
filartrix 4:987b201ec4b1 478 rq.cparam = (void*)&dummy;
filartrix 4:987b201ec4b1 479 rq.clen = 0;
filartrix 4:987b201ec4b1 480 rq.rparam = &status;
filartrix 4:987b201ec4b1 481 rq.rlen = 1;
filartrix 4:987b201ec4b1 482
filartrix 4:987b201ec4b1 483 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 484 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 485
filartrix 4:987b201ec4b1 486 return status;
filartrix 4:987b201ec4b1 487 }
filartrix 4:987b201ec4b1 488
filartrix 4:987b201ec4b1 489 tBleStatus aci_gap_terminate(uint16_t conn_handle, uint8_t reason)
filartrix 4:987b201ec4b1 490 {
filartrix 4:987b201ec4b1 491 struct hci_request rq;
filartrix 4:987b201ec4b1 492 gap_terminate_cp cp;
filartrix 4:987b201ec4b1 493 uint8_t status;
filartrix 4:987b201ec4b1 494
filartrix 4:987b201ec4b1 495 cp.handle = htobs(conn_handle);
filartrix 4:987b201ec4b1 496 cp.reason = reason;
filartrix 4:987b201ec4b1 497
filartrix 4:987b201ec4b1 498 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 499 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 500 rq.ocf = OCF_GAP_TERMINATE;
filartrix 4:987b201ec4b1 501 rq.cparam = &cp;
filartrix 4:987b201ec4b1 502 rq.clen = GAP_TERMINATE_CP_SIZE;
filartrix 4:987b201ec4b1 503 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 504 rq.rparam = &status;
filartrix 4:987b201ec4b1 505 rq.rlen = 1;
filartrix 4:987b201ec4b1 506
filartrix 4:987b201ec4b1 507 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 508 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 509
filartrix 4:987b201ec4b1 510 return status;
filartrix 4:987b201ec4b1 511 }
filartrix 4:987b201ec4b1 512
filartrix 4:987b201ec4b1 513 tBleStatus aci_gap_clear_security_database(void)
filartrix 4:987b201ec4b1 514 {
filartrix 4:987b201ec4b1 515 struct hci_request rq;
filartrix 4:987b201ec4b1 516 uint8_t status, dummy;
filartrix 4:987b201ec4b1 517
filartrix 4:987b201ec4b1 518 dummy = 0;
filartrix 4:987b201ec4b1 519
filartrix 4:987b201ec4b1 520 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 521 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 522 rq.ocf = OCF_GAP_CLEAR_SECURITY_DB;
filartrix 4:987b201ec4b1 523 rq.cparam = (void*)&dummy;
filartrix 4:987b201ec4b1 524 rq.clen = 0;
filartrix 4:987b201ec4b1 525 rq.rparam = &status;
filartrix 4:987b201ec4b1 526 rq.rlen = 1;
filartrix 4:987b201ec4b1 527
filartrix 4:987b201ec4b1 528 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 529 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 530
filartrix 4:987b201ec4b1 531 return status;
filartrix 4:987b201ec4b1 532 }
filartrix 4:987b201ec4b1 533
filartrix 4:987b201ec4b1 534 tBleStatus aci_gap_allow_rebond(void)
filartrix 4:987b201ec4b1 535 {
filartrix 4:987b201ec4b1 536 struct hci_request rq;
filartrix 4:987b201ec4b1 537 uint8_t status, dummy;
filartrix 4:987b201ec4b1 538
filartrix 4:987b201ec4b1 539 dummy = 0;
filartrix 4:987b201ec4b1 540
filartrix 4:987b201ec4b1 541 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 542 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 543 rq.ocf = OCF_GAP_ALLOW_REBOND_DB;
filartrix 4:987b201ec4b1 544 rq.cparam = (void*)&dummy;
filartrix 4:987b201ec4b1 545 rq.clen = 0;
filartrix 4:987b201ec4b1 546 rq.rparam = &status;
filartrix 4:987b201ec4b1 547 rq.rlen = 1;
filartrix 4:987b201ec4b1 548
filartrix 4:987b201ec4b1 549 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 550 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 551
filartrix 4:987b201ec4b1 552 return status;
filartrix 4:987b201ec4b1 553 }
filartrix 4:987b201ec4b1 554
filartrix 4:987b201ec4b1 555 tBleStatus aci_gap_start_limited_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
filartrix 4:987b201ec4b1 556 uint8_t own_address_type, uint8_t filterDuplicates)
filartrix 4:987b201ec4b1 557 {
filartrix 4:987b201ec4b1 558 struct hci_request rq;
filartrix 4:987b201ec4b1 559 gap_start_limited_discovery_proc_cp cp;
filartrix 4:987b201ec4b1 560 uint8_t status;
filartrix 4:987b201ec4b1 561
filartrix 4:987b201ec4b1 562 cp.scanInterval = htobs(scanInterval);
filartrix 4:987b201ec4b1 563 cp.scanWindow = htobs(scanWindow);
filartrix 4:987b201ec4b1 564 cp.own_address_type = own_address_type;
filartrix 4:987b201ec4b1 565 cp.filterDuplicates = filterDuplicates;
filartrix 4:987b201ec4b1 566
filartrix 4:987b201ec4b1 567 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 568 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 569 rq.ocf = OCF_GAP_START_LIMITED_DISCOVERY_PROC;
filartrix 4:987b201ec4b1 570 rq.cparam = &cp;
filartrix 4:987b201ec4b1 571 rq.clen = GAP_START_LIMITED_DISCOVERY_PROC_CP_SIZE;
filartrix 4:987b201ec4b1 572 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 573 rq.rparam = &status;
filartrix 4:987b201ec4b1 574 rq.rlen = 1;
filartrix 4:987b201ec4b1 575
filartrix 4:987b201ec4b1 576 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 577 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 578
filartrix 4:987b201ec4b1 579 return status;
filartrix 4:987b201ec4b1 580 }
filartrix 4:987b201ec4b1 581
filartrix 4:987b201ec4b1 582 tBleStatus aci_gap_start_general_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
filartrix 4:987b201ec4b1 583 uint8_t own_address_type, uint8_t filterDuplicates)
filartrix 4:987b201ec4b1 584 {
filartrix 4:987b201ec4b1 585 struct hci_request rq;
filartrix 4:987b201ec4b1 586 gap_start_general_discovery_proc_cp cp;
filartrix 4:987b201ec4b1 587 uint8_t status;
filartrix 4:987b201ec4b1 588
filartrix 4:987b201ec4b1 589 cp.scanInterval = htobs(scanInterval);
filartrix 4:987b201ec4b1 590 cp.scanWindow = htobs(scanWindow);
filartrix 4:987b201ec4b1 591 cp.own_address_type = own_address_type;
filartrix 4:987b201ec4b1 592 cp.filterDuplicates = filterDuplicates;
filartrix 4:987b201ec4b1 593
filartrix 4:987b201ec4b1 594 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 595 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 596 rq.ocf = OCF_GAP_START_GENERAL_DISCOVERY_PROC;
filartrix 4:987b201ec4b1 597 rq.cparam = &cp;
filartrix 4:987b201ec4b1 598 rq.clen = GAP_START_GENERAL_DISCOVERY_PROC_CP_SIZE;
filartrix 4:987b201ec4b1 599 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 600 rq.rparam = &status;
filartrix 4:987b201ec4b1 601 rq.rlen = 1;
filartrix 4:987b201ec4b1 602
filartrix 4:987b201ec4b1 603 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 604 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 605
filartrix 4:987b201ec4b1 606 return status;
filartrix 4:987b201ec4b1 607 }
filartrix 4:987b201ec4b1 608
filartrix 4:987b201ec4b1 609
filartrix 4:987b201ec4b1 610 tBleStatus aci_gap_start_auto_conn_establishment(uint16_t scanInterval, uint16_t scanWindow,
filartrix 4:987b201ec4b1 611 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
filartrix 4:987b201ec4b1 612 uint16_t conn_max_interval, uint16_t conn_latency,
filartrix 4:987b201ec4b1 613 uint16_t supervision_timeout, uint16_t min_conn_length,
filartrix 4:987b201ec4b1 614 uint16_t max_conn_length, uint8_t num_whitelist_entries,
filartrix 4:987b201ec4b1 615 uint8_t *addr_array)
filartrix 4:987b201ec4b1 616 {
filartrix 4:987b201ec4b1 617 struct hci_request rq;
filartrix 4:987b201ec4b1 618 uint8_t status;
filartrix 4:987b201ec4b1 619 uint8_t buffer[HCI_MAX_PACKET_SIZE];
filartrix 4:987b201ec4b1 620 uint8_t indx = 0;
filartrix 4:987b201ec4b1 621
filartrix 4:987b201ec4b1 622 if (((num_whitelist_entries*7)+18) > HCI_MAX_PACKET_SIZE)
filartrix 4:987b201ec4b1 623 return BLE_STATUS_INVALID_PARAMS;
filartrix 4:987b201ec4b1 624
filartrix 4:987b201ec4b1 625 scanInterval = htobs(scanInterval);
filartrix 4:987b201ec4b1 626 Osal_MemCpy(buffer + indx, &scanInterval, 2);
filartrix 4:987b201ec4b1 627 indx += 2;
filartrix 4:987b201ec4b1 628
filartrix 4:987b201ec4b1 629 scanWindow = htobs(scanWindow);
filartrix 4:987b201ec4b1 630 Osal_MemCpy(buffer + indx, &scanWindow, 2);
filartrix 4:987b201ec4b1 631 indx += 2;
filartrix 4:987b201ec4b1 632
filartrix 4:987b201ec4b1 633 buffer[indx] = own_bdaddr_type;
filartrix 4:987b201ec4b1 634 indx++;
filartrix 4:987b201ec4b1 635
filartrix 4:987b201ec4b1 636 conn_min_interval = htobs(conn_min_interval);
filartrix 4:987b201ec4b1 637 Osal_MemCpy(buffer + indx, &conn_min_interval, 2);
filartrix 4:987b201ec4b1 638 indx += 2;
filartrix 4:987b201ec4b1 639
filartrix 4:987b201ec4b1 640 conn_max_interval = htobs(conn_max_interval);
filartrix 4:987b201ec4b1 641 Osal_MemCpy(buffer + indx, &conn_max_interval, 2);
filartrix 4:987b201ec4b1 642 indx += 2;
filartrix 4:987b201ec4b1 643
filartrix 4:987b201ec4b1 644 conn_latency = htobs(conn_latency);
filartrix 4:987b201ec4b1 645 Osal_MemCpy(buffer + indx, &conn_latency, 2);
filartrix 4:987b201ec4b1 646 indx += 2;
filartrix 4:987b201ec4b1 647
filartrix 4:987b201ec4b1 648 supervision_timeout = htobs(supervision_timeout);
filartrix 4:987b201ec4b1 649 Osal_MemCpy(buffer + indx, &supervision_timeout, 2);
filartrix 4:987b201ec4b1 650 indx += 2;
filartrix 4:987b201ec4b1 651
filartrix 4:987b201ec4b1 652 min_conn_length = htobs(min_conn_length);
filartrix 4:987b201ec4b1 653 Osal_MemCpy(buffer + indx, &min_conn_length, 2);
filartrix 4:987b201ec4b1 654 indx += 2;
filartrix 4:987b201ec4b1 655
filartrix 4:987b201ec4b1 656 max_conn_length = htobs(max_conn_length);
filartrix 4:987b201ec4b1 657 Osal_MemCpy(buffer + indx, &max_conn_length, 2);
filartrix 4:987b201ec4b1 658 indx += 2;
filartrix 4:987b201ec4b1 659
filartrix 4:987b201ec4b1 660 buffer[indx] = num_whitelist_entries;
filartrix 4:987b201ec4b1 661 indx++;
filartrix 4:987b201ec4b1 662
filartrix 4:987b201ec4b1 663 Osal_MemCpy(buffer + indx, addr_array, (num_whitelist_entries*7));
filartrix 4:987b201ec4b1 664 indx += num_whitelist_entries * 7;
filartrix 4:987b201ec4b1 665
filartrix 4:987b201ec4b1 666 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 667 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 668 rq.ocf = OCF_GAP_START_AUTO_CONN_ESTABLISHMENT;
filartrix 4:987b201ec4b1 669 rq.cparam = (void *)buffer;
filartrix 4:987b201ec4b1 670 rq.clen = indx;
filartrix 4:987b201ec4b1 671 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 672 rq.rparam = &status;
filartrix 4:987b201ec4b1 673 rq.rlen = 1;
filartrix 4:987b201ec4b1 674
filartrix 4:987b201ec4b1 675 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 676 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 677
filartrix 4:987b201ec4b1 678 return status;
filartrix 4:987b201ec4b1 679 }
filartrix 4:987b201ec4b1 680
filartrix 4:987b201ec4b1 681 tBleStatus aci_gap_create_connection(uint16_t scanInterval, uint16_t scanWindow,
filartrix 4:987b201ec4b1 682 uint8_t peer_bdaddr_type, tBDAddr peer_bdaddr,
filartrix 4:987b201ec4b1 683 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
filartrix 4:987b201ec4b1 684 uint16_t conn_max_interval, uint16_t conn_latency,
filartrix 4:987b201ec4b1 685 uint16_t supervision_timeout, uint16_t min_conn_length,
filartrix 4:987b201ec4b1 686 uint16_t max_conn_length)
filartrix 4:987b201ec4b1 687 {
filartrix 4:987b201ec4b1 688 struct hci_request rq;
filartrix 4:987b201ec4b1 689 gap_create_connection_cp cp;
filartrix 4:987b201ec4b1 690 uint8_t status;
filartrix 4:987b201ec4b1 691
filartrix 4:987b201ec4b1 692 cp.scanInterval = htobs(scanInterval);
filartrix 4:987b201ec4b1 693 cp.scanWindow = htobs(scanWindow);
filartrix 4:987b201ec4b1 694 cp.peer_bdaddr_type = peer_bdaddr_type;
filartrix 4:987b201ec4b1 695 Osal_MemCpy(cp.peer_bdaddr, peer_bdaddr, 6);
filartrix 4:987b201ec4b1 696 cp.own_bdaddr_type = own_bdaddr_type;
filartrix 4:987b201ec4b1 697 cp.conn_min_interval = htobs(conn_min_interval);
filartrix 4:987b201ec4b1 698 cp.conn_max_interval = htobs(conn_max_interval);
filartrix 4:987b201ec4b1 699 cp.conn_latency = htobs(conn_latency);
filartrix 4:987b201ec4b1 700 cp.supervision_timeout = htobs(supervision_timeout);
filartrix 4:987b201ec4b1 701 cp.min_conn_length = htobs(min_conn_length);
filartrix 4:987b201ec4b1 702 cp.max_conn_length = htobs(max_conn_length);
filartrix 4:987b201ec4b1 703
filartrix 4:987b201ec4b1 704 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 705 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 706 rq.ocf = OCF_GAP_CREATE_CONNECTION;
filartrix 4:987b201ec4b1 707 rq.cparam = &cp;
filartrix 4:987b201ec4b1 708 rq.clen = GAP_CREATE_CONNECTION_CP_SIZE;
filartrix 4:987b201ec4b1 709 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 710 rq.rparam = &status;
filartrix 4:987b201ec4b1 711 rq.rlen = 1;
filartrix 4:987b201ec4b1 712
filartrix 4:987b201ec4b1 713 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 714 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 715
filartrix 4:987b201ec4b1 716 return status;
filartrix 4:987b201ec4b1 717 }
filartrix 4:987b201ec4b1 718
filartrix 4:987b201ec4b1 719 tBleStatus aci_gap_terminate_gap_procedure(uint8_t procedure_code)
filartrix 4:987b201ec4b1 720 {
filartrix 4:987b201ec4b1 721 struct hci_request rq;
filartrix 4:987b201ec4b1 722 uint8_t status;
filartrix 4:987b201ec4b1 723
filartrix 4:987b201ec4b1 724 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 725 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 726 rq.ocf = OCF_GAP_TERMINATE_GAP_PROCEDURE;
filartrix 4:987b201ec4b1 727 rq.cparam = &procedure_code;
filartrix 4:987b201ec4b1 728 rq.clen = 1;
filartrix 4:987b201ec4b1 729 rq.rparam = &status;
filartrix 4:987b201ec4b1 730 rq.rlen = 1;
filartrix 4:987b201ec4b1 731
filartrix 4:987b201ec4b1 732 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 733 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 734
filartrix 4:987b201ec4b1 735 return status;
filartrix 4:987b201ec4b1 736
filartrix 4:987b201ec4b1 737 }
filartrix 4:987b201ec4b1 738
filartrix 4:987b201ec4b1 739 tBleStatus aci_gap_send_pairing_request(uint16_t conn_handle, uint8_t force_rebond)
filartrix 4:987b201ec4b1 740 {
filartrix 4:987b201ec4b1 741 struct hci_request rq;
filartrix 4:987b201ec4b1 742 gap_send_pairing_request_cp cp;
filartrix 4:987b201ec4b1 743 uint8_t status;
filartrix 4:987b201ec4b1 744
filartrix 4:987b201ec4b1 745 cp.conn_handle = htobs(conn_handle);
filartrix 4:987b201ec4b1 746 cp.force_rebond = force_rebond;
filartrix 4:987b201ec4b1 747
filartrix 4:987b201ec4b1 748 Osal_MemSet(&rq, 0, sizeof(rq));
filartrix 4:987b201ec4b1 749 rq.ogf = OGF_VENDOR_CMD;
filartrix 4:987b201ec4b1 750 rq.ocf = OCF_GAP_SEND_PAIRING_REQUEST;
filartrix 4:987b201ec4b1 751 rq.cparam = &cp;
filartrix 4:987b201ec4b1 752 rq.clen = GAP_SEND_PAIRING_REQUEST_CP_SIZE;
filartrix 4:987b201ec4b1 753 rq.event = EVT_CMD_STATUS;
filartrix 4:987b201ec4b1 754 rq.rparam = &status;
filartrix 4:987b201ec4b1 755 rq.rlen = 1;
filartrix 4:987b201ec4b1 756
filartrix 4:987b201ec4b1 757 if (hci_send_req(&rq) < 0)
filartrix 4:987b201ec4b1 758 return BLE_STATUS_TIMEOUT;
filartrix 4:987b201ec4b1 759
filartrix 4:987b201ec4b1 760 return status;
filartrix 4:987b201ec4b1 761 }
filartrix 4:987b201ec4b1 762