Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Oct 26 10:03:59 2016 +0000
Revision:
0:82a60d86ab2e
Child:
1:765933092750
release v4.4.10

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