Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Thu Nov 10 17:55:05 2016 +0000
Revision:
9:bd53ca2aece5
Parent:
7:5b8648784381
Child:
12:beabd59e0c35
Sanity commit v4.6.2

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
Jeej 7:5b8648784381 9 const uint8_t const cup_data[CUP_DATA_SIZE] = CUP_DATA;
Jeej 0:82a60d86ab2e 10
Jeej 9:bd53ca2aece5 11 void cup_start_update(uint32_t offset)
Jeej 0:82a60d86ab2e 12 {
Jeej 0:82a60d86ab2e 13 cup_cfg_t cfg = {
Jeej 0:82a60d86ab2e 14 .cmd = 0x10AD,
Jeej 5:ac38f09fd179 15 .arch_nb = 20,
Jeej 0:82a60d86ab2e 16 };
Jeej 0:82a60d86ab2e 17
Jeej 0:82a60d86ab2e 18 uint32_t fof = 0;
Jeej 7:5b8648784381 19 int32_t rem = CUP_DATA_SIZE;
Jeej 0:82a60d86ab2e 20 uint8_t percent = 0;
Jeej 0:82a60d86ab2e 21 uint8_t percent_old = 255;
Jeej 0:82a60d86ab2e 22 Timer tim;
Jeej 0:82a60d86ab2e 23
Jeej 3:a59c8d77006b 24 D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 4, root_key);
Jeej 0:82a60d86ab2e 25
Jeej 0:82a60d86ab2e 26 // Upload file
Jeej 9:bd53ca2aece5 27 PRINT("Uploading %d bytes to CUP file. (offset %d)\r\n", CUP_DATA_SIZE, offset);
Jeej 0:82a60d86ab2e 28
Jeej 0:82a60d86ab2e 29 tim.start();
Jeej 0:82a60d86ab2e 30
Jeej 0:82a60d86ab2e 31 while (rem > 0)
Jeej 0:82a60d86ab2e 32 {
Jeej 9:bd53ca2aece5 33 D7A_WRITE(&(cup_data[fof]), CUP_CODE_FID, fof + offset, CUP_LOCAL_MTU, NULL);
Jeej 9:bd53ca2aece5 34 rem -= CUP_LOCAL_MTU;
Jeej 9:bd53ca2aece5 35 fof += CUP_LOCAL_MTU;
Jeej 0:82a60d86ab2e 36
Jeej 7:5b8648784381 37 percent = (100*fof)/CUP_DATA_SIZE;
Jeej 0:82a60d86ab2e 38 if (percent != percent_old)
Jeej 0:82a60d86ab2e 39 {
Jeej 0:82a60d86ab2e 40 PRINT("UPLOADING CUP FILE %3d percent\r\n", percent);
Jeej 0:82a60d86ab2e 41 percent_old = percent;
Jeej 0:82a60d86ab2e 42 }
Jeej 0:82a60d86ab2e 43
Jeej 0:82a60d86ab2e 44 // Wait to avoid COM faillure
Jeej 0:82a60d86ab2e 45 Thread::wait(1);
Jeej 0:82a60d86ab2e 46 }
Jeej 0:82a60d86ab2e 47
Jeej 0:82a60d86ab2e 48 float time_s = tim.read();
Jeej 7:5b8648784381 49 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 0:82a60d86ab2e 50
Jeej 3:a59c8d77006b 51 // Force PFLASH-cache flushing
Jeej 0:82a60d86ab2e 52 D7A_FLUSH(CUP_CODE_FID, root_key);
Jeej 0:82a60d86ab2e 53
Jeej 0:82a60d86ab2e 54 // Send Upgrade command
Jeej 0:82a60d86ab2e 55 cfg.cmd = 0xC0D5;
Jeej 7:5b8648784381 56 cfg.arch_nb = CUP_NB_ARCHIVES;
Jeej 3:a59c8d77006b 57 cfg.src_offset = offset;
Jeej 7:5b8648784381 58 cfg.signature = CUP_SIGNATURE;
Jeej 0:82a60d86ab2e 59
Jeej 0:82a60d86ab2e 60 D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 12, root_key);
Jeej 0:82a60d86ab2e 61
Jeej 7:5b8648784381 62 PRINT("Waiting self reboot...\r\n");
Jeej 4:23cb73bb11b3 63
Jeej 4:23cb73bb11b3 64 d7a_wait_ready();
Jeej 4:23cb73bb11b3 65
Jeej 4:23cb73bb11b3 66 D7A_READ(&cfg, CUP_CFG_FID, 0, 2, root_key);
Jeej 4:23cb73bb11b3 67
Jeej 4:23cb73bb11b3 68 if (cfg.cmd)
Jeej 4:23cb73bb11b3 69 {
Jeej 7:5b8648784381 70 PRINT("/!\\ CUP Error 0x%04X /!\\\r\n", cfg.cmd);
Jeej 4:23cb73bb11b3 71 }
Jeej 4:23cb73bb11b3 72 else
Jeej 4:23cb73bb11b3 73 {
Jeej 7:5b8648784381 74 PRINT("CUP OK\r\nResetting...\r\n\r\n");
Jeej 4:23cb73bb11b3 75 FLUSH();
Jeej 4:23cb73bb11b3 76 NVIC_SystemReset();
Jeej 4:23cb73bb11b3 77 }
Jeej 0:82a60d86ab2e 78 }
Jeej 0:82a60d86ab2e 79