WizziLab / Mbed OS D7A_WM_Updater

Dependencies:   modem_ref_helper DebouncedInterrupt

Files at this revision

API Documentation at this revision

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

cup.cpp Show annotated file Show diff for this revision Revisions of this file
cup.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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