Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Tue Aug 20 13:51:30 2019 +0000
Revision:
32:e3ee65b5b835
Parent:
29:aa16a927f0eb
Child:
33:9cd782e2b423
Release SH2050 v5.3.217

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 32:e3ee65b5b835 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 15:24434827c575 225 PRINT("\r\nYour modem is up to date! (v%d.%d.%d)\r\n",
Jeej 15:24434827c575 226 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch);
Jeej 15:24434827c575 227 }
Jeej 15:24434827c575 228
Jeej 22:f2b01e5e087e 229 cup_slack = check_slack(rev.cup_max_size, cup->data_size);
Jeej 15:24434827c575 230
Jeej 15:24434827c575 231 if (cup_slack < 0)
Jeej 15:24434827c575 232 {
Jeej 16:5a6168dbe7bb 233 PRINT("\r\n"
Jeej 26:7fc24677a950 234 "/!\\ Not enough space for full modem firmware binary. /!\\\r\n"
Jeej 26:7fc24677a950 235 "/!\\ Checking for bootloader firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 236 "\r\n"
Jeej 16:5a6168dbe7bb 237 );
Jeej 22:f2b01e5e087e 238
Jeej 22:f2b01e5e087e 239 cup_slack = check_slack(rev.cup_max_size, ((cup_param_t*)&cup_bootloader)->data_size);
Jeej 15:24434827c575 240
Jeej 15:24434827c575 241 if (cup_slack < 0)
Jeej 15:24434827c575 242 {
Jeej 15:24434827c575 243 PRINT("/!\\ Not enough space for bootloader /!\\\r\n");
Jeej 15:24434827c575 244 break;
Jeej 15:24434827c575 245 }
Jeej 15:24434827c575 246
Jeej 15:24434827c575 247 bootloader = true;
Jeej 16:5a6168dbe7bb 248
Jeej 16:5a6168dbe7bb 249 PRINT("\r\n"
Jeej 16:5a6168dbe7bb 250 "/!\\ This update will be done in 2 steps. /!\\\r\n"
Jeej 16:5a6168dbe7bb 251 "/!\\ Step 1/2: Upgrading modem to bootloader. /!\\\r\n"
Jeej 16:5a6168dbe7bb 252 "/!\\ Do no push the reset button or turn off the board during upgrade. /!\\\r\n"
Jeej 16:5a6168dbe7bb 253 );
Jeej 15:24434827c575 254 }
Jeej 15:24434827c575 255 else
Jeej 15:24434827c575 256 {
Jeej 15:24434827c575 257 bootloader = false;
Jeej 15:24434827c575 258 }
Jeej 15:24434827c575 259
Jeej 15:24434827c575 260 if (version_old > version_new)
Jeej 15:24434827c575 261 {
Jeej 15:24434827c575 262 PRINT("/!\\ Your modem is at a more recent version (v%d.%d.%d)/!\\\r\n"
Jeej 15:24434827c575 263 "/!\\ Are you sure you want to downgrade to v%d.%d.%d ? /!\\\r\n",
Jeej 15:24434827c575 264 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 265 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 266 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 267 PRINT("PRESS USER BUTTON TO CONFIRM...\r\n");
Jeej 32:e3ee65b5b835 268 button_user.acquire();
Jeej 18:a8a640941018 269 #endif
Jeej 15:24434827c575 270 PRINT("\r\nDowngrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 15:24434827c575 271 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 272 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 273 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 274 PRINT("PRESS USER BUTTON TO START DOWNGRADE...\r\n");
Jeej 32:e3ee65b5b835 275 button_user.acquire();
Jeej 18:a8a640941018 276 #endif
Jeej 15:24434827c575 277 }
Jeej 15:24434827c575 278 else if (version_old != version_new)
Jeej 15:24434827c575 279 {
Jeej 15:24434827c575 280 PRINT("\r\nUpgrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 15:24434827c575 281 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 282 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 283 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 284 PRINT("PRESS USER BUTTON TO START UPGRADE...\r\n");
Jeej 32:e3ee65b5b835 285 button_user.acquire();
Jeej 18:a8a640941018 286 #endif
Jeej 15:24434827c575 287 }
Jeej 20:100143cecc41 288 else
Jeej 20:100143cecc41 289 {
Jeej 26:7fc24677a950 290 #ifdef DEBUG_BUTTON
Jeej 20:100143cecc41 291 PRINT("\r\nReseting firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 20:100143cecc41 292 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 20:100143cecc41 293 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 28:5c9c420c666e 294 PRINT("PRESS USER BUTTON TO START RESET...\r\n");
Jeej 32:e3ee65b5b835 295 button_user.acquire();
Jeej 26:7fc24677a950 296 #else
Jeej 26:7fc24677a950 297 // No button to stop code
Jeej 26:7fc24677a950 298 break;
Jeej 20:100143cecc41 299 #endif
Jeej 20:100143cecc41 300 }
Jeej 15:24434827c575 301
Jeej 16:5a6168dbe7bb 302 cup_start_update(cup_slack, bootloader);
Jeej 12:beabd59e0c35 303 }
Jeej 13:c3324b26d473 304
Jeej 13:c3324b26d473 305 } while (0);
Jeej 0:82a60d86ab2e 306
Jeej 0:82a60d86ab2e 307 // Set main task to lowest priority
Jeej 32:e3ee65b5b835 308 osThreadSetPriority(osThreadGetId(), osPriorityLow);
Jeej 0:82a60d86ab2e 309 while(true)
Jeej 0:82a60d86ab2e 310 {
Jeej 0:82a60d86ab2e 311 // Wait to avoid beeing stuck in loop
Jeej 32:e3ee65b5b835 312 ThisThread::sleep_for(200);
Jeej 0:82a60d86ab2e 313 }
Jeej 0:82a60d86ab2e 314 }