Robotique FIP / Mbed 2 deprecated FIP_REV1

Dependencies:   HC_SR04_Ultrasonic_Library Servo mbed

Fork of FIP_REV1 by Robotique FIP

Committer:
julientiron
Date:
Tue May 19 17:46:51 2015 +0000
Revision:
2:b5166e24c7a6
Parent:
0:3d641e170a74
?a marche BLE+capteur de distance;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
julientiron 0:3d641e170a74 1 /******************** (C) COPYRIGHT 2013 STMicroelectronics ********************
julientiron 0:3d641e170a74 2 * File Name : bluenrg_hci.c
julientiron 0:3d641e170a74 3 * Author : AMS - HEA&RF BU
julientiron 0:3d641e170a74 4 * Version : V1.0.0
julientiron 0:3d641e170a74 5 * Date : 4-Oct-2013
julientiron 0:3d641e170a74 6 * Description : File with HCI commands for BlueNRG FW6.0 and above.
julientiron 0:3d641e170a74 7 ********************************************************************************
julientiron 0:3d641e170a74 8 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
julientiron 0:3d641e170a74 9 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
julientiron 0:3d641e170a74 10 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
julientiron 0:3d641e170a74 11 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
julientiron 0:3d641e170a74 12 * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
julientiron 0:3d641e170a74 13 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
julientiron 0:3d641e170a74 14 *******************************************************************************/
julientiron 0:3d641e170a74 15
julientiron 0:3d641e170a74 16 #include "hal_types.h"
julientiron 0:3d641e170a74 17 #include "osal.h"
julientiron 0:3d641e170a74 18 #include "ble_status.h"
julientiron 0:3d641e170a74 19 #include "hal.h"
julientiron 0:3d641e170a74 20 #include "osal.h"
julientiron 0:3d641e170a74 21 #include "hci_internal.h"
julientiron 0:3d641e170a74 22 #include "bluenrg_hci_internal.h"
julientiron 0:3d641e170a74 23 #include "gatt_service.h"
julientiron 0:3d641e170a74 24
julientiron 0:3d641e170a74 25
julientiron 0:3d641e170a74 26 tBleStatus aci_gatt_init()
julientiron 0:3d641e170a74 27 {
julientiron 0:3d641e170a74 28 struct hci_request rq;
julientiron 0:3d641e170a74 29 tHalUint8 status;
julientiron 0:3d641e170a74 30
julientiron 0:3d641e170a74 31 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 32 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 33 rq.ocf = OCF_GATT_INIT;
julientiron 0:3d641e170a74 34 rq.rparam = &status;
julientiron 0:3d641e170a74 35 rq.rlen = 1;
julientiron 0:3d641e170a74 36
julientiron 0:3d641e170a74 37 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 38 return -1;
julientiron 0:3d641e170a74 39
julientiron 0:3d641e170a74 40 if (status) {
julientiron 0:3d641e170a74 41 return status;
julientiron 0:3d641e170a74 42 }
julientiron 0:3d641e170a74 43
julientiron 0:3d641e170a74 44 return 0;
julientiron 0:3d641e170a74 45 }
julientiron 0:3d641e170a74 46
julientiron 0:3d641e170a74 47 tBleStatus aci_gap_init(uint8_t role, uint16_t* service_handle, uint16_t* dev_name_char_handle, uint16_t* appearance_char_handle)
julientiron 0:3d641e170a74 48 {
julientiron 0:3d641e170a74 49 struct hci_request rq;
julientiron 0:3d641e170a74 50 gap_init_cp cp;
julientiron 0:3d641e170a74 51 gap_init_rp resp;
julientiron 0:3d641e170a74 52
julientiron 0:3d641e170a74 53 cp.role = role;
julientiron 0:3d641e170a74 54
julientiron 0:3d641e170a74 55 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 56
julientiron 0:3d641e170a74 57 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 58 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 59 rq.ocf = OCF_GAP_INIT;
julientiron 0:3d641e170a74 60 rq.cparam = &cp;
julientiron 0:3d641e170a74 61 rq.clen = GAP_INIT_CP_SIZE;
julientiron 0:3d641e170a74 62 rq.rparam = &resp;
julientiron 0:3d641e170a74 63 rq.rlen = GAP_INIT_RP_SIZE;
julientiron 0:3d641e170a74 64
julientiron 0:3d641e170a74 65 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 66 return -1;
julientiron 0:3d641e170a74 67
julientiron 0:3d641e170a74 68 if (resp.status) {
julientiron 0:3d641e170a74 69 return resp.status;
julientiron 0:3d641e170a74 70 }
julientiron 0:3d641e170a74 71
julientiron 0:3d641e170a74 72 *service_handle = resp.service_handle;
julientiron 0:3d641e170a74 73 *dev_name_char_handle = resp.dev_name_char_handle;
julientiron 0:3d641e170a74 74 *appearance_char_handle = resp.appearance_char_handle;
julientiron 0:3d641e170a74 75
julientiron 0:3d641e170a74 76 return 0;
julientiron 0:3d641e170a74 77 }
julientiron 0:3d641e170a74 78
julientiron 0:3d641e170a74 79 tBleStatus aci_gap_set_non_discoverable(void)
julientiron 0:3d641e170a74 80 {
julientiron 0:3d641e170a74 81 struct hci_request rq;
julientiron 0:3d641e170a74 82 tHalUint8 status;
julientiron 0:3d641e170a74 83
julientiron 0:3d641e170a74 84 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 85 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 86 rq.ocf = OCF_GAP_SET_NON_DISCOVERABLE;
julientiron 0:3d641e170a74 87 rq.rparam = &status;
julientiron 0:3d641e170a74 88 rq.rlen = 1;
julientiron 0:3d641e170a74 89
julientiron 0:3d641e170a74 90 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 91 return -1;
julientiron 0:3d641e170a74 92
julientiron 0:3d641e170a74 93 return status;
julientiron 0:3d641e170a74 94 }
julientiron 0:3d641e170a74 95
julientiron 0:3d641e170a74 96 tBleStatus aci_gap_set_discoverable(uint8_t AdvType, uint16_t AdvIntervMin, uint16_t AdvIntervMax,
julientiron 0:3d641e170a74 97 uint8_t OwnAddrType, uint8_t AdvFilterPolicy, uint8_t LocalNameLen,
julientiron 0:3d641e170a74 98 const char *LocalName, uint8_t ServiceUUIDLen, const uint8_t* ServiceUUIDList,
julientiron 0:3d641e170a74 99 uint16_t SlaveConnIntervMin, uint16_t SlaveConnIntervMax)
julientiron 0:3d641e170a74 100 {
julientiron 0:3d641e170a74 101 struct hci_request rq;
julientiron 0:3d641e170a74 102 uint8_t status;
julientiron 0:3d641e170a74 103 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 104 uint8_t indx = 0;
julientiron 0:3d641e170a74 105
julientiron 0:3d641e170a74 106 buffer[indx] = AdvType;
julientiron 0:3d641e170a74 107 indx++;
julientiron 0:3d641e170a74 108
julientiron 0:3d641e170a74 109 Osal_MemCpy(buffer + indx, &AdvIntervMin, 2);
julientiron 0:3d641e170a74 110 indx += 2;
julientiron 0:3d641e170a74 111
julientiron 0:3d641e170a74 112 Osal_MemCpy(buffer + indx, &AdvIntervMax, 2);
julientiron 0:3d641e170a74 113 indx += 2;
julientiron 0:3d641e170a74 114
julientiron 0:3d641e170a74 115 buffer[indx] = OwnAddrType;
julientiron 0:3d641e170a74 116 indx++;
julientiron 0:3d641e170a74 117
julientiron 0:3d641e170a74 118 buffer[indx] = AdvFilterPolicy;
julientiron 0:3d641e170a74 119 indx++;
julientiron 0:3d641e170a74 120
julientiron 0:3d641e170a74 121 buffer[indx] = LocalNameLen;
julientiron 0:3d641e170a74 122 indx++;
julientiron 0:3d641e170a74 123
julientiron 0:3d641e170a74 124 Osal_MemCpy(buffer + indx, LocalName, LocalNameLen);
julientiron 0:3d641e170a74 125 indx += LocalNameLen;
julientiron 0:3d641e170a74 126
julientiron 0:3d641e170a74 127 buffer[indx] = ServiceUUIDLen;
julientiron 0:3d641e170a74 128 indx++;
julientiron 0:3d641e170a74 129
julientiron 0:3d641e170a74 130 Osal_MemCpy(buffer + indx, ServiceUUIDList, ServiceUUIDLen);
julientiron 0:3d641e170a74 131 indx += ServiceUUIDLen;
julientiron 0:3d641e170a74 132
julientiron 0:3d641e170a74 133 Osal_MemCpy(buffer + indx, &SlaveConnIntervMin, 2);
julientiron 0:3d641e170a74 134 indx += 2;
julientiron 0:3d641e170a74 135
julientiron 0:3d641e170a74 136 Osal_MemCpy(buffer + indx, &SlaveConnIntervMax, 2);
julientiron 0:3d641e170a74 137 indx += 2;
julientiron 0:3d641e170a74 138
julientiron 0:3d641e170a74 139 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 140 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 141 rq.ocf = OCF_GAP_SET_DISCOVERABLE;
julientiron 0:3d641e170a74 142 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 143 rq.clen = indx;
julientiron 0:3d641e170a74 144 rq.rparam = &status;
julientiron 0:3d641e170a74 145 rq.rlen = 1;
julientiron 0:3d641e170a74 146
julientiron 0:3d641e170a74 147 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 148 return -1;
julientiron 0:3d641e170a74 149
julientiron 0:3d641e170a74 150 if (status) {
julientiron 0:3d641e170a74 151 return status;
julientiron 0:3d641e170a74 152 }
julientiron 0:3d641e170a74 153
julientiron 0:3d641e170a74 154 return 0;
julientiron 0:3d641e170a74 155 }
julientiron 0:3d641e170a74 156
julientiron 0:3d641e170a74 157 tBleStatus aci_gap_update_adv_data(uint8_t AdvLen, const uint8_t *AdvData)
julientiron 0:3d641e170a74 158 {
julientiron 0:3d641e170a74 159 struct hci_request rq;
julientiron 0:3d641e170a74 160 uint8_t status;
julientiron 0:3d641e170a74 161 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 162 uint8_t indx = 0;
julientiron 0:3d641e170a74 163
julientiron 0:3d641e170a74 164 buffer[indx] = AdvLen;
julientiron 0:3d641e170a74 165 indx++;
julientiron 0:3d641e170a74 166
julientiron 0:3d641e170a74 167 Osal_MemCpy(buffer + indx, AdvData, AdvLen);
julientiron 0:3d641e170a74 168 indx += AdvLen;
julientiron 0:3d641e170a74 169
julientiron 0:3d641e170a74 170 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 171 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 172 rq.ocf = OCF_GAP_UPDATE_ADV_DATA;
julientiron 0:3d641e170a74 173 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 174 rq.clen = indx;
julientiron 0:3d641e170a74 175 rq.rparam = &status;
julientiron 0:3d641e170a74 176 rq.rlen = 1;
julientiron 0:3d641e170a74 177
julientiron 0:3d641e170a74 178 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 179 return -1;
julientiron 0:3d641e170a74 180
julientiron 0:3d641e170a74 181 return status;
julientiron 0:3d641e170a74 182 }
julientiron 0:3d641e170a74 183
julientiron 0:3d641e170a74 184
julientiron 0:3d641e170a74 185 tBleStatus aci_gatt_add_serv(tHalUint8 service_uuid_type, const tHalUint8* service_uuid, tHalUint8 service_type, tHalUint8 max_attr_records, tHalUint16 *serviceHandle)
julientiron 0:3d641e170a74 186 {
julientiron 0:3d641e170a74 187 struct hci_request rq;
julientiron 0:3d641e170a74 188 gatt_add_serv_rp resp;
julientiron 0:3d641e170a74 189 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 190 uint8_t uuid_len;
julientiron 0:3d641e170a74 191 uint8_t indx = 0;
julientiron 0:3d641e170a74 192
julientiron 0:3d641e170a74 193 buffer[indx] = service_uuid_type;
julientiron 0:3d641e170a74 194 indx++;
julientiron 0:3d641e170a74 195
julientiron 0:3d641e170a74 196 if(service_uuid_type == 0x01){
julientiron 0:3d641e170a74 197 uuid_len = 2;
julientiron 0:3d641e170a74 198 }
julientiron 0:3d641e170a74 199 else {
julientiron 0:3d641e170a74 200 uuid_len = 16;
julientiron 0:3d641e170a74 201 }
julientiron 0:3d641e170a74 202 Osal_MemCpy(buffer + indx, service_uuid, uuid_len);
julientiron 0:3d641e170a74 203 indx += uuid_len;
julientiron 0:3d641e170a74 204
julientiron 0:3d641e170a74 205 buffer[indx] = service_type;
julientiron 0:3d641e170a74 206 indx++;
julientiron 0:3d641e170a74 207
julientiron 0:3d641e170a74 208 buffer[indx] = max_attr_records;
julientiron 0:3d641e170a74 209 indx++;
julientiron 0:3d641e170a74 210
julientiron 0:3d641e170a74 211
julientiron 0:3d641e170a74 212 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 213
julientiron 0:3d641e170a74 214 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 215 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 216 rq.ocf = OCF_GATT_ADD_SERV;
julientiron 0:3d641e170a74 217 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 218 rq.clen = indx;
julientiron 0:3d641e170a74 219 rq.rparam = &resp;
julientiron 0:3d641e170a74 220 rq.rlen = GATT_ADD_SERV_RP_SIZE;
julientiron 0:3d641e170a74 221
julientiron 0:3d641e170a74 222 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 223 return -1;
julientiron 0:3d641e170a74 224
julientiron 0:3d641e170a74 225 if (resp.status) {
julientiron 0:3d641e170a74 226 return resp.status;
julientiron 0:3d641e170a74 227 }
julientiron 0:3d641e170a74 228
julientiron 0:3d641e170a74 229 *serviceHandle = resp.handle;
julientiron 0:3d641e170a74 230
julientiron 0:3d641e170a74 231 return 0;
julientiron 0:3d641e170a74 232 }
julientiron 0:3d641e170a74 233
julientiron 0:3d641e170a74 234 tBleStatus aci_gatt_add_char(tHalUint16 serviceHandle,
julientiron 0:3d641e170a74 235 tUuidType charUuidType,
julientiron 0:3d641e170a74 236 const tHalUint8* charUuid,
julientiron 0:3d641e170a74 237 tHalUint16 charValueLen,
julientiron 0:3d641e170a74 238 tHalUint8 charProperties,
julientiron 0:3d641e170a74 239 tAttrSecurityFlags secPermissions,
julientiron 0:3d641e170a74 240 tGattServerEvent gattEvtMask,
julientiron 0:3d641e170a74 241 tHalUint8 encryKeySize,
julientiron 0:3d641e170a74 242 tHalUint8 isVariable,
julientiron 0:3d641e170a74 243 tHalUint16* charHandle)
julientiron 0:3d641e170a74 244
julientiron 0:3d641e170a74 245
julientiron 0:3d641e170a74 246 {
julientiron 0:3d641e170a74 247 struct hci_request rq;
julientiron 0:3d641e170a74 248 gatt_add_serv_rp resp;
julientiron 0:3d641e170a74 249 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 250 uint8_t uuid_len;
julientiron 0:3d641e170a74 251 uint8_t indx = 0;
julientiron 0:3d641e170a74 252
julientiron 0:3d641e170a74 253 Osal_MemCpy(buffer + indx, &serviceHandle, 2);
julientiron 0:3d641e170a74 254 indx += 2;
julientiron 0:3d641e170a74 255
julientiron 0:3d641e170a74 256 buffer[indx] = charUuidType;
julientiron 0:3d641e170a74 257 indx++;
julientiron 0:3d641e170a74 258
julientiron 0:3d641e170a74 259 if(charUuidType == 0x01){
julientiron 0:3d641e170a74 260 uuid_len = 2;
julientiron 0:3d641e170a74 261 }
julientiron 0:3d641e170a74 262 else {
julientiron 0:3d641e170a74 263 uuid_len = 16;
julientiron 0:3d641e170a74 264 }
julientiron 0:3d641e170a74 265 Osal_MemCpy(buffer + indx, charUuid, uuid_len);
julientiron 0:3d641e170a74 266 indx += uuid_len;
julientiron 0:3d641e170a74 267
julientiron 0:3d641e170a74 268 buffer[indx] = charValueLen;
julientiron 0:3d641e170a74 269 indx++;
julientiron 0:3d641e170a74 270
julientiron 0:3d641e170a74 271 buffer[indx] = charProperties;
julientiron 0:3d641e170a74 272 indx++;
julientiron 0:3d641e170a74 273
julientiron 0:3d641e170a74 274 buffer[indx] = secPermissions;
julientiron 0:3d641e170a74 275 indx++;
julientiron 0:3d641e170a74 276
julientiron 0:3d641e170a74 277 buffer[indx] = gattEvtMask;
julientiron 0:3d641e170a74 278 indx++;
julientiron 0:3d641e170a74 279
julientiron 0:3d641e170a74 280 buffer[indx] = encryKeySize;
julientiron 0:3d641e170a74 281 indx++;
julientiron 0:3d641e170a74 282
julientiron 0:3d641e170a74 283 buffer[indx] = isVariable;
julientiron 0:3d641e170a74 284 indx++;
julientiron 0:3d641e170a74 285
julientiron 0:3d641e170a74 286 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 287
julientiron 0:3d641e170a74 288 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 289 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 290 rq.ocf = OCF_GATT_ADD_CHAR;
julientiron 0:3d641e170a74 291 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 292 rq.clen = indx;
julientiron 0:3d641e170a74 293 rq.rparam = &resp;
julientiron 0:3d641e170a74 294 rq.rlen = GATT_ADD_CHAR_RP_SIZE;
julientiron 0:3d641e170a74 295
julientiron 0:3d641e170a74 296 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 297 return -1;
julientiron 0:3d641e170a74 298
julientiron 0:3d641e170a74 299 if (resp.status) {
julientiron 0:3d641e170a74 300 return resp.status;
julientiron 0:3d641e170a74 301 }
julientiron 0:3d641e170a74 302
julientiron 0:3d641e170a74 303 *charHandle = resp.handle;
julientiron 0:3d641e170a74 304
julientiron 0:3d641e170a74 305 return 0;
julientiron 0:3d641e170a74 306 }
julientiron 0:3d641e170a74 307
julientiron 0:3d641e170a74 308 tBleStatus aci_gatt_add_char_desc(tHalUint16 serviceHandle,
julientiron 0:3d641e170a74 309 tHalUint16 charHandle,
julientiron 0:3d641e170a74 310 tUuidType descUuidType,
julientiron 0:3d641e170a74 311 const tHalUint8* uuid,
julientiron 0:3d641e170a74 312 tHalUint8 descValueMaxLen,
julientiron 0:3d641e170a74 313 tHalUint8 descValueLen,
julientiron 0:3d641e170a74 314 const void* descValue,
julientiron 0:3d641e170a74 315 tAttrSecurityFlags secPermissions,
julientiron 0:3d641e170a74 316 tAttrSecurityFlags accPermissions,
julientiron 0:3d641e170a74 317 tGattServerEvent gattEvtMask,
julientiron 0:3d641e170a74 318 tHalUint8 encryKeySize,
julientiron 0:3d641e170a74 319 tHalUint8 isVariable,
julientiron 0:3d641e170a74 320 tHalUint16* descHandle)
julientiron 0:3d641e170a74 321
julientiron 0:3d641e170a74 322
julientiron 0:3d641e170a74 323 {
julientiron 0:3d641e170a74 324 struct hci_request rq;
julientiron 0:3d641e170a74 325 gatt_add_char_desc_rp resp;
julientiron 0:3d641e170a74 326 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 327 uint8_t uuid_len;
julientiron 0:3d641e170a74 328 uint8_t indx = 0;
julientiron 0:3d641e170a74 329
julientiron 0:3d641e170a74 330 Osal_MemCpy(buffer + indx, &serviceHandle, 2);
julientiron 0:3d641e170a74 331 indx += 2;
julientiron 0:3d641e170a74 332
julientiron 0:3d641e170a74 333 Osal_MemCpy(buffer + indx, &charHandle, 2);
julientiron 0:3d641e170a74 334 indx += 2;
julientiron 0:3d641e170a74 335
julientiron 0:3d641e170a74 336 buffer[indx] = descUuidType;
julientiron 0:3d641e170a74 337 indx++;
julientiron 0:3d641e170a74 338
julientiron 0:3d641e170a74 339 if(descUuidType == 0x01){
julientiron 0:3d641e170a74 340 uuid_len = 2;
julientiron 0:3d641e170a74 341 }
julientiron 0:3d641e170a74 342 else {
julientiron 0:3d641e170a74 343 uuid_len = 16;
julientiron 0:3d641e170a74 344 }
julientiron 0:3d641e170a74 345 Osal_MemCpy(buffer + indx, uuid, uuid_len);
julientiron 0:3d641e170a74 346 indx += uuid_len;
julientiron 0:3d641e170a74 347
julientiron 0:3d641e170a74 348 buffer[indx] = descValueMaxLen;
julientiron 0:3d641e170a74 349 indx++;
julientiron 0:3d641e170a74 350
julientiron 0:3d641e170a74 351 buffer[indx] = descValueLen;
julientiron 0:3d641e170a74 352 indx++;
julientiron 0:3d641e170a74 353
julientiron 0:3d641e170a74 354 Osal_MemCpy(buffer + indx, descValue, descValueLen);
julientiron 0:3d641e170a74 355 indx += descValueLen;
julientiron 0:3d641e170a74 356
julientiron 0:3d641e170a74 357 buffer[indx] = secPermissions;
julientiron 0:3d641e170a74 358 indx++;
julientiron 0:3d641e170a74 359
julientiron 0:3d641e170a74 360 buffer[indx] = accPermissions;
julientiron 0:3d641e170a74 361 indx++;
julientiron 0:3d641e170a74 362
julientiron 0:3d641e170a74 363 buffer[indx] = gattEvtMask;
julientiron 0:3d641e170a74 364 indx++;
julientiron 0:3d641e170a74 365
julientiron 0:3d641e170a74 366 buffer[indx] = encryKeySize;
julientiron 0:3d641e170a74 367 indx++;
julientiron 0:3d641e170a74 368
julientiron 0:3d641e170a74 369 buffer[indx] = isVariable;
julientiron 0:3d641e170a74 370 indx++;
julientiron 0:3d641e170a74 371
julientiron 0:3d641e170a74 372 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 373
julientiron 0:3d641e170a74 374 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 375 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 376 rq.ocf = OCF_GATT_ADD_CHAR_DESC;
julientiron 0:3d641e170a74 377 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 378 rq.clen = indx;
julientiron 0:3d641e170a74 379 rq.rparam = &resp;
julientiron 0:3d641e170a74 380 rq.rlen = GATT_ADD_CHAR_DESC_RP_SIZE;
julientiron 0:3d641e170a74 381
julientiron 0:3d641e170a74 382 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 383 return -1;
julientiron 0:3d641e170a74 384
julientiron 0:3d641e170a74 385 if (resp.status) {
julientiron 0:3d641e170a74 386 return resp.status;
julientiron 0:3d641e170a74 387 }
julientiron 0:3d641e170a74 388
julientiron 0:3d641e170a74 389 *descHandle = resp.handle;
julientiron 0:3d641e170a74 390
julientiron 0:3d641e170a74 391 return 0;
julientiron 0:3d641e170a74 392 }
julientiron 0:3d641e170a74 393
julientiron 0:3d641e170a74 394
julientiron 0:3d641e170a74 395 tBleStatus aci_gatt_update_char_value(tHalUint16 servHandle,
julientiron 0:3d641e170a74 396 tHalUint16 charHandle,
julientiron 0:3d641e170a74 397 tHalUint8 charValOffset,
julientiron 0:3d641e170a74 398 tHalUint8 charValueLen,
julientiron 0:3d641e170a74 399 const tHalUint8 *charValue)
julientiron 0:3d641e170a74 400 {
julientiron 0:3d641e170a74 401 struct hci_request rq;
julientiron 0:3d641e170a74 402 uint8_t status;
julientiron 0:3d641e170a74 403 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 404 uint8_t indx = 0;
julientiron 0:3d641e170a74 405
julientiron 0:3d641e170a74 406 Osal_MemCpy(buffer + indx, &servHandle, 2);
julientiron 0:3d641e170a74 407 indx += 2;
julientiron 0:3d641e170a74 408
julientiron 0:3d641e170a74 409 Osal_MemCpy(buffer + indx, &charHandle, 2);
julientiron 0:3d641e170a74 410 indx += 2;
julientiron 0:3d641e170a74 411
julientiron 0:3d641e170a74 412 buffer[indx] = charValOffset;
julientiron 0:3d641e170a74 413 indx++;
julientiron 0:3d641e170a74 414
julientiron 0:3d641e170a74 415 buffer[indx] = charValueLen;
julientiron 0:3d641e170a74 416 indx++;
julientiron 0:3d641e170a74 417
julientiron 0:3d641e170a74 418 Osal_MemCpy(buffer + indx, charValue, charValueLen);
julientiron 0:3d641e170a74 419 indx += charValueLen;
julientiron 0:3d641e170a74 420
julientiron 0:3d641e170a74 421 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 422 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 423 rq.ocf = OCF_GATT_UPD_CHAR_VAL;
julientiron 0:3d641e170a74 424 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 425 rq.clen = indx;
julientiron 0:3d641e170a74 426 rq.rparam = &status;
julientiron 0:3d641e170a74 427 rq.rlen = 1;
julientiron 0:3d641e170a74 428
julientiron 0:3d641e170a74 429 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 430 return -1;
julientiron 0:3d641e170a74 431
julientiron 0:3d641e170a74 432 if (status) {
julientiron 0:3d641e170a74 433 return status;
julientiron 0:3d641e170a74 434 }
julientiron 0:3d641e170a74 435
julientiron 0:3d641e170a74 436 return 0;
julientiron 0:3d641e170a74 437 }
julientiron 0:3d641e170a74 438
julientiron 0:3d641e170a74 439 tBleStatus aci_gatt_allow_read(tHalUint16 conn_handle)
julientiron 0:3d641e170a74 440 {
julientiron 0:3d641e170a74 441 struct hci_request rq;
julientiron 0:3d641e170a74 442 gatt_allow_read_cp cp;
julientiron 0:3d641e170a74 443 tHalUint8 status;
julientiron 0:3d641e170a74 444
julientiron 0:3d641e170a74 445 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 446
julientiron 0:3d641e170a74 447 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 448 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 449 rq.ocf = OCF_GATT_ALLOW_READ;
julientiron 0:3d641e170a74 450 rq.cparam = &cp;
julientiron 0:3d641e170a74 451 rq.clen = GATT_ALLOW_READ_CP_SIZE;
julientiron 0:3d641e170a74 452 rq.rparam = &status;
julientiron 0:3d641e170a74 453 rq.rlen = 1;
julientiron 0:3d641e170a74 454
julientiron 0:3d641e170a74 455 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 456 return -1;
julientiron 0:3d641e170a74 457
julientiron 0:3d641e170a74 458 if (status) {
julientiron 0:3d641e170a74 459 return status;
julientiron 0:3d641e170a74 460 }
julientiron 0:3d641e170a74 461
julientiron 0:3d641e170a74 462 return 0;
julientiron 0:3d641e170a74 463 }
julientiron 0:3d641e170a74 464
julientiron 0:3d641e170a74 465 tBleStatus aci_gatt_set_desc_value(tHalUint16 servHandle,
julientiron 0:3d641e170a74 466 tHalUint16 charHandle,
julientiron 0:3d641e170a74 467 tHalUint16 charDescHandle,
julientiron 0:3d641e170a74 468 tHalUint16 charDescValOffset,
julientiron 0:3d641e170a74 469 tHalUint8 charDescValueLen,
julientiron 0:3d641e170a74 470 const tHalUint8 *charDescValue)
julientiron 0:3d641e170a74 471 {
julientiron 0:3d641e170a74 472 struct hci_request rq;
julientiron 0:3d641e170a74 473 uint8_t status;
julientiron 0:3d641e170a74 474 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 475 uint8_t indx = 0;
julientiron 0:3d641e170a74 476
julientiron 0:3d641e170a74 477 Osal_MemCpy(buffer + indx, &servHandle, 2);
julientiron 0:3d641e170a74 478 indx += 2;
julientiron 0:3d641e170a74 479
julientiron 0:3d641e170a74 480 Osal_MemCpy(buffer + indx, &charHandle, 2);
julientiron 0:3d641e170a74 481 indx += 2;
julientiron 0:3d641e170a74 482
julientiron 0:3d641e170a74 483 Osal_MemCpy(buffer + indx, &charDescHandle, 2);
julientiron 0:3d641e170a74 484 indx += 2;
julientiron 0:3d641e170a74 485
julientiron 0:3d641e170a74 486 Osal_MemCpy(buffer + indx, &charDescValOffset, 2);
julientiron 0:3d641e170a74 487 indx += 2;
julientiron 0:3d641e170a74 488
julientiron 0:3d641e170a74 489 buffer[indx] = charDescValueLen;
julientiron 0:3d641e170a74 490 indx++;
julientiron 0:3d641e170a74 491
julientiron 0:3d641e170a74 492 Osal_MemCpy(buffer + indx, charDescValue, charDescValueLen);
julientiron 0:3d641e170a74 493 indx += charDescValueLen;
julientiron 0:3d641e170a74 494
julientiron 0:3d641e170a74 495 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 496 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 497 rq.ocf = OCF_GATT_SET_DESC_VAL;
julientiron 0:3d641e170a74 498 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 499 rq.clen = indx;
julientiron 0:3d641e170a74 500 rq.rparam = &status;
julientiron 0:3d641e170a74 501 rq.rlen = 1;
julientiron 0:3d641e170a74 502
julientiron 0:3d641e170a74 503 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 504 return -1;
julientiron 0:3d641e170a74 505
julientiron 0:3d641e170a74 506 if (status) {
julientiron 0:3d641e170a74 507 return status;
julientiron 0:3d641e170a74 508 }
julientiron 0:3d641e170a74 509
julientiron 0:3d641e170a74 510 return 0;
julientiron 0:3d641e170a74 511 }
julientiron 0:3d641e170a74 512
julientiron 0:3d641e170a74 513 tBleStatus aci_gatt_disc_all_prim_services(uint16_t conn_handle)
julientiron 0:3d641e170a74 514 {
julientiron 0:3d641e170a74 515 struct hci_request rq;
julientiron 0:3d641e170a74 516 uint8_t status;
julientiron 0:3d641e170a74 517 gatt_disc_all_prim_services_cp cp;
julientiron 0:3d641e170a74 518
julientiron 0:3d641e170a74 519 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 520
julientiron 0:3d641e170a74 521 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 522 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 523 rq.ocf = OCF_GATT_DISC_ALL_PRIM_SERVICES;
julientiron 0:3d641e170a74 524 rq.cparam = &cp;
julientiron 0:3d641e170a74 525 rq.clen = GATT_DISC_ALL_PRIM_SERVICES_CP_SIZE;
julientiron 0:3d641e170a74 526 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 527 rq.rparam = &status;
julientiron 0:3d641e170a74 528 rq.rlen = 1;
julientiron 0:3d641e170a74 529
julientiron 0:3d641e170a74 530 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 531 return -1;
julientiron 0:3d641e170a74 532
julientiron 0:3d641e170a74 533 return status;
julientiron 0:3d641e170a74 534 }
julientiron 0:3d641e170a74 535
julientiron 0:3d641e170a74 536 tBleStatus aci_gatt_find_included_services(uint16_t conn_handle, uint16_t start_service_handle,
julientiron 0:3d641e170a74 537 uint16_t end_service_handle)
julientiron 0:3d641e170a74 538 {
julientiron 0:3d641e170a74 539 struct hci_request rq;
julientiron 0:3d641e170a74 540 uint8_t status;
julientiron 0:3d641e170a74 541 gatt_find_included_services_cp cp;
julientiron 0:3d641e170a74 542
julientiron 0:3d641e170a74 543 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 544 cp.start_handle = start_service_handle;
julientiron 0:3d641e170a74 545 cp.end_handle = end_service_handle;
julientiron 0:3d641e170a74 546
julientiron 0:3d641e170a74 547 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 548 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 549 rq.ocf = OCF_GATT_FIND_INCLUDED_SERVICES;
julientiron 0:3d641e170a74 550 rq.cparam = &cp;
julientiron 0:3d641e170a74 551 rq.clen = GATT_FIND_INCLUDED_SERVICES_CP_SIZE;
julientiron 0:3d641e170a74 552 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 553 rq.rparam = &status;
julientiron 0:3d641e170a74 554 rq.rlen = 1;
julientiron 0:3d641e170a74 555
julientiron 0:3d641e170a74 556 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 557 return -1;
julientiron 0:3d641e170a74 558
julientiron 0:3d641e170a74 559 return status;
julientiron 0:3d641e170a74 560 }
julientiron 0:3d641e170a74 561
julientiron 0:3d641e170a74 562 tBleStatus aci_gatt_disc_all_charac_of_serv(uint16_t conn_handle, uint16_t start_attr_handle,
julientiron 0:3d641e170a74 563 uint16_t end_attr_handle)
julientiron 0:3d641e170a74 564 {
julientiron 0:3d641e170a74 565 struct hci_request rq;
julientiron 0:3d641e170a74 566 uint8_t status;
julientiron 0:3d641e170a74 567 gatt_disc_all_charac_of_serv_cp cp;
julientiron 0:3d641e170a74 568
julientiron 0:3d641e170a74 569 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 570 cp.start_attr_handle = start_attr_handle;
julientiron 0:3d641e170a74 571 cp.end_attr_handle = end_attr_handle;
julientiron 0:3d641e170a74 572
julientiron 0:3d641e170a74 573 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 574 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 575 rq.ocf = OCF_GATT_DISC_ALL_CHARAC_OF_SERV;
julientiron 0:3d641e170a74 576 rq.cparam = &cp;
julientiron 0:3d641e170a74 577 rq.clen = GATT_DISC_ALL_CHARAC_OF_SERV_CP_SIZE;
julientiron 0:3d641e170a74 578 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 579 rq.rparam = &status;
julientiron 0:3d641e170a74 580 rq.rlen = 1;
julientiron 0:3d641e170a74 581
julientiron 0:3d641e170a74 582 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 583 return -1;
julientiron 0:3d641e170a74 584
julientiron 0:3d641e170a74 585 return status;
julientiron 0:3d641e170a74 586 }
julientiron 0:3d641e170a74 587
julientiron 0:3d641e170a74 588 tBleStatus aci_gatt_disc_all_charac_descriptors(uint16_t conn_handle, uint16_t char_val_handle,
julientiron 0:3d641e170a74 589 uint16_t char_end_handle)
julientiron 0:3d641e170a74 590 {
julientiron 0:3d641e170a74 591 struct hci_request rq;
julientiron 0:3d641e170a74 592 uint8_t status;
julientiron 0:3d641e170a74 593 gatt_disc_all_charac_descriptors_cp cp;
julientiron 0:3d641e170a74 594
julientiron 0:3d641e170a74 595 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 596 cp.char_val_handle = char_val_handle;
julientiron 0:3d641e170a74 597 cp.char_end_handle = char_end_handle;
julientiron 0:3d641e170a74 598
julientiron 0:3d641e170a74 599 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 600 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 601 rq.ocf = OCF_GATT_DISC_ALL_CHARAC_DESCRIPTORS;
julientiron 0:3d641e170a74 602 rq.cparam = &cp;
julientiron 0:3d641e170a74 603 rq.clen = GATT_DISC_ALL_CHARAC_DESCRIPTORS_CP_SIZE;
julientiron 0:3d641e170a74 604 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 605 rq.rparam = &status;
julientiron 0:3d641e170a74 606 rq.rlen = 1;
julientiron 0:3d641e170a74 607
julientiron 0:3d641e170a74 608 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 609 return -1;
julientiron 0:3d641e170a74 610
julientiron 0:3d641e170a74 611 return status;
julientiron 0:3d641e170a74 612 }
julientiron 0:3d641e170a74 613
julientiron 0:3d641e170a74 614 tBleStatus aci_gatt_write_without_response(uint16_t conn_handle, uint16_t attr_handle,
julientiron 0:3d641e170a74 615 uint8_t value_len, uint8_t *attr_value)
julientiron 0:3d641e170a74 616 {
julientiron 0:3d641e170a74 617 struct hci_request rq;
julientiron 0:3d641e170a74 618 uint8_t status;
julientiron 0:3d641e170a74 619 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 620 uint8_t indx = 0;
julientiron 0:3d641e170a74 621
julientiron 0:3d641e170a74 622 Osal_MemCpy(buffer + indx, &conn_handle, 2);
julientiron 0:3d641e170a74 623 indx += 2;
julientiron 0:3d641e170a74 624
julientiron 0:3d641e170a74 625 Osal_MemCpy(buffer + indx, &attr_handle, 2);
julientiron 0:3d641e170a74 626 indx += 2;
julientiron 0:3d641e170a74 627
julientiron 0:3d641e170a74 628 buffer[indx] = value_len;
julientiron 0:3d641e170a74 629 indx++;
julientiron 0:3d641e170a74 630
julientiron 0:3d641e170a74 631 Osal_MemCpy(buffer + indx, attr_value, value_len);
julientiron 0:3d641e170a74 632 indx += value_len;
julientiron 0:3d641e170a74 633
julientiron 0:3d641e170a74 634 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 635 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 636 rq.ocf = OCF_GATT_WRITE_WITHOUT_RESPONSE;
julientiron 0:3d641e170a74 637 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 638 rq.clen = indx;
julientiron 0:3d641e170a74 639 rq.rparam = &status;
julientiron 0:3d641e170a74 640 rq.rlen = 1;
julientiron 0:3d641e170a74 641
julientiron 0:3d641e170a74 642 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 643 return -1;
julientiron 0:3d641e170a74 644
julientiron 0:3d641e170a74 645 return status;
julientiron 0:3d641e170a74 646
julientiron 0:3d641e170a74 647 }
julientiron 0:3d641e170a74 648
julientiron 0:3d641e170a74 649 tBleStatus aci_gatt_write_response(uint16_t conn_handle,
julientiron 0:3d641e170a74 650 uint16_t attr_handle,
julientiron 0:3d641e170a74 651 uint8_t write_status,
julientiron 0:3d641e170a74 652 uint8_t err_code,
julientiron 0:3d641e170a74 653 uint8_t att_val_len,
julientiron 0:3d641e170a74 654 uint8_t *att_val)
julientiron 0:3d641e170a74 655 {
julientiron 0:3d641e170a74 656 struct hci_request rq;
julientiron 0:3d641e170a74 657 uint8_t status;
julientiron 0:3d641e170a74 658 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 659 uint8_t indx = 0;
julientiron 0:3d641e170a74 660
julientiron 0:3d641e170a74 661 Osal_MemCpy(buffer + indx, &conn_handle, 2);
julientiron 0:3d641e170a74 662 indx += 2;
julientiron 0:3d641e170a74 663
julientiron 0:3d641e170a74 664 Osal_MemCpy(buffer + indx, &attr_handle, 2);
julientiron 0:3d641e170a74 665 indx += 2;
julientiron 0:3d641e170a74 666
julientiron 0:3d641e170a74 667 buffer[indx] = write_status;
julientiron 0:3d641e170a74 668 indx += 1;
julientiron 0:3d641e170a74 669
julientiron 0:3d641e170a74 670 buffer[indx] = err_code;
julientiron 0:3d641e170a74 671 indx += 1;
julientiron 0:3d641e170a74 672
julientiron 0:3d641e170a74 673 buffer[indx] = att_val_len;
julientiron 0:3d641e170a74 674 indx += 1;
julientiron 0:3d641e170a74 675
julientiron 0:3d641e170a74 676 Osal_MemCpy(buffer + indx, &att_val, att_val_len);
julientiron 0:3d641e170a74 677 indx += att_val_len;
julientiron 0:3d641e170a74 678
julientiron 0:3d641e170a74 679 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 680 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 681 rq.ocf = OCF_GATT_WRITE_RESPONSE;
julientiron 0:3d641e170a74 682 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 683 rq.clen = indx;
julientiron 0:3d641e170a74 684 rq.rparam = &status;
julientiron 0:3d641e170a74 685 rq.rlen = 1;
julientiron 0:3d641e170a74 686
julientiron 0:3d641e170a74 687 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 688 return -1;
julientiron 0:3d641e170a74 689
julientiron 0:3d641e170a74 690 if (status) {
julientiron 0:3d641e170a74 691 return status;
julientiron 0:3d641e170a74 692 }
julientiron 0:3d641e170a74 693
julientiron 0:3d641e170a74 694 return 0;
julientiron 0:3d641e170a74 695 }
julientiron 0:3d641e170a74 696
julientiron 0:3d641e170a74 697 tBleStatus aci_gatt_read_charac_val(uint16_t conn_handle, uint16_t attr_handle)
julientiron 0:3d641e170a74 698 {
julientiron 0:3d641e170a74 699 struct hci_request rq;
julientiron 0:3d641e170a74 700 uint8_t status;
julientiron 0:3d641e170a74 701 gatt_read_charac_val_cp cp;
julientiron 0:3d641e170a74 702
julientiron 0:3d641e170a74 703 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 704 cp.attr_handle = attr_handle;
julientiron 0:3d641e170a74 705
julientiron 0:3d641e170a74 706 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 707 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 708 rq.ocf = OCF_GATT_READ_CHARAC_VAL;
julientiron 0:3d641e170a74 709 rq.cparam = &cp;
julientiron 0:3d641e170a74 710 rq.clen = GATT_READ_CHARAC_VAL_CP_SIZE;
julientiron 0:3d641e170a74 711 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 712 rq.rparam = &status;
julientiron 0:3d641e170a74 713 rq.rlen = 1;
julientiron 0:3d641e170a74 714
julientiron 0:3d641e170a74 715 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 716 return -1;
julientiron 0:3d641e170a74 717
julientiron 0:3d641e170a74 718 return status;
julientiron 0:3d641e170a74 719 }
julientiron 0:3d641e170a74 720
julientiron 0:3d641e170a74 721 tBleStatus aci_gatt_read_long_charac_val(uint16_t conn_handle, uint16_t attr_handle,
julientiron 0:3d641e170a74 722 uint16_t val_offset)
julientiron 0:3d641e170a74 723 {
julientiron 0:3d641e170a74 724 struct hci_request rq;
julientiron 0:3d641e170a74 725 uint8_t status;
julientiron 0:3d641e170a74 726 gatt_read_long_charac_val_cp cp;
julientiron 0:3d641e170a74 727
julientiron 0:3d641e170a74 728 cp.conn_handle = conn_handle;
julientiron 0:3d641e170a74 729 cp.attr_handle = attr_handle;
julientiron 0:3d641e170a74 730 cp.val_offset = val_offset;
julientiron 0:3d641e170a74 731
julientiron 0:3d641e170a74 732 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 733 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 734 rq.ocf = OCF_GATT_READ_LONG_CHARAC_VAL;
julientiron 0:3d641e170a74 735 rq.cparam = &cp;
julientiron 0:3d641e170a74 736 rq.clen = GATT_READ_LONG_CHARAC_VAL_CP_SIZE;
julientiron 0:3d641e170a74 737 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 738 rq.rparam = &status;
julientiron 0:3d641e170a74 739 rq.rlen = 1;
julientiron 0:3d641e170a74 740
julientiron 0:3d641e170a74 741 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 742 return -1;
julientiron 0:3d641e170a74 743
julientiron 0:3d641e170a74 744 return status;
julientiron 0:3d641e170a74 745 }
julientiron 0:3d641e170a74 746
julientiron 0:3d641e170a74 747 tBleStatus aci_gatt_write_charac_value(uint16_t conn_handle, uint16_t attr_handle,
julientiron 0:3d641e170a74 748 uint8_t value_len, uint8_t *attr_value)
julientiron 0:3d641e170a74 749 {
julientiron 0:3d641e170a74 750 struct hci_request rq;
julientiron 0:3d641e170a74 751 uint8_t status;
julientiron 0:3d641e170a74 752 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 753 uint8_t indx = 0;
julientiron 0:3d641e170a74 754
julientiron 0:3d641e170a74 755 Osal_MemCpy(buffer + indx, &conn_handle, 2);
julientiron 0:3d641e170a74 756 indx += 2;
julientiron 0:3d641e170a74 757
julientiron 0:3d641e170a74 758 Osal_MemCpy(buffer + indx, &attr_handle, 2);
julientiron 0:3d641e170a74 759 indx += 2;
julientiron 0:3d641e170a74 760
julientiron 0:3d641e170a74 761 buffer[indx] = value_len;
julientiron 0:3d641e170a74 762 indx++;
julientiron 0:3d641e170a74 763
julientiron 0:3d641e170a74 764 Osal_MemCpy(buffer + indx, attr_value, value_len);
julientiron 0:3d641e170a74 765 indx += value_len;
julientiron 0:3d641e170a74 766
julientiron 0:3d641e170a74 767 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 768 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 769 rq.ocf = OCF_GATT_WRITE_CHAR_VALUE;
julientiron 0:3d641e170a74 770 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 771 rq.clen = indx;
julientiron 0:3d641e170a74 772 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 773 rq.rparam = &status;
julientiron 0:3d641e170a74 774 rq.rlen = 1;
julientiron 0:3d641e170a74 775
julientiron 0:3d641e170a74 776 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 777 return -1;
julientiron 0:3d641e170a74 778
julientiron 0:3d641e170a74 779 return status;
julientiron 0:3d641e170a74 780 }
julientiron 0:3d641e170a74 781
julientiron 0:3d641e170a74 782 tBleStatus aci_gatt_write_charac_descriptor(uint16_t conn_handle, uint16_t attr_handle,
julientiron 0:3d641e170a74 783 uint8_t value_len, uint8_t *attr_value)
julientiron 0:3d641e170a74 784 {
julientiron 0:3d641e170a74 785 struct hci_request rq;
julientiron 0:3d641e170a74 786 uint8_t status;
julientiron 0:3d641e170a74 787 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 788 uint8_t indx = 0;
julientiron 0:3d641e170a74 789
julientiron 0:3d641e170a74 790 Osal_MemCpy(buffer + indx, &conn_handle, 2);
julientiron 0:3d641e170a74 791 indx += 2;
julientiron 0:3d641e170a74 792
julientiron 0:3d641e170a74 793 Osal_MemCpy(buffer + indx, &attr_handle, 2);
julientiron 0:3d641e170a74 794 indx += 2;
julientiron 0:3d641e170a74 795
julientiron 0:3d641e170a74 796 buffer[indx] = value_len;
julientiron 0:3d641e170a74 797 indx++;
julientiron 0:3d641e170a74 798
julientiron 0:3d641e170a74 799 Osal_MemCpy(buffer + indx, attr_value, value_len);
julientiron 0:3d641e170a74 800 indx += value_len;
julientiron 0:3d641e170a74 801
julientiron 0:3d641e170a74 802 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 803 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 804 rq.ocf = OCF_GATT_WRITE_CHAR_DESCRIPTOR;
julientiron 0:3d641e170a74 805 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 806 rq.clen = indx;
julientiron 0:3d641e170a74 807 rq.rparam = &status;
julientiron 0:3d641e170a74 808 rq.rlen = 1;
julientiron 0:3d641e170a74 809
julientiron 0:3d641e170a74 810 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 811 return -1;
julientiron 0:3d641e170a74 812
julientiron 0:3d641e170a74 813 return status;
julientiron 0:3d641e170a74 814 }
julientiron 0:3d641e170a74 815
julientiron 0:3d641e170a74 816 tBleStatus aci_hal_write_config_data(tHalUint8 offset,
julientiron 0:3d641e170a74 817 tHalUint8 len,
julientiron 0:3d641e170a74 818 const tHalUint8 *val)
julientiron 0:3d641e170a74 819 {
julientiron 0:3d641e170a74 820 struct hci_request rq;
julientiron 0:3d641e170a74 821 uint8_t status;
julientiron 0:3d641e170a74 822 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 823 uint8_t indx = 0;
julientiron 0:3d641e170a74 824
julientiron 0:3d641e170a74 825 buffer[indx] = offset;
julientiron 0:3d641e170a74 826 indx++;
julientiron 0:3d641e170a74 827
julientiron 0:3d641e170a74 828 buffer[indx] = len;
julientiron 0:3d641e170a74 829 indx++;
julientiron 0:3d641e170a74 830
julientiron 0:3d641e170a74 831 Osal_MemCpy(buffer + indx, val, len);
julientiron 0:3d641e170a74 832 indx += len;
julientiron 0:3d641e170a74 833
julientiron 0:3d641e170a74 834 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 835 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 836 rq.ocf = OCF_HAL_WRITE_CONFIG_DATA;
julientiron 0:3d641e170a74 837 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 838 rq.clen = indx;
julientiron 0:3d641e170a74 839 rq.rparam = &status;
julientiron 0:3d641e170a74 840 rq.rlen = 1;
julientiron 0:3d641e170a74 841
julientiron 0:3d641e170a74 842 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 843 return -1;
julientiron 0:3d641e170a74 844
julientiron 0:3d641e170a74 845 if (status) {
julientiron 0:3d641e170a74 846 return status;
julientiron 0:3d641e170a74 847 }
julientiron 0:3d641e170a74 848
julientiron 0:3d641e170a74 849 return 0;
julientiron 0:3d641e170a74 850 }
julientiron 0:3d641e170a74 851
julientiron 0:3d641e170a74 852 tBleStatus aci_hal_set_tx_power_level(uint8_t en_high_power, uint8_t pa_level)
julientiron 0:3d641e170a74 853 {
julientiron 0:3d641e170a74 854 struct hci_request rq;
julientiron 0:3d641e170a74 855 hal_set_tx_power_level_cp cp;
julientiron 0:3d641e170a74 856 uint8_t status;
julientiron 0:3d641e170a74 857
julientiron 0:3d641e170a74 858 cp.en_high_power = en_high_power;
julientiron 0:3d641e170a74 859 cp.pa_level = pa_level;
julientiron 0:3d641e170a74 860
julientiron 0:3d641e170a74 861 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 862 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 863 rq.ocf = OCF_HAL_SET_TX_POWER_LEVEL;
julientiron 0:3d641e170a74 864 rq.cparam = &cp;
julientiron 0:3d641e170a74 865 rq.clen = HAL_SET_TX_POWER_LEVEL_CP_SIZE;
julientiron 0:3d641e170a74 866 rq.rparam = &status;
julientiron 0:3d641e170a74 867 rq.rlen = 1;
julientiron 0:3d641e170a74 868
julientiron 0:3d641e170a74 869 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 870 return -1;
julientiron 0:3d641e170a74 871
julientiron 0:3d641e170a74 872 if (status) {
julientiron 0:3d641e170a74 873 return status;
julientiron 0:3d641e170a74 874 }
julientiron 0:3d641e170a74 875
julientiron 0:3d641e170a74 876 return 0;
julientiron 0:3d641e170a74 877 }
julientiron 0:3d641e170a74 878
julientiron 0:3d641e170a74 879 tBleStatus aci_gap_set_auth_requirement(uint8_t mitm_mode,
julientiron 0:3d641e170a74 880 uint8_t oob_enable,
julientiron 0:3d641e170a74 881 uint8_t oob_data[16],
julientiron 0:3d641e170a74 882 uint8_t min_encryption_key_size,
julientiron 0:3d641e170a74 883 uint8_t max_encryption_key_size,
julientiron 0:3d641e170a74 884 uint8_t use_fixed_pin,
julientiron 0:3d641e170a74 885 uint32_t fixed_pin,
julientiron 0:3d641e170a74 886 uint8_t bonding_mode)
julientiron 0:3d641e170a74 887 {
julientiron 0:3d641e170a74 888 struct hci_request rq;
julientiron 0:3d641e170a74 889 gap_set_auth_requirement_cp cp;
julientiron 0:3d641e170a74 890 uint8_t status;
julientiron 0:3d641e170a74 891
julientiron 0:3d641e170a74 892 cp.mitm_mode = mitm_mode;
julientiron 0:3d641e170a74 893 cp.oob_enable = oob_enable;
julientiron 0:3d641e170a74 894 Osal_MemCpy(cp.oob_data, oob_data, 16);
julientiron 0:3d641e170a74 895 cp.min_encryption_key_size = min_encryption_key_size;
julientiron 0:3d641e170a74 896 cp.max_encryption_key_size = max_encryption_key_size;
julientiron 0:3d641e170a74 897 cp.use_fixed_pin = use_fixed_pin;
julientiron 0:3d641e170a74 898 cp.fixed_pin = fixed_pin;
julientiron 0:3d641e170a74 899 cp.bonding_mode = bonding_mode;
julientiron 0:3d641e170a74 900
julientiron 0:3d641e170a74 901 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 902 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 903 rq.ocf = OCF_GAP_SET_AUTH_REQUIREMENT;
julientiron 0:3d641e170a74 904 rq.cparam = &cp;
julientiron 0:3d641e170a74 905 rq.clen = GAP_SET_AUTH_REQUIREMENT_CP_SIZE;
julientiron 0:3d641e170a74 906 rq.rparam = &status;
julientiron 0:3d641e170a74 907 rq.rlen = 1;
julientiron 0:3d641e170a74 908
julientiron 0:3d641e170a74 909 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 910 return -1;
julientiron 0:3d641e170a74 911
julientiron 0:3d641e170a74 912 if (status) {
julientiron 0:3d641e170a74 913 return status;
julientiron 0:3d641e170a74 914 }
julientiron 0:3d641e170a74 915
julientiron 0:3d641e170a74 916 return 0;
julientiron 0:3d641e170a74 917
julientiron 0:3d641e170a74 918 }
julientiron 0:3d641e170a74 919
julientiron 0:3d641e170a74 920 tBleStatus aci_gap_start_limited_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
julientiron 0:3d641e170a74 921 uint8_t own_address_type, uint8_t filterDuplicates)
julientiron 0:3d641e170a74 922 {
julientiron 0:3d641e170a74 923 struct hci_request rq;
julientiron 0:3d641e170a74 924 gap_start_limited_discovery_proc_cp cp;
julientiron 0:3d641e170a74 925 uint8_t status;
julientiron 0:3d641e170a74 926
julientiron 0:3d641e170a74 927 cp.scanInterval = scanInterval;
julientiron 0:3d641e170a74 928 cp.scanWindow = scanWindow;
julientiron 0:3d641e170a74 929 cp.own_address_type = own_address_type;
julientiron 0:3d641e170a74 930 cp.filterDuplicates = filterDuplicates;
julientiron 0:3d641e170a74 931
julientiron 0:3d641e170a74 932 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 933 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 934 rq.ocf = OCF_GAP_START_LIMITED_DISCOVERY_PROC;
julientiron 0:3d641e170a74 935 rq.cparam = &cp;
julientiron 0:3d641e170a74 936 rq.clen = GAP_START_LIMITED_DISCOVERY_PROC_CP_SIZE;
julientiron 0:3d641e170a74 937 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 938 rq.rparam = &status;
julientiron 0:3d641e170a74 939 rq.rlen = 1;
julientiron 0:3d641e170a74 940
julientiron 0:3d641e170a74 941 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 942 return -1;
julientiron 0:3d641e170a74 943
julientiron 0:3d641e170a74 944 return status;
julientiron 0:3d641e170a74 945 }
julientiron 0:3d641e170a74 946
julientiron 0:3d641e170a74 947 tBleStatus aci_gap_start_general_discovery_proc(uint16_t scanInterval, uint16_t scanWindow,
julientiron 0:3d641e170a74 948 uint8_t own_address_type, uint8_t filterDuplicates)
julientiron 0:3d641e170a74 949 {
julientiron 0:3d641e170a74 950 struct hci_request rq;
julientiron 0:3d641e170a74 951 gap_start_general_discovery_proc_cp cp;
julientiron 0:3d641e170a74 952 uint8_t status;
julientiron 0:3d641e170a74 953
julientiron 0:3d641e170a74 954 cp.scanInterval = scanInterval;
julientiron 0:3d641e170a74 955 cp.scanWindow = scanWindow;
julientiron 0:3d641e170a74 956 cp.own_address_type = own_address_type;
julientiron 0:3d641e170a74 957 cp.filterDuplicates = filterDuplicates;
julientiron 0:3d641e170a74 958
julientiron 0:3d641e170a74 959 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 960 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 961 rq.ocf = OCF_GAP_START_GENERAL_DISCOVERY_PROC;
julientiron 0:3d641e170a74 962 rq.cparam = &cp;
julientiron 0:3d641e170a74 963 rq.clen = GAP_START_GENERAL_DISCOVERY_PROC_CP_SIZE;
julientiron 0:3d641e170a74 964 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 965 rq.rparam = &status;
julientiron 0:3d641e170a74 966 rq.rlen = 1;
julientiron 0:3d641e170a74 967
julientiron 0:3d641e170a74 968 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 969 return -1;
julientiron 0:3d641e170a74 970
julientiron 0:3d641e170a74 971 return status;
julientiron 0:3d641e170a74 972 }
julientiron 0:3d641e170a74 973
julientiron 0:3d641e170a74 974
julientiron 0:3d641e170a74 975 tBleStatus aci_gap_start_auto_conn_establishment(uint16_t scanInterval, uint16_t scanWindow,
julientiron 0:3d641e170a74 976 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
julientiron 0:3d641e170a74 977 uint16_t conn_max_interval, uint16_t conn_latency,
julientiron 0:3d641e170a74 978 uint16_t supervision_timeout, uint16_t min_conn_length,
julientiron 0:3d641e170a74 979 uint16_t max_conn_length, uint8_t num_whitelist_entries,
julientiron 0:3d641e170a74 980 uint8_t *addr_array)
julientiron 0:3d641e170a74 981 {
julientiron 0:3d641e170a74 982 struct hci_request rq;
julientiron 0:3d641e170a74 983 uint8_t status;
julientiron 0:3d641e170a74 984 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 985 uint8_t indx = 0;
julientiron 0:3d641e170a74 986
julientiron 0:3d641e170a74 987 Osal_MemCpy(buffer + indx, &scanInterval, 2);
julientiron 0:3d641e170a74 988 indx += 2;
julientiron 0:3d641e170a74 989
julientiron 0:3d641e170a74 990 Osal_MemCpy(buffer + indx, &scanWindow, 2);
julientiron 0:3d641e170a74 991 indx += 2;
julientiron 0:3d641e170a74 992
julientiron 0:3d641e170a74 993 buffer[indx] = own_bdaddr_type;
julientiron 0:3d641e170a74 994 indx++;
julientiron 0:3d641e170a74 995
julientiron 0:3d641e170a74 996 Osal_MemCpy(buffer + indx, &conn_min_interval, 2);
julientiron 0:3d641e170a74 997 indx += 2;
julientiron 0:3d641e170a74 998
julientiron 0:3d641e170a74 999 Osal_MemCpy(buffer + indx, &conn_max_interval, 2);
julientiron 0:3d641e170a74 1000 indx += 2;
julientiron 0:3d641e170a74 1001
julientiron 0:3d641e170a74 1002 Osal_MemCpy(buffer + indx, &conn_latency, 2);
julientiron 0:3d641e170a74 1003 indx += 2;
julientiron 0:3d641e170a74 1004
julientiron 0:3d641e170a74 1005 Osal_MemCpy(buffer + indx, &supervision_timeout, 2);
julientiron 0:3d641e170a74 1006 indx += 2;
julientiron 0:3d641e170a74 1007
julientiron 0:3d641e170a74 1008 Osal_MemCpy(buffer + indx, &min_conn_length, 2);
julientiron 0:3d641e170a74 1009 indx += 2;
julientiron 0:3d641e170a74 1010
julientiron 0:3d641e170a74 1011 Osal_MemCpy(buffer + indx, &max_conn_length, 2);
julientiron 0:3d641e170a74 1012 indx += 2;
julientiron 0:3d641e170a74 1013
julientiron 0:3d641e170a74 1014 buffer[indx] = num_whitelist_entries;
julientiron 0:3d641e170a74 1015 indx++;
julientiron 0:3d641e170a74 1016
julientiron 0:3d641e170a74 1017 Osal_MemCpy(buffer + indx, addr_array, (num_whitelist_entries*7));
julientiron 0:3d641e170a74 1018 indx += num_whitelist_entries * 7;
julientiron 0:3d641e170a74 1019
julientiron 0:3d641e170a74 1020 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1021 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1022 rq.ocf = OCF_GAP_START_AUTO_CONN_ESTABLISHMENT;
julientiron 0:3d641e170a74 1023 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 1024 rq.clen = indx;
julientiron 0:3d641e170a74 1025 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 1026 rq.rparam = &status;
julientiron 0:3d641e170a74 1027 rq.rlen = 1;
julientiron 0:3d641e170a74 1028
julientiron 0:3d641e170a74 1029 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1030 return -1;
julientiron 0:3d641e170a74 1031
julientiron 0:3d641e170a74 1032 return status;
julientiron 0:3d641e170a74 1033 }
julientiron 0:3d641e170a74 1034
julientiron 0:3d641e170a74 1035 tBleStatus aci_gap_create_connection(uint16_t scanInterval, uint16_t scanWindow,
julientiron 0:3d641e170a74 1036 uint8_t peer_bdaddr_type, tBDAddr peer_bdaddr,
julientiron 0:3d641e170a74 1037 uint8_t own_bdaddr_type, uint16_t conn_min_interval,
julientiron 0:3d641e170a74 1038 uint16_t conn_max_interval, uint16_t conn_latency,
julientiron 0:3d641e170a74 1039 uint16_t supervision_timeout, uint16_t min_conn_length,
julientiron 0:3d641e170a74 1040 uint16_t max_conn_length)
julientiron 0:3d641e170a74 1041 {
julientiron 0:3d641e170a74 1042 struct hci_request rq;
julientiron 0:3d641e170a74 1043 gap_create_connection_cp cp;
julientiron 0:3d641e170a74 1044 uint8_t status;
julientiron 0:3d641e170a74 1045
julientiron 0:3d641e170a74 1046 cp.scanInterval = scanInterval;
julientiron 0:3d641e170a74 1047 cp.scanWindow = scanWindow;
julientiron 0:3d641e170a74 1048 cp.peer_bdaddr_type = peer_bdaddr_type;
julientiron 0:3d641e170a74 1049 Osal_MemCpy(cp.peer_bdaddr, peer_bdaddr, 6);
julientiron 0:3d641e170a74 1050 cp.own_bdaddr_type = own_bdaddr_type;
julientiron 0:3d641e170a74 1051 cp.conn_min_interval = conn_min_interval;
julientiron 0:3d641e170a74 1052 cp.conn_max_interval = conn_max_interval;
julientiron 0:3d641e170a74 1053 cp.conn_latency = conn_latency;
julientiron 0:3d641e170a74 1054 cp.supervision_timeout = supervision_timeout;
julientiron 0:3d641e170a74 1055 cp.min_conn_length = min_conn_length;
julientiron 0:3d641e170a74 1056 cp.max_conn_length = max_conn_length;
julientiron 0:3d641e170a74 1057
julientiron 0:3d641e170a74 1058 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1059 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1060 rq.ocf = OCF_GAP_CREATE_CONNECTION;
julientiron 0:3d641e170a74 1061 rq.cparam = &cp;
julientiron 0:3d641e170a74 1062 rq.clen = GAP_CREATE_CONNECTION_CP_SIZE;
julientiron 0:3d641e170a74 1063 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 1064 rq.rparam = &status;
julientiron 0:3d641e170a74 1065 rq.rlen = 1;
julientiron 0:3d641e170a74 1066
julientiron 0:3d641e170a74 1067 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1068 return -1;
julientiron 0:3d641e170a74 1069
julientiron 0:3d641e170a74 1070 return status;
julientiron 0:3d641e170a74 1071 }
julientiron 0:3d641e170a74 1072
julientiron 0:3d641e170a74 1073 tBleStatus aci_gap_terminate_gap_procedure(uint8_t procedure_code)
julientiron 0:3d641e170a74 1074 {
julientiron 0:3d641e170a74 1075 struct hci_request rq;
julientiron 0:3d641e170a74 1076 uint8_t status;
julientiron 0:3d641e170a74 1077
julientiron 0:3d641e170a74 1078 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1079 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1080 rq.ocf = OCF_GAP_TERMINATE_GAP_PROCEDURE;
julientiron 0:3d641e170a74 1081 rq.cparam = &procedure_code;
julientiron 0:3d641e170a74 1082 rq.clen = 1;
julientiron 0:3d641e170a74 1083 rq.rparam = &status;
julientiron 0:3d641e170a74 1084 rq.rlen = 1;
julientiron 0:3d641e170a74 1085
julientiron 0:3d641e170a74 1086 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1087 return -1;
julientiron 0:3d641e170a74 1088
julientiron 0:3d641e170a74 1089 return status;
julientiron 0:3d641e170a74 1090
julientiron 0:3d641e170a74 1091 }
julientiron 0:3d641e170a74 1092
julientiron 0:3d641e170a74 1093 tBleStatus aci_gap_terminate(uint16_t conn_handle, uint8_t reason)
julientiron 0:3d641e170a74 1094 {
julientiron 0:3d641e170a74 1095 struct hci_request rq;
julientiron 0:3d641e170a74 1096 gap_terminate_cp cp;
julientiron 0:3d641e170a74 1097 uint8_t status;
julientiron 0:3d641e170a74 1098
julientiron 0:3d641e170a74 1099 cp.handle = conn_handle;
julientiron 0:3d641e170a74 1100 cp.reason = reason;
julientiron 0:3d641e170a74 1101
julientiron 0:3d641e170a74 1102 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1103 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1104 rq.ocf = OCF_GAP_TERMINATE;
julientiron 0:3d641e170a74 1105 rq.cparam = &cp;
julientiron 0:3d641e170a74 1106 rq.clen = GAP_TERMINATE_CP_SIZE;
julientiron 0:3d641e170a74 1107 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 1108 rq.rparam = &status;
julientiron 0:3d641e170a74 1109 rq.rlen = 1;
julientiron 0:3d641e170a74 1110
julientiron 0:3d641e170a74 1111 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1112 return -1;
julientiron 0:3d641e170a74 1113
julientiron 0:3d641e170a74 1114 return status;
julientiron 0:3d641e170a74 1115 }
julientiron 0:3d641e170a74 1116
julientiron 0:3d641e170a74 1117 tBleStatus aci_l2cap_connection_parameter_update_request(uint16_t conn_handle, uint16_t interval_min, uint16_t interval_max,
julientiron 0:3d641e170a74 1118 uint16_t slave_latency, uint16_t timeout_mult)
julientiron 0:3d641e170a74 1119 {
julientiron 0:3d641e170a74 1120 struct hci_request rq;
julientiron 0:3d641e170a74 1121 l2cap_conn_param_upd_cp cp;
julientiron 0:3d641e170a74 1122 tHalUint8 status;
julientiron 0:3d641e170a74 1123
julientiron 0:3d641e170a74 1124 cp.handle = conn_handle;
julientiron 0:3d641e170a74 1125 cp.interval_min = interval_min;
julientiron 0:3d641e170a74 1126 cp.interval_max = interval_max;
julientiron 0:3d641e170a74 1127 cp.slave_latency = slave_latency;
julientiron 0:3d641e170a74 1128 cp.timeout_multiplier = timeout_mult;
julientiron 0:3d641e170a74 1129
julientiron 0:3d641e170a74 1130 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1131 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1132 rq.ocf = OCF_L2CAP_CONN_PARAM_UPD_REQ;
julientiron 0:3d641e170a74 1133 rq.event = EVT_CMD_STATUS;
julientiron 0:3d641e170a74 1134 rq.cparam = &cp;
julientiron 0:3d641e170a74 1135 rq.clen = L2CAP_CONN_PARAM_UPD_REQ_CP_SIZE;
julientiron 0:3d641e170a74 1136 rq.rparam = &status;
julientiron 0:3d641e170a74 1137 rq.rlen = 1;
julientiron 0:3d641e170a74 1138
julientiron 0:3d641e170a74 1139 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1140 return -1;
julientiron 0:3d641e170a74 1141
julientiron 0:3d641e170a74 1142 return status;
julientiron 0:3d641e170a74 1143 }
julientiron 0:3d641e170a74 1144
julientiron 0:3d641e170a74 1145
julientiron 0:3d641e170a74 1146 tBleStatus aci_hal_tone_start(uint8_t rf_channel)
julientiron 0:3d641e170a74 1147 {
julientiron 0:3d641e170a74 1148 struct hci_request rq;
julientiron 0:3d641e170a74 1149 hal_tone_start_cp cp;
julientiron 0:3d641e170a74 1150 uint8_t status;
julientiron 0:3d641e170a74 1151
julientiron 0:3d641e170a74 1152 cp.rf_channel = rf_channel;
julientiron 0:3d641e170a74 1153
julientiron 0:3d641e170a74 1154 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1155 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1156 rq.ocf = OCF_HAL_TONE_START;
julientiron 0:3d641e170a74 1157 rq.cparam = &cp;
julientiron 0:3d641e170a74 1158 rq.clen = HAL_TONE_START_CP_SIZE;
julientiron 0:3d641e170a74 1159 rq.rparam = &status;
julientiron 0:3d641e170a74 1160 rq.rlen = 1;
julientiron 0:3d641e170a74 1161
julientiron 0:3d641e170a74 1162 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1163 return -1;
julientiron 0:3d641e170a74 1164
julientiron 0:3d641e170a74 1165 if (status) {
julientiron 0:3d641e170a74 1166 return status;
julientiron 0:3d641e170a74 1167 }
julientiron 0:3d641e170a74 1168
julientiron 0:3d641e170a74 1169 return 0;
julientiron 0:3d641e170a74 1170 }
julientiron 0:3d641e170a74 1171
julientiron 0:3d641e170a74 1172 tBleStatus aci_updater_start(void)
julientiron 0:3d641e170a74 1173 {
julientiron 0:3d641e170a74 1174 struct hci_request rq;
julientiron 0:3d641e170a74 1175 tHalUint8 status;
julientiron 0:3d641e170a74 1176
julientiron 0:3d641e170a74 1177 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1178 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1179 rq.ocf = OCF_UPDATER_START;
julientiron 0:3d641e170a74 1180 rq.rparam = &status;
julientiron 0:3d641e170a74 1181 rq.rlen = 1;
julientiron 0:3d641e170a74 1182
julientiron 0:3d641e170a74 1183 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1184 return -1;
julientiron 0:3d641e170a74 1185
julientiron 0:3d641e170a74 1186 return status;
julientiron 0:3d641e170a74 1187 }
julientiron 0:3d641e170a74 1188
julientiron 0:3d641e170a74 1189 tBleStatus aci_updater_reboot()
julientiron 0:3d641e170a74 1190 {
julientiron 0:3d641e170a74 1191 struct hci_request rq;
julientiron 0:3d641e170a74 1192 tHalUint8 status;
julientiron 0:3d641e170a74 1193
julientiron 0:3d641e170a74 1194 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1195 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1196 rq.ocf = OCF_UPDATER_REBOOT;
julientiron 0:3d641e170a74 1197 rq.rparam = &status;
julientiron 0:3d641e170a74 1198 rq.rlen = 1;
julientiron 0:3d641e170a74 1199
julientiron 0:3d641e170a74 1200 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1201 return -1;
julientiron 0:3d641e170a74 1202
julientiron 0:3d641e170a74 1203 return status;
julientiron 0:3d641e170a74 1204 }
julientiron 0:3d641e170a74 1205
julientiron 0:3d641e170a74 1206 tBleStatus aci_get_updater_version(uint8_t *version)
julientiron 0:3d641e170a74 1207 {
julientiron 0:3d641e170a74 1208 struct hci_request rq;
julientiron 0:3d641e170a74 1209 get_updater_version_rp resp;
julientiron 0:3d641e170a74 1210
julientiron 0:3d641e170a74 1211 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 1212
julientiron 0:3d641e170a74 1213 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1214 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1215 rq.ocf = OCF_GET_UPDATER_VERSION;
julientiron 0:3d641e170a74 1216 rq.rparam = &resp;
julientiron 0:3d641e170a74 1217 rq.rlen = GET_UPDATER_VERSION_RP_SIZE;
julientiron 0:3d641e170a74 1218
julientiron 0:3d641e170a74 1219 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1220 return -1;
julientiron 0:3d641e170a74 1221
julientiron 0:3d641e170a74 1222 *version = resp.version;
julientiron 0:3d641e170a74 1223
julientiron 0:3d641e170a74 1224 return resp.status;
julientiron 0:3d641e170a74 1225 }
julientiron 0:3d641e170a74 1226
julientiron 0:3d641e170a74 1227 tBleStatus aci_get_updater_buffer_size(uint8_t *buffer_size)
julientiron 0:3d641e170a74 1228 {
julientiron 0:3d641e170a74 1229 struct hci_request rq;
julientiron 0:3d641e170a74 1230 get_updater_bufsize_rp resp;
julientiron 0:3d641e170a74 1231
julientiron 0:3d641e170a74 1232 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 1233
julientiron 0:3d641e170a74 1234 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1235 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1236 rq.ocf = OCF_GET_UPDATER_BUFSIZE;
julientiron 0:3d641e170a74 1237 rq.rparam = &resp;
julientiron 0:3d641e170a74 1238 rq.rlen = GET_UPDATER_BUFSIZE_RP_SIZE;
julientiron 0:3d641e170a74 1239
julientiron 0:3d641e170a74 1240 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1241 return -1;
julientiron 0:3d641e170a74 1242
julientiron 0:3d641e170a74 1243 *buffer_size = resp.buffer_size;
julientiron 0:3d641e170a74 1244
julientiron 0:3d641e170a74 1245 return resp.status;
julientiron 0:3d641e170a74 1246 }
julientiron 0:3d641e170a74 1247
julientiron 0:3d641e170a74 1248 tBleStatus aci_erase_blue_flag()
julientiron 0:3d641e170a74 1249 {
julientiron 0:3d641e170a74 1250 struct hci_request rq;
julientiron 0:3d641e170a74 1251 tHalUint8 status;
julientiron 0:3d641e170a74 1252
julientiron 0:3d641e170a74 1253 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1254 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1255 rq.ocf = OCF_UPDATER_ERASE_BLUE_FLAG;
julientiron 0:3d641e170a74 1256 rq.rparam = &status;
julientiron 0:3d641e170a74 1257 rq.rlen = 1;
julientiron 0:3d641e170a74 1258
julientiron 0:3d641e170a74 1259 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1260 return -1;
julientiron 0:3d641e170a74 1261
julientiron 0:3d641e170a74 1262 return status;
julientiron 0:3d641e170a74 1263 }
julientiron 0:3d641e170a74 1264
julientiron 0:3d641e170a74 1265 tBleStatus aci_reset_blue_flag()
julientiron 0:3d641e170a74 1266 {
julientiron 0:3d641e170a74 1267 struct hci_request rq;
julientiron 0:3d641e170a74 1268 tHalUint8 status;
julientiron 0:3d641e170a74 1269
julientiron 0:3d641e170a74 1270 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1271 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1272 rq.ocf = OCF_UPDATER_RESET_BLUE_FLAG;
julientiron 0:3d641e170a74 1273 rq.rparam = &status;
julientiron 0:3d641e170a74 1274 rq.rlen = 1;
julientiron 0:3d641e170a74 1275
julientiron 0:3d641e170a74 1276 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1277 return -1;
julientiron 0:3d641e170a74 1278
julientiron 0:3d641e170a74 1279 return status;
julientiron 0:3d641e170a74 1280 }
julientiron 0:3d641e170a74 1281
julientiron 0:3d641e170a74 1282 tBleStatus aci_updater_erase_sector(uint32_t address)
julientiron 0:3d641e170a74 1283 {
julientiron 0:3d641e170a74 1284 struct hci_request rq;
julientiron 0:3d641e170a74 1285 updater_erase_sector_cp cp;
julientiron 0:3d641e170a74 1286 uint8_t status;
julientiron 0:3d641e170a74 1287
julientiron 0:3d641e170a74 1288 cp.address = address;
julientiron 0:3d641e170a74 1289
julientiron 0:3d641e170a74 1290 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1291 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1292 rq.ocf = OCF_UPDATER_ERASE_SECTOR;
julientiron 0:3d641e170a74 1293 rq.cparam = &cp;
julientiron 0:3d641e170a74 1294 rq.clen = UPDATER_ERASE_SECTOR_CP_SIZE;
julientiron 0:3d641e170a74 1295 rq.rparam = &status;
julientiron 0:3d641e170a74 1296 rq.rlen = 1;
julientiron 0:3d641e170a74 1297
julientiron 0:3d641e170a74 1298 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1299 return -1;
julientiron 0:3d641e170a74 1300
julientiron 0:3d641e170a74 1301 return status;
julientiron 0:3d641e170a74 1302 }
julientiron 0:3d641e170a74 1303
julientiron 0:3d641e170a74 1304 tBleStatus aci_updater_program_data_block(uint32_t address,
julientiron 0:3d641e170a74 1305 uint16_t len,
julientiron 0:3d641e170a74 1306 const uint8_t *data)
julientiron 0:3d641e170a74 1307 {
julientiron 0:3d641e170a74 1308 struct hci_request rq;
julientiron 0:3d641e170a74 1309 uint8_t status;
julientiron 0:3d641e170a74 1310 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 1311 uint8_t indx = 0;
julientiron 0:3d641e170a74 1312
julientiron 0:3d641e170a74 1313 if(len > HCI_MAX_PACKET_SIZE)
julientiron 0:3d641e170a74 1314 return -1;
julientiron 0:3d641e170a74 1315
julientiron 0:3d641e170a74 1316 Osal_MemCpy(buffer + indx, &address, 4);
julientiron 0:3d641e170a74 1317 indx += 4;
julientiron 0:3d641e170a74 1318
julientiron 0:3d641e170a74 1319 Osal_MemCpy(buffer + indx, &len, 2);
julientiron 0:3d641e170a74 1320 indx += 2;
julientiron 0:3d641e170a74 1321
julientiron 0:3d641e170a74 1322 Osal_MemCpy(buffer + indx, data, len);
julientiron 0:3d641e170a74 1323 indx += len;
julientiron 0:3d641e170a74 1324
julientiron 0:3d641e170a74 1325 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1326 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1327 rq.ocf = OCF_UPDATER_PROG_DATA_BLOCK;
julientiron 0:3d641e170a74 1328 rq.cparam = (void *)buffer;
julientiron 0:3d641e170a74 1329 rq.clen = indx;
julientiron 0:3d641e170a74 1330 rq.rparam = &status;
julientiron 0:3d641e170a74 1331 rq.rlen = 1;
julientiron 0:3d641e170a74 1332
julientiron 0:3d641e170a74 1333 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1334 return -1;
julientiron 0:3d641e170a74 1335
julientiron 0:3d641e170a74 1336 return status;
julientiron 0:3d641e170a74 1337 }
julientiron 0:3d641e170a74 1338
julientiron 0:3d641e170a74 1339 tBleStatus aci_updater_read_data_block(uint32_t address,
julientiron 0:3d641e170a74 1340 uint16_t data_len,
julientiron 0:3d641e170a74 1341 uint8_t *data)
julientiron 0:3d641e170a74 1342 {
julientiron 0:3d641e170a74 1343 struct hci_request rq;
julientiron 0:3d641e170a74 1344 updater_read_data_block_cp cp;
julientiron 0:3d641e170a74 1345 uint8_t buffer[HCI_MAX_PACKET_SIZE];
julientiron 0:3d641e170a74 1346
julientiron 0:3d641e170a74 1347 if(data_len > HCI_MAX_PACKET_SIZE - 1)
julientiron 0:3d641e170a74 1348 return -1;
julientiron 0:3d641e170a74 1349
julientiron 0:3d641e170a74 1350 cp.address = address;
julientiron 0:3d641e170a74 1351 cp.data_len = data_len;
julientiron 0:3d641e170a74 1352
julientiron 0:3d641e170a74 1353 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1354 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1355 rq.ocf = OCF_UPDATER_READ_DATA_BLOCK;
julientiron 0:3d641e170a74 1356 rq.cparam = &cp;
julientiron 0:3d641e170a74 1357 rq.clen = UPDATER_READ_DATA_BLOCK_CP_SIZE;
julientiron 0:3d641e170a74 1358 rq.rparam = buffer;
julientiron 0:3d641e170a74 1359 rq.rlen = data_len + 1;
julientiron 0:3d641e170a74 1360
julientiron 0:3d641e170a74 1361 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1362 return -1;
julientiron 0:3d641e170a74 1363
julientiron 0:3d641e170a74 1364 Osal_MemCpy(data, buffer+1, data_len);
julientiron 0:3d641e170a74 1365
julientiron 0:3d641e170a74 1366 return buffer[0];
julientiron 0:3d641e170a74 1367 }
julientiron 0:3d641e170a74 1368
julientiron 0:3d641e170a74 1369 tBleStatus aci_updater_calc_crc(uint32_t address,
julientiron 0:3d641e170a74 1370 uint8_t num_sectors,
julientiron 0:3d641e170a74 1371 uint32_t *crc)
julientiron 0:3d641e170a74 1372 {
julientiron 0:3d641e170a74 1373 struct hci_request rq;
julientiron 0:3d641e170a74 1374 updater_calc_crc_cp cp;
julientiron 0:3d641e170a74 1375 updater_calc_crc_rp resp;
julientiron 0:3d641e170a74 1376
julientiron 0:3d641e170a74 1377 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 1378
julientiron 0:3d641e170a74 1379 cp.address = address;
julientiron 0:3d641e170a74 1380 cp.num_sectors = num_sectors;
julientiron 0:3d641e170a74 1381
julientiron 0:3d641e170a74 1382 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1383 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1384 rq.ocf = OCF_UPDATER_CALC_CRC;
julientiron 0:3d641e170a74 1385 rq.cparam = &cp;
julientiron 0:3d641e170a74 1386 rq.clen = UPDATER_CALC_CRC_CP_SIZE;
julientiron 0:3d641e170a74 1387 rq.rparam = &resp;
julientiron 0:3d641e170a74 1388 rq.rlen = UPDATER_CALC_CRC_RP_SIZE;
julientiron 0:3d641e170a74 1389
julientiron 0:3d641e170a74 1390 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1391 return -1;
julientiron 0:3d641e170a74 1392
julientiron 0:3d641e170a74 1393 *crc = resp.crc;
julientiron 0:3d641e170a74 1394
julientiron 0:3d641e170a74 1395 return resp.status;
julientiron 0:3d641e170a74 1396 }
julientiron 0:3d641e170a74 1397
julientiron 0:3d641e170a74 1398 tBleStatus aci_updater_hw_version(uint8_t *version)
julientiron 0:3d641e170a74 1399 {
julientiron 0:3d641e170a74 1400 struct hci_request rq;
julientiron 0:3d641e170a74 1401 updater_hw_version_rp resp;
julientiron 0:3d641e170a74 1402
julientiron 0:3d641e170a74 1403 Osal_MemSet(&resp, 0, sizeof(resp));
julientiron 0:3d641e170a74 1404
julientiron 0:3d641e170a74 1405 Osal_MemSet(&rq, 0, sizeof(rq));
julientiron 0:3d641e170a74 1406 rq.ogf = OGF_VENDOR_CMD;
julientiron 0:3d641e170a74 1407 rq.ocf = OCF_UPDATER_HW_VERSION;
julientiron 0:3d641e170a74 1408 rq.rparam = &resp;
julientiron 0:3d641e170a74 1409 rq.rlen = UPDATER_HW_VERSION_RP_SIZE;
julientiron 0:3d641e170a74 1410
julientiron 0:3d641e170a74 1411 if (hci_send_req(&rq) < 0)
julientiron 0:3d641e170a74 1412 return -1;
julientiron 0:3d641e170a74 1413
julientiron 0:3d641e170a74 1414 *version = resp.version;
julientiron 0:3d641e170a74 1415
julientiron 0:3d641e170a74 1416 return resp.status;
julientiron 0:3d641e170a74 1417 }