Fork of ble-x-nucleo-idb0xa1 with changes required by BleStarMbed
source/bluenrg-hci/hci/ble_hci_le.c@0:ac0b0725c6fa, 2018-02-20 (annotated)
- Committer:
- lorevee
- Date:
- Tue Feb 20 11:07:16 2018 +0000
- Revision:
- 0:ac0b0725c6fa
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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>© 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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 = ¶ms; |
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 | } |