FIX: "unaligned addr or size" in attempt of write the program in the RAM (#323)
authortexane <texane@gmail.com>
Sat, 8 Aug 2015 14:03:49 +0000 (16:03 +0200)
committertexane <texane@gmail.com>
Sat, 8 Aug 2015 14:03:49 +0000 (16:03 +0200)
src/stlink-common.c

index 8c9d4090a72ae56b979b98bf3f96391a92f49be7..7bf6f7263f03cea09148f2e4a4c11c20c3a16993 100644 (file)
@@ -953,6 +953,7 @@ int stlink_fwrite_sram
 
     int error = -1;
     size_t off;
+    size_t len;
     mapped_file_t mf = MAPPED_FILE_INITIALIZER;
 
 
@@ -971,16 +972,23 @@ int stlink_fwrite_sram
     } else if ((addr + mf.len) > (sl->sram_base + sl->sram_size)) {
         fprintf(stderr, "addr too high\n");
         goto on_error;
-    } else if ((addr & 3) || (mf.len & 3)) {
+    } else if (addr & 3) {
         /* todo */
-        fprintf(stderr, "unaligned addr or size\n");
+        fprintf(stderr, "unaligned addr\n");
         goto on_error;
     }
+
+    len = mf.len;
+
+    if(len & 3) {
+      len -= len & 3;
+    }
+
     /* do the copy by 1k blocks */
-    for (off = 0; off < mf.len; off += 1024) {
+    for (off = 0; off < len; off += 1024) {
         size_t size = 1024;
-        if ((off + size) > mf.len)
-            size = mf.len - off;
+        if ((off + size) > len)
+            size = len - off;
 
         memcpy(sl->q_buf, mf.base + off, size);
 
@@ -991,6 +999,11 @@ int stlink_fwrite_sram
         stlink_write_mem32(sl, addr + off, size);
     }
 
+    if(mf.len > len) {
+        memcpy(sl->q_buf, mf.base + len, mf.len - len);
+        stlink_write_mem8(sl, addr + len, mf.len - len);
+    }
+
     /* check the file ha been written */
     if (check_file(sl, &mf, addr) == -1) {
         fprintf(stderr, "check_file() == -1\n");