Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Oct 26 11:41:24 2016 +0000
Revision:
2:e0cdfa7d2a8b
Parent:
1:765933092750
Child:
3:a59c8d77006b
Added instructions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:82a60d86ab2e 1 #include "mbed.h"
Jeej 0:82a60d86ab2e 2 #include "cup.h"
Jeej 0:82a60d86ab2e 3 #include "bin.h"
Jeej 0:82a60d86ab2e 4 #include "crc.h"
Jeej 0:82a60d86ab2e 5 #include "d7a.h"
Jeej 0:82a60d86ab2e 6 #include "dbg.h"
Jeej 0:82a60d86ab2e 7
Jeej 0:82a60d86ab2e 8 #define FLASH_PAGE_SIZE (256)
Jeej 0:82a60d86ab2e 9 #define TU_LOCAL (220)
Jeej 0:82a60d86ab2e 10
Jeej 0:82a60d86ab2e 11
Jeej 0:82a60d86ab2e 12 CUP_Archive::CUP_Archive(void) :
Jeej 0:82a60d86ab2e 13 data(cup_data),
Jeej 0:82a60d86ab2e 14 data_size(CUP_DATA_SIZE),
Jeej 0:82a60d86ab2e 15 signature(CUP_SIGNATURE),
Jeej 0:82a60d86ab2e 16 nb_archives(CUP_NB_ARCHIVES),
Jeej 0:82a60d86ab2e 17 word_size(CUP_WORD_SIZE),
Jeej 0:82a60d86ab2e 18 fw_id(0),
Jeej 0:82a60d86ab2e 19 fw_major(CUP_FW_MAJOR),
Jeej 0:82a60d86ab2e 20 fw_minor(CUP_FW_MINOR),
Jeej 0:82a60d86ab2e 21 fw_patch(CUP_FW_PATCH),
Jeej 0:82a60d86ab2e 22 fw_hash(CUP_FW_HASH),
Jeej 0:82a60d86ab2e 23 hw_version(PLATFORM_HW_VERSION)
Jeej 0:82a60d86ab2e 24 {}
Jeej 0:82a60d86ab2e 25
Jeej 0:82a60d86ab2e 26 void CUP_Archive::start_update(uint32_t src_offset)
Jeej 0:82a60d86ab2e 27 {
Jeej 0:82a60d86ab2e 28 cup_cfg_t cfg = {
Jeej 0:82a60d86ab2e 29 .cmd = 0x10AD,
Jeej 0:82a60d86ab2e 30 .arch_nb = 100,
Jeej 0:82a60d86ab2e 31 };
Jeej 0:82a60d86ab2e 32
Jeej 0:82a60d86ab2e 33 uint32_t fof = 0;
Jeej 0:82a60d86ab2e 34 int32_t rem = this->data_size;
Jeej 0:82a60d86ab2e 35 uint8_t percent = 0;
Jeej 0:82a60d86ab2e 36 uint8_t percent_old = 255;
Jeej 0:82a60d86ab2e 37 Timer tim;
Jeej 0:82a60d86ab2e 38
Jeej 0:82a60d86ab2e 39 //src_offset = ((src_offset / FLASH_PAGE_SIZE) + 1) * FLASH_PAGE_SIZE;
Jeej 0:82a60d86ab2e 40 src_offset = 0;
Jeej 0:82a60d86ab2e 41
Jeej 0:82a60d86ab2e 42 // Upload file
Jeej 0:82a60d86ab2e 43 PRINT("UPLOADING CUP FILE Start.\r\n");
Jeej 0:82a60d86ab2e 44
Jeej 0:82a60d86ab2e 45 D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 4, root_key);
Jeej 0:82a60d86ab2e 46
Jeej 0:82a60d86ab2e 47 tim.start();
Jeej 0:82a60d86ab2e 48
Jeej 0:82a60d86ab2e 49 while (rem > 0)
Jeej 0:82a60d86ab2e 50 {
Jeej 0:82a60d86ab2e 51 D7A_WRITE(&(this->data[fof]), CUP_CODE_FID, fof, TU_LOCAL, NULL);
Jeej 0:82a60d86ab2e 52 rem -= TU_LOCAL;
Jeej 0:82a60d86ab2e 53 fof += TU_LOCAL;
Jeej 0:82a60d86ab2e 54
Jeej 0:82a60d86ab2e 55 percent = (100*fof)/this->data_size;
Jeej 0:82a60d86ab2e 56 if (percent != percent_old)
Jeej 0:82a60d86ab2e 57 {
Jeej 0:82a60d86ab2e 58 PRINT("UPLOADING CUP FILE %3d percent\r\n", percent);
Jeej 0:82a60d86ab2e 59 percent_old = percent;
Jeej 0:82a60d86ab2e 60 }
Jeej 0:82a60d86ab2e 61
Jeej 0:82a60d86ab2e 62 // Wait to avoid COM faillure
Jeej 0:82a60d86ab2e 63 Thread::wait(1);
Jeej 0:82a60d86ab2e 64 }
Jeej 0:82a60d86ab2e 65
Jeej 0:82a60d86ab2e 66 float time_s = tim.read();
Jeej 2:e0cdfa7d2a8b 67 PRINT("File[%d] %d bytes written in %.2f sec (%.2f kB/s)\r\n", CUP_CODE_FID, this->data_size, time_s, (this->data_size/time_s)/1024.0);
Jeej 0:82a60d86ab2e 68
Jeej 0:82a60d86ab2e 69 D7A_FLUSH(CUP_CODE_FID, root_key);
Jeej 0:82a60d86ab2e 70
Jeej 0:82a60d86ab2e 71 // Send Upgrade command
Jeej 0:82a60d86ab2e 72 cfg.cmd = 0xC0D5;
Jeej 0:82a60d86ab2e 73 cfg.arch_nb = this->nb_archives;
Jeej 0:82a60d86ab2e 74 cfg.src_offset = src_offset;
Jeej 0:82a60d86ab2e 75 cfg.signature = this->signature;
Jeej 0:82a60d86ab2e 76
Jeej 0:82a60d86ab2e 77 D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 12, root_key);
Jeej 0:82a60d86ab2e 78
Jeej 1:765933092750 79 PRINT("CUP Done.\r\nPlease wait for reboot...\r\n");
Jeej 0:82a60d86ab2e 80 }
Jeej 0:82a60d86ab2e 81