Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Mon Sep 18 14:47:43 2017 +0000
Revision:
23:365775929293
Parent:
22:f2b01e5e087e
Release v4.10.1 (ECC) for v4.7.x

Who changed what in which revision?

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