Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Nov 02 14:01:03 2016 +0000
Revision:
5:ac38f09fd179
Parent:
4:23cb73bb11b3
Child:
7:5b8648784381
release v4.5.0

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