Fork of ble-x-nucleo-idb0xa1 with changes required by BleStarMbed

Dependents:   ble-star-mbed

Committer:
lorevee
Date:
Tue Feb 20 11:07:16 2018 +0000
Revision:
0:ac0b0725c6fa
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lorevee 0:ac0b0725c6fa 1 /**
lorevee 0:ac0b0725c6fa 2 ******************************************************************************
lorevee 0:ac0b0725c6fa 3 * @file ble_hci_le.c
lorevee 0:ac0b0725c6fa 4 * @author AMG RF Application Team
lorevee 0:ac0b0725c6fa 5 * @brief Function for managing HCI interface.
lorevee 0:ac0b0725c6fa 6 ******************************************************************************
lorevee 0:ac0b0725c6fa 7 *
lorevee 0:ac0b0725c6fa 8 *
lorevee 0:ac0b0725c6fa 9 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
lorevee 0:ac0b0725c6fa 10 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
lorevee 0:ac0b0725c6fa 11 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
lorevee 0:ac0b0725c6fa 12 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
lorevee 0:ac0b0725c6fa 13 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
lorevee 0:ac0b0725c6fa 14 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
lorevee 0:ac0b0725c6fa 15 *
lorevee 0:ac0b0725c6fa 16 * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
lorevee 0:ac0b0725c6fa 17 */
lorevee 0:ac0b0725c6fa 18
lorevee 0:ac0b0725c6fa 19 #include "ble_hal_types.h"
lorevee 0:ac0b0725c6fa 20 #include "ble_osal.h"
lorevee 0:ac0b0725c6fa 21 #include "ble_status.h"
lorevee 0:ac0b0725c6fa 22 #include "ble_hal.h"
lorevee 0:ac0b0725c6fa 23 #include "ble_hci_const.h"
lorevee 0:ac0b0725c6fa 24
lorevee 0:ac0b0725c6fa 25 #define MIN(a,b) ((a) < (b) )? (a) : (b)
lorevee 0:ac0b0725c6fa 26 #define MAX(a,b) ((a) > (b) )? (a) : (b)
lorevee 0:ac0b0725c6fa 27
lorevee 0:ac0b0725c6fa 28 int hci_reset(void)
lorevee 0:ac0b0725c6fa 29 {
lorevee 0:ac0b0725c6fa 30 struct hci_request rq;
lorevee 0:ac0b0725c6fa 31 uint8_t status;
lorevee 0:ac0b0725c6fa 32
lorevee 0:ac0b0725c6fa 33 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 34 rq.ogf = OGF_HOST_CTL;
lorevee 0:ac0b0725c6fa 35 rq.ocf = OCF_RESET;
lorevee 0:ac0b0725c6fa 36 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 37 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 38
lorevee 0:ac0b0725c6fa 39 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 40 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 41
lorevee 0:ac0b0725c6fa 42 return status;
lorevee 0:ac0b0725c6fa 43 }
lorevee 0:ac0b0725c6fa 44
lorevee 0:ac0b0725c6fa 45 int hci_disconnect(uint16_t handle, uint8_t reason)
lorevee 0:ac0b0725c6fa 46 {
lorevee 0:ac0b0725c6fa 47 struct hci_request rq;
lorevee 0:ac0b0725c6fa 48 disconnect_cp cp;
lorevee 0:ac0b0725c6fa 49 uint8_t status;
lorevee 0:ac0b0725c6fa 50
lorevee 0:ac0b0725c6fa 51 cp.handle = handle;
lorevee 0:ac0b0725c6fa 52 cp.reason = reason;
lorevee 0:ac0b0725c6fa 53
lorevee 0:ac0b0725c6fa 54 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 55 rq.ogf = OGF_LINK_CTL;
lorevee 0:ac0b0725c6fa 56 rq.ocf = OCF_DISCONNECT;
lorevee 0:ac0b0725c6fa 57 rq.cparam = &cp;
lorevee 0:ac0b0725c6fa 58 rq.clen = DISCONNECT_CP_SIZE;
lorevee 0:ac0b0725c6fa 59 rq.event = EVT_CMD_STATUS;
lorevee 0:ac0b0725c6fa 60 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 61 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 62
lorevee 0:ac0b0725c6fa 63 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 64 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 65
lorevee 0:ac0b0725c6fa 66 return status;
lorevee 0:ac0b0725c6fa 67 }
lorevee 0:ac0b0725c6fa 68
lorevee 0:ac0b0725c6fa 69 int hci_le_read_local_version(uint8_t *hci_version, uint16_t *hci_revision, uint8_t *lmp_pal_version,
lorevee 0:ac0b0725c6fa 70 uint16_t *manufacturer_name, uint16_t *lmp_pal_subversion)
lorevee 0:ac0b0725c6fa 71 {
lorevee 0:ac0b0725c6fa 72 struct hci_request rq;
lorevee 0:ac0b0725c6fa 73 read_local_version_rp resp;
lorevee 0:ac0b0725c6fa 74
lorevee 0:ac0b0725c6fa 75 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 76
lorevee 0:ac0b0725c6fa 77 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 78 rq.ogf = OGF_INFO_PARAM;
lorevee 0:ac0b0725c6fa 79 rq.ocf = OCF_READ_LOCAL_VERSION;
lorevee 0:ac0b0725c6fa 80 rq.cparam = NULL;
lorevee 0:ac0b0725c6fa 81 rq.clen = 0;
lorevee 0:ac0b0725c6fa 82 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 83 rq.rlen = READ_LOCAL_VERSION_RP_SIZE;
lorevee 0:ac0b0725c6fa 84
lorevee 0:ac0b0725c6fa 85 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 86 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 87
lorevee 0:ac0b0725c6fa 88 if (resp.status) {
lorevee 0:ac0b0725c6fa 89 return resp.status;
lorevee 0:ac0b0725c6fa 90 }
lorevee 0:ac0b0725c6fa 91
lorevee 0:ac0b0725c6fa 92
lorevee 0:ac0b0725c6fa 93 *hci_version = resp.hci_version;
lorevee 0:ac0b0725c6fa 94 *hci_revision = btohs(resp.hci_revision);
lorevee 0:ac0b0725c6fa 95 *lmp_pal_version = resp.lmp_pal_version;
lorevee 0:ac0b0725c6fa 96 *manufacturer_name = btohs(resp.manufacturer_name);
lorevee 0:ac0b0725c6fa 97 *lmp_pal_subversion = btohs(resp.lmp_pal_subversion);
lorevee 0:ac0b0725c6fa 98
lorevee 0:ac0b0725c6fa 99 return 0;
lorevee 0:ac0b0725c6fa 100 }
lorevee 0:ac0b0725c6fa 101
lorevee 0:ac0b0725c6fa 102 int hci_le_read_buffer_size(uint16_t *pkt_len, uint8_t *max_pkt)
lorevee 0:ac0b0725c6fa 103 {
lorevee 0:ac0b0725c6fa 104 struct hci_request rq;
lorevee 0:ac0b0725c6fa 105 le_read_buffer_size_rp resp;
lorevee 0:ac0b0725c6fa 106
lorevee 0:ac0b0725c6fa 107 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 108
lorevee 0:ac0b0725c6fa 109 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 110 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 111 rq.ocf = OCF_LE_READ_BUFFER_SIZE;
lorevee 0:ac0b0725c6fa 112 rq.cparam = NULL;
lorevee 0:ac0b0725c6fa 113 rq.clen = 0;
lorevee 0:ac0b0725c6fa 114 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 115 rq.rlen = LE_READ_BUFFER_SIZE_RP_SIZE;
lorevee 0:ac0b0725c6fa 116
lorevee 0:ac0b0725c6fa 117 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 118 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 119
lorevee 0:ac0b0725c6fa 120 if (resp.status) {
lorevee 0:ac0b0725c6fa 121 return resp.status;
lorevee 0:ac0b0725c6fa 122 }
lorevee 0:ac0b0725c6fa 123
lorevee 0:ac0b0725c6fa 124 *pkt_len = resp.pkt_len;
lorevee 0:ac0b0725c6fa 125 *max_pkt = resp.max_pkt;
lorevee 0:ac0b0725c6fa 126
lorevee 0:ac0b0725c6fa 127 return 0;
lorevee 0:ac0b0725c6fa 128 }
lorevee 0:ac0b0725c6fa 129
lorevee 0:ac0b0725c6fa 130 int hci_le_set_advertising_parameters(uint16_t min_interval, uint16_t max_interval, uint8_t advtype,
lorevee 0:ac0b0725c6fa 131 uint8_t own_bdaddr_type, uint8_t direct_bdaddr_type, const tBDAddr direct_bdaddr, uint8_t chan_map,
lorevee 0:ac0b0725c6fa 132 uint8_t filter)
lorevee 0:ac0b0725c6fa 133 {
lorevee 0:ac0b0725c6fa 134 struct hci_request rq;
lorevee 0:ac0b0725c6fa 135 le_set_adv_parameters_cp adv_cp;
lorevee 0:ac0b0725c6fa 136 uint8_t status;
lorevee 0:ac0b0725c6fa 137
lorevee 0:ac0b0725c6fa 138 Osal_MemSet(&adv_cp, 0, sizeof(adv_cp));
lorevee 0:ac0b0725c6fa 139 adv_cp.min_interval = min_interval;
lorevee 0:ac0b0725c6fa 140 adv_cp.max_interval = max_interval;
lorevee 0:ac0b0725c6fa 141 adv_cp.advtype = advtype;
lorevee 0:ac0b0725c6fa 142 adv_cp.own_bdaddr_type = own_bdaddr_type;
lorevee 0:ac0b0725c6fa 143 adv_cp.direct_bdaddr_type = direct_bdaddr_type;
lorevee 0:ac0b0725c6fa 144 if(direct_bdaddr != NULL)
lorevee 0:ac0b0725c6fa 145 Osal_MemCpy(adv_cp.direct_bdaddr,direct_bdaddr,sizeof(adv_cp.direct_bdaddr));
lorevee 0:ac0b0725c6fa 146 adv_cp.chan_map = chan_map;
lorevee 0:ac0b0725c6fa 147 adv_cp.filter = filter;
lorevee 0:ac0b0725c6fa 148
lorevee 0:ac0b0725c6fa 149 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 150 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 151 rq.ocf = OCF_LE_SET_ADV_PARAMETERS;
lorevee 0:ac0b0725c6fa 152 rq.cparam = &adv_cp;
lorevee 0:ac0b0725c6fa 153 rq.clen = LE_SET_ADV_PARAMETERS_CP_SIZE;
lorevee 0:ac0b0725c6fa 154 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 155 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 156
lorevee 0:ac0b0725c6fa 157 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 158 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 159
lorevee 0:ac0b0725c6fa 160 return status;
lorevee 0:ac0b0725c6fa 161 }
lorevee 0:ac0b0725c6fa 162
lorevee 0:ac0b0725c6fa 163 int hci_le_set_advertising_data(uint8_t length, const uint8_t data[])
lorevee 0:ac0b0725c6fa 164 {
lorevee 0:ac0b0725c6fa 165 struct hci_request rq;
lorevee 0:ac0b0725c6fa 166 le_set_adv_data_cp adv_cp;
lorevee 0:ac0b0725c6fa 167 uint8_t status;
lorevee 0:ac0b0725c6fa 168
lorevee 0:ac0b0725c6fa 169 Osal_MemSet(&adv_cp, 0, sizeof(adv_cp));
lorevee 0:ac0b0725c6fa 170 adv_cp.length = length;
lorevee 0:ac0b0725c6fa 171 Osal_MemCpy(adv_cp.data, data, MIN(31,length));
lorevee 0:ac0b0725c6fa 172
lorevee 0:ac0b0725c6fa 173 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 174 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 175 rq.ocf = OCF_LE_SET_ADV_DATA;
lorevee 0:ac0b0725c6fa 176 rq.cparam = &adv_cp;
lorevee 0:ac0b0725c6fa 177 rq.clen = LE_SET_ADV_DATA_CP_SIZE;
lorevee 0:ac0b0725c6fa 178 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 179 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 180
lorevee 0:ac0b0725c6fa 181 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 182 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 183
lorevee 0:ac0b0725c6fa 184 return status;
lorevee 0:ac0b0725c6fa 185 }
lorevee 0:ac0b0725c6fa 186
lorevee 0:ac0b0725c6fa 187 int hci_le_set_advertise_enable(uint8_t enable)
lorevee 0:ac0b0725c6fa 188 {
lorevee 0:ac0b0725c6fa 189 struct hci_request rq;
lorevee 0:ac0b0725c6fa 190 le_set_advertise_enable_cp adv_cp;
lorevee 0:ac0b0725c6fa 191 uint8_t status;
lorevee 0:ac0b0725c6fa 192
lorevee 0:ac0b0725c6fa 193 Osal_MemSet(&adv_cp, 0, sizeof(adv_cp));
lorevee 0:ac0b0725c6fa 194 adv_cp.enable = enable?1:0;
lorevee 0:ac0b0725c6fa 195
lorevee 0:ac0b0725c6fa 196 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 197 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 198 rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;
lorevee 0:ac0b0725c6fa 199 rq.cparam = &adv_cp;
lorevee 0:ac0b0725c6fa 200 rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;
lorevee 0:ac0b0725c6fa 201 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 202 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 203
lorevee 0:ac0b0725c6fa 204 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 205 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 206
lorevee 0:ac0b0725c6fa 207 return status;
lorevee 0:ac0b0725c6fa 208 }
lorevee 0:ac0b0725c6fa 209
lorevee 0:ac0b0725c6fa 210 int hci_le_set_scan_parameters(uint8_t type, uint16_t interval,
lorevee 0:ac0b0725c6fa 211 uint16_t window, uint8_t own_bdaddr_type,
lorevee 0:ac0b0725c6fa 212 uint8_t filter)
lorevee 0:ac0b0725c6fa 213 {
lorevee 0:ac0b0725c6fa 214 struct hci_request rq;
lorevee 0:ac0b0725c6fa 215 le_set_scan_parameters_cp scan_cp;
lorevee 0:ac0b0725c6fa 216 uint8_t status;
lorevee 0:ac0b0725c6fa 217
lorevee 0:ac0b0725c6fa 218 Osal_MemSet(&scan_cp, 0, sizeof(scan_cp));
lorevee 0:ac0b0725c6fa 219 scan_cp.type = type;
lorevee 0:ac0b0725c6fa 220 scan_cp.interval = interval;
lorevee 0:ac0b0725c6fa 221 scan_cp.window = window;
lorevee 0:ac0b0725c6fa 222 scan_cp.own_bdaddr_type = own_bdaddr_type;
lorevee 0:ac0b0725c6fa 223 scan_cp.filter = filter;
lorevee 0:ac0b0725c6fa 224
lorevee 0:ac0b0725c6fa 225 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 226 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 227 rq.ocf = OCF_LE_SET_SCAN_PARAMETERS;
lorevee 0:ac0b0725c6fa 228 rq.cparam = &scan_cp;
lorevee 0:ac0b0725c6fa 229 rq.clen = LE_SET_SCAN_PARAMETERS_CP_SIZE;
lorevee 0:ac0b0725c6fa 230 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 231 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 232
lorevee 0:ac0b0725c6fa 233 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 234 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 235
lorevee 0:ac0b0725c6fa 236 return status;
lorevee 0:ac0b0725c6fa 237 }
lorevee 0:ac0b0725c6fa 238
lorevee 0:ac0b0725c6fa 239 int hci_le_set_scan_enable(uint8_t enable, uint8_t filter_dup)
lorevee 0:ac0b0725c6fa 240 {
lorevee 0:ac0b0725c6fa 241 struct hci_request rq;
lorevee 0:ac0b0725c6fa 242 le_set_scan_enable_cp scan_cp;
lorevee 0:ac0b0725c6fa 243 uint8_t status;
lorevee 0:ac0b0725c6fa 244
lorevee 0:ac0b0725c6fa 245 Osal_MemSet(&scan_cp, 0, sizeof(scan_cp));
lorevee 0:ac0b0725c6fa 246 scan_cp.enable = enable?1:0;
lorevee 0:ac0b0725c6fa 247 scan_cp.filter_dup = filter_dup;
lorevee 0:ac0b0725c6fa 248
lorevee 0:ac0b0725c6fa 249 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 250 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 251 rq.ocf = OCF_LE_SET_SCAN_ENABLE;
lorevee 0:ac0b0725c6fa 252 rq.cparam = &scan_cp;
lorevee 0:ac0b0725c6fa 253 rq.clen = LE_SET_SCAN_ENABLE_CP_SIZE;
lorevee 0:ac0b0725c6fa 254 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 255 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 256
lorevee 0:ac0b0725c6fa 257 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 258 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 259
lorevee 0:ac0b0725c6fa 260 return status;
lorevee 0:ac0b0725c6fa 261 }
lorevee 0:ac0b0725c6fa 262
lorevee 0:ac0b0725c6fa 263 int hci_le_rand(uint8_t random_number[8])
lorevee 0:ac0b0725c6fa 264 {
lorevee 0:ac0b0725c6fa 265 struct hci_request rq;
lorevee 0:ac0b0725c6fa 266 le_rand_rp resp;
lorevee 0:ac0b0725c6fa 267
lorevee 0:ac0b0725c6fa 268 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 269
lorevee 0:ac0b0725c6fa 270 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 271 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 272 rq.ocf = OCF_LE_RAND;
lorevee 0:ac0b0725c6fa 273 rq.cparam = NULL;
lorevee 0:ac0b0725c6fa 274 rq.clen = 0;
lorevee 0:ac0b0725c6fa 275 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 276 rq.rlen = LE_RAND_RP_SIZE;
lorevee 0:ac0b0725c6fa 277
lorevee 0:ac0b0725c6fa 278 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 279 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 280
lorevee 0:ac0b0725c6fa 281 if (resp.status) {
lorevee 0:ac0b0725c6fa 282 return resp.status;
lorevee 0:ac0b0725c6fa 283 }
lorevee 0:ac0b0725c6fa 284
lorevee 0:ac0b0725c6fa 285 Osal_MemCpy(random_number, resp.random, 8);
lorevee 0:ac0b0725c6fa 286
lorevee 0:ac0b0725c6fa 287 return 0;
lorevee 0:ac0b0725c6fa 288 }
lorevee 0:ac0b0725c6fa 289
lorevee 0:ac0b0725c6fa 290 int hci_le_set_scan_resp_data(uint8_t length, const uint8_t data[])
lorevee 0:ac0b0725c6fa 291 {
lorevee 0:ac0b0725c6fa 292 struct hci_request rq;
lorevee 0:ac0b0725c6fa 293 le_set_scan_response_data_cp scan_resp_cp;
lorevee 0:ac0b0725c6fa 294 uint8_t status;
lorevee 0:ac0b0725c6fa 295
lorevee 0:ac0b0725c6fa 296 Osal_MemSet(&scan_resp_cp, 0, sizeof(scan_resp_cp));
lorevee 0:ac0b0725c6fa 297 scan_resp_cp.length = length;
lorevee 0:ac0b0725c6fa 298 Osal_MemCpy(scan_resp_cp.data, data, MIN(31,length));
lorevee 0:ac0b0725c6fa 299
lorevee 0:ac0b0725c6fa 300 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 301 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 302 rq.ocf = OCF_LE_SET_SCAN_RESPONSE_DATA;
lorevee 0:ac0b0725c6fa 303 rq.cparam = &scan_resp_cp;
lorevee 0:ac0b0725c6fa 304 rq.clen = LE_SET_SCAN_RESPONSE_DATA_CP_SIZE;
lorevee 0:ac0b0725c6fa 305 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 306 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 307
lorevee 0:ac0b0725c6fa 308 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 309 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 310
lorevee 0:ac0b0725c6fa 311 return status;
lorevee 0:ac0b0725c6fa 312 }
lorevee 0:ac0b0725c6fa 313
lorevee 0:ac0b0725c6fa 314 int hci_le_read_advertising_channel_tx_power(int8_t *tx_power_level)
lorevee 0:ac0b0725c6fa 315 {
lorevee 0:ac0b0725c6fa 316 struct hci_request rq;
lorevee 0:ac0b0725c6fa 317 le_read_adv_channel_tx_power_rp resp;
lorevee 0:ac0b0725c6fa 318
lorevee 0:ac0b0725c6fa 319 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 320
lorevee 0:ac0b0725c6fa 321 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 322 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 323 rq.ocf = OCF_LE_READ_ADV_CHANNEL_TX_POWER;
lorevee 0:ac0b0725c6fa 324 rq.cparam = NULL;
lorevee 0:ac0b0725c6fa 325 rq.clen = 0;
lorevee 0:ac0b0725c6fa 326 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 327 rq.rlen = LE_RAND_RP_SIZE;
lorevee 0:ac0b0725c6fa 328
lorevee 0:ac0b0725c6fa 329 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 330 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 331
lorevee 0:ac0b0725c6fa 332 if (resp.status) {
lorevee 0:ac0b0725c6fa 333 return resp.status;
lorevee 0:ac0b0725c6fa 334 }
lorevee 0:ac0b0725c6fa 335
lorevee 0:ac0b0725c6fa 336 *tx_power_level = resp.level;
lorevee 0:ac0b0725c6fa 337
lorevee 0:ac0b0725c6fa 338 return 0;
lorevee 0:ac0b0725c6fa 339 }
lorevee 0:ac0b0725c6fa 340
lorevee 0:ac0b0725c6fa 341 int hci_le_set_random_address(tBDAddr bdaddr)
lorevee 0:ac0b0725c6fa 342 {
lorevee 0:ac0b0725c6fa 343 struct hci_request rq;
lorevee 0:ac0b0725c6fa 344 le_set_random_address_cp set_rand_addr_cp;
lorevee 0:ac0b0725c6fa 345 uint8_t status;
lorevee 0:ac0b0725c6fa 346
lorevee 0:ac0b0725c6fa 347 Osal_MemSet(&set_rand_addr_cp, 0, sizeof(set_rand_addr_cp));
lorevee 0:ac0b0725c6fa 348 Osal_MemCpy(set_rand_addr_cp.bdaddr, bdaddr, sizeof(tBDAddr));
lorevee 0:ac0b0725c6fa 349
lorevee 0:ac0b0725c6fa 350 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 351 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 352 rq.ocf = OCF_LE_SET_RANDOM_ADDRESS;
lorevee 0:ac0b0725c6fa 353 rq.cparam = &set_rand_addr_cp;
lorevee 0:ac0b0725c6fa 354 rq.clen = LE_SET_RANDOM_ADDRESS_CP_SIZE;
lorevee 0:ac0b0725c6fa 355 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 356 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 357
lorevee 0:ac0b0725c6fa 358 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 359 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 360
lorevee 0:ac0b0725c6fa 361 return status;
lorevee 0:ac0b0725c6fa 362 }
lorevee 0:ac0b0725c6fa 363
lorevee 0:ac0b0725c6fa 364 int hci_read_bd_addr(tBDAddr bdaddr)
lorevee 0:ac0b0725c6fa 365 {
lorevee 0:ac0b0725c6fa 366 struct hci_request rq;
lorevee 0:ac0b0725c6fa 367 read_bd_addr_rp resp;
lorevee 0:ac0b0725c6fa 368
lorevee 0:ac0b0725c6fa 369 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 370
lorevee 0:ac0b0725c6fa 371 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 372 rq.ogf = OGF_INFO_PARAM;
lorevee 0:ac0b0725c6fa 373 rq.ocf = OCF_READ_BD_ADDR;
lorevee 0:ac0b0725c6fa 374 rq.cparam = NULL;
lorevee 0:ac0b0725c6fa 375 rq.clen = 0;
lorevee 0:ac0b0725c6fa 376 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 377 rq.rlen = READ_BD_ADDR_RP_SIZE;
lorevee 0:ac0b0725c6fa 378
lorevee 0:ac0b0725c6fa 379 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 380 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 381
lorevee 0:ac0b0725c6fa 382 if (resp.status) {
lorevee 0:ac0b0725c6fa 383 return resp.status;
lorevee 0:ac0b0725c6fa 384 }
lorevee 0:ac0b0725c6fa 385 Osal_MemCpy(bdaddr, resp.bdaddr, sizeof(tBDAddr));
lorevee 0:ac0b0725c6fa 386
lorevee 0:ac0b0725c6fa 387 return 0;
lorevee 0:ac0b0725c6fa 388 }
lorevee 0:ac0b0725c6fa 389
lorevee 0:ac0b0725c6fa 390 int hci_le_create_connection(uint16_t interval, uint16_t window, uint8_t initiator_filter, uint8_t peer_bdaddr_type,
lorevee 0:ac0b0725c6fa 391 const tBDAddr peer_bdaddr, uint8_t own_bdaddr_type, uint16_t min_interval, uint16_t max_interval,
lorevee 0:ac0b0725c6fa 392 uint16_t latency, uint16_t supervision_timeout, uint16_t min_ce_length, uint16_t max_ce_length)
lorevee 0:ac0b0725c6fa 393 {
lorevee 0:ac0b0725c6fa 394 struct hci_request rq;
lorevee 0:ac0b0725c6fa 395 le_create_connection_cp create_cp;
lorevee 0:ac0b0725c6fa 396 uint8_t status;
lorevee 0:ac0b0725c6fa 397
lorevee 0:ac0b0725c6fa 398 Osal_MemSet(&create_cp, 0, sizeof(create_cp));
lorevee 0:ac0b0725c6fa 399 create_cp.interval = interval;
lorevee 0:ac0b0725c6fa 400 create_cp.window = window;
lorevee 0:ac0b0725c6fa 401 create_cp.initiator_filter = initiator_filter;
lorevee 0:ac0b0725c6fa 402 create_cp.peer_bdaddr_type = peer_bdaddr_type;
lorevee 0:ac0b0725c6fa 403 Osal_MemCpy(create_cp.peer_bdaddr, peer_bdaddr, sizeof(tBDAddr));
lorevee 0:ac0b0725c6fa 404 create_cp.own_bdaddr_type = own_bdaddr_type;
lorevee 0:ac0b0725c6fa 405 create_cp.min_interval=min_interval;
lorevee 0:ac0b0725c6fa 406 create_cp.max_interval=max_interval;
lorevee 0:ac0b0725c6fa 407 create_cp.latency = latency;
lorevee 0:ac0b0725c6fa 408 create_cp.supervision_timeout=supervision_timeout;
lorevee 0:ac0b0725c6fa 409 create_cp.min_ce_length=min_ce_length;
lorevee 0:ac0b0725c6fa 410 create_cp.max_ce_length=max_ce_length;
lorevee 0:ac0b0725c6fa 411
lorevee 0:ac0b0725c6fa 412 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 413 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 414 rq.ocf = OCF_LE_CREATE_CONN;
lorevee 0:ac0b0725c6fa 415 rq.cparam = &create_cp;
lorevee 0:ac0b0725c6fa 416 rq.clen = LE_CREATE_CONN_CP_SIZE;
lorevee 0:ac0b0725c6fa 417 rq.event = EVT_CMD_STATUS;
lorevee 0:ac0b0725c6fa 418 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 419 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 420
lorevee 0:ac0b0725c6fa 421 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 422 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 423
lorevee 0:ac0b0725c6fa 424 return status;
lorevee 0:ac0b0725c6fa 425 }
lorevee 0:ac0b0725c6fa 426
lorevee 0:ac0b0725c6fa 427 int hci_le_create_connection_cancel(void)
lorevee 0:ac0b0725c6fa 428 {
lorevee 0:ac0b0725c6fa 429 struct hci_request rq;
lorevee 0:ac0b0725c6fa 430 uint8_t status;
lorevee 0:ac0b0725c6fa 431
lorevee 0:ac0b0725c6fa 432 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 433 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 434 rq.ocf = OCF_LE_CREATE_CONN_CANCEL;
lorevee 0:ac0b0725c6fa 435 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 436 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 437
lorevee 0:ac0b0725c6fa 438 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 439 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 440
lorevee 0:ac0b0725c6fa 441 return status;
lorevee 0:ac0b0725c6fa 442 }
lorevee 0:ac0b0725c6fa 443
lorevee 0:ac0b0725c6fa 444 int hci_le_encrypt(uint8_t key[16], uint8_t plaintextData[16], uint8_t encryptedData[16])
lorevee 0:ac0b0725c6fa 445 {
lorevee 0:ac0b0725c6fa 446 struct hci_request rq;
lorevee 0:ac0b0725c6fa 447 le_encrypt_cp params;
lorevee 0:ac0b0725c6fa 448 le_encrypt_rp resp;
lorevee 0:ac0b0725c6fa 449
lorevee 0:ac0b0725c6fa 450 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 451
lorevee 0:ac0b0725c6fa 452 Osal_MemCpy(params.key, key, 16);
lorevee 0:ac0b0725c6fa 453 Osal_MemCpy(params.plaintext, plaintextData, 16);
lorevee 0:ac0b0725c6fa 454
lorevee 0:ac0b0725c6fa 455 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 456 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 457 rq.ocf = OCF_LE_ENCRYPT;
lorevee 0:ac0b0725c6fa 458 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 459 rq.clen = LE_ENCRYPT_CP_SIZE;
lorevee 0:ac0b0725c6fa 460 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 461 rq.rlen = LE_ENCRYPT_RP_SIZE;
lorevee 0:ac0b0725c6fa 462
lorevee 0:ac0b0725c6fa 463 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 464 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 465 }
lorevee 0:ac0b0725c6fa 466
lorevee 0:ac0b0725c6fa 467 if (resp.status) {
lorevee 0:ac0b0725c6fa 468 return resp.status;
lorevee 0:ac0b0725c6fa 469 }
lorevee 0:ac0b0725c6fa 470
lorevee 0:ac0b0725c6fa 471 Osal_MemCpy(encryptedData, resp.encdata, 16);
lorevee 0:ac0b0725c6fa 472
lorevee 0:ac0b0725c6fa 473 return 0;
lorevee 0:ac0b0725c6fa 474 }
lorevee 0:ac0b0725c6fa 475
lorevee 0:ac0b0725c6fa 476 int hci_le_ltk_request_reply(uint8_t key[16])
lorevee 0:ac0b0725c6fa 477 {
lorevee 0:ac0b0725c6fa 478 struct hci_request rq;
lorevee 0:ac0b0725c6fa 479 le_ltk_reply_cp params;
lorevee 0:ac0b0725c6fa 480 le_ltk_reply_rp resp;
lorevee 0:ac0b0725c6fa 481
lorevee 0:ac0b0725c6fa 482 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 483
lorevee 0:ac0b0725c6fa 484 params.handle = 1;
lorevee 0:ac0b0725c6fa 485 Osal_MemCpy(params.key, key, 16);
lorevee 0:ac0b0725c6fa 486
lorevee 0:ac0b0725c6fa 487 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 488 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 489 rq.ocf = OCF_LE_LTK_REPLY;
lorevee 0:ac0b0725c6fa 490 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 491 rq.clen = LE_LTK_REPLY_CP_SIZE;
lorevee 0:ac0b0725c6fa 492 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 493 rq.rlen = LE_LTK_REPLY_RP_SIZE;
lorevee 0:ac0b0725c6fa 494
lorevee 0:ac0b0725c6fa 495 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 496 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 497
lorevee 0:ac0b0725c6fa 498 return resp.status;
lorevee 0:ac0b0725c6fa 499 }
lorevee 0:ac0b0725c6fa 500
lorevee 0:ac0b0725c6fa 501 int hci_le_ltk_request_neg_reply(void)
lorevee 0:ac0b0725c6fa 502 {
lorevee 0:ac0b0725c6fa 503 struct hci_request rq;
lorevee 0:ac0b0725c6fa 504 le_ltk_neg_reply_cp params;
lorevee 0:ac0b0725c6fa 505 le_ltk_neg_reply_rp resp;
lorevee 0:ac0b0725c6fa 506
lorevee 0:ac0b0725c6fa 507 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 508
lorevee 0:ac0b0725c6fa 509 params.handle = 1;
lorevee 0:ac0b0725c6fa 510
lorevee 0:ac0b0725c6fa 511 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 512 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 513 rq.ocf = OCF_LE_LTK_NEG_REPLY;
lorevee 0:ac0b0725c6fa 514 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 515 rq.clen = LE_LTK_NEG_REPLY_CP_SIZE;
lorevee 0:ac0b0725c6fa 516 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 517 rq.rlen = LE_LTK_NEG_REPLY_RP_SIZE;
lorevee 0:ac0b0725c6fa 518
lorevee 0:ac0b0725c6fa 519 if (hci_send_req(&rq, FALSE) < 0)
lorevee 0:ac0b0725c6fa 520 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 521
lorevee 0:ac0b0725c6fa 522 return resp.status;
lorevee 0:ac0b0725c6fa 523 }
lorevee 0:ac0b0725c6fa 524
lorevee 0:ac0b0725c6fa 525 int hci_le_read_white_list_size(uint8_t *size)
lorevee 0:ac0b0725c6fa 526 {
lorevee 0:ac0b0725c6fa 527 struct hci_request rq;
lorevee 0:ac0b0725c6fa 528 le_read_white_list_size_rp resp;
lorevee 0:ac0b0725c6fa 529
lorevee 0:ac0b0725c6fa 530 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 531
lorevee 0:ac0b0725c6fa 532 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 533 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 534 rq.ocf = OCF_LE_READ_WHITE_LIST_SIZE;
lorevee 0:ac0b0725c6fa 535 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 536 rq.rlen = LE_READ_WHITE_LIST_SIZE_RP_SIZE;
lorevee 0:ac0b0725c6fa 537
lorevee 0:ac0b0725c6fa 538 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 539 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 540 }
lorevee 0:ac0b0725c6fa 541
lorevee 0:ac0b0725c6fa 542 if (resp.status) {
lorevee 0:ac0b0725c6fa 543 return resp.status;
lorevee 0:ac0b0725c6fa 544 }
lorevee 0:ac0b0725c6fa 545
lorevee 0:ac0b0725c6fa 546 *size = resp.size;
lorevee 0:ac0b0725c6fa 547
lorevee 0:ac0b0725c6fa 548 return 0;
lorevee 0:ac0b0725c6fa 549 }
lorevee 0:ac0b0725c6fa 550
lorevee 0:ac0b0725c6fa 551 int hci_le_clear_white_list(void)
lorevee 0:ac0b0725c6fa 552 {
lorevee 0:ac0b0725c6fa 553 struct hci_request rq;
lorevee 0:ac0b0725c6fa 554 uint8_t status;
lorevee 0:ac0b0725c6fa 555
lorevee 0:ac0b0725c6fa 556 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 557 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 558 rq.ocf = OCF_LE_CLEAR_WHITE_LIST;
lorevee 0:ac0b0725c6fa 559 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 560 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 561
lorevee 0:ac0b0725c6fa 562 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 563 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 564 }
lorevee 0:ac0b0725c6fa 565
lorevee 0:ac0b0725c6fa 566 return status;
lorevee 0:ac0b0725c6fa 567 }
lorevee 0:ac0b0725c6fa 568
lorevee 0:ac0b0725c6fa 569 int hci_le_add_device_to_white_list(uint8_t bdaddr_type, tBDAddr bdaddr)
lorevee 0:ac0b0725c6fa 570 {
lorevee 0:ac0b0725c6fa 571 struct hci_request rq;
lorevee 0:ac0b0725c6fa 572 le_add_device_to_white_list_cp params;
lorevee 0:ac0b0725c6fa 573 uint8_t status;
lorevee 0:ac0b0725c6fa 574
lorevee 0:ac0b0725c6fa 575 params.bdaddr_type = bdaddr_type;
lorevee 0:ac0b0725c6fa 576 Osal_MemCpy(params.bdaddr, bdaddr, 6);
lorevee 0:ac0b0725c6fa 577
lorevee 0:ac0b0725c6fa 578 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 579 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 580 rq.ocf = OCF_LE_ADD_DEVICE_TO_WHITE_LIST;
lorevee 0:ac0b0725c6fa 581 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 582 rq.clen = LE_ADD_DEVICE_TO_WHITE_LIST_CP_SIZE;
lorevee 0:ac0b0725c6fa 583 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 584 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 585
lorevee 0:ac0b0725c6fa 586 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 587 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 588 }
lorevee 0:ac0b0725c6fa 589
lorevee 0:ac0b0725c6fa 590 return status;
lorevee 0:ac0b0725c6fa 591 }
lorevee 0:ac0b0725c6fa 592
lorevee 0:ac0b0725c6fa 593 int hci_le_remove_device_from_white_list(uint8_t bdaddr_type, tBDAddr bdaddr)
lorevee 0:ac0b0725c6fa 594 {
lorevee 0:ac0b0725c6fa 595 struct hci_request rq;
lorevee 0:ac0b0725c6fa 596 le_remove_device_from_white_list_cp params;
lorevee 0:ac0b0725c6fa 597 uint8_t status;
lorevee 0:ac0b0725c6fa 598
lorevee 0:ac0b0725c6fa 599 params.bdaddr_type = bdaddr_type;
lorevee 0:ac0b0725c6fa 600 Osal_MemCpy(params.bdaddr, bdaddr, 6);
lorevee 0:ac0b0725c6fa 601
lorevee 0:ac0b0725c6fa 602 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 603 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 604 rq.ocf = OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST;
lorevee 0:ac0b0725c6fa 605 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 606 rq.clen = LE_REMOVE_DEVICE_FROM_WHITE_LIST_CP_SIZE;
lorevee 0:ac0b0725c6fa 607 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 608 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 609
lorevee 0:ac0b0725c6fa 610 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 611 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 612 }
lorevee 0:ac0b0725c6fa 613
lorevee 0:ac0b0725c6fa 614 return status;
lorevee 0:ac0b0725c6fa 615 }
lorevee 0:ac0b0725c6fa 616
lorevee 0:ac0b0725c6fa 617 int hci_read_transmit_power_level(uint16_t *conn_handle, uint8_t type, int8_t * tx_level)
lorevee 0:ac0b0725c6fa 618 {
lorevee 0:ac0b0725c6fa 619 struct hci_request rq;
lorevee 0:ac0b0725c6fa 620 read_transmit_power_level_cp params;
lorevee 0:ac0b0725c6fa 621 read_transmit_power_level_rp resp;
lorevee 0:ac0b0725c6fa 622
lorevee 0:ac0b0725c6fa 623 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 624
lorevee 0:ac0b0725c6fa 625 params.handle = *conn_handle;
lorevee 0:ac0b0725c6fa 626 params.type = type;
lorevee 0:ac0b0725c6fa 627
lorevee 0:ac0b0725c6fa 628 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 629 rq.ogf = OGF_HOST_CTL;
lorevee 0:ac0b0725c6fa 630 rq.ocf = OCF_READ_TRANSMIT_POWER_LEVEL;
lorevee 0:ac0b0725c6fa 631 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 632 rq.clen = READ_TRANSMIT_POWER_LEVEL_CP_SIZE;
lorevee 0:ac0b0725c6fa 633 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 634 rq.rlen = READ_TRANSMIT_POWER_LEVEL_RP_SIZE;
lorevee 0:ac0b0725c6fa 635
lorevee 0:ac0b0725c6fa 636 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 637 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 638 }
lorevee 0:ac0b0725c6fa 639
lorevee 0:ac0b0725c6fa 640 if (resp.status) {
lorevee 0:ac0b0725c6fa 641 return resp.status;
lorevee 0:ac0b0725c6fa 642 }
lorevee 0:ac0b0725c6fa 643
lorevee 0:ac0b0725c6fa 644 *conn_handle = resp.handle;
lorevee 0:ac0b0725c6fa 645 *tx_level = resp.level;
lorevee 0:ac0b0725c6fa 646
lorevee 0:ac0b0725c6fa 647 return 0;
lorevee 0:ac0b0725c6fa 648 }
lorevee 0:ac0b0725c6fa 649
lorevee 0:ac0b0725c6fa 650 int hci_read_rssi(uint16_t *conn_handle, int8_t * rssi)
lorevee 0:ac0b0725c6fa 651 {
lorevee 0:ac0b0725c6fa 652 struct hci_request rq;
lorevee 0:ac0b0725c6fa 653 read_rssi_cp params;
lorevee 0:ac0b0725c6fa 654 read_rssi_rp resp;
lorevee 0:ac0b0725c6fa 655
lorevee 0:ac0b0725c6fa 656 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 657
lorevee 0:ac0b0725c6fa 658 params.handle = *conn_handle;
lorevee 0:ac0b0725c6fa 659
lorevee 0:ac0b0725c6fa 660 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 661 rq.ogf = OGF_STATUS_PARAM;
lorevee 0:ac0b0725c6fa 662 rq.ocf = OCF_READ_RSSI;
lorevee 0:ac0b0725c6fa 663 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 664 rq.clen = READ_RSSI_CP_SIZE;
lorevee 0:ac0b0725c6fa 665 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 666 rq.rlen = READ_RSSI_RP_SIZE;
lorevee 0:ac0b0725c6fa 667
lorevee 0:ac0b0725c6fa 668 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 669 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 670 }
lorevee 0:ac0b0725c6fa 671
lorevee 0:ac0b0725c6fa 672 if (resp.status) {
lorevee 0:ac0b0725c6fa 673 return resp.status;
lorevee 0:ac0b0725c6fa 674 }
lorevee 0:ac0b0725c6fa 675
lorevee 0:ac0b0725c6fa 676 *conn_handle = resp.handle;
lorevee 0:ac0b0725c6fa 677 *rssi = resp.rssi;
lorevee 0:ac0b0725c6fa 678
lorevee 0:ac0b0725c6fa 679 return 0;
lorevee 0:ac0b0725c6fa 680 }
lorevee 0:ac0b0725c6fa 681
lorevee 0:ac0b0725c6fa 682 int hci_le_read_local_supported_features(uint8_t *features)
lorevee 0:ac0b0725c6fa 683 {
lorevee 0:ac0b0725c6fa 684 struct hci_request rq;
lorevee 0:ac0b0725c6fa 685 le_read_local_supported_features_rp resp;
lorevee 0:ac0b0725c6fa 686
lorevee 0:ac0b0725c6fa 687 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 688
lorevee 0:ac0b0725c6fa 689 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 690 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 691 rq.ocf = OCF_LE_READ_LOCAL_SUPPORTED_FEATURES;
lorevee 0:ac0b0725c6fa 692 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 693 rq.rlen = LE_READ_LOCAL_SUPPORTED_FEATURES_RP_SIZE;
lorevee 0:ac0b0725c6fa 694
lorevee 0:ac0b0725c6fa 695 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 696 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 697 }
lorevee 0:ac0b0725c6fa 698
lorevee 0:ac0b0725c6fa 699 if (resp.status) {
lorevee 0:ac0b0725c6fa 700 return resp.status;
lorevee 0:ac0b0725c6fa 701 }
lorevee 0:ac0b0725c6fa 702
lorevee 0:ac0b0725c6fa 703 Osal_MemCpy(features, resp.features, sizeof(resp.features));
lorevee 0:ac0b0725c6fa 704
lorevee 0:ac0b0725c6fa 705 return 0;
lorevee 0:ac0b0725c6fa 706 }
lorevee 0:ac0b0725c6fa 707
lorevee 0:ac0b0725c6fa 708 int hci_le_read_channel_map(uint16_t conn_handle, uint8_t ch_map[5])
lorevee 0:ac0b0725c6fa 709 {
lorevee 0:ac0b0725c6fa 710 struct hci_request rq;
lorevee 0:ac0b0725c6fa 711 le_read_channel_map_cp params;
lorevee 0:ac0b0725c6fa 712 le_read_channel_map_rp resp;
lorevee 0:ac0b0725c6fa 713
lorevee 0:ac0b0725c6fa 714 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 715
lorevee 0:ac0b0725c6fa 716 params.handle = conn_handle;
lorevee 0:ac0b0725c6fa 717
lorevee 0:ac0b0725c6fa 718 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 719 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 720 rq.ocf = OCF_LE_READ_CHANNEL_MAP;
lorevee 0:ac0b0725c6fa 721 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 722 rq.clen = LE_READ_CHANNEL_MAP_CP_SIZE;
lorevee 0:ac0b0725c6fa 723 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 724 rq.rlen = LE_READ_CHANNEL_MAP_RP_SIZE;
lorevee 0:ac0b0725c6fa 725
lorevee 0:ac0b0725c6fa 726 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 727 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 728 }
lorevee 0:ac0b0725c6fa 729
lorevee 0:ac0b0725c6fa 730 if (resp.status) {
lorevee 0:ac0b0725c6fa 731 return resp.status;
lorevee 0:ac0b0725c6fa 732 }
lorevee 0:ac0b0725c6fa 733
lorevee 0:ac0b0725c6fa 734 Osal_MemCpy(ch_map, resp.map, 5);
lorevee 0:ac0b0725c6fa 735
lorevee 0:ac0b0725c6fa 736 return 0;
lorevee 0:ac0b0725c6fa 737 }
lorevee 0:ac0b0725c6fa 738
lorevee 0:ac0b0725c6fa 739 int hci_le_read_supported_states(uint8_t states[8])
lorevee 0:ac0b0725c6fa 740 {
lorevee 0:ac0b0725c6fa 741 struct hci_request rq;
lorevee 0:ac0b0725c6fa 742 le_read_supported_states_rp resp;
lorevee 0:ac0b0725c6fa 743
lorevee 0:ac0b0725c6fa 744 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 745
lorevee 0:ac0b0725c6fa 746 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 747 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 748 rq.ocf = OCF_LE_READ_SUPPORTED_STATES;
lorevee 0:ac0b0725c6fa 749 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 750 rq.rlen = LE_READ_SUPPORTED_STATES_RP_SIZE;
lorevee 0:ac0b0725c6fa 751
lorevee 0:ac0b0725c6fa 752 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 753 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 754 }
lorevee 0:ac0b0725c6fa 755
lorevee 0:ac0b0725c6fa 756 if (resp.status) {
lorevee 0:ac0b0725c6fa 757 return resp.status;
lorevee 0:ac0b0725c6fa 758 }
lorevee 0:ac0b0725c6fa 759
lorevee 0:ac0b0725c6fa 760 Osal_MemCpy(states, resp.states, 8);
lorevee 0:ac0b0725c6fa 761
lorevee 0:ac0b0725c6fa 762 return 0;
lorevee 0:ac0b0725c6fa 763 }
lorevee 0:ac0b0725c6fa 764
lorevee 0:ac0b0725c6fa 765 int hci_le_receiver_test(uint8_t frequency)
lorevee 0:ac0b0725c6fa 766 {
lorevee 0:ac0b0725c6fa 767 struct hci_request rq;
lorevee 0:ac0b0725c6fa 768 le_receiver_test_cp params;
lorevee 0:ac0b0725c6fa 769 uint8_t status;
lorevee 0:ac0b0725c6fa 770
lorevee 0:ac0b0725c6fa 771 params.frequency = frequency;
lorevee 0:ac0b0725c6fa 772
lorevee 0:ac0b0725c6fa 773 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 774 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 775 rq.ocf = OCF_LE_RECEIVER_TEST;
lorevee 0:ac0b0725c6fa 776 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 777 rq.clen = LE_RECEIVER_TEST_CP_SIZE;
lorevee 0:ac0b0725c6fa 778 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 779 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 780
lorevee 0:ac0b0725c6fa 781 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 782 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 783 }
lorevee 0:ac0b0725c6fa 784
lorevee 0:ac0b0725c6fa 785 return status;
lorevee 0:ac0b0725c6fa 786 }
lorevee 0:ac0b0725c6fa 787
lorevee 0:ac0b0725c6fa 788 int hci_le_transmitter_test(uint8_t frequency, uint8_t length, uint8_t payload)
lorevee 0:ac0b0725c6fa 789 {
lorevee 0:ac0b0725c6fa 790 struct hci_request rq;
lorevee 0:ac0b0725c6fa 791 le_transmitter_test_cp params;
lorevee 0:ac0b0725c6fa 792 uint8_t status;
lorevee 0:ac0b0725c6fa 793
lorevee 0:ac0b0725c6fa 794 params.frequency = frequency;
lorevee 0:ac0b0725c6fa 795 params.length = length;
lorevee 0:ac0b0725c6fa 796 params.payload = payload;
lorevee 0:ac0b0725c6fa 797
lorevee 0:ac0b0725c6fa 798 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 799 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 800 rq.ocf = OCF_LE_TRANSMITTER_TEST;
lorevee 0:ac0b0725c6fa 801 rq.cparam = &params;
lorevee 0:ac0b0725c6fa 802 rq.clen = LE_TRANSMITTER_TEST_CP_SIZE;
lorevee 0:ac0b0725c6fa 803 rq.rparam = &status;
lorevee 0:ac0b0725c6fa 804 rq.rlen = 1;
lorevee 0:ac0b0725c6fa 805
lorevee 0:ac0b0725c6fa 806 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 807 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 808 }
lorevee 0:ac0b0725c6fa 809
lorevee 0:ac0b0725c6fa 810 return status;
lorevee 0:ac0b0725c6fa 811 }
lorevee 0:ac0b0725c6fa 812
lorevee 0:ac0b0725c6fa 813 int hci_le_test_end(uint16_t *num_pkts)
lorevee 0:ac0b0725c6fa 814 {
lorevee 0:ac0b0725c6fa 815 struct hci_request rq;
lorevee 0:ac0b0725c6fa 816 le_test_end_rp resp;
lorevee 0:ac0b0725c6fa 817
lorevee 0:ac0b0725c6fa 818 Osal_MemSet(&resp, 0, sizeof(resp));
lorevee 0:ac0b0725c6fa 819
lorevee 0:ac0b0725c6fa 820 Osal_MemSet(&rq, 0, sizeof(rq));
lorevee 0:ac0b0725c6fa 821 rq.ogf = OGF_LE_CTL;
lorevee 0:ac0b0725c6fa 822 rq.ocf = OCF_LE_TEST_END;
lorevee 0:ac0b0725c6fa 823 rq.rparam = &resp;
lorevee 0:ac0b0725c6fa 824 rq.rlen = LE_TEST_END_RP_SIZE;
lorevee 0:ac0b0725c6fa 825
lorevee 0:ac0b0725c6fa 826 if (hci_send_req(&rq, FALSE) < 0){
lorevee 0:ac0b0725c6fa 827 return BLE_STATUS_TIMEOUT;
lorevee 0:ac0b0725c6fa 828 }
lorevee 0:ac0b0725c6fa 829
lorevee 0:ac0b0725c6fa 830 if (resp.status) {
lorevee 0:ac0b0725c6fa 831 return resp.status;
lorevee 0:ac0b0725c6fa 832 }
lorevee 0:ac0b0725c6fa 833
lorevee 0:ac0b0725c6fa 834 *num_pkts = resp.num_pkts;
lorevee 0:ac0b0725c6fa 835
lorevee 0:ac0b0725c6fa 836 return 0;
lorevee 0:ac0b0725c6fa 837 }