Ignore NULL bytes at flash end when reading
authorUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Sun, 18 Dec 2011 15:34:16 +0000 (16:34 +0100)
committerUwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
Sun, 18 Dec 2011 15:34:16 +0000 (16:34 +0100)
src/stlink-common.c

index 632c222ef5205f91fbe6353c83381ab00b921448..fac7b685c225cdcab25739bdadfc44ee2254001d 100644 (file)
@@ -803,6 +803,7 @@ int stlink_fread(stlink_t* sl, const char* path, stm32_addr_t addr, size_t size)
 
     int error = -1;
     size_t off;
 
     int error = -1;
     size_t off;
+    int num_zero = 0;
 
     const int fd = open(path, O_RDWR | O_TRUNC | O_CREAT, 00700);
     if (fd == -1) {
 
     const int fd = open(path, O_RDWR | O_TRUNC | O_CREAT, 00700);
     if (fd == -1) {
@@ -814,6 +815,7 @@ int stlink_fread(stlink_t* sl, const char* path, stm32_addr_t addr, size_t size)
     for (off = 0; off < size; off += 1024) {
         size_t read_size = 1024;
        size_t rounded_size;
     for (off = 0; off < size; off += 1024) {
         size_t read_size = 1024;
        size_t rounded_size;
+       size_t index;
         if ((off + read_size) > size)
          read_size = size - off;
 
         if ((off + read_size) > size)
          read_size = size - off;
 
@@ -824,12 +826,21 @@ int stlink_fread(stlink_t* sl, const char* path, stm32_addr_t addr, size_t size)
 
         stlink_read_mem32(sl, addr + off, rounded_size);
 
 
         stlink_read_mem32(sl, addr + off, rounded_size);
 
+       for(index = 0; index < read_size; index ++) {
+           if (sl->q_buf[index] == 0)
+               num_zero ++;
+           else
+               num_zero = 0;
+       }
         if (write(fd, sl->q_buf, read_size) != (ssize_t) read_size) {
             fprintf(stderr, "write() != read_size\n");
             goto on_error;
         }
     }
 
         if (write(fd, sl->q_buf, read_size) != (ssize_t) read_size) {
             fprintf(stderr, "write() != read_size\n");
             goto on_error;
         }
     }
 
+    /* Ignore NULL Bytes at end of file */
+    ftruncate(fd, size - num_zero);
+
     /* success */
     error = 0;
 
     /* success */
     error = 0;