aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--package/system/mtd/src/fis.c6
-rw-r--r--package/system/mtd/src/fis.h2
-rw-r--r--package/system/mtd/src/mtd.c21
3 files changed, 26 insertions, 3 deletions
diff --git a/package/system/mtd/src/fis.c b/package/system/mtd/src/fis.c
index b50411cfeb..e314c10258 100644
--- a/package/system/mtd/src/fis.c
+++ b/package/system/mtd/src/fis.c
@@ -243,14 +243,14 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new)
memset(desc, 0, sizeof(struct fis_image_desc));
memcpy(desc->hdr.name, part->name, sizeof(desc->hdr.name));
desc->crc.desc = 0;
- desc->crc.file = 0;
+ desc->crc.file = part->crc;
desc->hdr.flash_base = offset;
desc->hdr.mem_base = part->loadaddr;
desc->hdr.entry_point = part->loadaddr;
desc->hdr.size = (part->size > 0) ? part->size : size;
- desc->hdr.data_length = desc->hdr.size;
-
+ desc->hdr.data_length = (part->length > 0) ? part->length :
+ desc->hdr.size;
offset += desc->hdr.size;
size -= desc->hdr.size;
}
diff --git a/package/system/mtd/src/fis.h b/package/system/mtd/src/fis.h
index bdf1103d8a..2be2cb1f04 100644
--- a/package/system/mtd/src/fis.h
+++ b/package/system/mtd/src/fis.h
@@ -6,6 +6,8 @@ struct fis_part {
uint32_t offset;
uint32_t loadaddr;
uint32_t size;
+ uint32_t length;
+ uint32_t crc;
};
int fis_validate(struct fis_part *old, int n_old, struct fis_part *new, int n_new);
diff --git a/package/system/mtd/src/mtd.c b/package/system/mtd/src/mtd.c
index eccb4f6a1a..9baed3fd5e 100644
--- a/package/system/mtd/src/mtd.c
+++ b/package/system/mtd/src/mtd.c
@@ -44,6 +44,7 @@
#include <sys/reboot.h>
#include <linux/reboot.h>
#include <mtd/mtd-user.h>
+#include "crc32.h"
#include "fis.h"
#include "mtd.h"
@@ -473,12 +474,14 @@ mtd_write(int imagefd, const char *mtd, char *fis_layout, size_t part_offset)
ssize_t r, w, e;
ssize_t skip = 0;
uint32_t offset = 0;
+ int buflen_raw = 0;
int jffs2_replaced = 0;
int skip_bad_blocks = 0;
#ifdef FIS_SUPPORT
static struct fis_part new_parts[MAX_ARGS];
static struct fis_part old_parts[MAX_ARGS];
+ struct fis_part *cur_part = NULL;
int n_new = 0, n_old = 0;
if (fis_layout) {
@@ -488,6 +491,8 @@ mtd_write(int imagefd, const char *mtd, char *fis_layout, size_t part_offset)
memset(&old_parts, 0, sizeof(old_parts));
memset(&new_parts, 0, sizeof(new_parts));
+ if (!part_offset)
+ cur_part = new_parts;
do {
next = strchr(tmp, ':');
@@ -588,6 +593,9 @@ resume:
buflen += r;
}
+ if (buflen_raw == 0)
+ buflen_raw = buflen;
+
if (buflen == 0)
break;
@@ -599,6 +607,7 @@ resume:
if (skip > 0) {
skip -= buflen;
+ buflen_raw = 0;
buflen = 0;
if (skip <= 0)
indicate_writing(mtd);
@@ -622,6 +631,7 @@ resume:
w += skip;
e += skip;
skip -= buflen;
+ buflen_raw = 0;
buflen = 0;
offset = 0;
continue;
@@ -687,6 +697,17 @@ resume:
}
w += buflen;
+#ifdef FIS_SUPPORT
+ if (cur_part && cur_part->size
+ && cur_part < &new_parts[MAX_ARGS - 1]
+ && cur_part->length + buflen_raw > cur_part->size)
+ cur_part++;
+ if (cur_part) {
+ cur_part->length += buflen_raw;
+ cur_part->crc = crc32(cur_part->crc, buf, buflen_raw);
+ }
+#endif
+ buflen_raw = 0;
buflen = 0;
offset = 0;
}