Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Revision:
16:5a6168dbe7bb
Parent:
15:24434827c575
Child:
17:05c9ec970a6d
--- a/main.cpp	Fri Mar 10 16:01:27 2017 +0000
+++ b/main.cpp	Mon Mar 13 12:13:41 2017 +0000
@@ -94,10 +94,11 @@
 
 int32_t check_slack(cup_param_t* cup, cup_cfg_t* cup_cfg)
 {
-    PRINT("key: %d data: %d code: %d src: %d\r\n", cup_cfg->key, cup->data_size, cup->code_size, cup_cfg->src_offset);
+    //PRINT("key: %d data: %d code: %d src: %d\r\n", cup_cfg->key, cup->data_size, cup->code_size, cup_cfg->src_offset);
     PRINT("Checking CUP Slack...              ");
-        
-    int32_t cup_slack = cup_cfg->key - cup->data_size - (cup->code_size > cup_cfg->src_offset)? cup->code_size - cup_cfg->src_offset : 0;
+    
+    int32_t data_size = (((cup->data_size/256)+1)*256);
+    int32_t cup_slack = cup_cfg->key - data_size;
     
     if (cup_slack < 0)
     {
@@ -117,7 +118,6 @@
     d7a_revision_t rev;
     cup_cfg_t cup_cfg;
     cup_param_t* cup = (cup_param_t*)&cup_modem;
-    uint32_t cup_offset;
     int32_t cup_slack;
     
     // Start & initialize
@@ -154,6 +154,10 @@
         if (rev.device_id == BOOTLOADER_DEV_ID)
         {
             // Update bootloader
+            PRINT("\r\n"
+                  "/!\\ This modem has a 4.7.x bootloader firmware. /!\\\r\n"
+                  "/!\\ Step 2/2: Upgrading to full modem firmware. /!\\\r\n"
+                  );
             
             // Read CUP config with root permissions
             D7A_READ(&cup_cfg, cup->cfg_fid, 0, sizeof(cup_cfg_t), root_key);
@@ -165,10 +169,8 @@
                 PRINT("/!\\ Not enough space for bootloader /!\\\r\n");
                 break;
             }
-            
-            cup_offset = cup_cfg.key + cup_cfg.src_offset - cup->data_size;
-            
-            cup_start_update(cup_offset);
+                        
+            cup_start_update(cup_slack);
         }
         else
         {
@@ -195,12 +197,12 @@
                     print_check_rev();
                     break;
                 }
-                
+                /*
                 if (check_parameter("Firmware version minor...", rev.fw_version.minor, cup->target_fw_minor))
                 {
                     print_check_rev();
                     break;
-                }
+                }*/
             }
             else
             {
@@ -216,7 +218,11 @@
             
             if (cup_slack < 0)
             {
-                PRINT("/!\\ Not enough space for binary, checking for bootloader /!\\\r\n");
+                PRINT("\r\n"
+                      "/!\\ Not enough space for full modem firmware binary /!\\\r\n"
+                      "/!\\ Checking for bootloader firmware                /!\\\r\n"
+                      "\r\n"
+                );
                 
                 cup_slack = check_slack((cup_param_t*)&cup_bootloader, &cup_cfg);
                 
@@ -227,6 +233,12 @@
                 }
                 
                 bootloader = true;
+                
+                PRINT("\r\n"
+                      "/!\\ This update will be done in 2 steps.                              /!\\\r\n"
+                      "/!\\ Step 1/2: Upgrading modem to bootloader.                          /!\\\r\n"
+                      "/!\\ Do no push the reset button or turn off the board during upgrade. /!\\\r\n"
+                      );
             }
             else
             {
@@ -260,8 +272,7 @@
     #endif
             }
         
-            cup_offset = cup_cfg.key - cup->data_size;
-            cup_start_update(cup_offset, bootloader);
+            cup_start_update(cup_slack, bootloader);
         }
     
     } while (0);