Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Thu Nov 10 15:45:16 2016 +0000
Revision:
7:5b8648784381
Parent:
5:ac38f09fd179
Child:
9:bd53ca2aece5
Release v4.6.0

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 5:ac38f09fd179 8 #define MODEM_FLASH_PAGE_SIZE (256)
Jeej 5:ac38f09fd179 9 #define TU_LOCAL (220)
Jeej 0:82a60d86ab2e 10
Jeej 7:5b8648784381 11 const uint8_t const cup_data[CUP_DATA_SIZE] = CUP_DATA;
Jeej 0:82a60d86ab2e 12
Jeej 7:5b8648784381 13 void cup_start_update(uint32_t src_offset, uint32_t max_size)
Jeej 0:82a60d86ab2e 14 {
Jeej 0:82a60d86ab2e 15 cup_cfg_t cfg = {
Jeej 0:82a60d86ab2e 16 .cmd = 0x10AD,
Jeej 5:ac38f09fd179 17 .arch_nb = 20,
Jeej 0:82a60d86ab2e 18 };
Jeej 0:82a60d86ab2e 19
Jeej 0:82a60d86ab2e 20 uint32_t fof = 0;
Jeej 7:5b8648784381 21 int32_t rem = CUP_DATA_SIZE;
Jeej 0:82a60d86ab2e 22 uint8_t percent = 0;
Jeej 0:82a60d86ab2e 23 uint8_t percent_old = 255;
Jeej 0:82a60d86ab2e 24 Timer tim;
Jeej 0:82a60d86ab2e 25
Jeej 3:a59c8d77006b 26 // get archive address
Jeej 7:5b8648784381 27 uint32_t addr = *((uint32_t*)&cup_data[4]);
Jeej 3:a59c8d77006b 28 // End address
Jeej 7:5b8648784381 29 uint32_t eaddr = addr + CUP_CODE_SIZE;
Jeej 3:a59c8d77006b 30
Jeej 3:a59c8d77006b 31 uint32_t offset = 0;
Jeej 3:a59c8d77006b 32
Jeej 3:a59c8d77006b 33 if (eaddr > src_offset)
Jeej 3:a59c8d77006b 34 {
Jeej 3:a59c8d77006b 35 // Calculate offset if needed
Jeej 7:5b8648784381 36 PRINT("/!\\ CUP process will overwrite Archive: 0x%08X + %d > 0x%08X /!\\\r\n", addr, CUP_CODE_SIZE, src_offset);
Jeej 5:ac38f09fd179 37 eaddr = ((eaddr / MODEM_FLASH_PAGE_SIZE) + 1) * MODEM_FLASH_PAGE_SIZE;
Jeej 3:a59c8d77006b 38 offset = eaddr - src_offset;
Jeej 3:a59c8d77006b 39 PRINT("/!\\ CUP Shifting archive storage to 0x%08X (Offset 0x%X) /!\\\r\n", eaddr, offset);
Jeej 3:a59c8d77006b 40 }
Jeej 3:a59c8d77006b 41
Jeej 3:a59c8d77006b 42 max_size -= offset;
Jeej 7:5b8648784381 43 int32_t slack = max_size - CUP_DATA_SIZE;
Jeej 4:23cb73bb11b3 44 ASSERT(slack >= 0, "Not enough space to store archive! (%d bytes short)\r\n", -slack);
Jeej 3:a59c8d77006b 45
Jeej 3:a59c8d77006b 46 D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 4, root_key);
Jeej 0:82a60d86ab2e 47
Jeej 0:82a60d86ab2e 48 // Upload file
Jeej 7:5b8648784381 49 PRINT("Uploading %d bytes at address 0x%08X (%d bytes slack)\r\n", CUP_DATA_SIZE, src_offset + offset, slack);
Jeej 0:82a60d86ab2e 50
Jeej 0:82a60d86ab2e 51 tim.start();
Jeej 0:82a60d86ab2e 52
Jeej 0:82a60d86ab2e 53 while (rem > 0)
Jeej 0:82a60d86ab2e 54 {
Jeej 7:5b8648784381 55 D7A_WRITE(&(cup_data[fof]), CUP_CODE_FID, fof + offset, TU_LOCAL, NULL);
Jeej 0:82a60d86ab2e 56 rem -= TU_LOCAL;
Jeej 0:82a60d86ab2e 57 fof += TU_LOCAL;
Jeej 0:82a60d86ab2e 58
Jeej 7:5b8648784381 59 percent = (100*fof)/CUP_DATA_SIZE;
Jeej 0:82a60d86ab2e 60 if (percent != percent_old)
Jeej 0:82a60d86ab2e 61 {
Jeej 0:82a60d86ab2e 62 PRINT("UPLOADING CUP FILE %3d percent\r\n", percent);
Jeej 0:82a60d86ab2e 63 percent_old = percent;
Jeej 0:82a60d86ab2e 64 }
Jeej 0:82a60d86ab2e 65
Jeej 0:82a60d86ab2e 66 // Wait to avoid COM faillure
Jeej 0:82a60d86ab2e 67 Thread::wait(1);
Jeej 0:82a60d86ab2e 68 }
Jeej 0:82a60d86ab2e 69
Jeej 0:82a60d86ab2e 70 float time_s = tim.read();
Jeej 7:5b8648784381 71 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 72
Jeej 3:a59c8d77006b 73 // Force PFLASH-cache flushing
Jeej 0:82a60d86ab2e 74 D7A_FLUSH(CUP_CODE_FID, root_key);
Jeej 0:82a60d86ab2e 75
Jeej 0:82a60d86ab2e 76 // Send Upgrade command
Jeej 0:82a60d86ab2e 77 cfg.cmd = 0xC0D5;
Jeej 7:5b8648784381 78 cfg.arch_nb = CUP_NB_ARCHIVES;
Jeej 3:a59c8d77006b 79 cfg.src_offset = offset;
Jeej 7:5b8648784381 80 cfg.signature = CUP_SIGNATURE;
Jeej 0:82a60d86ab2e 81
Jeej 0:82a60d86ab2e 82 D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 12, root_key);
Jeej 0:82a60d86ab2e 83
Jeej 7:5b8648784381 84 PRINT("Waiting self reboot...\r\n");
Jeej 4:23cb73bb11b3 85
Jeej 4:23cb73bb11b3 86 d7a_wait_ready();
Jeej 4:23cb73bb11b3 87
Jeej 4:23cb73bb11b3 88 D7A_READ(&cfg, CUP_CFG_FID, 0, 2, root_key);
Jeej 4:23cb73bb11b3 89
Jeej 4:23cb73bb11b3 90 if (cfg.cmd)
Jeej 4:23cb73bb11b3 91 {
Jeej 7:5b8648784381 92 PRINT("/!\\ CUP Error 0x%04X /!\\\r\n", cfg.cmd);
Jeej 4:23cb73bb11b3 93 }
Jeej 4:23cb73bb11b3 94 else
Jeej 4:23cb73bb11b3 95 {
Jeej 7:5b8648784381 96 PRINT("CUP OK\r\nResetting...\r\n\r\n");
Jeej 4:23cb73bb11b3 97 FLUSH();
Jeej 4:23cb73bb11b3 98 NVIC_SystemReset();
Jeej 4:23cb73bb11b3 99 }
Jeej 0:82a60d86ab2e 100 }
Jeej 0:82a60d86ab2e 101