Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: modem_ref_helper DebouncedInterrupt
Revision 3:a59c8d77006b, committed 2016-10-26
- Comitter:
- Jeej
- Date:
- Wed Oct 26 14:13:58 2016 +0000
- Parent:
- 2:e0cdfa7d2a8b
- Child:
- 4:23cb73bb11b3
- Commit message:
- Implemented automatic src offset shift.
Changed in this revision
--- a/cup.cpp Wed Oct 26 11:41:24 2016 +0000
+++ b/cup.cpp Wed Oct 26 14:13:58 2016 +0000
@@ -23,7 +23,7 @@
hw_version(PLATFORM_HW_VERSION)
{}
-void CUP_Archive::start_update(uint32_t src_offset)
+void CUP_Archive::start_update(uint32_t src_offset, uint32_t max_size)
{
cup_cfg_t cfg = {
.cmd = 0x10AD,
@@ -36,19 +36,38 @@
uint8_t percent_old = 255;
Timer tim;
- //src_offset = ((src_offset / FLASH_PAGE_SIZE) + 1) * FLASH_PAGE_SIZE;
- src_offset = 0;
+ // get archive address
+ uint32_t addr = *((uint32_t*)&this->data[4]);
+ // get uncompressed size
+ uint32_t dsize = *((uint32_t*)&this->data[9]);
+ // End address
+ uint32_t eaddr = addr + dsize;
+
+ uint32_t offset = 0;
+
+ if (eaddr > src_offset)
+ {
+ // Calculate offset if needed
+ PRINT("/!\\ CUP process will overwrite Archive: 0x%08X + %d > 0x%08X /!\\\r\n", addr, dsize, src_offset);
+ eaddr = ((eaddr / FLASH_PAGE_SIZE) + 1) * FLASH_PAGE_SIZE;
+ offset = eaddr - src_offset;
+ PRINT("/!\\ CUP Shifting archive storage to 0x%08X (Offset 0x%X) /!\\\r\n", eaddr, offset);
+ }
+
+ max_size -= offset;
+ int32_t slack = max_size - this->data_size;
+ ASSERT(slack >= 0, "Not enough space to store archive! (%d bytes short)\r\n", slack);
+
+ D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 4, root_key);
// Upload file
- PRINT("UPLOADING CUP FILE Start.\r\n");
-
- D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 4, root_key);
+ PRINT("Uploading %d bytes at address 0x%08X (%d bytes slack)\r\n", this->data_size, src_offset + offset, slack);
tim.start();
while (rem > 0)
{
- D7A_WRITE(&(this->data[fof]), CUP_CODE_FID, fof, TU_LOCAL, NULL);
+ D7A_WRITE(&(this->data[fof]), CUP_CODE_FID, fof + offset, TU_LOCAL, NULL);
rem -= TU_LOCAL;
fof += TU_LOCAL;
@@ -66,12 +85,13 @@
float time_s = tim.read();
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);
+ // Force PFLASH-cache flushing
D7A_FLUSH(CUP_CODE_FID, root_key);
// Send Upgrade command
cfg.cmd = 0xC0D5;
cfg.arch_nb = this->nb_archives;
- cfg.src_offset = src_offset;
+ cfg.src_offset = offset;
cfg.signature = this->signature;
D7A_WRITE((uint8_t*)&cfg, CUP_CFG_FID, 0, 12, root_key);
--- a/cup.h Wed Oct 26 11:41:24 2016 +0000
+++ b/cup.h Wed Oct 26 14:13:58 2016 +0000
@@ -100,7 +100,7 @@
CUP_Archive(void);
- void start_update(uint32_t src_offset);
+ void start_update(uint32_t src_offset, uint32_t max_size);
};
\ No newline at end of file
--- a/main.cpp Wed Oct 26 11:41:24 2016 +0000
+++ b/main.cpp Wed Oct 26 14:13:58 2016 +0000
@@ -138,7 +138,7 @@
}
button_user.wait();
- cup_pkg.start_update(cup_cfg.src_offset);
+ cup_pkg.start_update(cup_cfg.src_offset, cup_cfg.key);
}
// Set main task to lowest priority