Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Oct 23 14:44:56 2019 +0000
Revision:
33:9cd782e2b423
Parent:
32:e3ee65b5b835
Release SH2050 v5.3.254

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 22:f2b01e5e087e 1 #include "DebouncedInterrupt.h"
Jeej 22:f2b01e5e087e 2 #include "modem_ref_helper.h"
Jeej 22:f2b01e5e087e 3 #include "modem_callbacks.h"
Jeej 22:f2b01e5e087e 4 #include "bin.h"
Jeej 0:82a60d86ab2e 5 #include "cup.h"
Jeej 0:82a60d86ab2e 6
Jeej 0:82a60d86ab2e 7
Jeej 2:e0cdfa7d2a8b 8 // To udate your firmware:
Jeej 2:e0cdfa7d2a8b 9 // - Specify your root key
Jeej 2:e0cdfa7d2a8b 10 // - Choose your Hardware in bin.h
Jeej 2:e0cdfa7d2a8b 11 // - Program your NUCLEO with your modem stacked
Jeej 2:e0cdfa7d2a8b 12 // - Follow the instructions printed on the debug port
Jeej 2:e0cdfa7d2a8b 13
Jeej 2:e0cdfa7d2a8b 14
Jeej 2:e0cdfa7d2a8b 15 // This is the default root key
Jeej 2:e0cdfa7d2a8b 16 // if you have changed this key, please specify it here
Jeej 12:beabd59e0c35 17 uint8_t root_key[CUP_DEFAULT_KEY_SIZE] = CUP_DEFAULT_KEY;
Jeej 12:beabd59e0c35 18 uint8_t root_key_size = CUP_DEFAULT_KEY_SIZE;
Jeej 12:beabd59e0c35 19
Jeej 0:82a60d86ab2e 20 // Semaphore for notifiying button presses
Jeej 0:82a60d86ab2e 21 Semaphore button_user(0);
Jeej 22:f2b01e5e087e 22 Semaphore modem_ready(0);
Jeej 0:82a60d86ab2e 23
Jeej 0:82a60d86ab2e 24 // Interrupt Service Routine on button press.
Jeej 0:82a60d86ab2e 25 void button_push_isr( void )
Jeej 0:82a60d86ab2e 26 {
Jeej 0:82a60d86ab2e 27 button_user.release();
Jeej 0:82a60d86ab2e 28 }
Jeej 0:82a60d86ab2e 29
Jeej 7:5b8648784381 30 uint8_t check_parameter(const char* str, uint32_t param1, uint32_t param2)
Jeej 7:5b8648784381 31 {
Jeej 7:5b8648784381 32 PRINT("Checking %s ", str);
Jeej 7:5b8648784381 33 if (param1 != param2)
Jeej 7:5b8648784381 34 {
Jeej 7:5b8648784381 35 PRINT("Failed. (0x%08X != 0x%08X)\r\n", param1, param2);
Jeej 7:5b8648784381 36 return 1;
Jeej 7:5b8648784381 37 }
Jeej 7:5b8648784381 38 else
Jeej 7:5b8648784381 39 {
Jeej 7:5b8648784381 40 PRINT("OK. (0x%08X)\r\n", param1);
Jeej 7:5b8648784381 41 return 0;
Jeej 7:5b8648784381 42 }
Jeej 7:5b8648784381 43 }
Jeej 7:5b8648784381 44
Jeej 15:24434827c575 45 void print_check_rev(void)
Jeej 15:24434827c575 46 {
Jeej 17:05c9ec970a6d 47 PRINT("\r\n"
Jeej 17:05c9ec970a6d 48 "/!\\ Please, check that you are at the right commit in the mbed revision tree /!\\\r\n"
Jeej 17:05c9ec970a6d 49 );
Jeej 15:24434827c575 50 }
Jeej 15:24434827c575 51
Jeej 15:24434827c575 52 void print_check_hardware(void)
Jeej 15:24434827c575 53 {
Jeej 15:24434827c575 54 PRINT("Please, check that you chose the right Hardware in bin.h\r\n");
Jeej 15:24434827c575 55 }
Jeej 15:24434827c575 56
Jeej 22:f2b01e5e087e 57 int32_t check_slack(uint32_t cup_max_size, uint32_t cup_data_size)
Jeej 15:24434827c575 58 {
Jeej 16:5a6168dbe7bb 59 //PRINT("key: %d data: %d code: %d src: %d\r\n", cup_cfg->key, cup->data_size, cup->code_size, cup_cfg->src_offset);
Jeej 15:24434827c575 60 PRINT("Checking CUP Slack... ");
Jeej 16:5a6168dbe7bb 61
Jeej 18:a8a640941018 62 //int32_t data_size = (((cup->data_size/256)+1)*256);
Jeej 22:f2b01e5e087e 63 int32_t cup_slack = cup_max_size - cup_data_size;
Jeej 18:a8a640941018 64
Jeej 18:a8a640941018 65 cup_slack = ((cup_slack/256)*256);
Jeej 15:24434827c575 66
Jeej 15:24434827c575 67 if (cup_slack < 0)
Jeej 15:24434827c575 68 {
Jeej 15:24434827c575 69 PRINT("Failed. (%d bytes short)\r\n", -cup_slack);
Jeej 15:24434827c575 70 }
Jeej 15:24434827c575 71 else
Jeej 15:24434827c575 72 {
Jeej 15:24434827c575 73 PRINT("OK. (%d bytes)\r\n", cup_slack);
Jeej 15:24434827c575 74 }
Jeej 15:24434827c575 75
Jeej 15:24434827c575 76 return cup_slack;
Jeej 15:24434827c575 77 }
Jeej 15:24434827c575 78
Jeej 22:f2b01e5e087e 79 modem_callbacks_t callbacks = {
Jeej 22:f2b01e5e087e 80 .read = my_read,
Jeej 22:f2b01e5e087e 81 .write = my_write,
Jeej 22:f2b01e5e087e 82 .read_fprop = my_read_fprop,
Jeej 22:f2b01e5e087e 83 .flush = my_flush,
Jeej 22:f2b01e5e087e 84 .remove = my_delete,
Jeej 22:f2b01e5e087e 85 .udata = my_udata,
Jeej 22:f2b01e5e087e 86 .lqual = my_lqual,
Jeej 22:f2b01e5e087e 87 .ldown = my_ldown,
Jeej 22:f2b01e5e087e 88 .reset = my_reset,
Jeej 29:aa16a927f0eb 89 .boot = my_boot,
Jeej 29:aa16a927f0eb 90 .busy = my_busy,
Jeej 22:f2b01e5e087e 91 };
Jeej 22:f2b01e5e087e 92
Jeej 22:f2b01e5e087e 93 // Callback for g_main_id User
Jeej 22:f2b01e5e087e 94 void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 22:f2b01e5e087e 95 {
Jeej 22:f2b01e5e087e 96 (void)id;
Jeej 22:f2b01e5e087e 97
Jeej 22:f2b01e5e087e 98 if (terminal)
Jeej 22:f2b01e5e087e 99 {
Jeej 22:f2b01e5e087e 100 if (err)
Jeej 22:f2b01e5e087e 101 {
Jeej 22:f2b01e5e087e 102 PRINT("Done err %d\n", err);
Jeej 22:f2b01e5e087e 103 FLUSH();
Jeej 22:f2b01e5e087e 104 while(1);
Jeej 22:f2b01e5e087e 105 }
Jeej 22:f2b01e5e087e 106 modem_ready.release();
Jeej 22:f2b01e5e087e 107 }
Jeej 22:f2b01e5e087e 108 else if (err)
Jeej 22:f2b01e5e087e 109 {
Jeej 22:f2b01e5e087e 110 PRINT("Got err %d\n", err);
Jeej 22:f2b01e5e087e 111 FLUSH();
Jeej 22:f2b01e5e087e 112 while(1);
Jeej 22:f2b01e5e087e 113 }
Jeej 22:f2b01e5e087e 114 }
Jeej 22:f2b01e5e087e 115
Jeej 22:f2b01e5e087e 116 uint8_t g_main_id;
Jeej 22:f2b01e5e087e 117
Jeej 0:82a60d86ab2e 118 int main()
Jeej 0:82a60d86ab2e 119 {
Jeej 15:24434827c575 120 bool bootloader;
Jeej 22:f2b01e5e087e 121 revision_t rev;
Jeej 15:24434827c575 122 cup_param_t* cup = (cup_param_t*)&cup_modem;
Jeej 22:f2b01e5e087e 123 int32_t cup_slack = 0;
Jeej 0:82a60d86ab2e 124
Jeej 0:82a60d86ab2e 125 // Start & initialize
Jeej 26:7fc24677a950 126 #ifdef DEBUG_LED
Jeej 12:beabd59e0c35 127 DBG_OPEN(DEBUG_LED);
Jeej 26:7fc24677a950 128 #else
Jeej 26:7fc24677a950 129 DBG_OPEN(NC);
Jeej 26:7fc24677a950 130 #endif
Jeej 13:c3324b26d473 131 PRINT("\r\n"
Jeej 24:3aa9b3b4a89c 132 "-----------------------------------------\r\n"
Jeej 24:3aa9b3b4a89c 133 "------------- D7A WM Updater ------------\r\n"
Jeej 24:3aa9b3b4a89c 134 "-----------------------------------------\r\n");
Jeej 32:e3ee65b5b835 135
Jeej 33:9cd782e2b423 136 //PRINT("SystemCoreClock is %d Hz\r\n", SystemCoreClock);
Jeej 0:82a60d86ab2e 137
Jeej 12:beabd59e0c35 138 #ifdef DEBUG_BUTTON
Jeej 12:beabd59e0c35 139 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:82a60d86ab2e 140 user_interrupt.attach(button_push_isr, IRQ_FALL, 200, true);
Jeej 12:beabd59e0c35 141 #endif
Jeej 0:82a60d86ab2e 142
Jeej 22:f2b01e5e087e 143 modem_helper_open(&callbacks);
Jeej 22:f2b01e5e087e 144
Jeej 22:f2b01e5e087e 145 g_main_id = modem_get_id(my_main_callback);
Jeej 0:82a60d86ab2e 146
Jeej 13:c3324b26d473 147 do
Jeej 0:82a60d86ab2e 148 {
Jeej 13:c3324b26d473 149 // Check modem revision
Jeej 22:f2b01e5e087e 150 modem_read_file(D7A_FID_FIRMWARE_VERSION, &rev, 0, sizeof(revision_t), g_main_id);
Jeej 32:e3ee65b5b835 151 modem_ready.acquire();
Jeej 13:c3324b26d473 152
Jeej 15:24434827c575 153 if (check_parameter("Manufacturer ID... ", rev.manufacturer_id, cup->mfg_id))
Jeej 13:c3324b26d473 154 {
Jeej 15:24434827c575 155 print_check_rev();
Jeej 13:c3324b26d473 156 break;
Jeej 13:c3324b26d473 157 }
Jeej 13:c3324b26d473 158
Jeej 22:f2b01e5e087e 159 if (check_parameter("Hardware version... ", rev.hw_version, cup->hw_id))
Jeej 13:c3324b26d473 160 {
Jeej 15:24434827c575 161 print_check_hardware();
Jeej 13:c3324b26d473 162 break;
Jeej 13:c3324b26d473 163 }
Jeej 13:c3324b26d473 164
Jeej 15:24434827c575 165 if (rev.device_id == BOOTLOADER_DEV_ID)
Jeej 13:c3324b26d473 166 {
Jeej 15:24434827c575 167 // Update bootloader
Jeej 16:5a6168dbe7bb 168 PRINT("\r\n"
Jeej 26:7fc24677a950 169 "/!\\ This modem has a bootloader firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 170 "/!\\ Step 2/2: Upgrading to full modem firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 171 );
Jeej 15:24434827c575 172
Jeej 26:7fc24677a950 173 /*
Jeej 22:f2b01e5e087e 174 cup_slack = check_slack(rev.cup_max_size, cup->data_size);
Jeej 15:24434827c575 175
Jeej 15:24434827c575 176 if (cup_slack < 0)
Jeej 15:24434827c575 177 {
Jeej 26:7fc24677a950 178 PRINT("/!\\ Not enough space for firmware /!\\\r\n");
Jeej 15:24434827c575 179 break;
Jeej 15:24434827c575 180 }
Jeej 26:7fc24677a950 181 */
Jeej 26:7fc24677a950 182
Jeej 26:7fc24677a950 183 cup_start_update(0);
Jeej 13:c3324b26d473 184 }
Jeej 15:24434827c575 185 else
Jeej 0:82a60d86ab2e 186 {
Jeej 15:24434827c575 187 uint32_t version_old = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
Jeej 15:24434827c575 188 uint32_t version_new = (cup->fw_major << 24) | (cup->fw_minor << 16) | cup->fw_patch;
Jeej 15:24434827c575 189
Jeej 15:24434827c575 190 // Update modem
Jeej 15:24434827c575 191 if (check_parameter("Device ID... ", rev.device_id, cup->dev_id))
Jeej 15:24434827c575 192 {
Jeej 15:24434827c575 193 print_check_rev();
Jeej 15:24434827c575 194 break;
Jeej 15:24434827c575 195 }
Jeej 15:24434827c575 196
Jeej 15:24434827c575 197 if (version_old != version_new)
Jeej 15:24434827c575 198 {
Jeej 27:25be84b17eec 199 PRINT("Checking Firmware version major... ");
Jeej 27:25be84b17eec 200 if (rev.fw_version.major < cup->target_fw_major)
Jeej 15:24434827c575 201 {
Jeej 27:25be84b17eec 202 PRINT("Failed. (0x%08X != 0x%08X)\r\n", rev.fw_version.major, cup->target_fw_major);
Jeej 15:24434827c575 203 print_check_rev();
Jeej 15:24434827c575 204 break;
Jeej 15:24434827c575 205 }
Jeej 27:25be84b17eec 206 else
Jeej 27:25be84b17eec 207 {
Jeej 27:25be84b17eec 208 PRINT("OK. (0x%08X)\r\n", rev.fw_version.major);
Jeej 27:25be84b17eec 209 }
Jeej 17:05c9ec970a6d 210
Jeej 26:7fc24677a950 211 PRINT("Checking Firmware version minor... ");
Jeej 27:25be84b17eec 212 if (rev.fw_version.minor < cup->target_fw_minor && rev.fw_version.major == cup->target_fw_major)
Jeej 15:24434827c575 213 {
Jeej 26:7fc24677a950 214 PRINT("Failed. (0x%08X != 0x%08X)\r\n", rev.fw_version.minor, cup->target_fw_minor);
Jeej 15:24434827c575 215 print_check_rev();
Jeej 15:24434827c575 216 break;
Jeej 17:05c9ec970a6d 217 }
Jeej 26:7fc24677a950 218 else
Jeej 26:7fc24677a950 219 {
Jeej 26:7fc24677a950 220 PRINT("OK. (0x%08X)\r\n", rev.fw_version.minor);
Jeej 26:7fc24677a950 221 }
Jeej 15:24434827c575 222 }
Jeej 15:24434827c575 223 else
Jeej 15:24434827c575 224 {
Jeej 33:9cd782e2b423 225 PRINT("\r\n"
Jeej 33:9cd782e2b423 226 "-----------------------------------------\r\n"
Jeej 33:9cd782e2b423 227 "Your modem is up to date! (v%d.%d.%d)\r\n"
Jeej 33:9cd782e2b423 228 "-----------------------------------------\r\n"
Jeej 33:9cd782e2b423 229 "\r\n",
Jeej 15:24434827c575 230 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch);
Jeej 15:24434827c575 231 }
Jeej 15:24434827c575 232
Jeej 22:f2b01e5e087e 233 cup_slack = check_slack(rev.cup_max_size, cup->data_size);
Jeej 15:24434827c575 234
Jeej 15:24434827c575 235 if (cup_slack < 0)
Jeej 15:24434827c575 236 {
Jeej 16:5a6168dbe7bb 237 PRINT("\r\n"
Jeej 26:7fc24677a950 238 "/!\\ Not enough space for full modem firmware binary. /!\\\r\n"
Jeej 26:7fc24677a950 239 "/!\\ Checking for bootloader firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 240 "\r\n"
Jeej 16:5a6168dbe7bb 241 );
Jeej 22:f2b01e5e087e 242
Jeej 22:f2b01e5e087e 243 cup_slack = check_slack(rev.cup_max_size, ((cup_param_t*)&cup_bootloader)->data_size);
Jeej 15:24434827c575 244
Jeej 15:24434827c575 245 if (cup_slack < 0)
Jeej 15:24434827c575 246 {
Jeej 15:24434827c575 247 PRINT("/!\\ Not enough space for bootloader /!\\\r\n");
Jeej 15:24434827c575 248 break;
Jeej 15:24434827c575 249 }
Jeej 15:24434827c575 250
Jeej 15:24434827c575 251 bootloader = true;
Jeej 16:5a6168dbe7bb 252
Jeej 16:5a6168dbe7bb 253 PRINT("\r\n"
Jeej 16:5a6168dbe7bb 254 "/!\\ This update will be done in 2 steps. /!\\\r\n"
Jeej 16:5a6168dbe7bb 255 "/!\\ Step 1/2: Upgrading modem to bootloader. /!\\\r\n"
Jeej 16:5a6168dbe7bb 256 "/!\\ Do no push the reset button or turn off the board during upgrade. /!\\\r\n"
Jeej 16:5a6168dbe7bb 257 );
Jeej 15:24434827c575 258 }
Jeej 15:24434827c575 259 else
Jeej 15:24434827c575 260 {
Jeej 15:24434827c575 261 bootloader = false;
Jeej 15:24434827c575 262 }
Jeej 15:24434827c575 263
Jeej 15:24434827c575 264 if (version_old > version_new)
Jeej 15:24434827c575 265 {
Jeej 15:24434827c575 266 PRINT("/!\\ Your modem is at a more recent version (v%d.%d.%d)/!\\\r\n"
Jeej 15:24434827c575 267 "/!\\ Are you sure you want to downgrade to v%d.%d.%d ? /!\\\r\n",
Jeej 15:24434827c575 268 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 269 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 270 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 271 PRINT("PRESS USER BUTTON TO CONFIRM...\r\n");
Jeej 32:e3ee65b5b835 272 button_user.acquire();
Jeej 18:a8a640941018 273 #endif
Jeej 15:24434827c575 274 PRINT("\r\nDowngrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 15:24434827c575 275 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 276 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 277 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 278 PRINT("PRESS USER BUTTON TO START DOWNGRADE...\r\n");
Jeej 32:e3ee65b5b835 279 button_user.acquire();
Jeej 18:a8a640941018 280 #endif
Jeej 15:24434827c575 281 }
Jeej 15:24434827c575 282 else if (version_old != version_new)
Jeej 15:24434827c575 283 {
Jeej 15:24434827c575 284 PRINT("\r\nUpgrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 15:24434827c575 285 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 286 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 287 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 288 PRINT("PRESS USER BUTTON TO START UPGRADE...\r\n");
Jeej 32:e3ee65b5b835 289 button_user.acquire();
Jeej 18:a8a640941018 290 #endif
Jeej 15:24434827c575 291 }
Jeej 20:100143cecc41 292 else
Jeej 20:100143cecc41 293 {
Jeej 26:7fc24677a950 294 #ifdef DEBUG_BUTTON
Jeej 20:100143cecc41 295 PRINT("\r\nReseting firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 20:100143cecc41 296 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 20:100143cecc41 297 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 28:5c9c420c666e 298 PRINT("PRESS USER BUTTON TO START RESET...\r\n");
Jeej 32:e3ee65b5b835 299 button_user.acquire();
Jeej 26:7fc24677a950 300 #else
Jeej 26:7fc24677a950 301 // No button to stop code
Jeej 26:7fc24677a950 302 break;
Jeej 20:100143cecc41 303 #endif
Jeej 20:100143cecc41 304 }
Jeej 15:24434827c575 305
Jeej 16:5a6168dbe7bb 306 cup_start_update(cup_slack, bootloader);
Jeej 12:beabd59e0c35 307 }
Jeej 13:c3324b26d473 308
Jeej 13:c3324b26d473 309 } while (0);
Jeej 0:82a60d86ab2e 310
Jeej 0:82a60d86ab2e 311 // Set main task to lowest priority
Jeej 32:e3ee65b5b835 312 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:82a60d86ab2e 313 while(true)
Jeej 0:82a60d86ab2e 314 {
Jeej 0:82a60d86ab2e 315 // Wait to avoid beeing stuck in loop
Jeej 32:e3ee65b5b835 316 ThisThread::sleep_for(200);
Jeej 0:82a60d86ab2e 317 }
Jeej 0:82a60d86ab2e 318 }