firmware-utils: fix endianness bugs in firmware generation program.
Should make it work on big endian systems again, I do not have such a system. This closes #9093. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@26543 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
666d5984b9
commit
51633f949d
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue