ar71xx: add support for TP-LINK Archer C7 v5
[openwrt/openwrt.git] / tools / firmware-utils / src / trx2edips.c
index 9606bd851202449550c56d44510ccdc3c2302a4b..f8d068d5020593ab693df2e32c15105c6946ad74 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,9 +33,15 @@ 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
-#define EDIMAX_HDR_LEN 0xc
+#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;
@@ -113,21 +127,23 @@ int main(int argc, char *argv[])
                fprintf(stderr, "Unable to open %s\n", argv[1]);
                return EXIT_FAILURE;
        }
+       /* compute the length of the file */
        fseek(fpIn, 0, SEEK_END);
        length = ftell(fpIn);
-
+       /* alloc enough memory to store the file */
        buf = (char *)malloc(length);
        if (!buf) {
                fprintf(stderr, "malloc of buffers failed\n");
                return EXIT_FAILURE;
        }
-
+       
        rewind(fpIn);
+       /* read the whole file*/
        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;
        }
 
@@ -139,12 +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]);
-       p->crc32 = crc32buf((char *) &p->flag_version, length - offsetof(struct trx_header, flag_version));
+       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 = STORE32_LE(crc32buf((char *) &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);
 
-       fwrite(&sign,  sizeof(long), 1, fpOut);
-       fwrite(&length, sizeof(long), 1, fpOut);
-       fwrite(&start_addr, sizeof(long), 1, fpOut);
+       /* write the modified file */
+       fwrite(&eh, sizeof(struct edimax_header), 1, fpOut);
        fwrite(buf, sizeof(char), length, fpOut);
        fclose(fpOut);
 }