Program to update the D7A modem's firmware.
Dependencies: modem_ref_helper DebouncedInterrupt
main.cpp@32:e3ee65b5b835, 2019-08-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |