ver:init

Committer:
iv123
Date:
Sun Jun 18 16:10:28 2017 +0000
Revision:
0:88b85febcb45
Initial commit

Who changed what in which revision?

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