Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Oct 17 09:27:48 2018 +0000
Revision:
29:aa16a927f0eb
Parent:
28:5c9c420c666e
Child:
32:e3ee65b5b835
Release v5.2.358 for SH2001 and SH2050 v5.0.36.; SH2030 no longer supported.

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 0:82a60d86ab2e 135
Jeej 12:beabd59e0c35 136 #ifdef DEBUG_BUTTON
Jeej 12:beabd59e0c35 137 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
Jeej 0:82a60d86ab2e 138 user_interrupt.attach(button_push_isr, IRQ_FALL, 200, true);
Jeej 12:beabd59e0c35 139 #endif
Jeej 0:82a60d86ab2e 140
Jeej 22:f2b01e5e087e 141 modem_helper_open(&callbacks);
Jeej 22:f2b01e5e087e 142
Jeej 22:f2b01e5e087e 143 g_main_id = modem_get_id(my_main_callback);
Jeej 0:82a60d86ab2e 144
Jeej 13:c3324b26d473 145 do
Jeej 0:82a60d86ab2e 146 {
Jeej 13:c3324b26d473 147 // Check modem revision
Jeej 22:f2b01e5e087e 148 modem_read_file(D7A_FID_FIRMWARE_VERSION, &rev, 0, sizeof(revision_t), g_main_id);
Jeej 22:f2b01e5e087e 149 modem_ready.wait();
Jeej 13:c3324b26d473 150
Jeej 15:24434827c575 151 if (check_parameter("Manufacturer ID... ", rev.manufacturer_id, cup->mfg_id))
Jeej 13:c3324b26d473 152 {
Jeej 15:24434827c575 153 print_check_rev();
Jeej 13:c3324b26d473 154 break;
Jeej 13:c3324b26d473 155 }
Jeej 13:c3324b26d473 156
Jeej 22:f2b01e5e087e 157 if (check_parameter("Hardware version... ", rev.hw_version, cup->hw_id))
Jeej 13:c3324b26d473 158 {
Jeej 15:24434827c575 159 print_check_hardware();
Jeej 13:c3324b26d473 160 break;
Jeej 13:c3324b26d473 161 }
Jeej 13:c3324b26d473 162
Jeej 15:24434827c575 163 if (rev.device_id == BOOTLOADER_DEV_ID)
Jeej 13:c3324b26d473 164 {
Jeej 15:24434827c575 165 // Update bootloader
Jeej 16:5a6168dbe7bb 166 PRINT("\r\n"
Jeej 26:7fc24677a950 167 "/!\\ This modem has a bootloader firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 168 "/!\\ Step 2/2: Upgrading to full modem firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 169 );
Jeej 15:24434827c575 170
Jeej 26:7fc24677a950 171 /*
Jeej 22:f2b01e5e087e 172 cup_slack = check_slack(rev.cup_max_size, cup->data_size);
Jeej 15:24434827c575 173
Jeej 15:24434827c575 174 if (cup_slack < 0)
Jeej 15:24434827c575 175 {
Jeej 26:7fc24677a950 176 PRINT("/!\\ Not enough space for firmware /!\\\r\n");
Jeej 15:24434827c575 177 break;
Jeej 15:24434827c575 178 }
Jeej 26:7fc24677a950 179 */
Jeej 26:7fc24677a950 180
Jeej 26:7fc24677a950 181 cup_start_update(0);
Jeej 13:c3324b26d473 182 }
Jeej 15:24434827c575 183 else
Jeej 0:82a60d86ab2e 184 {
Jeej 15:24434827c575 185 uint32_t version_old = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
Jeej 15:24434827c575 186 uint32_t version_new = (cup->fw_major << 24) | (cup->fw_minor << 16) | cup->fw_patch;
Jeej 15:24434827c575 187
Jeej 15:24434827c575 188 // Update modem
Jeej 15:24434827c575 189 if (check_parameter("Device ID... ", rev.device_id, cup->dev_id))
Jeej 15:24434827c575 190 {
Jeej 15:24434827c575 191 print_check_rev();
Jeej 15:24434827c575 192 break;
Jeej 15:24434827c575 193 }
Jeej 15:24434827c575 194
Jeej 15:24434827c575 195 if (version_old != version_new)
Jeej 15:24434827c575 196 {
Jeej 27:25be84b17eec 197 PRINT("Checking Firmware version major... ");
Jeej 27:25be84b17eec 198 if (rev.fw_version.major < cup->target_fw_major)
Jeej 15:24434827c575 199 {
Jeej 27:25be84b17eec 200 PRINT("Failed. (0x%08X != 0x%08X)\r\n", rev.fw_version.major, cup->target_fw_major);
Jeej 15:24434827c575 201 print_check_rev();
Jeej 15:24434827c575 202 break;
Jeej 15:24434827c575 203 }
Jeej 27:25be84b17eec 204 else
Jeej 27:25be84b17eec 205 {
Jeej 27:25be84b17eec 206 PRINT("OK. (0x%08X)\r\n", rev.fw_version.major);
Jeej 27:25be84b17eec 207 }
Jeej 17:05c9ec970a6d 208
Jeej 26:7fc24677a950 209 PRINT("Checking Firmware version minor... ");
Jeej 27:25be84b17eec 210 if (rev.fw_version.minor < cup->target_fw_minor && rev.fw_version.major == cup->target_fw_major)
Jeej 15:24434827c575 211 {
Jeej 26:7fc24677a950 212 PRINT("Failed. (0x%08X != 0x%08X)\r\n", rev.fw_version.minor, cup->target_fw_minor);
Jeej 15:24434827c575 213 print_check_rev();
Jeej 15:24434827c575 214 break;
Jeej 17:05c9ec970a6d 215 }
Jeej 26:7fc24677a950 216 else
Jeej 26:7fc24677a950 217 {
Jeej 26:7fc24677a950 218 PRINT("OK. (0x%08X)\r\n", rev.fw_version.minor);
Jeej 26:7fc24677a950 219 }
Jeej 15:24434827c575 220 }
Jeej 15:24434827c575 221 else
Jeej 15:24434827c575 222 {
Jeej 15:24434827c575 223 PRINT("\r\nYour modem is up to date! (v%d.%d.%d)\r\n",
Jeej 15:24434827c575 224 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch);
Jeej 15:24434827c575 225 }
Jeej 15:24434827c575 226
Jeej 22:f2b01e5e087e 227 cup_slack = check_slack(rev.cup_max_size, cup->data_size);
Jeej 15:24434827c575 228
Jeej 15:24434827c575 229 if (cup_slack < 0)
Jeej 15:24434827c575 230 {
Jeej 16:5a6168dbe7bb 231 PRINT("\r\n"
Jeej 26:7fc24677a950 232 "/!\\ Not enough space for full modem firmware binary. /!\\\r\n"
Jeej 26:7fc24677a950 233 "/!\\ Checking for bootloader firmware. /!\\\r\n"
Jeej 16:5a6168dbe7bb 234 "\r\n"
Jeej 16:5a6168dbe7bb 235 );
Jeej 22:f2b01e5e087e 236
Jeej 22:f2b01e5e087e 237 cup_slack = check_slack(rev.cup_max_size, ((cup_param_t*)&cup_bootloader)->data_size);
Jeej 15:24434827c575 238
Jeej 15:24434827c575 239 if (cup_slack < 0)
Jeej 15:24434827c575 240 {
Jeej 15:24434827c575 241 PRINT("/!\\ Not enough space for bootloader /!\\\r\n");
Jeej 15:24434827c575 242 break;
Jeej 15:24434827c575 243 }
Jeej 15:24434827c575 244
Jeej 15:24434827c575 245 bootloader = true;
Jeej 16:5a6168dbe7bb 246
Jeej 16:5a6168dbe7bb 247 PRINT("\r\n"
Jeej 16:5a6168dbe7bb 248 "/!\\ This update will be done in 2 steps. /!\\\r\n"
Jeej 16:5a6168dbe7bb 249 "/!\\ Step 1/2: Upgrading modem to bootloader. /!\\\r\n"
Jeej 16:5a6168dbe7bb 250 "/!\\ Do no push the reset button or turn off the board during upgrade. /!\\\r\n"
Jeej 16:5a6168dbe7bb 251 );
Jeej 15:24434827c575 252 }
Jeej 15:24434827c575 253 else
Jeej 15:24434827c575 254 {
Jeej 15:24434827c575 255 bootloader = false;
Jeej 15:24434827c575 256 }
Jeej 15:24434827c575 257
Jeej 15:24434827c575 258 if (version_old > version_new)
Jeej 15:24434827c575 259 {
Jeej 15:24434827c575 260 PRINT("/!\\ Your modem is at a more recent version (v%d.%d.%d)/!\\\r\n"
Jeej 15:24434827c575 261 "/!\\ Are you sure you want to downgrade to v%d.%d.%d ? /!\\\r\n",
Jeej 15:24434827c575 262 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 263 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 264 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 265 PRINT("PRESS USER BUTTON TO CONFIRM...\r\n");
Jeej 15:24434827c575 266 button_user.wait();
Jeej 18:a8a640941018 267 #endif
Jeej 15:24434827c575 268 PRINT("\r\nDowngrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 15:24434827c575 269 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 270 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 271 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 272 PRINT("PRESS USER BUTTON TO START DOWNGRADE...\r\n");
Jeej 15:24434827c575 273 button_user.wait();
Jeej 18:a8a640941018 274 #endif
Jeej 15:24434827c575 275 }
Jeej 15:24434827c575 276 else if (version_old != version_new)
Jeej 15:24434827c575 277 {
Jeej 15:24434827c575 278 PRINT("\r\nUpgrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 15:24434827c575 279 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 15:24434827c575 280 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 18:a8a640941018 281 #ifdef DEBUG_BUTTON
Jeej 15:24434827c575 282 PRINT("PRESS USER BUTTON TO START UPGRADE...\r\n");
Jeej 15:24434827c575 283 button_user.wait();
Jeej 18:a8a640941018 284 #endif
Jeej 15:24434827c575 285 }
Jeej 20:100143cecc41 286 else
Jeej 20:100143cecc41 287 {
Jeej 26:7fc24677a950 288 #ifdef DEBUG_BUTTON
Jeej 20:100143cecc41 289 PRINT("\r\nReseting firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 20:100143cecc41 290 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 20:100143cecc41 291 cup->fw_major, cup->fw_minor, cup->fw_patch);
Jeej 28:5c9c420c666e 292 PRINT("PRESS USER BUTTON TO START RESET...\r\n");
Jeej 20:100143cecc41 293 button_user.wait();
Jeej 26:7fc24677a950 294 #else
Jeej 26:7fc24677a950 295 // No button to stop code
Jeej 26:7fc24677a950 296 break;
Jeej 20:100143cecc41 297 #endif
Jeej 20:100143cecc41 298 }
Jeej 15:24434827c575 299
Jeej 16:5a6168dbe7bb 300 cup_start_update(cup_slack, bootloader);
Jeej 12:beabd59e0c35 301 }
Jeej 13:c3324b26d473 302
Jeej 13:c3324b26d473 303 } while (0);
Jeej 0:82a60d86ab2e 304
Jeej 0:82a60d86ab2e 305 // Set main task to lowest priority
Jeej 0:82a60d86ab2e 306 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:82a60d86ab2e 307 while(true)
Jeej 0:82a60d86ab2e 308 {
Jeej 0:82a60d86ab2e 309 // Wait to avoid beeing stuck in loop
Jeej 0:82a60d86ab2e 310 Thread::wait(200);
Jeej 0:82a60d86ab2e 311 }
Jeej 0:82a60d86ab2e 312 }