|
@@ -44,6 +44,7 @@
|
|
|
#include <sys/reboot.h>
|
|
#include <sys/reboot.h>
|
|
|
#include <linux/reboot.h>
|
|
#include <linux/reboot.h>
|
|
|
#include <mtd/mtd-user.h>
|
|
#include <mtd/mtd-user.h>
|
|
|
|
|
+#include "crc32.h"
|
|
|
#include "fis.h"
|
|
#include "fis.h"
|
|
|
#include "mtd.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 r, w, e;
|
|
|
ssize_t skip = 0;
|
|
ssize_t skip = 0;
|
|
|
uint32_t offset = 0;
|
|
uint32_t offset = 0;
|
|
|
|
|
+ int buflen_raw = 0;
|
|
|
int jffs2_replaced = 0;
|
|
int jffs2_replaced = 0;
|
|
|
int skip_bad_blocks = 0;
|
|
int skip_bad_blocks = 0;
|
|
|
|
|
|
|
|
#ifdef FIS_SUPPORT
|
|
#ifdef FIS_SUPPORT
|
|
|
static struct fis_part new_parts[MAX_ARGS];
|
|
static struct fis_part new_parts[MAX_ARGS];
|
|
|
static struct fis_part old_parts[MAX_ARGS];
|
|
static struct fis_part old_parts[MAX_ARGS];
|
|
|
|
|
+ struct fis_part *cur_part = NULL;
|
|
|
int n_new = 0, n_old = 0;
|
|
int n_new = 0, n_old = 0;
|
|
|
|
|
|
|
|
if (fis_layout) {
|
|
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(&old_parts, 0, sizeof(old_parts));
|
|
|
memset(&new_parts, 0, sizeof(new_parts));
|
|
memset(&new_parts, 0, sizeof(new_parts));
|
|
|
|
|
+ if (!part_offset)
|
|
|
|
|
+ cur_part = new_parts;
|
|
|
|
|
|
|
|
do {
|
|
do {
|
|
|
next = strchr(tmp, ':');
|
|
next = strchr(tmp, ':');
|
|
@@ -588,6 +593,9 @@ resume:
|
|
|
buflen += r;
|
|
buflen += r;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (buflen_raw == 0)
|
|
|
|
|
+ buflen_raw = buflen;
|
|
|
|
|
+
|
|
|
if (buflen == 0)
|
|
if (buflen == 0)
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
@@ -599,6 +607,7 @@ resume:
|
|
|
|
|
|
|
|
if (skip > 0) {
|
|
if (skip > 0) {
|
|
|
skip -= buflen;
|
|
skip -= buflen;
|
|
|
|
|
+ buflen_raw = 0;
|
|
|
buflen = 0;
|
|
buflen = 0;
|
|
|
if (skip <= 0)
|
|
if (skip <= 0)
|
|
|
indicate_writing(mtd);
|
|
indicate_writing(mtd);
|
|
@@ -622,6 +631,7 @@ resume:
|
|
|
w += skip;
|
|
w += skip;
|
|
|
e += skip;
|
|
e += skip;
|
|
|
skip -= buflen;
|
|
skip -= buflen;
|
|
|
|
|
+ buflen_raw = 0;
|
|
|
buflen = 0;
|
|
buflen = 0;
|
|
|
offset = 0;
|
|
offset = 0;
|
|
|
continue;
|
|
continue;
|
|
@@ -687,6 +697,17 @@ resume:
|
|
|
}
|
|
}
|
|
|
w += buflen;
|
|
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;
|
|
buflen = 0;
|
|
|
offset = 0;
|
|
offset = 0;
|
|
|
}
|
|
}
|