fix CRC32 calculation for sysupgrade
authorMarkus Wigge <mwigge@marcant.net>
Tue, 27 Jul 2010 15:37:37 +0000 (15:37 +0000)
committerMarkus Wigge <mwigge@marcant.net>
Tue, 27 Jul 2010 15:37:37 +0000 (15:37 +0000)
* 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

target/linux/brcm47xx/image/Makefile
tools/firmware-utils/src/trx.c

index 69a31e7554fe519449acc9a48e07835c4ad95257..f534f5f28499fa31dafbc0afe04314cb7941e3c2 100644 (file)
@@ -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
index 7a64cfd1a9cc58a5282fa28aac78221df7c12e41..9697ad79dcc6e6b0866b3a6be80907cc8f2dcab8 100644 (file)
@@ -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) {