HSP Platform firmware evaluating ECG data and hearth rate over PPG data.

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
gmehmet
Date:
Wed Apr 10 14:56:25 2019 +0300
Revision:
1:f60eafbf009a
upload from local

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 1:f60eafbf009a 1 /*******************************************************************************
gmehmet 1:f60eafbf009a 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 1:f60eafbf009a 3 *
gmehmet 1:f60eafbf009a 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 1:f60eafbf009a 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 1:f60eafbf009a 6 * to deal in the Software without restriction, including without limitation
gmehmet 1:f60eafbf009a 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 1:f60eafbf009a 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 1:f60eafbf009a 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 1:f60eafbf009a 10 *
gmehmet 1:f60eafbf009a 11 * The above copyright notice and this permission notice shall be included
gmehmet 1:f60eafbf009a 12 * in all copies or substantial portions of the Software.
gmehmet 1:f60eafbf009a 13 *
gmehmet 1:f60eafbf009a 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 1:f60eafbf009a 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 1:f60eafbf009a 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 1:f60eafbf009a 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 1:f60eafbf009a 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 1:f60eafbf009a 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 1:f60eafbf009a 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 1:f60eafbf009a 21 *
gmehmet 1:f60eafbf009a 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 1:f60eafbf009a 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 1:f60eafbf009a 24 * Products, Inc. Branding Policy.
gmehmet 1:f60eafbf009a 25 *
gmehmet 1:f60eafbf009a 26 * The mere transfer of this software does not imply any licenses
gmehmet 1:f60eafbf009a 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 1:f60eafbf009a 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 1:f60eafbf009a 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 1:f60eafbf009a 30 * ownership rights.
gmehmet 1:f60eafbf009a 31 *******************************************************************************
gmehmet 1:f60eafbf009a 32 */
gmehmet 1:f60eafbf009a 33
gmehmet 1:f60eafbf009a 34 #include "DSInterface.h"
gmehmet 1:f60eafbf009a 35 #include "SSBootloaderComm.h"
gmehmet 1:f60eafbf009a 36
gmehmet 1:f60eafbf009a 37 #include "../../../../Utilities/mxm_assert.h"
gmehmet 1:f60eafbf009a 38 #include "SSInterface.h"
gmehmet 1:f60eafbf009a 39 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 40 #include "utils.h"
gmehmet 1:f60eafbf009a 41 #include "BLE_ICARUS.h"
gmehmet 1:f60eafbf009a 42
gmehmet 1:f60eafbf009a 43
gmehmet 1:f60eafbf009a 44 static bool flag_image_on_ram = false;
gmehmet 1:f60eafbf009a 45
gmehmet 1:f60eafbf009a 46 static const char* const cmd_tbl[] = {
gmehmet 1:f60eafbf009a 47 "bootldr",
gmehmet 1:f60eafbf009a 48 "exit",
gmehmet 1:f60eafbf009a 49 "reset",
gmehmet 1:f60eafbf009a 50 "page_size",
gmehmet 1:f60eafbf009a 51 "num_pages",
gmehmet 1:f60eafbf009a 52 "set_iv",
gmehmet 1:f60eafbf009a 53 "set_auth",
gmehmet 1:f60eafbf009a 54 "erase",
gmehmet 1:f60eafbf009a 55 "page_erase",
gmehmet 1:f60eafbf009a 56 "flash",
gmehmet 1:f60eafbf009a 57 "set_cfg bl enter_mode",
gmehmet 1:f60eafbf009a 58 "set_cfg bl enter_pin",
gmehmet 1:f60eafbf009a 59 "set_cfg bl enter_pol",
gmehmet 1:f60eafbf009a 60 "set_cfg bl exit_mode",
gmehmet 1:f60eafbf009a 61 "set_cfg bl exit_to",
gmehmet 1:f60eafbf009a 62 "set_cfg bl save",
gmehmet 1:f60eafbf009a 63 "image_on_ram",
gmehmet 1:f60eafbf009a 64 "set_cfg host ebl",
gmehmet 1:f60eafbf009a 65 "set_cfg host cdf", /* bootloader comm_delay_factor */
gmehmet 1:f60eafbf009a 66 "get_cfg host",
gmehmet 1:f60eafbf009a 67 };
gmehmet 1:f60eafbf009a 68
gmehmet 1:f60eafbf009a 69 SSBootloaderComm::SSBootloaderComm(USBSerial *USB, SSInterface* ssInterface, DSInterface* dsInterface)
gmehmet 1:f60eafbf009a 70 :SensorComm("bl", false), m_USB(USB), ss_int(ssInterface), ds_int(dsInterface)
gmehmet 1:f60eafbf009a 71 {
gmehmet 1:f60eafbf009a 72 bl_comm_delay_factor = 1;
gmehmet 1:f60eafbf009a 73 }
gmehmet 1:f60eafbf009a 74
gmehmet 1:f60eafbf009a 75 int SSBootloaderComm::parse_auth(const char* cmd, uint8_t *auth_bytes)
gmehmet 1:f60eafbf009a 76 {
gmehmet 1:f60eafbf009a 77 char cmdStr[] = "set_auth ";
gmehmet 1:f60eafbf009a 78 int length = strlen(cmd);
gmehmet 1:f60eafbf009a 79 int expected_length = strlen(cmdStr) + 2*AES_AUTH_SIZE;
gmehmet 1:f60eafbf009a 80 if (length != expected_length) {
gmehmet 1:f60eafbf009a 81 pr_err("Couldn't parse Auth bytes, incorrect number of characters (len:%d, expected:%d)\n",
gmehmet 1:f60eafbf009a 82 length, expected_length);
gmehmet 1:f60eafbf009a 83 return COMM_INVALID_PARAM;
gmehmet 1:f60eafbf009a 84 }
gmehmet 1:f60eafbf009a 85
gmehmet 1:f60eafbf009a 86 const char* macPtr = cmd + strlen(cmdStr);
gmehmet 1:f60eafbf009a 87
gmehmet 1:f60eafbf009a 88 int num_found;
gmehmet 1:f60eafbf009a 89 int byteVal;
gmehmet 1:f60eafbf009a 90 for (int aidx = 0; aidx < AES_AUTH_SIZE; aidx++) {
gmehmet 1:f60eafbf009a 91 num_found = sscanf(macPtr, "%2X", &byteVal);
gmehmet 1:f60eafbf009a 92
gmehmet 1:f60eafbf009a 93 if (num_found != 1 || byteVal > 0xFF) {
gmehmet 1:f60eafbf009a 94 pr_err("Couldn't parse byte %d of Auth\n", aidx);
gmehmet 1:f60eafbf009a 95 return COMM_INVALID_PARAM;
gmehmet 1:f60eafbf009a 96 }
gmehmet 1:f60eafbf009a 97
gmehmet 1:f60eafbf009a 98 auth_bytes[aidx] = (uint8_t)byteVal;
gmehmet 1:f60eafbf009a 99 macPtr += 2;
gmehmet 1:f60eafbf009a 100 }
gmehmet 1:f60eafbf009a 101
gmehmet 1:f60eafbf009a 102 return COMM_SUCCESS;
gmehmet 1:f60eafbf009a 103 }
gmehmet 1:f60eafbf009a 104
gmehmet 1:f60eafbf009a 105 int SSBootloaderComm::parse_iv(const char* cmd, uint8_t* iv_bytes)
gmehmet 1:f60eafbf009a 106 {
gmehmet 1:f60eafbf009a 107 char cmdStr[] = "set_iv ";
gmehmet 1:f60eafbf009a 108 int length = strlen(cmd);
gmehmet 1:f60eafbf009a 109 int expected_length = strlen(cmdStr) + 2*AES_NONCE_SIZE;
gmehmet 1:f60eafbf009a 110 if (length != expected_length) {
gmehmet 1:f60eafbf009a 111 pr_err("Couldn't parse IV, incorrect number of characters (len:%d, expected:%d)\n",
gmehmet 1:f60eafbf009a 112 length, expected_length);
gmehmet 1:f60eafbf009a 113 return COMM_INVALID_PARAM;
gmehmet 1:f60eafbf009a 114 }
gmehmet 1:f60eafbf009a 115
gmehmet 1:f60eafbf009a 116 const char* ivPtr = cmd + strlen(cmdStr);
gmehmet 1:f60eafbf009a 117
gmehmet 1:f60eafbf009a 118 int num_found;
gmehmet 1:f60eafbf009a 119 int byteVal;
gmehmet 1:f60eafbf009a 120 for (int ividx = 0; ividx < AES_NONCE_SIZE; ividx++) {
gmehmet 1:f60eafbf009a 121 num_found = sscanf(ivPtr, "%2X", &byteVal);
gmehmet 1:f60eafbf009a 122
gmehmet 1:f60eafbf009a 123 if (num_found != 1 || byteVal > 0xFF) {
gmehmet 1:f60eafbf009a 124 pr_err("Couldn't parse byte %d of IV\n", ividx);
gmehmet 1:f60eafbf009a 125 return COMM_INVALID_PARAM;
gmehmet 1:f60eafbf009a 126 }
gmehmet 1:f60eafbf009a 127 iv_bytes[ividx] = (uint8_t)byteVal;
gmehmet 1:f60eafbf009a 128 ivPtr += 2;
gmehmet 1:f60eafbf009a 129 }
gmehmet 1:f60eafbf009a 130
gmehmet 1:f60eafbf009a 131 return COMM_SUCCESS;
gmehmet 1:f60eafbf009a 132 }
gmehmet 1:f60eafbf009a 133
gmehmet 1:f60eafbf009a 134 bool SSBootloaderComm::parse_command(const char* cmd)
gmehmet 1:f60eafbf009a 135 {
gmehmet 1:f60eafbf009a 136 int ret = EXIT_SUCCESS;
gmehmet 1:f60eafbf009a 137 bool recognizedCmd = false;
gmehmet 1:f60eafbf009a 138 char charbuf[768];
gmehmet 1:f60eafbf009a 139 int data_len = 0;
gmehmet 1:f60eafbf009a 140 bool flash_flag=false;
gmehmet 1:f60eafbf009a 141
gmehmet 1:f60eafbf009a 142 if (!ss_int) {
gmehmet 1:f60eafbf009a 143 pr_err("No SmartSensor Interface defined!");
gmehmet 1:f60eafbf009a 144 return false;
gmehmet 1:f60eafbf009a 145 }
gmehmet 1:f60eafbf009a 146 if (!ds_int) {
gmehmet 1:f60eafbf009a 147 pr_err("No DeviceStudio Interface defined!");
gmehmet 1:f60eafbf009a 148 return false;
gmehmet 1:f60eafbf009a 149 }
gmehmet 1:f60eafbf009a 150
gmehmet 1:f60eafbf009a 151 for (int i = 0; i < NUM_CMDS; i++) {
gmehmet 1:f60eafbf009a 152 if (starts_with(cmd, cmd_tbl[i])) {
gmehmet 1:f60eafbf009a 153 cmd_state_t user_cmd = (cmd_state_t)i;
gmehmet 1:f60eafbf009a 154 recognizedCmd = true;
gmehmet 1:f60eafbf009a 155
gmehmet 1:f60eafbf009a 156 switch (user_cmd) {
gmehmet 1:f60eafbf009a 157 case cmd_enter_bootldr:
gmehmet 1:f60eafbf009a 158 {
gmehmet 1:f60eafbf009a 159 SS_STATUS status;
gmehmet 1:f60eafbf009a 160 status = ss_int->reset_to_bootloader();
gmehmet 1:f60eafbf009a 161 if (status == SS_SUCCESS){
gmehmet 1:f60eafbf009a 162 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 163 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 164 }
gmehmet 1:f60eafbf009a 165 else{
gmehmet 1:f60eafbf009a 166 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 167 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 168 }
gmehmet 1:f60eafbf009a 169
gmehmet 1:f60eafbf009a 170 ds_int->set_fw_platform(ss_int->get_ss_platform_name());
gmehmet 1:f60eafbf009a 171 ds_int->set_fw_version(ss_int->get_ss_fw_version());
gmehmet 1:f60eafbf009a 172 got_page_size = false;
gmehmet 1:f60eafbf009a 173 sent_num_pages = false;
gmehmet 1:f60eafbf009a 174 } break;
gmehmet 1:f60eafbf009a 175
gmehmet 1:f60eafbf009a 176 case cmd_exit_bootldr:
gmehmet 1:f60eafbf009a 177 {
gmehmet 1:f60eafbf009a 178 SS_STATUS status = ss_int->reset_to_main_app();
gmehmet 1:f60eafbf009a 179 if (status == SS_SUCCESS){
gmehmet 1:f60eafbf009a 180 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 181 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 182 }
gmehmet 1:f60eafbf009a 183 else{
gmehmet 1:f60eafbf009a 184 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 185 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 186 }
gmehmet 1:f60eafbf009a 187
gmehmet 1:f60eafbf009a 188 ds_int->set_fw_platform(ss_int->get_ss_platform_name());
gmehmet 1:f60eafbf009a 189 ds_int->set_fw_version(ss_int->get_ss_fw_version());
gmehmet 1:f60eafbf009a 190
gmehmet 1:f60eafbf009a 191 } break;
gmehmet 1:f60eafbf009a 192
gmehmet 1:f60eafbf009a 193 case cmd_reset:
gmehmet 1:f60eafbf009a 194 {
gmehmet 1:f60eafbf009a 195 SS_STATUS status = ss_int->reset();
gmehmet 1:f60eafbf009a 196 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 197 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 198 else
gmehmet 1:f60eafbf009a 199 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 200 m_USB->printf("\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 201
gmehmet 1:f60eafbf009a 202 ds_int->set_fw_platform(ss_int->get_ss_platform_name());
gmehmet 1:f60eafbf009a 203 ds_int->set_fw_version(ss_int->get_ss_fw_version());
gmehmet 1:f60eafbf009a 204
gmehmet 1:f60eafbf009a 205 } break;
gmehmet 1:f60eafbf009a 206
gmehmet 1:f60eafbf009a 207 case cmd_page_size:
gmehmet 1:f60eafbf009a 208 {
gmehmet 1:f60eafbf009a 209 uint8_t cmd_bytes[] = { SS_FAM_R_BOOTLOADER, SS_CMDIDX_PAGESIZE };
gmehmet 1:f60eafbf009a 210 uint8_t rxbuf[3];
gmehmet 1:f60eafbf009a 211
gmehmet 1:f60eafbf009a 212 SS_STATUS status = ss_int->read_cmd(
gmehmet 1:f60eafbf009a 213 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 214 0, 0,
gmehmet 1:f60eafbf009a 215 &rxbuf[0], ARRAY_SIZE(rxbuf));
gmehmet 1:f60eafbf009a 216
gmehmet 1:f60eafbf009a 217 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 218 //rxbuf holds page size in big-endian format
gmehmet 1:f60eafbf009a 219 page_size = (256*(int)rxbuf[1]) + rxbuf[2];
gmehmet 1:f60eafbf009a 220 mxm_assert_msg(page_size <= MAX_PAGE_SIZE, "Page size exceeds maximum allowed");
gmehmet 1:f60eafbf009a 221
gmehmet 1:f60eafbf009a 222 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%d err=%d\r\n", cmd, page_size, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 223 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 224 got_page_size = true;
gmehmet 1:f60eafbf009a 225
gmehmet 1:f60eafbf009a 226 } else {
gmehmet 1:f60eafbf009a 227 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 228 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 229 }
gmehmet 1:f60eafbf009a 230 } break;
gmehmet 1:f60eafbf009a 231
gmehmet 1:f60eafbf009a 232 case cmd_num_pages:
gmehmet 1:f60eafbf009a 233 {
gmehmet 1:f60eafbf009a 234 int num_tok = sscanf(cmd, "num_pages %d", &num_pages);
gmehmet 1:f60eafbf009a 235 if (num_tok != 1) {
gmehmet 1:f60eafbf009a 236 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s value=%d err=%d\r\n", cmd, 0, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 237 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 238 break;
gmehmet 1:f60eafbf009a 239 }
gmehmet 1:f60eafbf009a 240
gmehmet 1:f60eafbf009a 241 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SETNUMPAGES };
gmehmet 1:f60eafbf009a 242 //num pages = 256*MSB + LSB
gmehmet 1:f60eafbf009a 243 uint8_t data[] = { (uint8_t)((num_pages >> 8) & 0xFF), (uint8_t)(num_pages & 0xFF) };
gmehmet 1:f60eafbf009a 244
gmehmet 1:f60eafbf009a 245 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 246 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 247 &data[0], ARRAY_SIZE(data));
gmehmet 1:f60eafbf009a 248
gmehmet 1:f60eafbf009a 249 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 250 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 251 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 252 sent_num_pages = true;
gmehmet 1:f60eafbf009a 253
gmehmet 1:f60eafbf009a 254 } else {
gmehmet 1:f60eafbf009a 255 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 256 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 257 }
gmehmet 1:f60eafbf009a 258 } break;
gmehmet 1:f60eafbf009a 259
gmehmet 1:f60eafbf009a 260 case cmd_set_iv:
gmehmet 1:f60eafbf009a 261 {
gmehmet 1:f60eafbf009a 262 uint8_t iv_bytes[AES_NONCE_SIZE];
gmehmet 1:f60eafbf009a 263 ret = parse_iv(cmd, &iv_bytes[0]);
gmehmet 1:f60eafbf009a 264 if (ret != COMM_SUCCESS) {
gmehmet 1:f60eafbf009a 265 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 266 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 267 }
gmehmet 1:f60eafbf009a 268 else
gmehmet 1:f60eafbf009a 269 {
gmehmet 1:f60eafbf009a 270 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SETIV };
gmehmet 1:f60eafbf009a 271
gmehmet 1:f60eafbf009a 272 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 273 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 274 &iv_bytes[0], ARRAY_SIZE(iv_bytes));
gmehmet 1:f60eafbf009a 275
gmehmet 1:f60eafbf009a 276 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 277 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 278 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 279
gmehmet 1:f60eafbf009a 280 } else {
gmehmet 1:f60eafbf009a 281 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 282 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 283 }
gmehmet 1:f60eafbf009a 284 }
gmehmet 1:f60eafbf009a 285 } break;
gmehmet 1:f60eafbf009a 286
gmehmet 1:f60eafbf009a 287 case cmd_set_auth:
gmehmet 1:f60eafbf009a 288 {
gmehmet 1:f60eafbf009a 289 uint8_t auth_bytes[AES_AUTH_SIZE];
gmehmet 1:f60eafbf009a 290 ret = parse_auth(cmd, &auth_bytes[0]);
gmehmet 1:f60eafbf009a 291 if (ret != COMM_SUCCESS) {
gmehmet 1:f60eafbf009a 292 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, ret);
gmehmet 1:f60eafbf009a 293 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 294 }
gmehmet 1:f60eafbf009a 295 else
gmehmet 1:f60eafbf009a 296 {
gmehmet 1:f60eafbf009a 297 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SETAUTH };
gmehmet 1:f60eafbf009a 298
gmehmet 1:f60eafbf009a 299 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 300 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 301 &auth_bytes[0], ARRAY_SIZE(auth_bytes));
gmehmet 1:f60eafbf009a 302
gmehmet 1:f60eafbf009a 303 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 304 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 305 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 306
gmehmet 1:f60eafbf009a 307 } else {
gmehmet 1:f60eafbf009a 308 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 309 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 310 }
gmehmet 1:f60eafbf009a 311 }
gmehmet 1:f60eafbf009a 312 } break;
gmehmet 1:f60eafbf009a 313
gmehmet 1:f60eafbf009a 314 case cmd_erase:
gmehmet 1:f60eafbf009a 315 {
gmehmet 1:f60eafbf009a 316 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_ERASE };
gmehmet 1:f60eafbf009a 317
gmehmet 1:f60eafbf009a 318 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 319 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 320 0, 0,
gmehmet 1:f60eafbf009a 321 SS_BOOTLOADER_ERASE_DELAY);
gmehmet 1:f60eafbf009a 322 if (status == SS_SUCCESS){
gmehmet 1:f60eafbf009a 323 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 324 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 325 }
gmehmet 1:f60eafbf009a 326 else{
gmehmet 1:f60eafbf009a 327 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 328 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 329 }
gmehmet 1:f60eafbf009a 330 } break;
gmehmet 1:f60eafbf009a 331
gmehmet 1:f60eafbf009a 332 case cmd_page_erase:
gmehmet 1:f60eafbf009a 333 {
gmehmet 1:f60eafbf009a 334 int page_num_to_erase;
gmehmet 1:f60eafbf009a 335 int num_tok = sscanf(cmd, "page_erase %d", &page_num_to_erase);
gmehmet 1:f60eafbf009a 336 if (num_tok != 1) {
gmehmet 1:f60eafbf009a 337 m_USB->printf("\r\n%s value=%d err=%d\r\n", cmd, 0, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 338 break;
gmehmet 1:f60eafbf009a 339 }
gmehmet 1:f60eafbf009a 340
gmehmet 1:f60eafbf009a 341 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_ERASE_PAGE };
gmehmet 1:f60eafbf009a 342 //num pages = 256*MSB + LSB
gmehmet 1:f60eafbf009a 343 uint8_t data[] = { (uint8_t)((page_num_to_erase >> 8) & 0xFF), (uint8_t)(page_num_to_erase & 0xFF) };
gmehmet 1:f60eafbf009a 344
gmehmet 1:f60eafbf009a 345 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 346 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 347 &data[0], ARRAY_SIZE(data), 50);
gmehmet 1:f60eafbf009a 348
gmehmet 1:f60eafbf009a 349 if (status == SS_SUCCESS) {
gmehmet 1:f60eafbf009a 350 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 351 sent_num_pages = true;
gmehmet 1:f60eafbf009a 352 } else {
gmehmet 1:f60eafbf009a 353 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 354 }
gmehmet 1:f60eafbf009a 355 } break;
gmehmet 1:f60eafbf009a 356
gmehmet 1:f60eafbf009a 357 case cmd_flash:
gmehmet 1:f60eafbf009a 358 {
gmehmet 1:f60eafbf009a 359 if (got_page_size && sent_num_pages) {
gmehmet 1:f60eafbf009a 360 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 361 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 362
gmehmet 1:f60eafbf009a 363 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 364 BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
gmehmet 1:f60eafbf009a 365 BLE_Icarus_TransferDataFromQueue();
gmehmet 1:f60eafbf009a 366 }
gmehmet 1:f60eafbf009a 367 BLE::Instance().waitForEvent();
gmehmet 1:f60eafbf009a 368
gmehmet 1:f60eafbf009a 369 flash_page_data();
gmehmet 1:f60eafbf009a 370 flash_flag=true;
gmehmet 1:f60eafbf009a 371 } else {
gmehmet 1:f60eafbf009a 372 pr_err("Can't enter flash mode. Need number of pages, and size of page"
gmehmet 1:f60eafbf009a 373 "(num_pages, page_size, commands)\r\n");
gmehmet 1:f60eafbf009a 374 data_len = snprintf(charbuf, sizeof(charbuf), "\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 375 m_USB->printf(charbuf);
gmehmet 1:f60eafbf009a 376 }
gmehmet 1:f60eafbf009a 377 } break;
gmehmet 1:f60eafbf009a 378
gmehmet 1:f60eafbf009a 379 case cmd_setcfg_bl_enter_mode:
gmehmet 1:f60eafbf009a 380 {
gmehmet 1:f60eafbf009a 381 uint8_t mode;
gmehmet 1:f60eafbf009a 382 ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
gmehmet 1:f60eafbf009a 383 if (ret != 1) {
gmehmet 1:f60eafbf009a 384 pr_err("parse_cmd_data=%d\r\n", ret);
gmehmet 1:f60eafbf009a 385 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 386 break;
gmehmet 1:f60eafbf009a 387 }
gmehmet 1:f60eafbf009a 388
gmehmet 1:f60eafbf009a 389 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_ENTRY, SS_BL_CFG_ENTER_BL_MODE, mode };
gmehmet 1:f60eafbf009a 390 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 391 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 392 0, 0);
gmehmet 1:f60eafbf009a 393 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 394 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 395 else
gmehmet 1:f60eafbf009a 396 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 397
gmehmet 1:f60eafbf009a 398 } break;
gmehmet 1:f60eafbf009a 399
gmehmet 1:f60eafbf009a 400 case cmd_setcfg_bl_ebl_pin:
gmehmet 1:f60eafbf009a 401 {
gmehmet 1:f60eafbf009a 402 uint8_t pin[2];
gmehmet 1:f60eafbf009a 403 ret = parse_cmd_data(cmd, cmd_tbl[i], &pin[0], 2, false);
gmehmet 1:f60eafbf009a 404 if (ret != 2) {
gmehmet 1:f60eafbf009a 405 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 406 break;
gmehmet 1:f60eafbf009a 407 }
gmehmet 1:f60eafbf009a 408
gmehmet 1:f60eafbf009a 409 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_ENTRY, SS_BL_CFG_EBL_PIN,
gmehmet 1:f60eafbf009a 410 pin[0], pin[1]};
gmehmet 1:f60eafbf009a 411 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 412 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 413 0, 0);
gmehmet 1:f60eafbf009a 414 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 415 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 416 else
gmehmet 1:f60eafbf009a 417 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 418
gmehmet 1:f60eafbf009a 419 } break;
gmehmet 1:f60eafbf009a 420
gmehmet 1:f60eafbf009a 421 case cmd_setcfg_bl_ebl_pol:
gmehmet 1:f60eafbf009a 422 {
gmehmet 1:f60eafbf009a 423 uint8_t mode;
gmehmet 1:f60eafbf009a 424 ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
gmehmet 1:f60eafbf009a 425 if (ret != 1) {
gmehmet 1:f60eafbf009a 426 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 427 break;
gmehmet 1:f60eafbf009a 428 }
gmehmet 1:f60eafbf009a 429
gmehmet 1:f60eafbf009a 430 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_ENTRY, SS_BL_CFG_EBL_POL, mode };
gmehmet 1:f60eafbf009a 431 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 432 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 433 0, 0);
gmehmet 1:f60eafbf009a 434 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 435 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 436 else
gmehmet 1:f60eafbf009a 437 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 438
gmehmet 1:f60eafbf009a 439 } break;
gmehmet 1:f60eafbf009a 440
gmehmet 1:f60eafbf009a 441 case cmd_setcfg_bl_exit_mode:
gmehmet 1:f60eafbf009a 442 {
gmehmet 1:f60eafbf009a 443 uint8_t mode;
gmehmet 1:f60eafbf009a 444 ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
gmehmet 1:f60eafbf009a 445 if (ret != 1) {
gmehmet 1:f60eafbf009a 446 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 447 break;
gmehmet 1:f60eafbf009a 448 }
gmehmet 1:f60eafbf009a 449
gmehmet 1:f60eafbf009a 450 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_EXIT, SS_BL_CFG_EXIT_BL_MODE, mode };
gmehmet 1:f60eafbf009a 451 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 452 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 453 0, 0);
gmehmet 1:f60eafbf009a 454 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 455 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 456 else
gmehmet 1:f60eafbf009a 457 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 458
gmehmet 1:f60eafbf009a 459 } break;
gmehmet 1:f60eafbf009a 460 case cmd_setcfg_bl_timeout:
gmehmet 1:f60eafbf009a 461 {
gmehmet 1:f60eafbf009a 462 uint8_t to;
gmehmet 1:f60eafbf009a 463 ret = parse_cmd_data(cmd, cmd_tbl[i], &to, 1, false);
gmehmet 1:f60eafbf009a 464 if (ret != 1) {
gmehmet 1:f60eafbf009a 465 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 466 break;
gmehmet 1:f60eafbf009a 467 }
gmehmet 1:f60eafbf009a 468
gmehmet 1:f60eafbf009a 469 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_EXIT, SS_BL_CFG_TIMEOUT, to };
gmehmet 1:f60eafbf009a 470 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 471 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 472 0, 0);
gmehmet 1:f60eafbf009a 473 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 474 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 475 else
gmehmet 1:f60eafbf009a 476 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 477
gmehmet 1:f60eafbf009a 478 } break;
gmehmet 1:f60eafbf009a 479 case cmd_setcfg_bl_save:
gmehmet 1:f60eafbf009a 480 {
gmehmet 1:f60eafbf009a 481 uint8_t cmd_bytes[] = { SS_FAM_W_BOOTLOADER_CFG, SS_CMDIDX_BL_SAVE };
gmehmet 1:f60eafbf009a 482
gmehmet 1:f60eafbf009a 483 SS_STATUS status = ss_int->write_cmd(
gmehmet 1:f60eafbf009a 484 &cmd_bytes[0], ARRAY_SIZE(cmd_bytes),
gmehmet 1:f60eafbf009a 485 0, 0, 50);
gmehmet 1:f60eafbf009a 486 if (status == SS_SUCCESS)
gmehmet 1:f60eafbf009a 487 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 488 else
gmehmet 1:f60eafbf009a 489 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_GENERAL_ERROR);
gmehmet 1:f60eafbf009a 490
gmehmet 1:f60eafbf009a 491 } break;
gmehmet 1:f60eafbf009a 492 case cmd_image_on_ram:
gmehmet 1:f60eafbf009a 493 {
gmehmet 1:f60eafbf009a 494 uint8_t mode = 0;
gmehmet 1:f60eafbf009a 495 ret = parse_cmd_data(cmd, cmd_tbl[i], &mode, 1, false);
gmehmet 1:f60eafbf009a 496 if (ret != 1) {
gmehmet 1:f60eafbf009a 497 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 498 break;
gmehmet 1:f60eafbf009a 499 }
gmehmet 1:f60eafbf009a 500
gmehmet 1:f60eafbf009a 501 /* TODO: Implement effects of this */
gmehmet 1:f60eafbf009a 502 flag_image_on_ram = !!mode;
gmehmet 1:f60eafbf009a 503 pr_info("flag_image_on_ram: %d, mode: %d\n", flag_image_on_ram, mode);
gmehmet 1:f60eafbf009a 504 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 505 break;
gmehmet 1:f60eafbf009a 506 } break;
gmehmet 1:f60eafbf009a 507 case cmd_setcfg_host_ebl:
gmehmet 1:f60eafbf009a 508 {
gmehmet 1:f60eafbf009a 509 uint8_t tmp; /* 0: Command bootloader, 1: No command, trigger GPIO */
gmehmet 1:f60eafbf009a 510
gmehmet 1:f60eafbf009a 511 int ret = parse_cmd_data(cmd, cmd_tbl[i], &tmp, 1, false);
gmehmet 1:f60eafbf009a 512 if (ret != 1) {
gmehmet 1:f60eafbf009a 513 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 514 break;
gmehmet 1:f60eafbf009a 515 }
gmehmet 1:f60eafbf009a 516
gmehmet 1:f60eafbf009a 517 if (ss_int->set_ebl_mode(tmp) == SS_SUCCESS)
gmehmet 1:f60eafbf009a 518 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 519 else
gmehmet 1:f60eafbf009a 520 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 521 break;
gmehmet 1:f60eafbf009a 522 } break;
gmehmet 1:f60eafbf009a 523 case cmd_setcfg_host_cdf:
gmehmet 1:f60eafbf009a 524 {
gmehmet 1:f60eafbf009a 525 uint8_t tmp;
gmehmet 1:f60eafbf009a 526
gmehmet 1:f60eafbf009a 527 int ret = parse_cmd_data(cmd, cmd_tbl[i], &tmp, 1, false);
gmehmet 1:f60eafbf009a 528 if (ret != 1) {
gmehmet 1:f60eafbf009a 529 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_INVALID_PARAM);
gmehmet 1:f60eafbf009a 530 break;
gmehmet 1:f60eafbf009a 531 }
gmehmet 1:f60eafbf009a 532
gmehmet 1:f60eafbf009a 533 /* TODO: Implement effects of this */
gmehmet 1:f60eafbf009a 534 bl_comm_delay_factor = tmp;
gmehmet 1:f60eafbf009a 535 m_USB->printf("\r\n%s err=%d\r\n", cmd, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 536 break;
gmehmet 1:f60eafbf009a 537 } break;
gmehmet 1:f60eafbf009a 538 case cmd_getcfg_host:
gmehmet 1:f60eafbf009a 539 {
gmehmet 1:f60eafbf009a 540 m_USB->printf("\r\n%s ebl=%d cdf=%d err=%d\r\n", cmd, ss_int->get_ebl_mode(), bl_comm_delay_factor, COMM_SUCCESS);
gmehmet 1:f60eafbf009a 541 } break;
gmehmet 1:f60eafbf009a 542 default:
gmehmet 1:f60eafbf009a 543 {
gmehmet 1:f60eafbf009a 544 mxm_assert_msg(false, "Invalid switch case!");
gmehmet 1:f60eafbf009a 545 }
gmehmet 1:f60eafbf009a 546 }
gmehmet 1:f60eafbf009a 547
gmehmet 1:f60eafbf009a 548
gmehmet 1:f60eafbf009a 549 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 550 if(flash_flag==false)
gmehmet 1:f60eafbf009a 551 {
gmehmet 1:f60eafbf009a 552 BLE_Icarus_AddtoQueue((uint8_t *)charbuf, (int32_t)sizeof(charbuf), data_len);
gmehmet 1:f60eafbf009a 553 }
gmehmet 1:f60eafbf009a 554 }
gmehmet 1:f60eafbf009a 555
gmehmet 1:f60eafbf009a 556
gmehmet 1:f60eafbf009a 557 }
gmehmet 1:f60eafbf009a 558 }
gmehmet 1:f60eafbf009a 559
gmehmet 1:f60eafbf009a 560 return recognizedCmd;
gmehmet 1:f60eafbf009a 561 }
gmehmet 1:f60eafbf009a 562
gmehmet 1:f60eafbf009a 563 void SSBootloaderComm::flash_page_data(void)
gmehmet 1:f60eafbf009a 564 {
gmehmet 1:f60eafbf009a 565 int totalBytes = 0;
gmehmet 1:f60eafbf009a 566 int currentPage = 1;
gmehmet 1:f60eafbf009a 567 char charbuf_flash[256];
gmehmet 1:f60eafbf009a 568 int data_len_flash = 0;
gmehmet 1:f60eafbf009a 569
gmehmet 1:f60eafbf009a 570 static uint8_t tx_buf[MAX_PAGE_SIZE + CHECKBYTES_SIZE + 2] = { SS_FAM_W_BOOTLOADER, SS_CMDIDX_SENDPAGE };
gmehmet 1:f60eafbf009a 571 uint8_t *data_buffer = &tx_buf[2];
gmehmet 1:f60eafbf009a 572
gmehmet 1:f60eafbf009a 573 while (currentPage <= num_pages) {
gmehmet 1:f60eafbf009a 574 pr_info("Waiting for page %d/%d data (%d bytes)...", currentPage, num_pages, page_size);
gmehmet 1:f60eafbf009a 575
gmehmet 1:f60eafbf009a 576 //Collect page data + checksum from PC/Android
gmehmet 1:f60eafbf009a 577 // totalBytes = 100;
gmehmet 1:f60eafbf009a 578 while (totalBytes < (page_size + CHECKBYTES_SIZE)) {
gmehmet 1:f60eafbf009a 579 data_buffer[totalBytes++] = m_USB->_getc();
gmehmet 1:f60eafbf009a 580 //Here we should be able to take the data over BLE
gmehmet 1:f60eafbf009a 581 }
gmehmet 1:f60eafbf009a 582
gmehmet 1:f60eafbf009a 583 pr_info("Done\r\n");
gmehmet 1:f60eafbf009a 584
gmehmet 1:f60eafbf009a 585 //Send data to SmartSensor
gmehmet 1:f60eafbf009a 586 SS_STATUS status = ss_int->write_cmd(tx_buf, page_size + CHECKBYTES_SIZE + 2, 2000 /*bl_comm_delay_factor * PAGE_WRITE_DELAY_MS*/);
gmehmet 1:f60eafbf009a 587 pr_err("status: %d\r\n", status);
gmehmet 1:f60eafbf009a 588
gmehmet 1:f60eafbf009a 589 //Inform PC/Andoid of status
gmehmet 1:f60eafbf009a 590 if (status == SS_ERR_BTLDR_CHECKSUM) {
gmehmet 1:f60eafbf009a 591 pr_err("Verify checksum failed!\r\n");
gmehmet 1:f60eafbf009a 592 data_len_flash = snprintf(charbuf_flash, sizeof(charbuf_flash), "\r\npageFlashDone err=%d\r\n", FLASH_ERR_CHECKSUM);
gmehmet 1:f60eafbf009a 593 m_USB->printf(charbuf_flash);
gmehmet 1:f60eafbf009a 594 } else if (status != SS_SUCCESS) {
gmehmet 1:f60eafbf009a 595 pr_err("Page flash failed!\r\n");
gmehmet 1:f60eafbf009a 596 data_len_flash = snprintf(charbuf_flash, sizeof(charbuf_flash), "\r\npageFlashDone err=%d\r\n", FLASH_ERR_GENERAL);
gmehmet 1:f60eafbf009a 597 m_USB->printf(charbuf_flash);
gmehmet 1:f60eafbf009a 598 } else {
gmehmet 1:f60eafbf009a 599 currentPage++;
gmehmet 1:f60eafbf009a 600 pr_err("Page flash successful!\r\n");
gmehmet 1:f60eafbf009a 601 data_len_flash = snprintf(charbuf_flash, sizeof(charbuf_flash), "\r\npageFlashDone err=%d\r\n", COMM_SUCCESS);
gmehmet 1:f60eafbf009a 602 m_USB->printf(charbuf_flash);
gmehmet 1:f60eafbf009a 603 }
gmehmet 1:f60eafbf009a 604
gmehmet 1:f60eafbf009a 605 totalBytes = 0;
gmehmet 1:f60eafbf009a 606
gmehmet 1:f60eafbf009a 607 if (BLE::Instance().gap().getState().connected) {
gmehmet 1:f60eafbf009a 608 BLE_Icarus_AddtoQueue((uint8_t *)charbuf_flash, (int32_t)sizeof(charbuf_flash), data_len_flash);
gmehmet 1:f60eafbf009a 609 BLE_Icarus_TransferDataFromQueue();
gmehmet 1:f60eafbf009a 610 }
gmehmet 1:f60eafbf009a 611 BLE::Instance().waitForEvent();
gmehmet 1:f60eafbf009a 612
gmehmet 1:f60eafbf009a 613
gmehmet 1:f60eafbf009a 614 }
gmehmet 1:f60eafbf009a 615 }