BLE shield
Fork of X_NUCLEO_IDB0XA1 by
Embed:
(wiki syntax)
Show/hide line numbers
bluenrg_updater_aci.c
00001 /******************** (C) COPYRIGHT 2013 STMicroelectronics ******************** 00002 * File Name : bluenrg_hci.c 00003 * Author : AMS - HEA&RF BU 00004 * Version : V1.0.0 00005 * Date : 4-Oct-2013 00006 * Description : File with HCI commands for BlueNRG FW6.0 and above. 00007 ******************************************************************************** 00008 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS 00009 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. 00010 * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, 00011 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE 00012 * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING 00013 * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. 00014 *******************************************************************************/ 00015 00016 #include "hal_types.h" 00017 #include "osal.h" 00018 #include "ble_status.h" 00019 #include "hal.h" 00020 #include "osal.h" 00021 #include "hci_const.h" 00022 #include "bluenrg_aci_const.h" 00023 #include "bluenrg_updater_aci.h" 00024 00025 #define MIN(a,b) ((a) < (b) )? (a) : (b) 00026 #define MAX(a,b) ((a) > (b) )? (a) : (b) 00027 00028 tBleStatus aci_updater_start(void) 00029 { 00030 struct hci_request rq; 00031 uint8_t status = 0; 00032 00033 Osal_MemSet(&rq, 0, sizeof(rq)); 00034 rq.ogf = OGF_VENDOR_CMD; 00035 rq.ocf = OCF_UPDATER_START; 00036 rq.rparam = &status; 00037 rq.rlen = 1; 00038 00039 hci_send_req(&rq, FALSE); // No command complete is sent. 00040 00041 return status; 00042 } 00043 00044 tBleStatus aci_updater_reboot(void) 00045 { 00046 struct hci_request rq; 00047 uint8_t status = 0; 00048 00049 Osal_MemSet(&rq, 0, sizeof(rq)); 00050 rq.ogf = OGF_VENDOR_CMD; 00051 rq.ocf = OCF_UPDATER_REBOOT; 00052 rq.rparam = &status; 00053 rq.rlen = 1; 00054 00055 hci_send_req(&rq, FALSE); // No command complete is sent. 00056 00057 return status; 00058 } 00059 00060 tBleStatus aci_get_updater_version(uint8_t *version) 00061 { 00062 struct hci_request rq; 00063 get_updater_version_rp resp; 00064 00065 Osal_MemSet(&resp, 0, sizeof(resp)); 00066 00067 Osal_MemSet(&rq, 0, sizeof(rq)); 00068 rq.ogf = OGF_VENDOR_CMD; 00069 rq.ocf = OCF_GET_UPDATER_VERSION; 00070 rq.rparam = &resp; 00071 rq.rlen = GET_UPDATER_VERSION_RP_SIZE; 00072 00073 if (hci_send_req(&rq, FALSE) < 0) 00074 return BLE_STATUS_TIMEOUT; 00075 00076 *version = resp.version; 00077 00078 return resp.status; 00079 } 00080 00081 tBleStatus aci_get_updater_buffer_size(uint8_t *buffer_size) 00082 { 00083 struct hci_request rq; 00084 get_updater_bufsize_rp resp; 00085 00086 Osal_MemSet(&resp, 0, sizeof(resp)); 00087 00088 Osal_MemSet(&rq, 0, sizeof(rq)); 00089 rq.ogf = OGF_VENDOR_CMD; 00090 rq.ocf = OCF_GET_UPDATER_BUFSIZE; 00091 rq.rparam = &resp; 00092 rq.rlen = GET_UPDATER_BUFSIZE_RP_SIZE; 00093 00094 if (hci_send_req(&rq, FALSE) < 0) 00095 return BLE_STATUS_TIMEOUT; 00096 00097 *buffer_size = resp.buffer_size; 00098 00099 return resp.status; 00100 } 00101 00102 tBleStatus aci_erase_blue_flag(void) 00103 { 00104 struct hci_request rq; 00105 uint8_t status; 00106 00107 Osal_MemSet(&rq, 0, sizeof(rq)); 00108 rq.ogf = OGF_VENDOR_CMD; 00109 rq.ocf = OCF_UPDATER_ERASE_BLUE_FLAG; 00110 rq.rparam = &status; 00111 rq.rlen = 1; 00112 00113 if (hci_send_req(&rq, FALSE) < 0) 00114 return BLE_STATUS_TIMEOUT; 00115 00116 return status; 00117 } 00118 00119 tBleStatus aci_reset_blue_flag(void) 00120 { 00121 struct hci_request rq; 00122 uint8_t status; 00123 00124 Osal_MemSet(&rq, 0, sizeof(rq)); 00125 rq.ogf = OGF_VENDOR_CMD; 00126 rq.ocf = OCF_UPDATER_RESET_BLUE_FLAG; 00127 rq.rparam = &status; 00128 rq.rlen = 1; 00129 00130 if (hci_send_req(&rq, FALSE) < 0) 00131 return BLE_STATUS_TIMEOUT; 00132 00133 return status; 00134 } 00135 00136 tBleStatus aci_updater_erase_sector(uint32_t address) 00137 { 00138 struct hci_request rq; 00139 updater_erase_sector_cp cp; 00140 uint8_t status; 00141 00142 cp.address = htobl(address); 00143 00144 Osal_MemSet(&rq, 0, sizeof(rq)); 00145 rq.ogf = OGF_VENDOR_CMD; 00146 rq.ocf = OCF_UPDATER_ERASE_SECTOR; 00147 rq.cparam = &cp; 00148 rq.clen = UPDATER_ERASE_SECTOR_CP_SIZE; 00149 rq.rparam = &status; 00150 rq.rlen = 1; 00151 00152 if (hci_send_req(&rq, FALSE) < 0) 00153 return BLE_STATUS_TIMEOUT; 00154 00155 return status; 00156 } 00157 00158 tBleStatus aci_updater_program_data_block(uint32_t address, 00159 uint16_t len, 00160 const uint8_t *data) 00161 { 00162 struct hci_request rq; 00163 uint8_t status; 00164 updater_prog_data_block_cp cp; 00165 00166 if( len > sizeof(cp.data)) 00167 return BLE_STATUS_INVALID_PARAMS; 00168 00169 cp.address = htobl(address); 00170 cp.data_len = htobs(len); 00171 Osal_MemCpy(cp.data, data, len); 00172 00173 Osal_MemSet(&rq, 0, sizeof(rq)); 00174 rq.ogf = OGF_VENDOR_CMD; 00175 rq.ocf = OCF_UPDATER_PROG_DATA_BLOCK; 00176 rq.cparam = &cp; 00177 rq.clen = UPDATER_PROG_DATA_BLOCK_CP_SIZE+len; 00178 rq.rparam = &status; 00179 rq.rlen = 1; 00180 00181 if (hci_send_req(&rq, FALSE) < 0) 00182 return BLE_STATUS_TIMEOUT; 00183 00184 return status; 00185 } 00186 00187 tBleStatus aci_updater_read_data_block(uint32_t address, 00188 uint16_t data_len, 00189 uint8_t *data) 00190 { 00191 struct hci_request rq; 00192 updater_read_data_block_cp cp; 00193 uint8_t buffer[HCI_MAX_PAYLOAD_SIZE]; 00194 00195 if((data_len+1) > HCI_MAX_PAYLOAD_SIZE) 00196 return BLE_STATUS_INVALID_PARAMS; 00197 00198 cp.address = htobl(address); 00199 cp.data_len = htobs(data_len); 00200 00201 Osal_MemSet(&rq, 0, sizeof(rq)); 00202 rq.ogf = OGF_VENDOR_CMD; 00203 rq.ocf = OCF_UPDATER_READ_DATA_BLOCK; 00204 rq.cparam = &cp; 00205 rq.clen = UPDATER_READ_DATA_BLOCK_CP_SIZE; 00206 rq.rparam = buffer; 00207 rq.rlen = data_len + 1; 00208 00209 if (hci_send_req(&rq, FALSE) < 0) 00210 return BLE_STATUS_TIMEOUT; 00211 00212 // First byte is status 00213 Osal_MemCpy(data, buffer+1, data_len); 00214 00215 return buffer[0]; 00216 } 00217 00218 tBleStatus aci_updater_calc_crc(uint32_t address, 00219 uint8_t num_sectors, 00220 uint32_t *crc) 00221 { 00222 struct hci_request rq; 00223 updater_calc_crc_cp cp; 00224 updater_calc_crc_rp resp; 00225 00226 Osal_MemSet(&resp, 0, sizeof(resp)); 00227 00228 cp.address = htobl(address); 00229 cp.num_sectors = num_sectors; 00230 00231 Osal_MemSet(&rq, 0, sizeof(rq)); 00232 rq.ogf = OGF_VENDOR_CMD; 00233 rq.ocf = OCF_UPDATER_CALC_CRC; 00234 rq.cparam = &cp; 00235 rq.clen = UPDATER_CALC_CRC_CP_SIZE; 00236 rq.rparam = &resp; 00237 rq.rlen = UPDATER_CALC_CRC_RP_SIZE; 00238 00239 if (hci_send_req(&rq, FALSE) < 0) 00240 return BLE_STATUS_TIMEOUT; 00241 00242 *crc = btohl(resp.crc); 00243 00244 return resp.status; 00245 } 00246 00247 tBleStatus aci_updater_hw_version(uint8_t *version) 00248 { 00249 struct hci_request rq; 00250 updater_hw_version_rp resp; 00251 00252 Osal_MemSet(&resp, 0, sizeof(resp)); 00253 00254 Osal_MemSet(&rq, 0, sizeof(rq)); 00255 rq.ogf = OGF_VENDOR_CMD; 00256 rq.ocf = OCF_UPDATER_HW_VERSION; 00257 rq.rparam = &resp; 00258 rq.rlen = UPDATER_HW_VERSION_RP_SIZE; 00259 00260 if (hci_send_req(&rq, FALSE) < 0) 00261 return BLE_STATUS_TIMEOUT; 00262 00263 *version = resp.version; 00264 00265 return resp.status; 00266 } 00267 00268 00269 00270
Generated on Tue Jul 12 2022 19:27:28 by 1.7.2