Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Jan 11 11:44:05 2017 +0000
Revision:
13:c3324b26d473
Parent:
12:beabd59e0c35
Child:
15:24434827c575
Sanity commit 4.7.28 test

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