gjhn

Dependents:   BLE_GENERALE

Fork of X_NUCLEO_IDB0XA1 by ST

Committer:
Vincent Coubard
Date:
Thu Sep 15 10:52:02 2016 +0100
Branch:
32241492098bb4d0cd62a16975725a4374ad7ecc
Revision:
294:fd19310b086d
Parent:
132:51056160fa4a
Sync with 32241492098bb4d0cd62a16975725a4374ad7ecc

2016-07-28 16:04:43+02:00: Andrea Palmieri
Update include

Signed-off-by: Andrea Palmieri <andrea.palmieri@st.com>

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 132:51056160fa4a 1 /******************** (C) COPYRIGHT 2013 STMicroelectronics ********************
Wolfgang Betz 132:51056160fa4a 2 * File Name : bluenrg_hci.c
Wolfgang Betz 132:51056160fa4a 3 * Author : AMS - HEA&RF BU
Wolfgang Betz 132:51056160fa4a 4 * Version : V1.0.0
Wolfgang Betz 132:51056160fa4a 5 * Date : 4-Oct-2013
Wolfgang Betz 132:51056160fa4a 6 * Description : File with HCI commands for BlueNRG FW6.0 and above.
Wolfgang Betz 132:51056160fa4a 7 ********************************************************************************
Wolfgang Betz 132:51056160fa4a 8 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
Wolfgang Betz 132:51056160fa4a 9 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
Wolfgang Betz 132:51056160fa4a 10 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
Wolfgang Betz 132:51056160fa4a 11 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
Wolfgang Betz 132:51056160fa4a 12 * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
Wolfgang Betz 132:51056160fa4a 13 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
Wolfgang Betz 132:51056160fa4a 14 *******************************************************************************/
Wolfgang Betz 132:51056160fa4a 15
Vincent Coubard 294:fd19310b086d 16 #include "ble_hal_types.h"
Vincent Coubard 294:fd19310b086d 17 #include "ble_osal.h"
Wolfgang Betz 132:51056160fa4a 18 #include "ble_status.h"
Vincent Coubard 294:fd19310b086d 19 #include "ble_hal.h"
Vincent Coubard 294:fd19310b086d 20 #include "ble_osal.h"
Vincent Coubard 294:fd19310b086d 21 #include "ble_hci_const.h"
Wolfgang Betz 132:51056160fa4a 22 #include "bluenrg_aci_const.h"
Wolfgang Betz 132:51056160fa4a 23 #include "bluenrg_updater_aci.h"
Wolfgang Betz 132:51056160fa4a 24
Wolfgang Betz 132:51056160fa4a 25 #define MIN(a,b) ((a) < (b) )? (a) : (b)
Wolfgang Betz 132:51056160fa4a 26 #define MAX(a,b) ((a) > (b) )? (a) : (b)
Wolfgang Betz 132:51056160fa4a 27
Wolfgang Betz 132:51056160fa4a 28 tBleStatus aci_updater_start(void)
Wolfgang Betz 132:51056160fa4a 29 {
Wolfgang Betz 132:51056160fa4a 30 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 31 uint8_t status = 0;
Wolfgang Betz 132:51056160fa4a 32
Wolfgang Betz 132:51056160fa4a 33 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 34 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 35 rq.ocf = OCF_UPDATER_START;
Wolfgang Betz 132:51056160fa4a 36 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 37 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 38
Wolfgang Betz 132:51056160fa4a 39 hci_send_req(&rq, FALSE); // No command complete is sent.
Wolfgang Betz 132:51056160fa4a 40
Wolfgang Betz 132:51056160fa4a 41 return status;
Wolfgang Betz 132:51056160fa4a 42 }
Wolfgang Betz 132:51056160fa4a 43
Wolfgang Betz 132:51056160fa4a 44 tBleStatus aci_updater_reboot(void)
Wolfgang Betz 132:51056160fa4a 45 {
Wolfgang Betz 132:51056160fa4a 46 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 47 uint8_t status = 0;
Wolfgang Betz 132:51056160fa4a 48
Wolfgang Betz 132:51056160fa4a 49 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 50 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 51 rq.ocf = OCF_UPDATER_REBOOT;
Wolfgang Betz 132:51056160fa4a 52 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 53 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 54
Wolfgang Betz 132:51056160fa4a 55 hci_send_req(&rq, FALSE); // No command complete is sent.
Wolfgang Betz 132:51056160fa4a 56
Wolfgang Betz 132:51056160fa4a 57 return status;
Wolfgang Betz 132:51056160fa4a 58 }
Wolfgang Betz 132:51056160fa4a 59
Wolfgang Betz 132:51056160fa4a 60 tBleStatus aci_get_updater_version(uint8_t *version)
Wolfgang Betz 132:51056160fa4a 61 {
Wolfgang Betz 132:51056160fa4a 62 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 63 get_updater_version_rp resp;
Wolfgang Betz 132:51056160fa4a 64
Wolfgang Betz 132:51056160fa4a 65 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 66
Wolfgang Betz 132:51056160fa4a 67 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 68 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 69 rq.ocf = OCF_GET_UPDATER_VERSION;
Wolfgang Betz 132:51056160fa4a 70 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 71 rq.rlen = GET_UPDATER_VERSION_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 72
Wolfgang Betz 132:51056160fa4a 73 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 74 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 75
Wolfgang Betz 132:51056160fa4a 76 *version = resp.version;
Wolfgang Betz 132:51056160fa4a 77
Wolfgang Betz 132:51056160fa4a 78 return resp.status;
Wolfgang Betz 132:51056160fa4a 79 }
Wolfgang Betz 132:51056160fa4a 80
Wolfgang Betz 132:51056160fa4a 81 tBleStatus aci_get_updater_buffer_size(uint8_t *buffer_size)
Wolfgang Betz 132:51056160fa4a 82 {
Wolfgang Betz 132:51056160fa4a 83 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 84 get_updater_bufsize_rp resp;
Wolfgang Betz 132:51056160fa4a 85
Wolfgang Betz 132:51056160fa4a 86 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 87
Wolfgang Betz 132:51056160fa4a 88 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 89 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 90 rq.ocf = OCF_GET_UPDATER_BUFSIZE;
Wolfgang Betz 132:51056160fa4a 91 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 92 rq.rlen = GET_UPDATER_BUFSIZE_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 93
Wolfgang Betz 132:51056160fa4a 94 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 95 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 96
Wolfgang Betz 132:51056160fa4a 97 *buffer_size = resp.buffer_size;
Wolfgang Betz 132:51056160fa4a 98
Wolfgang Betz 132:51056160fa4a 99 return resp.status;
Wolfgang Betz 132:51056160fa4a 100 }
Wolfgang Betz 132:51056160fa4a 101
Wolfgang Betz 132:51056160fa4a 102 tBleStatus aci_erase_blue_flag(void)
Wolfgang Betz 132:51056160fa4a 103 {
Wolfgang Betz 132:51056160fa4a 104 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 105 uint8_t status;
Wolfgang Betz 132:51056160fa4a 106
Wolfgang Betz 132:51056160fa4a 107 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 108 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 109 rq.ocf = OCF_UPDATER_ERASE_BLUE_FLAG;
Wolfgang Betz 132:51056160fa4a 110 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 111 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 112
Wolfgang Betz 132:51056160fa4a 113 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 114 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 115
Wolfgang Betz 132:51056160fa4a 116 return status;
Wolfgang Betz 132:51056160fa4a 117 }
Wolfgang Betz 132:51056160fa4a 118
Wolfgang Betz 132:51056160fa4a 119 tBleStatus aci_reset_blue_flag(void)
Wolfgang Betz 132:51056160fa4a 120 {
Wolfgang Betz 132:51056160fa4a 121 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 122 uint8_t status;
Wolfgang Betz 132:51056160fa4a 123
Wolfgang Betz 132:51056160fa4a 124 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 125 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 126 rq.ocf = OCF_UPDATER_RESET_BLUE_FLAG;
Wolfgang Betz 132:51056160fa4a 127 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 128 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 129
Wolfgang Betz 132:51056160fa4a 130 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 131 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 132
Wolfgang Betz 132:51056160fa4a 133 return status;
Wolfgang Betz 132:51056160fa4a 134 }
Wolfgang Betz 132:51056160fa4a 135
Wolfgang Betz 132:51056160fa4a 136 tBleStatus aci_updater_erase_sector(uint32_t address)
Wolfgang Betz 132:51056160fa4a 137 {
Wolfgang Betz 132:51056160fa4a 138 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 139 updater_erase_sector_cp cp;
Wolfgang Betz 132:51056160fa4a 140 uint8_t status;
Wolfgang Betz 132:51056160fa4a 141
Wolfgang Betz 132:51056160fa4a 142 cp.address = htobl(address);
Wolfgang Betz 132:51056160fa4a 143
Wolfgang Betz 132:51056160fa4a 144 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 145 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 146 rq.ocf = OCF_UPDATER_ERASE_SECTOR;
Wolfgang Betz 132:51056160fa4a 147 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 148 rq.clen = UPDATER_ERASE_SECTOR_CP_SIZE;
Wolfgang Betz 132:51056160fa4a 149 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 150 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 151
Wolfgang Betz 132:51056160fa4a 152 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 153 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 154
Wolfgang Betz 132:51056160fa4a 155 return status;
Wolfgang Betz 132:51056160fa4a 156 }
Wolfgang Betz 132:51056160fa4a 157
Wolfgang Betz 132:51056160fa4a 158 tBleStatus aci_updater_program_data_block(uint32_t address,
Wolfgang Betz 132:51056160fa4a 159 uint16_t len,
Wolfgang Betz 132:51056160fa4a 160 const uint8_t *data)
Wolfgang Betz 132:51056160fa4a 161 {
Wolfgang Betz 132:51056160fa4a 162 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 163 uint8_t status;
Wolfgang Betz 132:51056160fa4a 164 updater_prog_data_block_cp cp;
Wolfgang Betz 132:51056160fa4a 165
Wolfgang Betz 132:51056160fa4a 166 if( len > sizeof(cp.data))
Wolfgang Betz 132:51056160fa4a 167 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 168
Wolfgang Betz 132:51056160fa4a 169 cp.address = htobl(address);
Wolfgang Betz 132:51056160fa4a 170 cp.data_len = htobs(len);
Wolfgang Betz 132:51056160fa4a 171 Osal_MemCpy(cp.data, data, len);
Wolfgang Betz 132:51056160fa4a 172
Wolfgang Betz 132:51056160fa4a 173 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 174 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 175 rq.ocf = OCF_UPDATER_PROG_DATA_BLOCK;
Wolfgang Betz 132:51056160fa4a 176 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 177 rq.clen = UPDATER_PROG_DATA_BLOCK_CP_SIZE+len;
Wolfgang Betz 132:51056160fa4a 178 rq.rparam = &status;
Wolfgang Betz 132:51056160fa4a 179 rq.rlen = 1;
Wolfgang Betz 132:51056160fa4a 180
Wolfgang Betz 132:51056160fa4a 181 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 182 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 183
Wolfgang Betz 132:51056160fa4a 184 return status;
Wolfgang Betz 132:51056160fa4a 185 }
Wolfgang Betz 132:51056160fa4a 186
Wolfgang Betz 132:51056160fa4a 187 tBleStatus aci_updater_read_data_block(uint32_t address,
Wolfgang Betz 132:51056160fa4a 188 uint16_t data_len,
Wolfgang Betz 132:51056160fa4a 189 uint8_t *data)
Wolfgang Betz 132:51056160fa4a 190 {
Wolfgang Betz 132:51056160fa4a 191 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 192 updater_read_data_block_cp cp;
Wolfgang Betz 132:51056160fa4a 193 uint8_t buffer[HCI_MAX_PAYLOAD_SIZE];
Wolfgang Betz 132:51056160fa4a 194
Wolfgang Betz 132:51056160fa4a 195 if((data_len+1) > HCI_MAX_PAYLOAD_SIZE)
Wolfgang Betz 132:51056160fa4a 196 return BLE_STATUS_INVALID_PARAMS;
Wolfgang Betz 132:51056160fa4a 197
Wolfgang Betz 132:51056160fa4a 198 cp.address = htobl(address);
Wolfgang Betz 132:51056160fa4a 199 cp.data_len = htobs(data_len);
Wolfgang Betz 132:51056160fa4a 200
Wolfgang Betz 132:51056160fa4a 201 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 202 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 203 rq.ocf = OCF_UPDATER_READ_DATA_BLOCK;
Wolfgang Betz 132:51056160fa4a 204 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 205 rq.clen = UPDATER_READ_DATA_BLOCK_CP_SIZE;
Wolfgang Betz 132:51056160fa4a 206 rq.rparam = buffer;
Wolfgang Betz 132:51056160fa4a 207 rq.rlen = data_len + 1;
Wolfgang Betz 132:51056160fa4a 208
Wolfgang Betz 132:51056160fa4a 209 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 210 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 211
Wolfgang Betz 132:51056160fa4a 212 // First byte is status
Wolfgang Betz 132:51056160fa4a 213 Osal_MemCpy(data, buffer+1, data_len);
Wolfgang Betz 132:51056160fa4a 214
Wolfgang Betz 132:51056160fa4a 215 return buffer[0];
Wolfgang Betz 132:51056160fa4a 216 }
Wolfgang Betz 132:51056160fa4a 217
Wolfgang Betz 132:51056160fa4a 218 tBleStatus aci_updater_calc_crc(uint32_t address,
Wolfgang Betz 132:51056160fa4a 219 uint8_t num_sectors,
Wolfgang Betz 132:51056160fa4a 220 uint32_t *crc)
Wolfgang Betz 132:51056160fa4a 221 {
Wolfgang Betz 132:51056160fa4a 222 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 223 updater_calc_crc_cp cp;
Wolfgang Betz 132:51056160fa4a 224 updater_calc_crc_rp resp;
Wolfgang Betz 132:51056160fa4a 225
Wolfgang Betz 132:51056160fa4a 226 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 227
Wolfgang Betz 132:51056160fa4a 228 cp.address = htobl(address);
Wolfgang Betz 132:51056160fa4a 229 cp.num_sectors = num_sectors;
Wolfgang Betz 132:51056160fa4a 230
Wolfgang Betz 132:51056160fa4a 231 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 232 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 233 rq.ocf = OCF_UPDATER_CALC_CRC;
Wolfgang Betz 132:51056160fa4a 234 rq.cparam = &cp;
Wolfgang Betz 132:51056160fa4a 235 rq.clen = UPDATER_CALC_CRC_CP_SIZE;
Wolfgang Betz 132:51056160fa4a 236 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 237 rq.rlen = UPDATER_CALC_CRC_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 238
Wolfgang Betz 132:51056160fa4a 239 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 240 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 241
Wolfgang Betz 132:51056160fa4a 242 *crc = btohl(resp.crc);
Wolfgang Betz 132:51056160fa4a 243
Wolfgang Betz 132:51056160fa4a 244 return resp.status;
Wolfgang Betz 132:51056160fa4a 245 }
Wolfgang Betz 132:51056160fa4a 246
Wolfgang Betz 132:51056160fa4a 247 tBleStatus aci_updater_hw_version(uint8_t *version)
Wolfgang Betz 132:51056160fa4a 248 {
Wolfgang Betz 132:51056160fa4a 249 struct hci_request rq;
Wolfgang Betz 132:51056160fa4a 250 updater_hw_version_rp resp;
Wolfgang Betz 132:51056160fa4a 251
Wolfgang Betz 132:51056160fa4a 252 Osal_MemSet(&resp, 0, sizeof(resp));
Wolfgang Betz 132:51056160fa4a 253
Wolfgang Betz 132:51056160fa4a 254 Osal_MemSet(&rq, 0, sizeof(rq));
Wolfgang Betz 132:51056160fa4a 255 rq.ogf = OGF_VENDOR_CMD;
Wolfgang Betz 132:51056160fa4a 256 rq.ocf = OCF_UPDATER_HW_VERSION;
Wolfgang Betz 132:51056160fa4a 257 rq.rparam = &resp;
Wolfgang Betz 132:51056160fa4a 258 rq.rlen = UPDATER_HW_VERSION_RP_SIZE;
Wolfgang Betz 132:51056160fa4a 259
Wolfgang Betz 132:51056160fa4a 260 if (hci_send_req(&rq, FALSE) < 0)
Wolfgang Betz 132:51056160fa4a 261 return BLE_STATUS_TIMEOUT;
Wolfgang Betz 132:51056160fa4a 262
Wolfgang Betz 132:51056160fa4a 263 *version = resp.version;
Wolfgang Betz 132:51056160fa4a 264
Wolfgang Betz 132:51056160fa4a 265 return resp.status;
Wolfgang Betz 132:51056160fa4a 266 }
Wolfgang Betz 132:51056160fa4a 267
Wolfgang Betz 132:51056160fa4a 268
Wolfgang Betz 132:51056160fa4a 269