Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Mon Jan 29 18:08:31 2018 +0000
Revision:
26:7fc24677a950
Parent:
22:f2b01e5e087e
Child:
32:e3ee65b5b835
Release v5.0.13 for v4.10+

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:82a60d86ab2e 1 #include "cup.h"
Jeej 0:82a60d86ab2e 2 #include "bin.h"
Jeej 0:82a60d86ab2e 3
Jeej 0:82a60d86ab2e 4
Jeej 15:24434827c575 5 uint8_t const modem_data[CUP_DATA_SIZE] = CUP_DATA;
Jeej 15:24434827c575 6 uint8_t const bootloader_data[BOOTLOADER_DATA_SIZE] = BOOTLOADER_DATA;
Jeej 22:f2b01e5e087e 7 Semaphore modem_cup_ready(0);
Jeej 0:82a60d86ab2e 8
Jeej 15:24434827c575 9 cup_param_t const cup_modem = {
Jeej 15:24434827c575 10 .data = (uint8_t*)modem_data,
Jeej 15:24434827c575 11 .cfg_fid = CUP_CFG_FID,
Jeej 15:24434827c575 12 .code_fid = CUP_CODE_FID,
Jeej 15:24434827c575 13 .code_size = CUP_CODE_SIZE,
Jeej 15:24434827c575 14 .data_size = CUP_DATA_SIZE,
Jeej 15:24434827c575 15 .local_mtu = CUP_LOCAL_MTU,
Jeej 15:24434827c575 16 .nb_archives = CUP_NB_ARCHIVES,
Jeej 15:24434827c575 17 .signature = CUP_SIGNATURE,
Jeej 15:24434827c575 18 .mfg_id = CUP_MFG_ID,
Jeej 15:24434827c575 19 .dev_id = CUP_DEV_ID,
Jeej 15:24434827c575 20 .hw_id = CUP_HW_ID,
Jeej 15:24434827c575 21 .fw_major = CUP_FW_MAJOR,
Jeej 15:24434827c575 22 .fw_minor = CUP_FW_MINOR,
Jeej 15:24434827c575 23 .fw_patch = CUP_FW_PATCH,
Jeej 15:24434827c575 24 .fw_hash = CUP_FW_HASH,
Jeej 15:24434827c575 25 .target_fw_major = CUP_TARGET_FW_MAJOR,
Jeej 15:24434827c575 26 .target_fw_minor = CUP_TARGET_FW_MINOR,
Jeej 15:24434827c575 27 };
Jeej 15:24434827c575 28
Jeej 15:24434827c575 29 cup_param_t const cup_bootloader = {
Jeej 15:24434827c575 30 .data = (uint8_t*)bootloader_data,
Jeej 15:24434827c575 31 .cfg_fid = BOOTLOADER_CFG_FID,
Jeej 15:24434827c575 32 .code_fid = BOOTLOADER_CODE_FID,
Jeej 15:24434827c575 33 .code_size = BOOTLOADER_CODE_SIZE,
Jeej 15:24434827c575 34 .data_size = BOOTLOADER_DATA_SIZE,
Jeej 15:24434827c575 35 .local_mtu = BOOTLOADER_LOCAL_MTU,
Jeej 15:24434827c575 36 .nb_archives = BOOTLOADER_NB_ARCHIVES,
Jeej 15:24434827c575 37 .signature = BOOTLOADER_SIGNATURE,
Jeej 15:24434827c575 38 .mfg_id = BOOTLOADER_MFG_ID,
Jeej 15:24434827c575 39 .dev_id = BOOTLOADER_DEV_ID,
Jeej 15:24434827c575 40 .hw_id = BOOTLOADER_HW_ID,
Jeej 15:24434827c575 41 .fw_major = BOOTLOADER_FW_MAJOR,
Jeej 15:24434827c575 42 .fw_minor = BOOTLOADER_FW_MINOR,
Jeej 15:24434827c575 43 .fw_patch = BOOTLOADER_FW_PATCH,
Jeej 15:24434827c575 44 .fw_hash = BOOTLOADER_FW_HASH,
Jeej 15:24434827c575 45 .target_fw_major = BOOTLOADER_TARGET_FW_MAJOR,
Jeej 15:24434827c575 46 .target_fw_minor = BOOTLOADER_TARGET_FW_MINOR,
Jeej 15:24434827c575 47 };
Jeej 15:24434827c575 48
Jeej 22:f2b01e5e087e 49 void my_cup_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 22:f2b01e5e087e 50 {
Jeej 22:f2b01e5e087e 51 (void)id;
Jeej 22:f2b01e5e087e 52
Jeej 22:f2b01e5e087e 53 if (terminal)
Jeej 22:f2b01e5e087e 54 {
Jeej 22:f2b01e5e087e 55 if (err)
Jeej 22:f2b01e5e087e 56 {
Jeej 22:f2b01e5e087e 57 PRINT("Done err %d\n", err);
Jeej 22:f2b01e5e087e 58 FLUSH();
Jeej 22:f2b01e5e087e 59 while(1);
Jeej 22:f2b01e5e087e 60 }
Jeej 22:f2b01e5e087e 61 modem_cup_ready.release();
Jeej 22:f2b01e5e087e 62 }
Jeej 22:f2b01e5e087e 63 else if (err)
Jeej 22:f2b01e5e087e 64 {
Jeej 22:f2b01e5e087e 65 PRINT("Got err %d\n", err);
Jeej 22:f2b01e5e087e 66 FLUSH();
Jeej 22:f2b01e5e087e 67 while(1);
Jeej 22:f2b01e5e087e 68 }
Jeej 22:f2b01e5e087e 69 }
Jeej 22:f2b01e5e087e 70
Jeej 15:24434827c575 71 void cup_start_update(uint32_t offset, bool bootloader)
Jeej 0:82a60d86ab2e 72 {
Jeej 0:82a60d86ab2e 73 cup_cfg_t cfg = {
Jeej 0:82a60d86ab2e 74 .cmd = 0x10AD,
Jeej 5:ac38f09fd179 75 .arch_nb = 20,
Jeej 0:82a60d86ab2e 76 };
Jeej 0:82a60d86ab2e 77
Jeej 15:24434827c575 78 cup_param_t* cup;
Jeej 15:24434827c575 79
Jeej 0:82a60d86ab2e 80 uint32_t fof = 0;
Jeej 0:82a60d86ab2e 81 uint8_t percent = 0;
Jeej 0:82a60d86ab2e 82 uint8_t percent_old = 255;
Jeej 0:82a60d86ab2e 83 Timer tim;
Jeej 15:24434827c575 84 int32_t rem;
Jeej 0:82a60d86ab2e 85
Jeej 22:f2b01e5e087e 86 uint8_t id = modem_get_id(my_cup_callback);
Jeej 22:f2b01e5e087e 87
Jeej 15:24434827c575 88 if (bootloader)
Jeej 15:24434827c575 89 {
Jeej 15:24434827c575 90 PRINT("Uploading Bootloader\r\n");
Jeej 15:24434827c575 91 cup = (cup_param_t*)&cup_bootloader;
Jeej 15:24434827c575 92 }
Jeej 15:24434827c575 93 else
Jeej 15:24434827c575 94 {
Jeej 15:24434827c575 95 PRINT("Uploading New version\r\n");
Jeej 15:24434827c575 96 cup = (cup_param_t*)&cup_modem;
Jeej 15:24434827c575 97 }
Jeej 15:24434827c575 98
Jeej 15:24434827c575 99 rem = cup->data_size;
Jeej 22:f2b01e5e087e 100
Jeej 15:24434827c575 101 // Start CUP
Jeej 22:f2b01e5e087e 102 modem_write_file_root(cup->cfg_fid, (uint8_t*)&cfg, 0, 4, root_key, id);
Jeej 22:f2b01e5e087e 103 modem_cup_ready.wait();
Jeej 18:a8a640941018 104
Jeej 0:82a60d86ab2e 105 // Upload file
Jeej 15:24434827c575 106 PRINT("Uploading %d bytes to CUP file. (offset %d)\r\n", cup->data_size, offset);
Jeej 0:82a60d86ab2e 107
Jeej 0:82a60d86ab2e 108 tim.start();
Jeej 0:82a60d86ab2e 109
Jeej 0:82a60d86ab2e 110 while (rem > 0)
Jeej 0:82a60d86ab2e 111 {
Jeej 15:24434827c575 112 int32_t chunk = (rem > cup->local_mtu)? cup->local_mtu : rem;
Jeej 22:f2b01e5e087e 113 modem_write_file(cup->code_fid, &(cup->data[fof]), fof + offset, chunk, id);
Jeej 22:f2b01e5e087e 114 modem_cup_ready.wait();
Jeej 15:24434827c575 115 rem -= chunk;
Jeej 15:24434827c575 116 fof += chunk;
Jeej 0:82a60d86ab2e 117
Jeej 15:24434827c575 118 percent = (100*fof)/cup->data_size;
Jeej 22:f2b01e5e087e 119 if (percent != percent_old && !(percent%5))
Jeej 0:82a60d86ab2e 120 {
Jeej 0:82a60d86ab2e 121 PRINT("UPLOADING CUP FILE %3d percent\r\n", percent);
Jeej 0:82a60d86ab2e 122 percent_old = percent;
Jeej 0:82a60d86ab2e 123 }
Jeej 0:82a60d86ab2e 124
Jeej 0:82a60d86ab2e 125 // Wait to avoid COM faillure
Jeej 0:82a60d86ab2e 126 Thread::wait(1);
Jeej 0:82a60d86ab2e 127 }
Jeej 0:82a60d86ab2e 128
Jeej 0:82a60d86ab2e 129 float time_s = tim.read();
Jeej 15:24434827c575 130 PRINT("CUP: %d bytes written in %.2f sec (%.2f kB/s)\r\n", cup->data_size, time_s, (cup->data_size/time_s)/1024.0);
Jeej 18:a8a640941018 131
Jeej 3:a59c8d77006b 132 // Force PFLASH-cache flushing
Jeej 22:f2b01e5e087e 133 modem_flush_file_root(cup->code_fid, root_key, id);
Jeej 22:f2b01e5e087e 134 modem_cup_ready.wait();
Jeej 0:82a60d86ab2e 135
Jeej 0:82a60d86ab2e 136 // Send Upgrade command
Jeej 0:82a60d86ab2e 137 cfg.cmd = 0xC0D5;
Jeej 15:24434827c575 138 cfg.arch_nb = cup->nb_archives;
Jeej 3:a59c8d77006b 139 cfg.src_offset = offset;
Jeej 15:24434827c575 140 cfg.signature = cup->signature;
Jeej 0:82a60d86ab2e 141
Jeej 22:f2b01e5e087e 142 modem_write_file_root(cup->cfg_fid, (uint8_t*)&cfg, 0, 12, root_key, id);
Jeej 22:f2b01e5e087e 143 modem_cup_ready.wait();
Jeej 0:82a60d86ab2e 144
Jeej 7:5b8648784381 145 PRINT("Waiting self reboot...\r\n");
Jeej 0:82a60d86ab2e 146 }
Jeej 0:82a60d86ab2e 147