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
This commit is contained in:
Markus Wigge 2010-07-27 15:37:37 +00:00
parent 9afff8f6a6
commit 7a052dc799
2 changed files with 6 additions and 4 deletions

View File

@ -56,7 +56,7 @@ define trxalign/jffs2-64k
-a 0x10000 -f $(KDIR)/root.$(1) -a 0x10000 -f $(KDIR)/root.$(1)
endef endef
define trxalign/squashfs 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 endef
define Image/Build/trxV2 define Image/Build/trxV2

View File

@ -98,7 +98,7 @@ int main(int argc, char **argv)
int c, i, append = 0; int c, i, append = 0;
size_t n; size_t n;
ssize_t n2; ssize_t n2;
uint32_t cur_len; uint32_t cur_len, fsmark=0;
unsigned long maxlen = TRX_MAX_LEN; unsigned long maxlen = TRX_MAX_LEN;
struct trx_header *p; struct trx_header *p;
char trx_version = 1; char trx_version = 1;
@ -131,6 +131,8 @@ int main(int argc, char **argv)
cur_len += 4; cur_len += 4;
} }
break; break;
case 'F':
fsmark = cur_len;
case 'A': case 'A':
append = 1; append = 1;
/* fall through */ /* fall through */
@ -269,10 +271,10 @@ int main(int argc, char **argv)
} }
p->crc32 = crc32buf((char *) &p->flag_version, 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->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 */ /* restore TRXv2 bin-header */
if (trx_version == 2) { if (trx_version == 2) {