firmware-utils: fix endianness bugs in firmware generation program.
authorHauke Mehrtens <hauke@hauke-m.de>
Sat, 9 Apr 2011 15:06:01 +0000 (15:06 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Sat, 9 Apr 2011 15:06:01 +0000 (15:06 +0000)
Should make it work on big endian systems again, I do not have such a system.

This closes #9093.

SVN-Revision: 26543

tools/firmware-utils/src/trx2edips.c

index 378be2789e5cd77eea61282d3b6620391331a4c9..3869648e8cd433f1026bd9f78686942f0f95190b 100644 (file)
@@ -5,6 +5,17 @@
 #include <string.h>
 #include <errno.h>
 #include <unistd.h>
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define STORE32_LE(X)          bswap_32(X)
+#define LOAD32_LE(X)           bswap_32(X)
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+#define STORE32_LE(X)          (X)
+#define LOAD32_LE(X)           (X)
+#else
+#error unkown endianness!
+#endif
+
 /**********************************************************************/
 /* from trxhdr.h */
 
@@ -22,6 +33,12 @@ struct trx_header {
 };
 
 
+struct edimax_header {
+       uint32_t sign;                  /* signature for header */
+       uint32_t length;                /* start address but doesn't seems to be used... */
+       uint32_t start_addr;            /* length of data, not used too ...*/
+};
+
 
 #define EDIMAX_PS16    0x36315350      /* "PS16" */
 #define EDIMAX_HDR_LEN         0xc
@@ -93,16 +110,13 @@ int main(int argc, char *argv[])
 {
        FILE *fpIn = NULL;
        FILE *fpOut = NULL;
-       long  nImgSize;
-       uint32_t sign = EDIMAX_PS16;            /* signature for header */
-       uint32_t start_addr = 0x80500000;       /* start address but doesn't seems to be used... */
-       uint32_t length;                        /* length of data, not used too ...*/
+       struct edimax_header eh;
        size_t res;
+       int length;
 
        char *buf;
        struct trx_header *p;
 
-
        if (argc != 3) {
                printf("Usage: %s <input file> <output file>\n", argv[0]);
                return -1;
@@ -128,8 +142,8 @@ int main(int argc, char *argv[])
        res = fread(buf, 1, length, fpIn);
 
        p = (struct trx_header *)buf;
-       if (p->magic != TRX_MAGIC) {
-               fprintf(stderr, "Not a trx file...%x\n", p->magic);
+       if (LOAD32_LE(p->magic) != TRX_MAGIC) {
+               fprintf(stderr, "Not a trx file...%x\n", LOAD32_LE(p->magic));
                return EXIT_FAILURE;
        }
 
@@ -141,13 +155,16 @@ int main(int argc, char *argv[])
                return EXIT_FAILURE;
        }
        /* make the 3 partition beeing 12 bytes closer from the header */
-       memcpy(buf + p->offsets[2] - EDIMAX_HDR_LEN, buf + p->offsets[2], length - p->offsets[2]);
+       memcpy(buf + LOAD32_LE(p->offsets[2]) - EDIMAX_HDR_LEN, buf + LOAD32_LE(p->offsets[2]), length - LOAD32_LE(p->offsets[2]));
        /* recompute the crc32 check */
-       p->crc32 = crc32buf((char *) &p->flag_version, length - offsetof(struct trx_header, flag_version));
+       p->crc32 = STORE32_LE(crc32buf((char *) &(LOAD32_LE(p->flag_version)), length - offsetof(struct trx_header, flag_version)));
+
+       eh.sign = STORE32_LE(EDIMAX_PS16);
+       eh.length = STORE32_LE(length);
+       eh.start_addr = STORE32_LE(0x80500000);
+
        /* write the modified file */
-       fwrite(&sign,  sizeof(uint32_t), 1, fpOut);
-       fwrite(&length, sizeof(uint32_t), 1, fpOut);
-       fwrite(&start_addr, sizeof(uint32_t), 1, fpOut);
+       fwrite(&eh, sizeof(struct edimax_header), 1, fpOut);
        fwrite(buf, sizeof(char), length, fpOut);
        fclose(fpOut);
 }