On 21/04/2014 17:57, Claudio Leite wrote:
> Generates webflash-compatible images for a few RT2880 routers
> based on Gemtek OEM boards.
> 
> Signed-off-by: Claudio Leite <lei...@staticky.com>

is there a difference between these 2 patches and the 3/3 that was
posted earlier ? i already have the 3/3 in my local queue, wanna make
sure i push the correct patch ...








> --- tools/firmware-utils/Makefile              |   1 + 
> tools/firmware-utils/src/mkheader_gemtek.c | 211
> +++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) 
> create mode 100644 tools/firmware-utils/src/mkheader_gemtek.c
> 
> diff --git a/tools/firmware-utils/Makefile
> b/tools/firmware-utils/Makefile index 585090e..3be80e7 100644 ---
> a/tools/firmware-utils/Makefile +++
> b/tools/firmware-utils/Makefile @@ -66,6 +66,7 @@ define
> Host/Compile $(call cc,mkporayfw, -Wall) #$(call cc,mkhilinkfw,
> -lcrypto) $(call cc,mkdcs932, -Wall) +        $(call
> cc,mkheader_gemtek,-lz) endef
> 
> define Host/Install diff --git
> a/tools/firmware-utils/src/mkheader_gemtek.c
> b/tools/firmware-utils/src/mkheader_gemtek.c new file mode 100644 
> index 0000000..9e618ef --- /dev/null +++
> b/tools/firmware-utils/src/mkheader_gemtek.c @@ -0,0 +1,211 @@ +/* 
> + * Copyright (C) 2014  Claudio Leite <lei...@staticky.com> + * + *
> This program is free software; you can redistribute it and/or
> modify + * it under the terms of the GNU General Public License as
> published by + * the Free Software Foundation; either version 2 of
> the License, or + * (at your option) any later version. + * + *
> This program is distributed in the hope that it will be useful, + *
> but WITHOUT ANY WARRANTY; without even the implied warranty of + *
> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +
> * General Public License for more details. + * + * You should have
> received a copy of the GNU General Public License + * along with
> this program; if not, write to the Free Software + * Foundation,
> Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + 
> +/* + * Builds a proper flash image for routers using some Gemtek +
> * OEM boards. These include the Airlink101 AR725W, the + * Asante
> SmartHub 600 (AWRT-600N), and Linksys WRT100/110. + * + * The
> resulting image is compatible with the factory firmware + * web
> upgrade and TFTP interface. + * + * To build: + *  gcc -O2 -o
> mkheader_gemtek mkheader_gemtek.c -lz + * + * Claudio Leite
> <lei...@staticky.com> + */ + +#include <stdio.h> +#include
> <stdlib.h> +#include <stdint.h> +#include <string.h> + +#include
> <zlib.h>              /* for crc32() */ + +/* + * The header is in
> little-endian format. In case + * we are on a BE host, we need to
> swap binary + * values. + */ +#ifdef __APPLE__ +# include
> <libkern/OSByteOrder.h> +# define le32 OSSwapHostToLittleInt32 
> +#else +# if defined(__linux__) +#  include <endian.h> +#  if
> __BYTE_ORDER == __BIG_ENDIAN +#   define CPU_BIG_ENDIAN +#  endif 
> +# else +#  include <sys/endian.h>            /* BSD's should have this */ +#
> if _BYTE_ORDER == _BIG_ENDIAN +#   define CPU_BIG_ENDIAN +#  endif 
> +# endif +# ifdef CPU_BIG_ENDIAN +#  define le32(x) (((x &
> 0xff000000) >> 24) | \ +                   ((x & 0x00ff0000) >> 8)
> | \ +                   ((x & 0x0000ff00) << 8)  | \ +
> ((x & 0x000000ff) << 24)) +# else +#  define le32(x) (x) +# endif 
> +#endif + +struct gemtek_header { +   uint8_t         magic[4]; +     uint8_t
> version[4]; + uint32_t        product_id; +   uint32_t        imagesz; +      
> uint32_t
> checksum; +   uint32_t        fast_checksum; +        uint8_t         
> build[4]; +     uint8_t
> lang[4]; +}; + +#define HDRLEN        sizeof(struct gemtek_header) + 
> +struct machines { +  char           *desc; + char           *id; +
> uint32_t      maxsize; +      struct gemtek_header header; +}; + +struct
> machines mach_def[] = { +     {"Airlink101 AR725W", "ar725w",
> 0x340000, +           {"GMTK", "1003", le32(0x03000001), 0, 0, +              
>   0,
> "01\0\0", "EN\0\0"}}, +       {"Asante AWRT-600N", "awrt600n", 0x340000, 
> +             {"A600", "1005", le32(0x03000001), 0, 0, +                0, 
> "01\0\0",
> "EN\0\0"}}, + {"Linksys WRT100", "wrt100", 0x320000, +                {"GMTK",
> "1007", le32(0x03040001), 0, 0, +               0, "2\0\0\0", "EN\0\0"}}, +
> {"Linksys WRT110", "wrt110", 0x320000, +              {"GMTK", "1007",
> le32(0x03040001), 0, 0, +               0, "2\0\0\0", "EN\0\0"}}, +   {0} +}; 
> + 
> +int +main(int argc, char *argv[]) +{ +       unsigned long   res, flen; +
> struct gemtek_header my_hdr; +        FILE           *f, *f_out; +    int
> image_type = -1, index; +     uint8_t        *buf; +  uint32_t        crc; + +
> if (argc < 3) { +             fprintf(stderr, "mkheader_gemtek <uImage>
> <webflash image> [machine ID]\n"); +          fprintf(stderr, "  where
> [machine ID] is one of:\n"); +                for (index = 0;
> mach_def[index].desc != 0; index++) { +                       fprintf(stderr, 
> "
> %-10s  %s", mach_def[index].id, mach_def[index].desc); +                      
> if
> (index == 0) +                                fprintf(stderr, " 
> (default)\n"); +                      else +
> fprintf(stderr, "\n"); +              } + +           exit(-1); +     } + +   
> if (argc == 4)
> { +           for(index = 0; mach_def[index].id != 0; index++) { +
> if(strcmp(mach_def[index].id, argv[3]) == 0) { +                              
> image_type =
> index; +                              break; +                        } +     
>         } + +           if(image_type == -1) { +
> fprintf(stderr, "\nERROR: invalid machine type\n"); +                 
> exit(-1); +
> } +   } else +                image_type = 0; + +     printf("Opening 
> %s...\n",
> argv[1]); + + f = fopen(argv[1], "r"); +      if(!f) { +
> fprintf(stderr, "\nERROR: couldn't open input image\n"); +
> exit(-1); +   } + +   fseek(f, 0, SEEK_END); +        flen = (unsigned long)
> ftell(f); + + printf("  %lu (0x%lX) bytes long\n", flen, flen); + +
> if (flen > mach_def[image_type].maxsize) { +          fprintf(stderr,
> "\nERROR: image exceeds maximum compatible size\n"); +                goto
> f_error; +    } + +   buf = malloc(flen + HDRLEN); +  if (!buf) { +
> fprintf(stderr, "\nERROR: couldn't allocate buffer\n"); +             goto
> f_error; +    } +     rewind(f); +    res = fread(buf + HDRLEN, 1, flen, f); 
> +     if (res != flen) { +            perror("Couldn't read entire file:
> fread()"); +          goto f_error; + } +     fclose(f); + +  
> printf("\nCreating
> %s...\n", argv[2]); + +       memcpy(&my_hdr,
> &mach_def[image_type].header, HDRLEN); + +    printf("  Using %s
> magic\n", mach_def[image_type].desc); + +     my_hdr.imagesz =
> le32(flen + HDRLEN); +        memcpy(my_hdr.lang, "EN", 2); + +
> memcpy(buf, &my_hdr, HDRLEN); + +     crc = crc32(0, buf, flen +
> HDRLEN); +    printf("  CRC32: %08X\n", crc); + +     my_hdr.checksum =
> le32(crc); +  memcpy(buf, &my_hdr, HDRLEN); + +       printf("
> Writing...\n"); + +   f_out = fopen(argv[2], "w"); +  if(!f_out) { +
> fprintf(stderr, "\nERROR: couldn't open output image\n"); +
> exit(-1); +   } + +   fwrite(buf, 1, flen + HDRLEN, f_out); + +
> fclose(f_out); + +    free(buf); +    return 0; + +f_error: + fclose(f); 
> +     exit(-1); +}
> 
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to