mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-08-19 12:58:36 +03:00
Fix 32/64bits issues with airlink image generator
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7189 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
9c5c412127
commit
489e115285
@ -25,10 +25,9 @@ AIRLINK AR525W firmware image structure
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
typedef unsigned long u32;
|
|
||||||
typedef unsigned char uchar;
|
typedef unsigned char uchar;
|
||||||
|
|
||||||
u32 crctab[257] = {
|
uint32_t crctab[257] = {
|
||||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
|
||||||
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
|
||||||
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||||
@ -96,7 +95,7 @@ u32 crctab[257] = {
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 header[] = {
|
uint32_t header[] = {
|
||||||
0x00000000, 0x4e525241,
|
0x00000000, 0x4e525241,
|
||||||
0x4b544d47, 0x00000000, 0x00000000, 0x000afd4a,
|
0x4b544d47, 0x00000000, 0x00000000, 0x000afd4a,
|
||||||
0x00000000, 0x00000005, 0x00000000, 0x00000000
|
0x00000000, 0x00000005, 0x00000000, 0x00000000
|
||||||
@ -107,7 +106,7 @@ static int JFFS2 = 0;
|
|||||||
int generate_image(char *kname, char *fsname, char *fname, int EHDR)
|
int generate_image(char *kname, char *fsname, char *fname, int EHDR)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u32 lenk, lens;
|
uint32_t lenk, lens;
|
||||||
uchar *bk, *bs;
|
uchar *bk, *bs;
|
||||||
int fkd, ffd, fsd;
|
int fkd, ffd, fsd;
|
||||||
fkd = open(kname, O_RDONLY);
|
fkd = open(kname, O_RDONLY);
|
||||||
@ -151,11 +150,11 @@ int generate_image(char *kname, char *fsname, char *fname, int EHDR)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 crc32(uchar * buf, u32 len)
|
uint32_t crc32(uchar * buf, uint32_t len)
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
u32 sum;
|
uint32_t sum;
|
||||||
register u32 s0;
|
register uint32_t s0;
|
||||||
s0 = ~0;
|
s0 = ~0;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
s0 = (s0 >> 8) ^ crctab[(uchar) (s0 & 0xFF) ^ buf[i]];
|
s0 = (s0 >> 8) ^ crctab[(uchar) (s0 & 0xFF) ^ buf[i]];
|
||||||
@ -242,10 +241,10 @@ int main(int argc, char **argv)
|
|||||||
lseek(fd, 0, SEEK_SET);
|
lseek(fd, 0, SEEK_SET);
|
||||||
uchar *buf = malloc(len);
|
uchar *buf = malloc(len);
|
||||||
read(fd, buf, len);
|
read(fd, buf, len);
|
||||||
u32 sum, l0;
|
uint32_t sum, l0;
|
||||||
u32 MagicS = 0x474d544b;
|
uint32_t MagicS = 0x474d544b;
|
||||||
u32 MagicE = 0x4152524e;
|
uint32_t MagicE = 0x4152524e;
|
||||||
if (ntohl(*((u32 *) buf)) == MagicS) {
|
if (ntohl(*((uint32_t *) buf)) == MagicS) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Image without extra 8 bytes - Standard header\n");
|
"Image without extra 8 bytes - Standard header\n");
|
||||||
buf[0x10] = len & 0xff;
|
buf[0x10] = len & 0xff;
|
||||||
@ -255,11 +254,11 @@ int main(int argc, char **argv)
|
|||||||
lseek(fd, 0x10, SEEK_SET);
|
lseek(fd, 0x10, SEEK_SET);
|
||||||
write(fd, buf + 0x10, 0x4);
|
write(fd, buf + 0x10, 0x4);
|
||||||
EHDR = 0;
|
EHDR = 0;
|
||||||
} else if ((ntohl(*((u32 *) (buf + 0x8))) == MagicS)
|
} else if ((ntohl(*((uint32_t *) (buf + 0x8))) == MagicS)
|
||||||
&& ((ntohl(*((u32 *) (buf + 0x4))) == MagicE))) {
|
&& ((ntohl(*((uint32_t *) (buf + 0x4))) == MagicE))) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Image with extra 8 bytes - Extended header\n");
|
"Image with extra 8 bytes - Extended header\n");
|
||||||
*((u32 *) (buf + 0x18)) = len - 8;
|
*((uint32_t *) (buf + 0x18)) = len - 8;
|
||||||
buf[0x18] = (len - 8) & 0xff;
|
buf[0x18] = (len - 8) & 0xff;
|
||||||
buf[0x19] = ((len - 8) >> 8) & 0xff;
|
buf[0x19] = ((len - 8) >> 8) & 0xff;
|
||||||
buf[0x1a] = ((len - 8) >> 16) & 0xff;
|
buf[0x1a] = ((len - 8) >> 16) & 0xff;
|
||||||
@ -268,11 +267,11 @@ int main(int argc, char **argv)
|
|||||||
write(fd, buf + 0x18, 0x4);
|
write(fd, buf + 0x18, 0x4);
|
||||||
buf += 8;
|
buf += 8;
|
||||||
EHDR = 1;
|
EHDR = 1;
|
||||||
} else if (len == buf[0x10] | ((u32)buf[0x11] << 8) | ((u32)buf[0x12] << 16) | ((u32)buf[0x13] << 24)) {
|
} else if (len == buf[0x10] | ((uint32_t)buf[0x11] << 8) | ((uint32_t)buf[0x12] << 16) | ((uint32_t)buf[0x13] << 24)) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Image without extra 8 bytes - Standard header\n");
|
"Image without extra 8 bytes - Standard header\n");
|
||||||
EHDR = 0;
|
EHDR = 0;
|
||||||
} else if (len == (buf[0x18] | ((u32)buf[0x19] << 8) | ((u32)buf[0x1a] << 16) | ((u32)buf[0x1b] << 24)) + 8) {
|
} else if (len == (buf[0x18] | ((uint32_t)buf[0x19] << 8) | ((uint32_t)buf[0x1a] << 16) | ((uint32_t)buf[0x1b] << 24)) + 8) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Image with extra 8 bytes - Extended header\n");
|
"Image with extra 8 bytes - Extended header\n");
|
||||||
buf += 8;
|
buf += 8;
|
||||||
@ -281,16 +280,16 @@ int main(int argc, char **argv)
|
|||||||
fprintf(stderr, "ERROR: Wrong image size\n");
|
fprintf(stderr, "ERROR: Wrong image size\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
l0 = buf[0x10] | ((u32)buf[0x11] << 8) | ((u32)buf[0x12] << 16) | ((u32)buf[0x13] << 24);
|
l0 = buf[0x10] | ((uint32_t)buf[0x11] << 8) | ((uint32_t)buf[0x12] << 16) | ((uint32_t)buf[0x13] << 24);
|
||||||
if (!BHDR)
|
if (!BHDR)
|
||||||
*((u32 *) & buf[0x18]) = 0;
|
*((uint32_t *) & buf[0x18]) = 0;
|
||||||
unsigned long sum0 = buf[0x18] | ((u32)buf[0x19] << 8) | ((u32)buf[0x1a] << 16) | ((u32)buf[0x1b] << 24);
|
unsigned long sum0 = buf[0x18] | ((uint32_t)buf[0x19] << 8) | ((uint32_t)buf[0x1a] << 16) | ((uint32_t)buf[0x1b] << 24);
|
||||||
unsigned long sum1 = buf[0x4] | ((u32)buf[0x5] << 8) | ((u32)buf[0x6] << 16) | ((u32)buf[0x7] << 24);
|
unsigned long sum1 = buf[0x4] | ((uint32_t)buf[0x5] << 8) | ((uint32_t)buf[0x6] << 16) | ((uint32_t)buf[0x7] << 24);
|
||||||
*((u32 *) & buf[0x4]) = 0x0L;
|
*((uint32_t *) & buf[0x4]) = 0x0L;
|
||||||
memcpy(b, buf, 0x100);
|
memcpy(b, buf, 0x100);
|
||||||
memcpy(b + 0x100, buf + ((l0 >> 1) - ((l0 & 0x6) >> 1)), 0x100);
|
memcpy(b + 0x100, buf + ((l0 >> 1) - ((l0 & 0x6) >> 1)), 0x100);
|
||||||
memcpy(b + 0x200, buf + (l0 - 0x200), 0x200);
|
memcpy(b + 0x200, buf + (l0 - 0x200), 0x200);
|
||||||
*((u32 *) & b[0x18]) = 0x0L;
|
*((uint32_t *) & b[0x18]) = 0x0L;
|
||||||
|
|
||||||
sum = crc32(b, 0x400);
|
sum = crc32(b, 0x400);
|
||||||
printf("CRC32 sum0 - (%x, %x, %x)\n", sum, sum0, 0x400);
|
printf("CRC32 sum0 - (%x, %x, %x)\n", sum, sum0, 0x400);
|
||||||
@ -316,13 +315,13 @@ int main(int argc, char **argv)
|
|||||||
buf[0x7] = (sum >> 24) & 0xff;
|
buf[0x7] = (sum >> 24) & 0xff;
|
||||||
write(fd, &buf[0x4], 0x4);
|
write(fd, &buf[0x4], 0x4);
|
||||||
if (EHDR) {
|
if (EHDR) {
|
||||||
unsigned long sum2 = buf[-0x8] | ((u32)buf[-0x7] << 8) | ((u32)buf[-0x6] << 16) | ((u32)buf[-0x5] << 24);
|
unsigned long sum2 = buf[-0x8] | ((uint32_t)buf[-0x7] << 8) | ((uint32_t)buf[-0x6] << 16) | ((uint32_t)buf[-0x5] << 24);
|
||||||
*((u32 *) & buf[-0x8]) = 0L;
|
*((uint32_t *) & buf[-0x8]) = 0L;
|
||||||
sum = crc32(buf - 0x4, len - 0x4);
|
sum = crc32(buf - 0x4, len - 0x4);
|
||||||
printf("CRC32 sum2 - (%x, %x, %x)\n", sum, sum2,
|
printf("CRC32 sum2 - (%x, %x, %x)\n", sum, sum2,
|
||||||
len - 0x4);
|
len - 0x4);
|
||||||
lseek(fd, 0, SEEK_SET);
|
lseek(fd, 0, SEEK_SET);
|
||||||
*((u32 *) & buf[-0x8]) = htonl(sum);
|
*((uint32_t *) & buf[-0x8]) = htonl(sum);
|
||||||
write(fd, &buf[-0x8], 0x4);
|
write(fd, &buf[-0x8], 0x4);
|
||||||
buf -= 8;
|
buf -= 8;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user