From f1dba241d895bf8b640e8b4ee655b48001350076 Mon Sep 17 00:00:00 2001 From: kaloz Date: Mon, 6 Feb 2006 00:07:27 +0000 Subject: port the changes from [3155] to Kamikaze git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@3156 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- target/utils/src/motorola-bin.c | 57 +++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 10 deletions(-) (limited to 'target/utils/src') diff --git a/target/utils/src/motorola-bin.c b/target/utils/src/motorola-bin.c index 476afe32f2..acf856dde6 100644 --- a/target/utils/src/motorola-bin.c +++ b/target/utils/src/motorola-bin.c @@ -1,8 +1,9 @@ /* * motorola-bin.c * - * Copyright (C) 2005 Mike Baker - * Openwrt.org + * Copyright (C) 2005-2006 Mike Baker, + * Imre Kaloz + * OpenWrt.org * * $Id$ * @@ -22,6 +23,12 @@ * */ +/* + * February 1, 2006 + * + * Add support for for creating WA840G and WE800G images + */ + #include #include #include @@ -59,29 +66,41 @@ unsigned int crc32buf(char *buf, size_t len) struct motorola { unsigned int crc; // crc32 of the remainder - unsigned int flags; // unknown, 10577050 + unsigned int flags; // unknown, 105770* char *trx; // standard trx }; +void usage(void) __attribute__ (( __noreturn__ )); + +void usage(void) +{ + printf("Usage: motorola-bin [-device] [trxfile] [binfile]\n\n"); + printf("Known devices: 1 - WR850G | 2 - WA840G | 3 - WE800G\n"); + exit(1); +} + int main(int argc, char **argv) { unsigned int len; int fd; + int c; void *trx; struct motorola *firmware; - if (argc<3) { - printf("%s \n",argv[0]); - exit(0); + // verify parameters + + if (argc!=4) + { + usage(); } // mmap trx file - if (((fd = open(argv[1], O_RDONLY)) < 0) + if (((fd = open(argv[2], O_RDONLY)) < 0) || ((len = lseek(fd, 0, SEEK_END)) < 0) || ((trx = mmap(0, len, PROT_READ, MAP_SHARED, fd, 0)) == (void *) (-1)) || (close(fd) < 0)) { perror("open/malloc"); - exit(-1); + exit(1); } // create a firmware image in memory @@ -92,11 +111,29 @@ int main(int argc, char **argv) // setup the motorola headers init_crc32(); - firmware->flags = ntohl(0x10577050); + + // setup the firmware magic + + while ((c = getopt(argc, argv, "123")) !=-1) { + switch (c) { + case '1': + firmware->flags = ntohl(0x10577050); // Motorola WR850G + break; + case '2': + firmware->flags = ntohl(0x10577040); // Motorola WA840G + break; + case '3': + firmware->flags = ntohl(0x10577000); // Motorola WE800G + break; + default: + usage(); + } + } + firmware->crc = htonl(crc32buf((char *)&firmware->flags,len+4)); // write the firmware - if (((fd = open(argv[2], O_CREAT|O_WRONLY,0644)) < 0) + if (((fd = open(argv[3], O_CREAT|O_WRONLY,0644)) < 0) || (write(fd,firmware,len+8) != len+8) || (close(fd) < 0)) { perror("write"); -- cgit v1.2.3