aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Wigge <mwigge@marcant.net>2010-07-27 15:37:37 +0000
committerMarkus Wigge <mwigge@marcant.net>2010-07-27 15:37:37 +0000
commit7a052dc79957fd5bc719e64b124afa0449b89171 (patch)
treed2ba5ae4ec954cd840195476307661249d19e493
parent9afff8f6a643e296e0ca5aed1f74439ff15a8489 (diff)
downloadupstream-7a052dc79957fd5bc719e64b124afa0449b89171.tar.gz
upstream-7a052dc79957fd5bc719e64b124afa0449b89171.tar.bz2
upstream-7a052dc79957fd5bc719e64b124afa0449b89171.zip
fix CRC32 calculation for sysupgrade
* reduce image size for CRC calculation by fs_mark size sysupgrade sometimes failed for me and I noticed that it was due to incorrect CRC values in trx-header after performing it. It seems that the fs_mark was completely included in the calculation and that it was nevertheless modified by sysupgrade while appending the jffs data. This only occurs for the first boot after sysupgrade as the flashmap driver recalculates the CRC to an even smaller area when it boots. SVN-Revision: 22396
-rw-r--r--target/linux/brcm47xx/image/Makefile2
-rw-r--r--tools/firmware-utils/src/trx.c8
2 files changed, 6 insertions, 4 deletions
diff --git a/target/linux/brcm47xx/image/Makefile b/target/linux/brcm47xx/image/Makefile
index 69a31e7554..f534f5f284 100644
--- a/target/linux/brcm47xx/image/Makefile
+++ b/target/linux/brcm47xx/image/Makefile
@@ -56,7 +56,7 @@ define trxalign/jffs2-64k
-a 0x10000 -f $(KDIR)/root.$(1)
endef
define trxalign/squashfs
--a 1024 -f $(KDIR)/root.$(1) $(if $(2),-f $(2)) -a 0x10000 -A $(KDIR)/fs_mark
+-a 1024 -f $(KDIR)/root.$(1) $(if $(2),-f $(2)) -a 0x10000 -F $(KDIR)/fs_mark
endef
define Image/Build/trxV2
diff --git a/tools/firmware-utils/src/trx.c b/tools/firmware-utils/src/trx.c
index 7a64cfd1a9..9697ad79dc 100644
--- a/tools/firmware-utils/src/trx.c
+++ b/tools/firmware-utils/src/trx.c
@@ -98,7 +98,7 @@ int main(int argc, char **argv)
int c, i, append = 0;
size_t n;
ssize_t n2;
- uint32_t cur_len;
+ uint32_t cur_len, fsmark=0;
unsigned long maxlen = TRX_MAX_LEN;
struct trx_header *p;
char trx_version = 1;
@@ -131,6 +131,8 @@ int main(int argc, char **argv)
cur_len += 4;
}
break;
+ case 'F':
+ fsmark = cur_len;
case 'A':
append = 1;
/* fall through */
@@ -269,10 +271,10 @@ int main(int argc, char **argv)
}
p->crc32 = crc32buf((char *) &p->flag_version,
- cur_len - offsetof(struct trx_header, flag_version));
+ (fsmark)?fsmark:cur_len - offsetof(struct trx_header, flag_version));
p->crc32 = STORE32_LE(p->crc32);
- p->len = STORE32_LE(cur_len);
+ p->len = (fsmark)?fsmark:cur_len - offsetof(struct trx_header, flag_version);
/* restore TRXv2 bin-header */
if (trx_version == 2) {