Fix merge problem with flash verify for F4
authorKarl Palsson <karlp@tweak.net.au>
Tue, 15 Nov 2011 19:56:14 +0000 (19:56 +0000)
committerKarl Palsson <karlp@tweak.net.au>
Tue, 15 Nov 2011 19:56:14 +0000 (19:56 +0000)
The F4 code had #ifdefd out the verification, as the page/sector size can be
too large to read in via a single transfer.  Pull the verification out to a
separate function, the flash write was getting far too large anyway.

src/stlink-common.c
src/stlink-common.h

index 214f6c5735bb4bfd742923cd27699718fad81e05..3b84cc689119be4f11664f741057a71c080e2184 100644 (file)
@@ -1148,6 +1148,46 @@ int stlink_fcheck_flash(stlink_t *sl, const char* path, stm32_addr_t addr) {
     return res;
 }
 
+/**
+ * Verify addr..addr+len is binary identical to base...base+len
+ * @param sl stlink context
+ * @param address stm device address
+ * @param data host side buffer to check against
+ * @param length how much
+ * @return 0 for success, -ve for failure
+ */
+int stlink_verify_write_flash(stlink_t *sl, stm32_addr_t address, uint8_t *data, unsigned length) {
+    size_t off;
+    if ((sl->chip_id & 0xFFF) == STM32_CHIPID_F4) {
+        DLOG("(FIXME)Skipping verification for F4, not enough ram (yet)\n");
+        return 0;
+    }
+    ILOG("Starting verification of write complete\n");
+    for (off = 0; off < length; off += sl->flash_pgsz) {
+        size_t aligned_size;
+
+        /* adjust last page size */
+        size_t cmp_size = sl->flash_pgsz;
+        if ((off + sl->flash_pgsz) > length)
+            cmp_size = length - off;
+
+        aligned_size = cmp_size;
+        if (aligned_size & (4 - 1))
+            aligned_size = (cmp_size + 4) & ~(4 - 1);
+
+               fprintf(stdout, "AlignedSize:%#zx\n", aligned_size);
+        stlink_read_mem32(sl, address + off, aligned_size);
+
+        if (memcmp(sl->q_buf, data + off, cmp_size)) {
+            WLOG("Verification of flash failed at offset: %zd\n", off);
+            return -1;
+        }
+    }
+    ILOG("Flash written and verified! jolly good!\n");
+    return 0;
+
+}
+
 int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, unsigned len) {
     size_t off;
     flash_loader_t fl;
@@ -1370,28 +1410,8 @@ int stlink_write_flash(stlink_t *sl, stm32_addr_t addr, uint8_t* base, unsigned
         WLOG("unknown coreid, not sure how to write: %x\n", sl->core_id);
         return -1;
     }
-
-    ILOG("Starting verification of write complete\n");
-    for (off = 0; off < len; off += sl->flash_pgsz) {
-        size_t aligned_size;
-
-        /* adjust last page size */
-        size_t cmp_size = sl->flash_pgsz;
-        if ((off + sl->flash_pgsz) > len)
-            cmp_size = len - off;
-
-        aligned_size = cmp_size;
-        if (aligned_size & (4 - 1))
-            aligned_size = (cmp_size + 4) & ~(4 - 1);
-
-               fprintf(stdout, "AlignedSize:%#zx\n", aligned_size);
-        stlink_read_mem32(sl, addr + off, aligned_size);
-
-        if (memcmp(sl->q_buf, base + off, cmp_size))
-            return -1;
-    }
-    ILOG("Flash written and verified! jolly good!\n");
-    return 0;
+    
+    return stlink_verify_write_flash(sl, addr, base, len);
 }
 
 /**
index 82967d4b5951a733dd42f198782a806989c98509..ae02961a0544ff1112d4a86939cbd8869318970b 100644 (file)
@@ -348,6 +348,7 @@ extern "C" {
     int stlink_erase_flash_mass(stlink_t* sl);
     int stlink_write_flash(stlink_t* sl, stm32_addr_t address, uint8_t* data, unsigned length);
     int stlink_fwrite_flash(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, unsigned length);
     
     // PUBLIC
     uint32_t stlink_chip_id(stlink_t *sl);