Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Oct 26 11:01:26 2016 +0000
Revision:
1:765933092750
Parent:
0:82a60d86ab2e
Child:
2:e0cdfa7d2a8b
release v4.4.12

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:82a60d86ab2e 1 #include "mbed.h"
Jeej 0:82a60d86ab2e 2 #include "rtos.h"
Jeej 0:82a60d86ab2e 3 #include "d7a.h"
Jeej 0:82a60d86ab2e 4 #include "dbg.h"
Jeej 0:82a60d86ab2e 5 #include "cup.h"
Jeej 0:82a60d86ab2e 6 #include "DebouncedInterrupt.h"
Jeej 0:82a60d86ab2e 7
Jeej 0:82a60d86ab2e 8 // File IDs
Jeej 0:82a60d86ab2e 9 #define D7A_FID_FIRMWARE_VERSION (2)
Jeej 0:82a60d86ab2e 10
Jeej 1:765933092750 11 uint8_t root_key[D7A_ROOT_KEY_SIZE] = {
Jeej 1:765933092750 12 0xCE, 0x57, 0x74, 0x0B, 0x04, 0x1E, 0xCA, 0xFE
Jeej 1:765933092750 13 };
Jeej 0:82a60d86ab2e 14
Jeej 0:82a60d86ab2e 15 // callbacks structure
Jeej 0:82a60d86ab2e 16 const d7a_callbacks_t callbacks = {
Jeej 0:82a60d86ab2e 17 .write_file = NULL,
Jeej 0:82a60d86ab2e 18 .read_file = NULL,
Jeej 0:82a60d86ab2e 19 .notif_done = NULL,
Jeej 0:82a60d86ab2e 20 .unsolicited_msg = NULL,
Jeej 0:82a60d86ab2e 21 };
Jeej 0:82a60d86ab2e 22
Jeej 0:82a60d86ab2e 23 // Com configuration for the DASH7 shield
Jeej 0:82a60d86ab2e 24 const d7a_com_config_t shield_config = {
Jeej 0:82a60d86ab2e 25 .tx = D10,
Jeej 0:82a60d86ab2e 26 .rx = D2,
Jeej 0:82a60d86ab2e 27 .rts = D13,
Jeej 0:82a60d86ab2e 28 .cts = D9,
Jeej 0:82a60d86ab2e 29 .rx_buffer_size = 1024,
Jeej 0:82a60d86ab2e 30 };
Jeej 0:82a60d86ab2e 31
Jeej 0:82a60d86ab2e 32 // Semaphore for notifiying button presses
Jeej 0:82a60d86ab2e 33 Semaphore button_user(0);
Jeej 0:82a60d86ab2e 34
Jeej 0:82a60d86ab2e 35 // Interrupt Service Routine on button press.
Jeej 0:82a60d86ab2e 36 void button_push_isr( void )
Jeej 0:82a60d86ab2e 37 {
Jeej 0:82a60d86ab2e 38 button_user.release();
Jeej 0:82a60d86ab2e 39 }
Jeej 0:82a60d86ab2e 40
Jeej 0:82a60d86ab2e 41 int main()
Jeej 0:82a60d86ab2e 42 {
Jeej 0:82a60d86ab2e 43 d7a_revision_t rev;
Jeej 0:82a60d86ab2e 44
Jeej 0:82a60d86ab2e 45 // Start & initialize
Jeej 0:82a60d86ab2e 46 DBG_OPEN();
Jeej 1:765933092750 47 PRINT("\r\n-----------------------------------\r\n");
Jeej 1:765933092750 48 PRINT("---------- D7A WM Updater ---------\r\n");
Jeej 1:765933092750 49 PRINT("-----------------------------------\r\n");
Jeej 0:82a60d86ab2e 50
Jeej 0:82a60d86ab2e 51 DebouncedInterrupt user_interrupt(USER_BUTTON);
Jeej 0:82a60d86ab2e 52 user_interrupt.attach(button_push_isr, IRQ_FALL, 200, true);
Jeej 0:82a60d86ab2e 53
Jeej 0:82a60d86ab2e 54 d7a_open(&shield_config, A3, &callbacks);
Jeej 0:82a60d86ab2e 55
Jeej 0:82a60d86ab2e 56 // Check modem revision
Jeej 0:82a60d86ab2e 57 D7A_READ(&rev, D7A_FID_FIRMWARE_VERSION, 0, sizeof(d7a_revision_t), NULL);
Jeej 0:82a60d86ab2e 58
Jeej 0:82a60d86ab2e 59 PRINT("-----------------------------------\r\n");
Jeej 0:82a60d86ab2e 60 PRINT("--------- D7A Modem infos ---------\r\n");
Jeej 1:765933092750 61 PRINT("Manufacturer ID: 0x%08X\r\n", rev.manufacturer_id);
Jeej 1:765933092750 62 PRINT("Device ID: 0x%08X\r\n", rev.device_id);
Jeej 1:765933092750 63 PRINT("Hardware version: 0x%08X\r\n", rev.hw_version);
Jeej 1:765933092750 64 PRINT("Firmware version: v%d.%d.%d\r\n", rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch);
Jeej 1:765933092750 65 PRINT("Firmware hash: 0x%08x\r\n", rev.fw_version.hash);
Jeej 1:765933092750 66 PRINT("File system CRC: 0x%08x\r\n", rev.fs_crc);
Jeej 0:82a60d86ab2e 67 PRINT("-----------------------------------\r\n");
Jeej 0:82a60d86ab2e 68
Jeej 0:82a60d86ab2e 69 // Check package infos
Jeej 0:82a60d86ab2e 70 CUP_Archive cup_pkg;
Jeej 0:82a60d86ab2e 71
Jeej 0:82a60d86ab2e 72 PRINT("-------- CUP Archive infos --------\r\n");
Jeej 1:765933092750 73 PRINT("Firmware version: v%d.%d.%d\r\n", cup_pkg.fw_major, cup_pkg.fw_minor, cup_pkg.fw_patch);
Jeej 1:765933092750 74 PRINT("Size: %d\r\n", cup_pkg.data_size);
Jeej 1:765933092750 75 PRINT("Nb archives: %d\r\n", cup_pkg.nb_archives);
Jeej 1:765933092750 76 PRINT("Signature: 0x%08X\r\n", cup_pkg.signature);
Jeej 0:82a60d86ab2e 77 PRINT("-----------------------------------\r\n");
Jeej 0:82a60d86ab2e 78
Jeej 0:82a60d86ab2e 79 // Read CUP config with root permissions
Jeej 0:82a60d86ab2e 80 cup_cfg_t cup_cfg;
Jeej 0:82a60d86ab2e 81 D7A_READ(&cup_cfg, CUP_CFG_FID, 0, sizeof(cup_cfg_t), root_key);
Jeej 0:82a60d86ab2e 82
Jeej 0:82a60d86ab2e 83 PRINT("----- CUP Configuration infos -----\r\n");
Jeej 1:765933092750 84 PRINT("Src offset: 0x%08X\r\n", cup_cfg.src_offset);
Jeej 1:765933092750 85 PRINT("Signature: 0x%08X\r\n", cup_cfg.signature);
Jeej 1:765933092750 86 PRINT("File max size: %d\r\n", cup_cfg.key);
Jeej 1:765933092750 87 PRINT("Dbg config: 0x%08X\r\n", cup_cfg.dbg_cfg);
Jeej 0:82a60d86ab2e 88 PRINT("-----------------------------------\r\n");
Jeej 0:82a60d86ab2e 89
Jeej 0:82a60d86ab2e 90 uint32_t version_old = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
Jeej 0:82a60d86ab2e 91 uint32_t version_new = (cup_pkg.fw_major << 24) | (cup_pkg.fw_minor << 16) | cup_pkg.fw_patch;
Jeej 0:82a60d86ab2e 92
Jeej 0:82a60d86ab2e 93 if (rev.hw_version != cup_pkg.hw_version)
Jeej 0:82a60d86ab2e 94 {
Jeej 0:82a60d86ab2e 95 PRINT("Please select the right Hardware in bin.h\r\n");
Jeej 0:82a60d86ab2e 96 }
Jeej 0:82a60d86ab2e 97 else if((cup_pkg.data_size % cup_pkg.word_size) != 0)
Jeej 0:82a60d86ab2e 98 {
Jeej 0:82a60d86ab2e 99 PRINT("Size %d should be multiple of %d.\r\n", cup_pkg.data_size, cup_pkg.word_size);
Jeej 0:82a60d86ab2e 100 }
Jeej 0:82a60d86ab2e 101 else if (cup_pkg.data_size > cup_cfg.key)
Jeej 0:82a60d86ab2e 102 {
Jeej 0:82a60d86ab2e 103 PRINT("CUP File too big for upgrade. Available %d needs %d.\r\n", cup_cfg.key, cup_pkg.data_size);
Jeej 0:82a60d86ab2e 104 }
Jeej 0:82a60d86ab2e 105 else if (version_old == version_new)
Jeej 0:82a60d86ab2e 106 {
Jeej 0:82a60d86ab2e 107 PRINT("Your modem is already up to date!\r\n");
Jeej 0:82a60d86ab2e 108 }
Jeej 0:82a60d86ab2e 109 else
Jeej 0:82a60d86ab2e 110 {
Jeej 0:82a60d86ab2e 111 if (version_old > version_new)
Jeej 0:82a60d86ab2e 112 {
Jeej 0:82a60d86ab2e 113 PRINT("/!\\ Your modem is at a more recent version /!\\\r\n/!\\ Are you sure you want to downgrade? /!\\\r\n");
Jeej 0:82a60d86ab2e 114 PRINT("PRESS USER BUTTON TO CONFIRM...\r\n");
Jeej 0:82a60d86ab2e 115 button_user.wait();
Jeej 0:82a60d86ab2e 116 PRINT("Downgrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 0:82a60d86ab2e 117 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 0:82a60d86ab2e 118 cup_pkg.fw_major, cup_pkg.fw_minor, cup_pkg.fw_patch);
Jeej 0:82a60d86ab2e 119 PRINT("PRESS USER BUTTON TO START DOWNGRADE...\r\n");
Jeej 0:82a60d86ab2e 120 }
Jeej 0:82a60d86ab2e 121 else
Jeej 0:82a60d86ab2e 122 {
Jeej 0:82a60d86ab2e 123 PRINT("Upgrading firmware: v%d.%d.%d --> v%d.%d.%d\r\n",
Jeej 0:82a60d86ab2e 124 rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch,
Jeej 0:82a60d86ab2e 125 cup_pkg.fw_major, cup_pkg.fw_minor, cup_pkg.fw_patch);
Jeej 0:82a60d86ab2e 126 PRINT("PRESS USER BUTTON TO START UPGRADE...\r\n");
Jeej 0:82a60d86ab2e 127 }
Jeej 0:82a60d86ab2e 128
Jeej 0:82a60d86ab2e 129 button_user.wait();
Jeej 0:82a60d86ab2e 130 cup_pkg.start_update(cup_cfg.src_offset);
Jeej 0:82a60d86ab2e 131 }
Jeej 0:82a60d86ab2e 132
Jeej 0:82a60d86ab2e 133 // Set main task to lowest priority
Jeej 0:82a60d86ab2e 134 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:82a60d86ab2e 135 while(true)
Jeej 0:82a60d86ab2e 136 {
Jeej 0:82a60d86ab2e 137 // Wait to avoid beeing stuck in loop
Jeej 0:82a60d86ab2e 138 Thread::wait(200);
Jeej 0:82a60d86ab2e 139 }
Jeej 0:82a60d86ab2e 140 }