be quicker about determining erased byte pattern when flashing
authorGeorge Talusan <george.talusan@gmail.com>
Sat, 27 Feb 2016 16:41:39 +0000 (11:41 -0500)
committerGeorge Talusan <george.talusan@gmail.com>
Sat, 27 Feb 2016 17:51:59 +0000 (12:51 -0500)
gdbserver/gdb-server.c
src/stlink-common.c
src/stlink-common.h

index 0c31cff18aca66e521e5d1bd1dda79c736d3f913..ef289f282a8789579cbeaa543330d36077284d1e 100644 (file)
@@ -752,7 +752,7 @@ static int flash_go(stlink_t *sl) {
             DLOG("flash_do: page %08x\n", page);
             unsigned send = length > FLASH_PAGE ? FLASH_PAGE : length;
             if(stlink_write_flash(sl, page, fb->data + (page - fb->addr),
-                        send) < 0)
+                        send, 0) < 0)
                 goto error;
             length -= send;
             
index 90d71f31e2e4cc36ab173e23417961a7a8290769..917a1e0e3c63c68e4ffc7002e7fd107963212bdc 100644 (file)
@@ -1723,7 +1723,7 @@ int stm32l1_write_half_pages(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uin
     return 0;
 }
 
-int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len) {
+int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t len, uint8_t eraseonly) {
     size_t off;
     flash_loader_t fl;
     ILOG("Attempting to write %d (%#x) bytes to stm32 address: %u (%#x)\n",
@@ -1769,6 +1769,9 @@ int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, uint32_t
     ILOG("Finished erasing %d pages of %d (%#x) bytes\n",
             page_count, sl->flash_pgsz, sl->flash_pgsz);
 
+    if (eraseonly)
+        return 0;
+
     if ((sl->chip_id == STM32_CHIPID_F2) ||
         (sl->chip_id == STM32_CHIPID_F4) ||
         (sl->chip_id == STM32_CHIPID_F4_DE) ||
@@ -1972,19 +1975,18 @@ int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
         ELOG("map_file() == -1\n");
         return -1;
     }
-    for(index = 0; index < mf.len; index ++) {
-        if (mf.base[index] == erased_pattern)
-            num_empty ++;
-        else
-            num_empty = 0;
+    for(index = mf.len - 1; num_empty < mf.len; index --) {
+        if (mf.base[index] != erased_pattern) {
+            break;
+        }
+        num_empty ++;
     }
     /* Round down to words */
     num_empty -= (num_empty & 3);
     if(num_empty != 0) {
         ILOG("Ignoring %d bytes of 0x%02x at end of file\n", num_empty, erased_pattern);
-        mf.len -= num_empty;
     }
-    err = stlink_write_flash(sl, addr, mf.base, mf.len);
+    err = stlink_write_flash(sl, addr, mf.base, num_empty == mf.len? mf.len : mf.len - num_empty, num_empty == mf.len);
     /* set stack*/
     stlink_write_reg(sl, stlink_read_debug32(sl, addr    ),13);
     /* Set PC to the reset routine*/
index a0bd64909d5b4f6fd9a7c7e22fb2880cca35fe78..2751ac8392f1014f8c3daf9fbc2398f4c249682e 100644 (file)
@@ -655,7 +655,7 @@ extern "C" {
 
     // unprocessed
     int stlink_erase_flash_mass(stlink_t* sl);
-    int stlink_write_flash(stlink_t* sl, stm32_addr_t address, uint8_t* data, uint32_t length);
+    int stlink_write_flash(stlink_t* sl, stm32_addr_t address, uint8_t* data, uint32_t length, uint8_t eraseonly);
     int stlink_fwrite_flash(stlink_t *sl, const char* path, stm32_addr_t addr);
     int stlink_fwrite_sram(stlink_t *sl, const char* path, stm32_addr_t addr);
     int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, uint32_t length);