NUCLEO-F401RE + BlueNRG shield client test (TI Sensortag reading)

Dependencies:   mbed-src

Committer:
ostapsky
Date:
Sat Aug 16 11:00:04 2014 +0000
Revision:
0:aa1e012ec210
CLIENT mode first revision

Who changed what in which revision?

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