[PATCH 1/1] tools: add firmware utils for linksys-addfwhdr generation. Needed for openwrt-factory flashing over the stock WEB interface for Linksys E8350-v1(and other linksys devices) The tool source files for "addfwhdr" are placed in a separate sub-d

mail at adrianschmutzler.de mail at adrianschmutzler.de
Sat Jul 25 13:35:02 EDT 2020


Hi Todor,

> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces at lists.openwrt.org]
> On Behalf Of Todor Colov
> Sent: Samstag, 25. Juli 2020 18:30
> To: openwrt-devel at lists.openwrt.org
> Cc: Todor Colov <todorcolov at abv.bg>
> Subject: [PATCH 1/1] tools: add firmware utils for linksys-addfwhdr
> generation. Needed for openwrt-factory flashing over the stock WEB
> interface for Linksys E8350-v1(and other linksys devices) The tool source files
> for "addfwhdr" are placed in a separate sub-direc

some formal advice for submitting patches, now that you have resubmitted some of yours a few times:

1. If you send the same patch with changes, please add a v2, v3 etc. to the [PATCH] prefix, so everyone can see which is the most recent version.
As some help for the reviewers, it is convenient to add the changes in each version below a line with "---" after the commit message.
This can be done automatically with "git format-patch -v2", where the "-v2" adds a "v2" to the patches.

2. Cover-letters are meant for patchsets with several changes. If you send a single patch, it is more convenient to include the information in the commit message of the patch; either before the "---" for relevant information that should be included when the patch is merged, or after the "---" for remotely/less important additional info that will be removed automatically when somebody picks that patch. The cover letter then is not necessary at all.
However, in your case, it appears that you should actually should send your patches together as a "patchset", as they depend on each other. In that case, a single cover letter for multiple patches actually makes sense, to explain the aim of the patchset as a whole, while the commit message describes the individual patches. This is achieved by running format-patch on a set of patches, e.g. "git format-patch @~3 -v2 --cover-letter" to format the last three patches relative to your current checkout.

3. Please format your commit message properly. In this patch, all you commit message is recognized as title, as you see by the mail subject. I never had this case myself, but I suspect it is created if you don't have an empty line after the commit title.

Best

Adrian


> 
> Signed-off-by: Todor Colov <todorcolov at abv.bg>
> ---
>  tools/firmware-utils/Makefile                 |   4 +-
>  tools/firmware-utils/src/linksys/addfwhdr.c   | 195 ++++++++
>  tools/firmware-utils/src/linksys/bcmdefs.h    | 318 +++++++++++++
>  .../firmware-utils/src/linksys/code_pattern.h | 396 ++++++++++++++++
>  tools/firmware-utils/src/linksys/crc.c        | 290 ++++++++++++
>  tools/firmware-utils/src/linksys/crc.h        |  69 +++
>  tools/firmware-utils/src/linksys/cyutils.h    | 348 ++++++++++++++
>  tools/firmware-utils/src/linksys/typedefs.h   | 447 ++++++++++++++++++
>  8 files changed, 2066 insertions(+), 1 deletion(-)
>  create mode 100644 tools/firmware-utils/src/linksys/addfwhdr.c
>  create mode 100644 tools/firmware-utils/src/linksys/bcmdefs.h
>  create mode 100644 tools/firmware-utils/src/linksys/code_pattern.h
>  create mode 100644 tools/firmware-utils/src/linksys/crc.c
>  create mode 100644 tools/firmware-utils/src/linksys/crc.h
>  create mode 100644 tools/firmware-utils/src/linksys/cyutils.h
>  create mode 100644 tools/firmware-utils/src/linksys/typedefs.h
> 
> diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile
> index 3dd9ac5c2c..0948e69013 100644
> --- a/tools/firmware-utils/Makefile
> +++ b/tools/firmware-utils/Makefile
> @@ -23,6 +23,8 @@ endef
> 
>  define Host/Compile
>  	mkdir -p $(HOST_BUILD_DIR)/bin
> +	mkdir -p $(HOST_BUILD_DIR)/bin/linksys
> +	$(call cc,linksys/addfwhdr linksys/crc )
>  	$(call cc,add_header)
>  	$(call cc,addpattern)
>  	$(call cc,asustrx)
> @@ -97,7 +99,7 @@ define Host/Compile
>  endef
> 
>  define Host/Install
> -	$(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/*
> $(STAGING_DIR_HOST)/bin/
> +	$(CP) $(HOST_BUILD_DIR)/bin/* $(STAGING_DIR_HOST)/bin/
>  endef
> 
>  $(eval $(call HostBuild))
> diff --git a/tools/firmware-utils/src/linksys/addfwhdr.c b/tools/firmware-
> utils/src/linksys/addfwhdr.c
> new file mode 100644
> index 0000000000..6e2896c62d
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/addfwhdr.c
> @@ -0,0 +1,195 @@
> +#include <stdio.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <sys/stat.h>
> +#include <stdarg.h>
> +#include <getopt.h>
> +#include <time.h>
> +#include <sys/time.h>
> +
> +#include "cyutils.h"
> +#include "code_pattern.h"
> +
> +#include "typedefs.h"
> +
> +#define MAX_BUF	1024
> +#define CRC32_INIT_VALUE 0xffffffff	/* Initial CRC32 checksum
> value */
> +
> +extern uint32 crc32(uint8 *pdata, uint nbytes, uint32 crc);
> +
> +int fd, fd_w;
> +
> +void die(const char * str, ...)
> +{
> +	va_list args;
> +	va_start(args, str);
> +	vfprintf(stderr, str, args);
> +	fputc('\n', stderr);
> +	exit(1);
> +}
> +
> +int
> +fill_null0(int size)
> +{
> +	unsigned char buf[1];
> +	int i;
> +
> +	fprintf(stderr,"Fill null\n");
> +
> +	buf[0] = 0xff;
> +	for (i=0 ; i< size; i++ )
> +		if (write(fd_w, buf, 1) != 1)
> +			return 0;
> +
> +	return 1;
> +}
> +
> +long
> +file_open(const char *name)
> +{
> +	struct stat sb;
> +	if ((fd = open(name, O_RDONLY, 0)) < 0){
> +		die("Unable to open `%s' : %m", name);
> +	}
> +
> +	if (fstat (fd, &sb))
> +		die("Unable to stat `%s' : %m", name);
> +
> +	return sb.st_size;
> +}
> +
> +void usage(void)
> +{
> +	die("Usage: addfwhdr [-i|--input] sysupgrade.o [-o|--output]
> code.bin\n");
> +}
> +
> +int main(int argc, char ** argv)
> +{
> +	uint input_size,c;
> +	char *input_file=NULL, *output_file=NULL;
> +        int opt;
> +        int option_index=0;
> +	int garbage = 0;
> +	char *buf = NULL;
> +        extern char *optarg;
> +        extern int optind, opterr, optopt;
> +
> +	struct cbt_fw_header *fwhdr;
> +	uint32 crc;
> +
> +        static struct option long_options[] =
> +	{
> +		{"input", 1, 0, 'i'},
> +		{"output", 1, 0, 'o'},
> +		{"garbage", 0, 0, 'g'},
> +		{0, 0, 0, 0}
> +	};
> +
> +	printf("\n---------- add fw header --------\n");
> +
> +        fwhdr  = malloc(sizeof(struct cbt_fw_header));
> +	memset(fwhdr, 0, sizeof(struct cbt_fw_header));
> +
> +	while(1){
> +		opt = getopt_long(argc, argv, "i:o:g",long_options,
> &option_index);
> +		if(opt == -1)
> +			break;
> +		switch(opt){
> +			case 'h' :
> +				usage(); break;
> +			case 'i' :
> +				input_file = optarg;
> +				printf("input file is [%s]\n",input_file); break;
> +			case 'o' :
> +				output_file = optarg;
> +				printf("output file is [%s]\n",output_file);
> break;
> +			case 'g' :
> +				garbage = 1; break;
> +			default :
> +				usage();
> +		}
> +	}
> +
> +	if(!input_file || !output_file)
> +	{
> +		printf("You must specify the input and output file!\n");
> +		usage();
> +	}
> +
> +
> +	unlink(output_file);
> +	if ((fd_w = open(output_file,O_RDWR|O_CREAT, S_IREAD |
> S_IWRITE)) < 0){
> +		die("Unable to open `%s' : %m", output_file);
> +	}
> +
> +	fwhdr = malloc(sizeof(struct cbt_fw_header));
> +	memset(fwhdr, 0, sizeof(struct cbt_fw_header));
> +
> +	memcpy((char *)&fwhdr->magic, FWHDR_MAGIC_STR,
> sizeof(fwhdr->magic));
> +
> +	input_size = file_open(input_file);
> +	if(!(buf = malloc(input_size)))
> +	{
> +		perror("malloc");
> +		goto fail;
> +	}
> +	c = read(fd, buf, input_size);
> +	fwhdr->len = input_size + sizeof(struct cbt_fw_header);
> +
> +	fwhdr->res = fwhdr->res | 0x1;
> +
> +	//junzhao add fw build date in cbt_fw_header for calculate MD5
> +	#if 0
> +	{
> +	       static char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
> "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
> +	       int year, day, mon=1;
> +               char temp[10]={0};
> +	       unsigned char *p_date = (unsigned char *)&fwhdr->res;
> +               int j;
> +
> +               sscanf(__DATE__, "%s %d %d", temp, &day, &year);
> +
> +               for(j=0;j<12;j++) {
> +                       if(!strcmp(temp, months[j])) {
> +                               mon = j+1;
> +                               break;
> +                       }
> +               }
> +               p_date[0]= year-2000;
> +               p_date[1]= mon;
> +               p_date[2]= day;
> +
> +	       printf("%s: Build date(20%d-%d-%d)\n", __FUNCTION__,
> p_date[0], p_date[1], p_date[2]);
> +
> +	}
> +	#endif
> +	//end
> +
> +	crc = crc32((uint8 *)&fwhdr->res, 4, CRC32_INIT_VALUE);
> +	crc = crc32((uint8 *)&buf[0], input_size, crc);
> +
> +	fwhdr->crc32 = crc;
> +
> +	/* write code pattern header */
> +	write(fd_w, fwhdr, sizeof(struct cbt_fw_header));
> +
> +	if(write(fd_w, buf, c)!=c)
> +		die("Write call failed!\n");
> +
> +#if 0
> +	if(garbage == 1){			// add garbage, let image is a
> multiple of 1024, and the web upgrade will ok
> +		printf("Add %d bytes garbage\n",1024-32);
> +		if(!fill_null0(1024-32))
> +			die("error!\n");
> +	}
> +#endif
> +fail:
> +	if(buf)
> +		free(buf);
> +	close (fd);
> +	close (fd_w);
> +
> +	return 0;
> +}
> diff --git a/tools/firmware-utils/src/linksys/bcmdefs.h b/tools/firmware-
> utils/src/linksys/bcmdefs.h
> new file mode 100644
> index 0000000000..edd7397892
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/bcmdefs.h
> @@ -0,0 +1,318 @@
> +/*
> + * Misc system wide definitions
> + *
> + * Copyright (C) 2009, Broadcom Corporation
> + * All Rights Reserved.
> + *
> + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO
> WARRANTIES OF ANY
> + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR
> OTHERWISE. BROADCOM
> + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF
> MERCHANTABILITY, FITNESS
> + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS
> SOFTWARE.
> + *
> + * $Id: bcmdefs.h,v 1.1.1.1 2010/11/24 06:37:38 gavin.ke Exp $
> + */
> +
> +#ifndef	_bcmdefs_h_
> +#define	_bcmdefs_h_
> +
> +/*
> + * One doesn't need to include this file explicitly, gets included automatically
> if
> + * typedefs.h is included.
> + */
> +
> +/* Use BCM_REFERENCE to suppress warnings about intentionally-unused
> function
> + * arguments or local variables.
> + */
> +#define BCM_REFERENCE(data)	((void)data)
> +
> +/* Reclaiming text and data :
> + * The following macros specify special linker sections that can be reclaimed
> + * after a system is considered 'up'.
> + * BCMATTACHFN is also used for detach functions (it's not worth having a
> BCMDETACHFN,
> + * as in most cases, the attach function calls the detach function to clean up
> on error).
> + */
> +#ifdef DONGLEBUILD
> +
> +extern bool bcmreclaimed;
> +
> +#define BCMATTACHDATA(_data)	__attribute__ ((__section__
> (".dataini2." #_data))) _data
> +#define BCMATTACHFN(_fn)	__attribute__ ((__section__ (".textini2."
> #_fn))) _fn
> +
> +#define BCMPREATTACHDATA(_data)	__attribute__ ((__section__
> (".dataini2." #_data))) _data
> +#define BCMPREATTACHFN(_fn)	__attribute__ ((__section__
> (".textini2." #_fn))) _fn
> +
> +#if defined(BCMRECLAIM)
> +#define BCMINITDATA(_data)	__attribute__ ((__section__
> (".dataini1." #_data))) _data
> +#define BCMINITFN(_fn)		__attribute__ ((__section__
> (".textini1." #_fn))) _fn
> +#define CONST
> +#else
> +#define BCMINITDATA(_data)	_data
> +#define BCMINITFN(_fn)		_fn
> +#define CONST	const
> +#endif
> +
> +/* Non-manufacture or internal attach function/dat */
> +#if !defined(WLTEST)
> +#define	BCMNMIATTACHFN(_fn)	BCMATTACHFN(_fn)
> +#define	BCMNMIATTACHDATA(_data)	BCMATTACHDATA(_data)
> +#else
> +#define	BCMNMIATTACHFN(_fn)	_fn
> +#define	BCMNMIATTACHDATA(_data)	_data
> +#endif
> +
> +#define BCMUNINITFN(_fn)	_fn
> +
> +#define BCMFASTPATH
> +
> +#else /* DONGLEBUILD */
> +
> +#define bcmreclaimed 		0
> +#define BCMATTACHDATA(_data)	_data
> +#define BCMATTACHFN(_fn)	_fn
> +#define BCMPREATTACHDATA(_data)	_data
> +#define BCMPREATTACHFN(_fn)	_fn
> +#define BCMINITDATA(_data)	_data
> +#define BCMINITFN(_fn)		_fn
> +#define BCMUNINITFN(_fn)	_fn
> +#define	BCMNMIATTACHFN(_fn)	_fn
> +#define	BCMNMIATTACHDATA(_data)	_data
> +#define CONST	const
> +#ifdef mips
> +#define BCMFASTPATH		__attribute__
> ((__section__(".text.fastpath")))
> +#else
> +#define BCMFASTPATH
> +#endif
> +
> +#endif /* DONGLEBUILD */
> +
> +#if defined(BCMROMOFFLOAD) || defined(BCMROMBUILD)
> +typedef struct {
> +	uint16 esiz;
> +	uint16 cnt;
> +	void *addr;
> +} bcmromdat_patch_t;
> +#endif
> +
> +/* Put some library data/code into ROM to reduce RAM requirements */
> +#if defined(BCMROMOFFLOAD)
> +#define BCMROMDATA(_data)	__attribute__ ((weak, __section__
> (".datarom."#_data))) _data
> +#define BCMROMDAT_NAME(_data)	_data
> +#define BCMROMFN(_fn)		__attribute__ ((weak, long_call,
> __section__ (".textrom."#_fn))) _fn
> +#define BCMROMDAT_ARYSIZ(data)	ARRAYSIZE(data)
> +#define BCMROMDAT_SIZEOF(data)	sizeof(data)
> +#define BCMROMDAT_APATCH(data) \
> +	const bcmromdat_patch_t BCMROMDATA(data##__bcmpatch) = \
> +	{ sizeof(data[0]), sizeof(data)/sizeof(data[0]), ((void*)data) };
> +#define BCMROMDAT_SPATCH(data) \
> +	const bcmromdat_patch_t BCMROMDATA(data##__bcmpatch) = \
> +	{ sizeof(data), 1, ((void*)&data) };
> +#define BCMROMFN_NAME(_fn)	_fn
> +#define STATIC
> +#elif defined(BCMROMBUILD)
> +#include <bcmjmptbl.h>
> +#define STATIC
> +#else /* !BCMROMBUILD */
> +#define BCMROMDATA(_data)	_data
> +#define BCMROMDAT_NAME(_data)	_data
> +#define BCMROMFN(_fn)		_fn
> +#define BCMROMFN_NAME(_fn)	_fn
> +#define STATIC	static
> +#define BCMROMDAT_ARYSIZ(data)	ARRAYSIZE(data)
> +#define BCMROMDAT_SIZEOF(data)	sizeof(data)
> +#define BCMROMDAT_APATCH(data)
> +#define BCMROMDAT_SPATCH(data)
> +#endif /* !BCMROMBUILD */
> +
> +/* Bus types */
> +#define	SI_BUS			0	/* SOC Interconnect */
> +#define	PCI_BUS			1	/* PCI target */
> +#define	PCMCIA_BUS		2	/* PCMCIA target */
> +#define SDIO_BUS		3	/* SDIO target */
> +#define JTAG_BUS		4	/* JTAG */
> +#define USB_BUS			5	/* USB (does not support R/W
> REG) */
> +#define SPI_BUS			6	/* gSPI target */
> +#define RPC_BUS			7	/* RPC target */
> +
> +/* Allows size optimization for single-bus image */
> +#ifdef BCMBUSTYPE
> +#define BUSTYPE(bus) 	(BCMBUSTYPE)
> +#else
> +#define BUSTYPE(bus) 	(bus)
> +#endif
> +
> +/* Allows size optimization for single-backplane image */
> +#ifdef BCMCHIPTYPE
> +#define CHIPTYPE(bus) 	(BCMCHIPTYPE)
> +#else
> +#define CHIPTYPE(bus) 	(bus)
> +#endif
> +
> +
> +/* Allows size optimization for SPROM support */
> +#if defined(BCMSPROMBUS)
> +#define SPROMBUS	(BCMSPROMBUS)
> +#elif defined(SI_PCMCIA_SROM)
> +#define SPROMBUS	(PCMCIA_BUS)
> +#else
> +#define SPROMBUS	(PCI_BUS)
> +#endif
> +
> +/* Allows size optimization for single-chip image */
> +#ifdef BCMCHIPID
> +#define CHIPID(chip)	(BCMCHIPID)
> +#else
> +#define CHIPID(chip)	(chip)
> +#endif
> +
> +#ifdef BCMCHIPREV
> +#define CHIPREV(rev)	(BCMCHIPREV)
> +#else
> +#define CHIPREV(rev)	(rev)
> +#endif
> +
> +/* Defines for DMA Address Width - Shared between OSL and HNDDMA */
> +#define DMADDR_MASK_32 0x0		/* Address mask for 32-bits */
> +#define DMADDR_MASK_30 0xc0000000	/* Address mask for 30-bits */
> +#define DMADDR_MASK_0  0xffffffff	/* Address mask for 0-bits (hi-
> part) */
> +
> +#define	DMADDRWIDTH_30  30 /* 30-bit addressing capability */
> +#define	DMADDRWIDTH_32  32 /* 32-bit addressing capability */
> +#define	DMADDRWIDTH_63  63 /* 64-bit addressing capability */
> +#define	DMADDRWIDTH_64  64 /* 64-bit addressing capability */
> +
> +#ifdef BCMDMA64OSL
> +typedef struct {
> +	uint32 loaddr;
> +	uint32 hiaddr;
> +} dma64addr_t;
> +
> +typedef dma64addr_t dmaaddr_t;
> +#define PHYSADDRHI(_pa) ((_pa).hiaddr)
> +#define PHYSADDRHISET(_pa, _val) \
> +	do { \
> +		(_pa).hiaddr = (_val);		\
> +	} while (0)
> +#define PHYSADDRLO(_pa) ((_pa).loaddr)
> +#define PHYSADDRLOSET(_pa, _val) \
> +	do { \
> +		(_pa).loaddr = (_val);		\
> +	} while (0)
> +
> +#else
> +typedef unsigned long dmaaddr_t;
> +#define PHYSADDRHI(_pa) (0)
> +#define PHYSADDRHISET(_pa, _val)
> +#define PHYSADDRLO(_pa) ((_pa))
> +#define PHYSADDRLOSET(_pa, _val) \
> +	do { \
> +		(_pa) = (_val);			\
> +	} while (0)
> +#endif /* BCMDMA64OSL */
> +
> +/* One physical DMA segment */
> +typedef struct  {
> +	dmaaddr_t addr;
> +	uint32	  length;
> +} hnddma_seg_t;
> +
> +#if defined(MACOSX)
> +/* In MacOS, the OS API may return large number of segments. Setting this
> number lower
> + * will result in failure of dma map
> + */
> +#define MAX_DMA_SEGS 8
> +#else
> +#define MAX_DMA_SEGS 4
> +#endif
> +
> +
> +typedef struct {
> +	void *oshdmah; /* Opaque handle for OSL to store its information */
> +	uint origsize; /* Size of the virtual packet */
> +	uint nsegs;
> +	hnddma_seg_t segs[MAX_DMA_SEGS];
> +} hnddma_seg_map_t;
> +
> +
> +/* packet headroom necessary to accommodate the largest header in the
> system, (i.e TXOFF).
> + * By doing, we avoid the need  to allocate an extra buffer for the header
> when bridging to WL.
> + * There is a compile time check in wlc.c which ensure that this value is at
> least as big
> + * as TXOFF. This value is used in dma_rxfill (hnddma.c).
> + */
> +
> +#if defined(BCM_RPC_NOCOPY) || defined(BCM_RCP_TXNOCOPY)
> +/* add 40 bytes to allow for extra RPC header and info  */
> +#define BCMEXTRAHDROOM 220
> +#else /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
> +#ifdef CTFMAP
> +#define BCMEXTRAHDROOM 176
> +#else /* CTFMAP */
> +#define BCMEXTRAHDROOM 172
> +#endif /* CTFMAP */
> +#endif /* BCM_RPC_NOCOPY || BCM_RPC_TXNOCOPY */
> +
> +/* Headroom required for dongle-to-host communication.  Packets
> allocated
> + * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
> + * leave this much room in front for low-level message headers which may
> + * be needed to get across the dongle bus to the host.  (These messages
> + * don't go over the network, so room for the full WL header above would
> + * be a waste.).
> + */
> +#ifdef BCMUSBDEV
> +#define BCMDONGLEHDRSZ 0
> +#define BCMDONGLEPADSZ 0
> +#else
> +#define BCMDONGLEHDRSZ 12
> +#define BCMDONGLEPADSZ 16
> +#endif
> +
> +#define BCMDONGLEOVERHEAD	(BCMDONGLEHDRSZ +
> BCMDONGLEPADSZ)
> +
> +#ifdef BCMDBG
> +
> +#ifndef BCMDBG_ERR
> +#define BCMDBG_ERR
> +#endif /* BCMDBG_ERR */
> +
> +#ifndef BCMDBG_ASSERT
> +#define BCMDBG_ASSERT
> +#endif /* BCMDBG_ASSERT */
> +
> +#endif /* BCMDBG */
> +
> +#if defined(BCMDBG_ASSERT) || defined(BCMASSERT_LOG)
> +#define BCMASSERT_SUPPORT
> +#endif /* BCMDBG_ASSERT || BCMASSERT_LOG */
> +
> +/* Macros for doing definition and get/set of bitfields
> + * Usage example, e.g. a three-bit field (bits 4-6):
> + *    #define <NAME>_M	BITFIELD_MASK(3)
> + *    #define <NAME>_S	4
> + * ...
> + *    regval = R_REG(osh, &regs->regfoo);
> + *    field = GFIELD(regval, <NAME>);
> + *    regval = SFIELD(regval, <NAME>, 1);
> + *    W_REG(osh, &regs->regfoo, regval);
> + */
> +#define BITFIELD_MASK(width) \
> +		(((unsigned)1 << (width)) - 1)
> +#define GFIELD(val, field) \
> +		(((val) >> field ## _S) & field ## _M)
> +#define SFIELD(val, field, bits) \
> +		(((val) & (~(field ## _M << field ## _S))) | \
> +		 ((unsigned)(bits) << field ## _S))
> +
> +/* define BCMSMALL to remove misc features for memory-constrained
> environments */
> +#ifdef BCMSMALL
> +#undef	BCMSPACE
> +#define bcmspace	FALSE	/* if (bcmspace) code is discarded */
> +#else
> +#define	BCMSPACE
> +#define bcmspace	TRUE	/* if (bcmspace) code is retained */
> +#endif
> +
> +/* Max. nvram variable table size */
> +#define	MAXSZ_NVRAM_VARS	4096
> +
> +#define LOCATOR_EXTERN static
> +
> +#endif /* _bcmdefs_h_ */
> diff --git a/tools/firmware-utils/src/linksys/code_pattern.h
> b/tools/firmware-utils/src/linksys/code_pattern.h
> new file mode 100644
> index 0000000000..0bbaa1102d
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/code_pattern.h
> @@ -0,0 +1,396 @@
> +#ifndef _CODE_PATTERN_H_
> +#define _CODE_PATTERN_H_
> +
> +#define CODE_ID		"U2ND"
> +#define BOOT_PATTERN	"EST"
> +#define UP_PMON		1
> +#define UP_MAC		2
> +#define UP_CODE		3
> +#define UP_PIGGY	4
> +#define UP_EOU_KEY	5
> +#define UP_SN		6
> +#define UP_LANG		7
> +#define UP_T_CERT	8
> +#define CMP_T_CERT	9	//for factory test.
> +#define UP_CODE2       10
> +#define UP_FULL_WL     11
> +#define UP_WSC_PIN     12
> +#define UP_COUNTRY     13
> +#define UP_QUAN_BOOT   14
> +#define UP_QUAN_IMAGE   15
> +
> +#define LINKSYS		7
> +#define PCI_OEM		9	// <remove the line>
> +#define ELSA		10	// <remove the line>
> +#define ALLNET		11	// <remove the line>
> +#define REENET		12	// 2003/06/21	<remove the line>
> +#define CISCO		90
> +#define	OTHER_OEM	99	// <remove the line>
> +
> +#define ENGLISH 	1
> +#define JAPANESE	2
> +#define GERMAN		3
> +#define FRENCH		4
> +#define KOREAN		5
> +
> +#define	USA		1
> +#define	JAPAN		2
> +#define	EUROPE		3
> +#define WW		4
> +#define GERMANY		5
> +#define	KOREA		6
> +#define	FRANCE		7
> +
> +#define	WRT54G		1
> +#define	WRT54GS		2
> +#define	WRT54V5		3
> +#define	DPN		4
> +#define	RTA41		5
> +#define	WRT54G3G	6
> +#define	T_MOBILE 	7
> +#define WRT300N		8
> +#define WRT54GL         9
> +#define WRT54GSV4       10
> +#define WRT350N		11
> +#define WRT610N		12
> +#define WRT61XN		13
> +#define E200		14
> +#define E300		15
> +//John
> +#define WRT54GV5        16
> +
> +#define E3200		17
> +#define E4200		18
> +#define E2500		19
> +#define AC2350		20
> +
> +
> +#define CES_M_SERIAL	1
> +#define CES_E_SERIAL	2
> +
> +/***************************************
> + * define OEM                          *
> + * Don't edit, auto edit by select.sh  *
> + ***************************************/
> +#define OEM LINKSYS //LINKSYS
> +//#define OEM PCI_OEM //PCI_OEM
> +//#define OEM ELSA //ELSA
> +//#define OEM ALLNET //ALLNET
> +//#define OEM REENET //REENET
> +//#define OEM OTHER_OEM //OTHER_OEM
> +
> +/***************************************
> + * define MODEL NAME                          *
> + * Don't edit, auto edit by select.sh  *
> + ***************************************/
> +
> +//#define LINKSYS_MODEL E3200 //E3200
> +//#define LINKSYS_MODEL E300 //E300
> +//#define LINKSYS_MODEL E200 //E200
> +//#define LINKSYS_MODEL E4200 //E4200
> +//#define LINKSYS_MODEL E2500 //E2500
> +#define LINKSYS_MODEL AC2350 //AC2350
> +
> +/***************************************
> + * define MODEL SERIAL                          *
> + * Don't edit, auto edit by select.sh  *
> + ***************************************/
> +//#define LINKSYS_MODEL_SERIAL CES_M_SERIAL //CES_M_SERIAL
> +#define LINKSYS_MODEL_SERIAL CES_E_SERIAL //CES_E_SERIAL
> +
> +/***************************************
> + * define country                      *
> + * LOCALE=COUNTRY =                    *
> + ***************************************/
> +#define COUNTRY		LOCALE
> +#define LOCALE USA
> +//#define LOCALE JAPAN
> +//#define LOCALE EUROPE
> +//#define LOCALE WW
> +//#define LOCALE GERMANY
> +//#define LOCALE FRANCE
> +//#define LOCALE KOREA
> +//#define LOCALE UK
> +
> +/***************************************
> + * define model name and code pattern  *
> + * MODEL_NAME =                        *
> + * CODE_PATTERN =                      *
> + ***************************************/
> +#if OEM == LINKSYS
> +	#define	CT_VENDOR		"LINKSYS"
> +	#define UI_STYLE	CISCO
> +
> +	#if LINKSYS_MODEL == WRT54GS
> +		#define CODE_PATTERN   "W54S"
> +		#if LOCALE == GERMANY
> +			#define MODEL_NAME	"WRT54GS-DE"
> +			#define MODEL_VERSION	""
> +		#elif LOCALE == FRANCE
> +			#define MODEL_NAME	"WRT54GS-FR"
> +			#define MODEL_VERSION	""
> +		#elif LOCALE == JAPAN
> +			#define MODEL_NAME	"WRT54GS-JP"
> +			#define MODEL_VERSION	""
> +		#else
> +			#define MODEL_NAME	"WRT54GS"
> +			#define MODEL_VERSION	"V3.0"
> +		#endif
> +	#elif LINKSYS_MODEL == WRT54GSV4
> +		#define CODE_PATTERN   "W54s"
> +		#define MODEL_NAME     "WRT54GSV4"
> +		#define MODEL_VERSION  ""
> +	#elif LINKSYS_MODEL == DPN  //DPN
> +		#define CODE_PATTERN   "WDPN"
> +		#define MODEL_NAME     "DPN"
> +		#define MODEL_VERSION	""
> +	#elif LINKSYS_MODEL == WRT54GV5
> +		#define CODE_PATTERN   "W54V"
> +		#define MODEL_NAME     "WRTA54G"
> +		#define MODEL_VERSION	""
> +	#elif LINKSYS_MODEL == RTA41
> +		#define CODE_PATTERN   "W54N"
> +		#define MODEL_NAME     "RTA41"
> +		#define MODEL_VERSION	""
> +	#elif LINKSYS_MODEL == WRT54G3G
> +		#define CODE_PATTERN   "W54F"
> +		#if LOCALE == EUROPE
> +			#define MODEL_NAME     "WRT54G3G-EU"
> +			#define MODEL_VERSION	""
> +		#elif LOCALE == UK
> +			#define MODEL_NAME     "WRT54G3G-UK"
> +			#define MODEL_VERSION	""
> +		#else
> +			#define MODEL_NAME     "WRT54G3G"
> +			#define MODEL_VERSION	"V1"
> +		#endif
> +	#elif LINKSYS_MODEL == T_MOBILE
> +		#define CODE_PATTERN   "W54T"
> +		#define MODEL_NAME     "WRT54G-TM"
> +		#define MODEL_VERSION	"V3.0"
> +	#elif LINKSYS_MODEL == WRT300N
> +		#define CODE_PATTERN   "EWCB"
> +		#define MODEL_NAME     "WRT300N"
> +		#define MODEL_VERSION	"V1.0"
> +	#elif LINKSYS_MODEL == WRT350N
> +		#define CODE_PATTERN   "EWCG"
> +		#define MODEL_NAME     "WRT350N"
> +		#define MODEL_VERSION	"V1.0"
> +	#elif LINKSYS_MODEL == WRT54G
> +		#define CODE_PATTERN   "W54G"
> +		#if LOCALE == GERMANY
> +			#define MODEL_NAME	"WRT54G-DE"
> +			#define MODEL_VERSION	""
> +		#elif LOCALE == FRANCE
> +			#define MODEL_NAME	"WRT54G-FR"
> +			#define MODEL_VERSION	""
> +		#elif LOCALE == JAPAN
> +			#define MODEL_NAME	"WRT54G-JP"
> +			#define MODEL_VERSION	""
> +		#else
> +			#define MODEL_NAME	"WRT54G"
> +			#define MODEL_VERSION	"V4.0"
> +		#endif
> +	#elif LINKSYS_MODEL == WRT54GL
> +		#define CODE_PATTERN   "W54G"
> +		#define MODEL_NAME	"WRT54GL"
> +		#define MODEL_VERSION	"V1"
> +	#elif LINKSYS_MODEL == WRT610N
> +		#define CODE_PATTERN   "610N"
> +		#define MODEL_NAME	"WRT610N"
> +		#define MODEL_VERSION	"V2"              //V1 or V2
> +	#elif LINKSYS_MODEL == E200
> +		#define CODE_PATTERN   "32XN"
> +		#define MODEL_NUMBER	"E2000"
> +		#define MODEL_NAME	"Linksys E2000"
> +		#define MODEL_VERSION	"V1.0"
> +	#elif LINKSYS_MODEL == E300
> +		#define CODE_PATTERN   "61XN"
> +		#define MODEL_NUMBER	"E3000"	    //model
> number added by Jemmy 2009.11.17
> +		#define MODEL_NAME	"Linksys E3000"
> +		#define MODEL_VERSION	"V1"              //V1 or V2
> +	#elif LINKSYS_MODEL == E3200
> +		#define CODE_PATTERN   "3200"
> +		#define MODEL_NUMBER	"E3200"	    //model
> number added by zhaoguang 2010.10.25
> +		#define MODEL_NAME	"Linksys E3200"
> +		#define MODEL_VERSION	"V1"
> +	#elif LINKSYS_MODEL == E4200
> +		#define CODE_PATTERN   "4200"
> +		#define MODEL_NUMBER	"E4200"	    //model
> number added by Jemmy 2009.11.17
> +		#define MODEL_NAME	"Linksys E4200"
> +		#define MODEL_VERSION	"V1"              //V1 or V2
> +	#elif (LINKSYS_MODEL == E2500)
> +		#define CODE_PATTERN   "25V3"
> +		#define MODEL_NUMBER	"E2500"	    //model
> number
> +		#define MODEL_NAME	"Linksys E2500"
> +		#define MODEL_VERSION	"V3"              //V1 or V2
> +	#elif (LINKSYS_MODEL == AC2350)
> +		#define CODE_PATTERN   "8350"
> +		#define MODEL_NUMBER	"E8350"	    //model
> number
> +		#define MODEL_NAME	"Linksys E8350"
> +		#define MODEL_VERSION	"V1"              //V1 or V2
> +
> +	#else
> +		#error "You must select a LINKSYS_MODEL!!"
> +	#endif
> +
> +	#if LINKSYS_MODEL == WRT54G || LINKSYS_MODEL == WRT54GL
> +		#define INTEL_FLASH_SUPPORT_VERSION_FROM "v1.41.8"
> +		#define BCM4712_CHIP_SUPPORT_VERSION_FROM
> "v1.50.0"
> +		#define INTEL_FLASH_SUPPORT_BOOT_VERSION_FROM
> "v1.3"
> +		#define BCM4712_CHIP_SUPPORT_BOOT_VERSION_FROM
> "v2.0"
> +	#else
> +		#define INTEL_FLASH_SUPPORT_VERSION_FROM "v0.00.0"
> +		#define BCM4712_CHIP_SUPPORT_VERSION_FROM
> "v0.00.0"
> +		#define INTEL_FLASH_SUPPORT_BOOT_VERSION_FROM
> "v0.0"
> +		#define BCM4712_CHIP_SUPPORT_BOOT_VERSION_FROM
> "v0.0"
> +	#endif
> +	#if	LINKSYS_MODEL == WRT350N
> +		#define WRT350N_SUPPORT_VERSION_FROM "v0.85.3"
> 
> +	#endif
> +
> +#elif OEM == PCI_OEM
> +	#define CODE_PATTERN    "W54P"
> +	#if LOCALE == JAPAN
> +		#define MODEL_NAME	"Planex BLW-04G Wireless
> Router"
> +	#else
> +		#define MODEL_NAME	"Advanced Wireless 11g
> Router"
> +	#endif
> +	#define	CT_VENDOR		"PCI"
> +#elif OEM == ELSA
> +	#define CODE_PATTERN    "W54E"
> +	#define MODEL_NAME	"ELSA WLAN DSL-Router 4P G"
> +	#define	CT_VENDOR	"ELSA"
> +#elif OEM == ALLNET
> +	#define CODE_PATTERN    "W54A"
> +	#define MODEL_NAME	"Advanced Wireless 11g Router"
> +	#define	CT_VENDOR	"ALLNET"
> +#elif OEM == REENET
> +	#define CODE_PATTERN    "W54R"
> +	#define MODEL_NAME	"RW-IPG500"
> +	#define	CT_VENDOR	"REENET"
> +#elif OEM == OTHER_OEM
> +	#define CODE_PATTERN    "W54O"
> +	#define MODEL_NAME	"Advanced Wireless 11g Router"
> +	#define	CT_VENDOR	"OTHER_OEM"
> +#else
> +	#error "Your must select a OEM name!!"
> +#endif
> +
> +/***************************************
> + * define language                     *
> + * LANGUAGE =                          *
> + * LANG_SEL=EN                         *
> + * HTTP_CHARSET =		       *
> + ***************************************/
> +#if LOCALE == JAPAN
> +	#define	LANGUAGE	JAPANESE
> +	#define	HTTP_CHARSET	"shift-jis"
> +#elif LOCALE == GERMANY
> +	#define LANGUAGE	GERMAN
> +	#define	HTTP_CHARSET	"iso-8859-1"
> +#elif LOCALE == FRANCE
> +	#define LANGUAGE	FRENCH
> +	#define	HTTP_CHARSET	"iso-8859-1"
> +#elif LOCALE == KOREA
> +	#define LANGUAGE 	KOREAN
> +	#define	HTTP_CHARSET	"euc-kr"
> +#else
> +	#define LANGUAGE 	ENGLISH
> +	#define	HTTP_CHARSET	"iso-8859-1"
> +#endif
> +
> +/***************************************
> + * define wireless max channel         *
> + * WL_MAX_CHANNEL =                    *
> + ***************************************/
> +#if LOCALE == JAPAN || LOCALE == EUROPE || LOCALE == GERMANY ||
> LOCALE == FRANCE
> +	#define	WL_MAX_CHANNEL	"13"
> +#elif OEM == KOREA			// <remove the line>
> +	#define	WL_MAX_CHANNEL	"13"	// <remove the line>
> +#else
> +	#define WL_MAX_CHANNEL	"11"
> +#endif
> +
> +/***************************************
> + * define web file path                *
> + * WEB_PAGE =                          *
> + ***************************************/
> +#if OEM == LINKSYS
> +#if UI_STYLE ==  CISCO
> +	#if LOCALE == JAPAN
> +		#define	WEB_PAGE	"cisco_wrt54g_jp"
> +	#elif LOCALE == GERMANY
> +		#define	WEB_PAGE	"cisco_wrt54g_de"
> +	#elif LOCALE == FRANCE
> +		#define	WEB_PAGE	"cisco_wrt54g_fr"
> +	#else
> +		#if LINKSYS_MODEL == E200
> +			#define WEB_PAGE        "ces_m"
> +		#elif LINKSYS_MODEL == E300
> +			#define WEB_PAGE        "ces_m"
> +		#elif LINKSYS_MODEL == E3200
> +			#define WEB_PAGE        "e3200_m"
> +		#elif LINKSYS_MODEL == E4200
> +			#define WEB_PAGE        "e4200_m"
> +		#elif (LINKSYS_MODEL == E2500)
> +			#define WEB_PAGE        "e2500_m"
> +		#elif (LINKSYS_MODEL == AC2350)
> +			#define WEB_PAGE        "ac2350_m"
> +		#else
> +			#define WEB_PAGE	"cisco_wrt54g_m"
> +		#endif
> +	#endif
> +#else
> +	#if LOCALE == JAPAN
> +		#define	WEB_PAGE	"linksys_wrt54g_jp"
> +	#else
> +		#define WEB_PAGE	"linksys_wrt54g_en"
> +	#endif
> +#endif
> +#elif OEM == PCI_OEM
> +	#if LOCALE == JAPAN
> +		#define	WEB_PAGE	"pci_wrt54g_jp"
> +	#else
> +		#define WEB_PAGE	"pci_wrt54g_en"
> +	#endif
> +#elif OEM == ELSA
> +	#define WEB_PAGE	"elsa_wrt54g_en"
> +#elif OEM == ALLNET
> +	#define WEB_PAGE	"nonbrand"
> +#elif OEM == REENET
> +	#define WEB_PAGE	"reenet_wrt54g_kr"
> +#elif	OEM == OTHER_OEM
> +	#define WEB_PAGE	"nonbrand"
> +#endif
> +
> +/***************************************
> + * check LOCALE
> + ***************************************/
> +#if OEM == LINKSYS
> + #if LOCALE != JAPAN && LOCALE != USA && LOCALE != EUROPE && LOCALE
> != GERMANY && LOCALE != FRANCE
> +	#error	"The LOCALE for LINKSYS is error, must be USA, EUROPE,
> JAPAN, GERMANY or FRANCE"
> + #endif
> +#elif OEM == PCI_OEM
> + #if LOCALE != JAPAN && LOCALE != USA && LOCALE != EUROPE
> +	#error	"The LOCALE for PCI is error, must be USA or JAPAN"
> + #endif
> +#elif OEM == ELSA
> + #if LOCALE != EUROPE
> +	#error	"The LOCALE for ELSA is error, must be EUROPE"
> + #endif
> +#elif OEM == ALLNET
> + #if LOCALE != EUROPE
> +	#error	"The LOCALE for ALLNET is error, must be EUROPE"
> + #endif
> +#elif OEM == REENET
> + #if LOCALE != KOREA
> +	#error	"The LOCALE for REENET is error, must be KOREA"
> + #endif
> +#elif OEM == OTHER_OEM
> + #if LOCALE != USA && LOCALE != EUROPE
> +	#error	"The LOCALE for NONBRAND is error, must be USA or
> EUROPE"
> + #endif
> +#endif
> +
> +#endif
> diff --git a/tools/firmware-utils/src/linksys/crc.c b/tools/firmware-
> utils/src/linksys/crc.c
> new file mode 100644
> index 0000000000..7d3e641df9
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/crc.c
> @@ -0,0 +1,290 @@
> +/*********************************************************
> **********************
> + * $Id: crc.c,v 1.1.1.1 2010/11/24 06:37:40 gavin.ke Exp $
> + * Copyright 2007, Broadcom Corporation
> + * All Rights Reserved.
> + *
> + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO
> WARRANTIES OF ANY
> + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR
> OTHERWISE. BROADCOM
> + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF
> MERCHANTABILITY, FITNESS
> + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS
> SOFTWARE.
> + * crc.c: utility function to compute various CRCs
> +
> **********************************************************
> ********************/
> +
> +#include "typedefs.h"
> +#include "crc.h"
> +
> +/*********************************************************
> **********************
> + * hcs
> + *
> + * Computes and inserts a header check sum based on crc8 polynomial
> + * below.  Unlike a typical crc, the header check sum is inserted 13
> + * bytes from the end of the byte stream (rather than appended to the
> + * end of the byte stream) such that at the receiver a normal checksum
> + * computation over all of the bytes results in a known good value.
> + * Given a constant 12 bytes after the header checksum to the end of
> + * the header, a lookup table can be used to provide the actual value
> + * inserted.
> +
> **********************************************************
> ********************/
> +
> +static uint8 hcs_table[8] = { 0x16, 0x2c, 0x58, 0xb0, 0x37, 0x6e, 0xdc, 0xef};
> +
> +void
> +hcs(
> +    uint8 *pheader, /* pointer to array of data to process */
> +    uint nbytes   /* number of input data bytes to process */
> +)
> +{
> +    uint8 hcs0, hcs1;
> +    int i;
> +
> +    /* run once with zeros in hcs position, 13th byte from the end */
> +    pheader[nbytes - 12 - 1] = 0;
> +    hcs0 = crc8(pheader, nbytes, CRC8_INIT_VALUE);
> +
> +    /* now compute real hcs to insert in place of zeros */
> +    hcs1 = 0;
> +    for (i = 0; i < 8; i++) {
> +        hcs1 ^= ((hcs0 & (1 << i)) != 0 ? hcs_table[i] : 0);
> +    }
> +    pheader[nbytes - 12 - 1] = hcs1 ^ 0xff;
> +    return;
> +}
> +
> +/*********************************************************
> **********************
> + * crc8
> + *
> + * Computes a crc8 over the input data using the polynomial:
> + *
> + *       x^8 + x^7 +x^6 + x^4 + x^2 + 1
> + *
> + * The caller provides the initial value (either CRC8_INIT_VALUE
> + * or the previous returned value) to allow for processing of
> + * discontiguous blocks of data.  When generating the CRC the
> + * caller is responsible for complementing the final return value
> + * and inserting it into the byte stream.  When checking, a final
> + * return value of CRC8_GOOD_VALUE indicates a valid CRC.
> + *
> + * Reference: Dallas Semiconductor Application Note 27
> + *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
> + *     ver 3, Aug 1993, ross at guest.adelaide.edu.au, Rocksoft Pty Ltd.,
> + *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
> + *
> +
> **********************************************************
> ********************/
> +
> +static uint8 crc8_table[256] = {
> +    0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B,
> +    0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21,
> +    0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF,
> +    0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5,
> +    0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14,
> +    0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E,
> +    0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80,
> +    0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA,
> +    0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95,
> +    0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF,
> +    0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01,
> +    0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B,
> +    0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA,
> +    0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0,
> +    0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E,
> +    0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34,
> +    0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0,
> +    0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A,
> +    0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54,
> +    0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E,
> +    0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF,
> +    0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5,
> +    0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B,
> +    0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61,
> +    0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E,
> +    0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74,
> +    0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA,
> +    0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0,
> +    0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41,
> +    0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B,
> +    0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5,
> +    0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F
> +};
> +
> +#define CRC_INNER_LOOP(n, c, x) \
> +    (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
> +
> +uint8
> +crc8(
> +    uint8 *pdata,  /* pointer to array of data to process */
> +    uint nbytes, /* number of input data bytes to process */
> +    uint8 crc      /* either CRC8_INIT_VALUE or previous return value */
> +)
> +{
> +    while (nbytes-- > 0)
> +        CRC_INNER_LOOP(8, crc, *pdata++);
> +    return crc;
> +}
> +
> +/*********************************************************
> **********************
> + * crc16
> + *
> + * Computes a crc16 over the input data using the polynomial:
> + *
> + *       x^16 + x^12 +x^5 + 1
> + *
> + * The caller provides the initial value (either CRC16_INIT_VALUE
> + * or the previous returned value) to allow for processing of
> + * discontiguous blocks of data.  When generating the CRC the
> + * caller is responsible for complementing the final return value
> + * and inserting it into the byte stream.  When checking, a final
> + * return value of CRC16_GOOD_VALUE indicates a valid CRC.
> + *
> + * Reference: Dallas Semiconductor Application Note 27
> + *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
> + *     ver 3, Aug 1993, ross at guest.adelaide.edu.au, Rocksoft Pty Ltd.,
> + *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
> + *
> +
> **********************************************************
> ********************/
> +
> +static uint16 crc16_table[256] = {
> +    0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
> +    0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
> +    0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
> +    0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
> +    0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
> +    0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
> +    0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
> +    0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
> +    0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
> +    0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
> +    0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
> +    0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
> +    0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
> +    0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
> +    0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
> +    0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
> +    0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
> +    0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
> +    0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
> +    0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
> +    0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
> +    0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
> +    0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
> +    0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
> +    0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
> +    0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
> +    0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
> +    0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
> +    0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
> +    0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
> +    0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
> +    0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78
> +};
> +
> +uint16
> +crc16(
> +    uint8 *pdata,  /* pointer to array of data to process */
> +    uint nbytes, /* number of input data bytes to process */
> +    uint16 crc     /* either CRC16_INIT_VALUE or previous return value */
> +)
> +{
> +    while (nbytes-- > 0)
> +        CRC_INNER_LOOP(16, crc, *pdata++);
> +    return crc;
> +}
> +
> +/*********************************************************
> **********************
> + * crc32
> + *
> + * Computes a crc32 over the input data using the polynomial:
> + *
> + *
> x^32+x^26+x^23+x^22+x^16+x^12+x^11+X^10+x^8+x^7+x^5+x^4+x^2+x+1
> + *
> + * The caller provides the initial value (either CRC32_INIT_VALUE
> + * or the previous returned value) to allow for processing of
> + * discontiguous blocks of data.  When generating the CRC the
> + * caller is responsible for complementing the final return value
> + * and inserting it into the byte stream.  When checking, a final
> + * return value of CRC32_GOOD_VALUE indicates a valid CRC.
> + *
> + * Reference: Dallas Semiconductor Application Note 27
> + *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
> + *     ver 3, Aug 1993, ross at guest.adelaide.edu.au, Rocksoft Pty Ltd.,
> + *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
> + *
> +
> **********************************************************
> ********************/
> +
> +static uint32 crc32_table[256] = {
> +    0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
> +    0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
> +    0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
> +    0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
> +    0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
> +    0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
> +    0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
> +    0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
> +    0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
> +    0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
> +    0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
> +    0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
> +    0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
> +    0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
> +    0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
> +    0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
> +    0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
> +    0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
> +    0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
> +    0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
> +    0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
> +    0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
> +    0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
> +    0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
> +    0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
> +    0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
> +    0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
> +    0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
> +    0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
> +    0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
> +    0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
> +    0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
> +    0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
> +    0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
> +    0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
> +    0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
> +    0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
> +    0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
> +    0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
> +    0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
> +    0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
> +    0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
> +    0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
> +    0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
> +    0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
> +    0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
> +    0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
> +    0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
> +    0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
> +    0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
> +    0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
> +    0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
> +    0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
> +    0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
> +    0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
> +    0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
> +    0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
> +    0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
> +    0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
> +    0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
> +    0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
> +    0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
> +    0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
> +    0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
> +};
> +
> +uint32
> +crc32(
> +    uint8 *pdata,  /* pointer to array of data to process */
> +    uint nbytes, /* number of input data bytes to process */
> +    uint32 crc     /* either CRC32_INIT_VALUE or previous return value */
> +)
> +{
> +    while (nbytes-- > 0)
> +        CRC_INNER_LOOP(32, crc, *pdata++);
> +    return crc;
> +}
> diff --git a/tools/firmware-utils/src/linksys/crc.h b/tools/firmware-
> utils/src/linksys/crc.h
> new file mode 100644
> index 0000000000..c7e783c159
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/crc.h
> @@ -0,0 +1,69 @@
> +/*********************************************************
> **********************
> + * $Id: crc.h,v 1.2 2010/12/22 05:14:42 gavin.ke Exp $
> + * Copyright (C) 2009, Broadcom Corporation
> + * All Rights Reserved.
> + *
> + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO
> WARRANTIES OF ANY
> + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR
> OTHERWISE. BROADCOM
> + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF
> MERCHANTABILITY, FITNESS
> + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS
> SOFTWARE.
> + * crc.h - a function to compute crc for iLine10 headers
> +
> **********************************************************
> ********************/
> +
> +#ifndef _RTS_CRC_H_
> +#define _RTS_CRC_H_ 1
> +
> +#include "typedefs.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +
> +#define CRC8_INIT_VALUE  0xff       /* Initial CRC8 checksum value */
> +#define CRC8_GOOD_VALUE  0x9f       /* Good final CRC8 checksum value */
> +#define HCS_GOOD_VALUE   0x39       /* Good final header checksum value
> */
> +
> +#define CRC16_INIT_VALUE 0xffff     /* Initial CRC16 checksum value */
> +#define CRC16_GOOD_VALUE 0xf0b8     /* Good final CRC16 checksum
> value */
> +
> +#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */
> +#define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum
> value */
> +
> +void   hcs(uint8 *, uint);
> +uint8  crc8(uint8 *, uint, uint8);
> +uint16 crc16(uint8 *, uint, uint16);
> +uint32 crc32(uint8 *, uint, uint32);
> +
> +/* macros for common usage */
> +
> +#define APPEND_CRC8(pbytes, nbytes)                           \
> +do {                                                          \
> +    uint8 tmp = crc8(pbytes, nbytes, CRC8_INIT_VALUE) ^ 0xff; \
> +    (pbytes)[(nbytes)] = tmp;                                 \
> +    (nbytes) += 1;                                            \
> +} while (0)
> +
> +#define APPEND_CRC16(pbytes, nbytes)                               \
> +do {                                                               \
> +    uint16 tmp = crc16(pbytes, nbytes, CRC16_INIT_VALUE) ^ 0xffff; \
> +    (pbytes)[(nbytes) + 0] = (tmp >> 0) & 0xff;                    \
> +    (pbytes)[(nbytes) + 1] = (tmp >> 8) & 0xff;                    \
> +    (nbytes) += 2;                                                 \
> +} while (0)
> +
> +#define APPEND_CRC32(pbytes, nbytes)                                   \
> +do {                                                                   \
> +    uint32 tmp = crc32(pbytes, nbytes, CRC32_INIT_VALUE) ^ 0xffffffff; \
> +    (pbytes)[(nbytes) + 0] = (tmp >>  0) & 0xff;                       \
> +    (pbytes)[(nbytes) + 1] = (tmp >>  8) & 0xff;                       \
> +    (pbytes)[(nbytes) + 2] = (tmp >> 16) & 0xff;                       \
> +    (pbytes)[(nbytes) + 3] = (tmp >> 24) & 0xff;                       \
> +    (nbytes) += 4;                                                     \
> +} while (0)
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* _RTS_CRC_H_ */
> diff --git a/tools/firmware-utils/src/linksys/cyutils.h b/tools/firmware-
> utils/src/linksys/cyutils.h
> new file mode 100644
> index 0000000000..fd77ab52f3
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/cyutils.h
> @@ -0,0 +1,348 @@
> +#include "code_pattern.h"
> +
> +#if LINKSYS_MODEL == WRT54GSV4
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v1.05.6"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v1.05.8"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #endif
> +#elif LINKSYS_MODEL == WRT54GS	// WRT54GSV1-3
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v4.70.8"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v4.71.0"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #endif
> +#elif LINKSYS_MODEL == WRT54GL
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v4.30.2"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v4.30.4"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #endif
> +#elif LINKSYS_MODEL == WRT54G	// WRT54GV1-4
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v4.20.9"
> +    #define SERIAL_NUMBER	"001"
> +    #define MINOR_VERSION	""
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v4.21.0"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #endif
> +#elif LINKSYS_MODEL == T_MOBILE
> +    #define CYBERTAN_VERSION	"v5.00.0"
> +    #define SERIAL_NUMBER	"002"
> +    #define MINOR_VERSION	""
> +#elif LINKSYS_MODEL == WRT54G3G
> +    #define CYBERTAN_VERSION	"v1.90.0"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +#elif LINKSYS_MODEL == WRT300N
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v0.92.1"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v0.92.1"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	""
> +  #endif
> +#elif LINKSYS_MODEL == WRT350N
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v1.03.9"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	"-beta3"
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v1.03.9"
> +    #define SERIAL_NUMBER	"000"
> +    #define MINOR_VERSION	"-beta3"
> +  #endif
> +#elif LINKSYS_MODEL == WRT610N
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v2.00.00"
> +    #define SERIAL_NUMBER	"02 betasvn0526"
> +    #define MINOR_VERSION	""
> +//add by michael at 200804014
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +//end by michael
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v0.00.01"
> +    #define SERIAL_NUMBER	"09"
> +    #define MINOR_VERSION	""
> +//add by michael at 20080414
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #endif
> +//end by michael
> +#elif LINKSYS_MODEL == E200
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v0.0.01"
> +    #define SERIAL_NUMBER	"001"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v0.00.01"
> +    #define SERIAL_NUMBER	"001"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #endif
> +#elif LINKSYS_MODEL == E300
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v3.0.00"
> +    #define SERIAL_NUMBER	"006"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v0.00.01"
> +    #define SERIAL_NUMBER	"09"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #endif
> +#elif LINKSYS_MODEL == E3200
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v1.0.00"
> +    #define SERIAL_NUMBER	"1"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v0.00.01"
> +    #define SERIAL_NUMBER	"01"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #endif
> +#elif LINKSYS_MODEL == E4200
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v1.0.00"
> +    #define SERIAL_NUMBER	"9"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v0.00.01"
> +    #define SERIAL_NUMBER	"09"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #endif
> +#elif LINKSYS_MODEL == E2500
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v3.0.00"
> +    #define SERIAL_NUMBER	"6"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v1.0.00"
> +    #define SERIAL_NUMBER	"01"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +  #endif
> +#elif LINKSYS_MODEL == AC2350
> +  #if LOCALE == USA
> +    #define CYBERTAN_VERSION	"v1.0.03"
> +    #define SERIAL_NUMBER	"003"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +    #define CYBERTAN_UBOOT_VERSION	"v1.0"
> +  #else	// ETSI
> +    #define CYBERTAN_VERSION	"v1.0.00"
> +    #define SERIAL_NUMBER	"01"
> +    #define MINOR_VERSION	""
> +    #define BUILD_KEYWORD   " B"
> +    #define BUILD_NUMBER    SERIAL_NUMBER
> +    #define BETA_VERSION    " "
> +    #define CYBERTAN_UBOOT_VERSION	"v1.0"
> +  #endif
> +
> +#endif
> +
> +#if LINKSYS_MODEL == T_MOBILE
> +    #define CFES_BOOT_VERSION	"v5.3"
> +#elif LINKSYS_MODEL == E2500
> +    //#define CFES_BOOT_VERSION	"v4.13"
> +    //#define CFES_BOOT_VERSION	"v5.00"
> +    #define CFES_BOOT_VERSION	"v6.07"
> +#else
> +    #define CFES_BOOT_VERSION	"v5.2"
> +#endif
> +
> +#define LANG_VERSION		"v1.00.00"    //for lang.bin version
> control(setupwizard)
> +#define PMON_BOOT_VERSION	"v1.8"
> +#define QCA_WL_VERSION		"v10.2.138.3" /*add for QCA wireless
> version by Jemmy 2014.5.21*/
> +
> +
> +#if LINKSYS_MODEL == T_MOBILE
> +#define BOOT_IPADDR "192.168.0.1"
> +#define BOOT_NETMASK "255.255.255.0"
> +#else
> +#define BOOT_IPADDR "192.168.1.1"
> +#define BOOT_NETMASK "255.255.255.0"
> +#endif
> +
> +#define SUPPORT_4712_CHIP	0x0001
> +#define SUPPORT_INTEL_FLASH	0x0002
> +#define SUPPORT_5325E_SWITCH	0x0004
> +#define SUPPORT_4704_CHIP	0x0008
> +#define SUPPORT_5352E_CHIP	0x0010
> +
> +struct code_header {
> +	char magic[4];	// Code Pattern
> +	char res1[4];	// for extra magic
> +	char fwdate[3];	// Firmware build date
> +	char fwvern[3];	// Firmware version
> +	char id[4];	// U2ND
> +	char hw_ver;    // 0) for 4702, 1) for 4712, 2) for 4712L, 3) for 4704, 4)
> for 5352E
> +	unsigned char  sn;	// Serial Number
> +	unsigned short flags;
> +	unsigned char  stable[2];	// The image is stable (for dual image)
> +	unsigned char  try1[2];		// Try to boot image first time (for dual
> image)
> +	unsigned char  try2[2];		// Try to boot image second time (for
> dual image)
> +	unsigned char  try3[2];		// Try to boot image third time (for
> dual_image)
> +	unsigned char  res3[2];
> +} ;
> +
> +//add for AC2350 F/W header
> +#define FWHDR_MAGIC_STR "CHDR"
> +#define FWHDR_MAGIC 0X52444843
> +struct cbt_fw_header
> +{
> +	unsigned int magic;		/* "CHDR" */
> +	unsigned int len;		/* Length of file including header */
> +	unsigned int crc32;		/* 32-bit CRC */
> +	unsigned int res;
> +};
> +
> +//#ifdef MULTILANG_SUPPORT
> +struct lang_header {
> +        char magic[4];
> +        char res1[4];   // for extra magic
> +        char fwdate[3];
> +        char fwvern[3];
> +        char id[4];     // U2ND
> +        char hw_ver;    // 0: for 4702, 1: for 4712
> +	char res2;
> +        unsigned long len;
> +        unsigned char res3[8];
> +} ;
> +//#endif
> +
> +struct boot_header {
> +	char magic[3];
> +	char res[29];
> +};
> +
> +/***************************************
> + * define upnp misc                    *
> + ***************************************/
> +#if OEM == LINKSYS
> +  #if LANGUAGE == ENGLISH
> +    #define URL			"http://www.linksys.com/"
> +  #else
> +    #define URL			"http://www.linksys.co.jp/"
> +  #endif
> +  #define DEV_FRIENDLY_NAME	"Linksys"MODEL_NAME
> +  #define DEV_MFR		"Linksys"
> +  //#define DEV_MFR_URL		URL
> +  #define DEV_MFR_URL		"http://www.linksys.com"
> +  #define DEV_MODEL_DESCRIPTION	"Internet Access Server"
> +  #define DEV_MODEL		MODEL_NAME
> +  #define DEV_MODEL_NO		CYBERTAN_VERSION
> +  //#define DEV_MODEL_URL		URL
> +  #define DEV_MODEL_URL
> 	"http://www.linksys.com/international"
> +#elif OEM == PCI
> +  #if LANGUAGE == ENGLISH
> +    #define URL			"http://www.planex.com/"
> +  #else
> +    #define URL			"http://www.planex.co.jp/"
> +  #endif
> +  #define DEV_FRIENDLY_NAME	"BLW-04G Wireless Broadband
> Router"
> +  #define DEV_MFR		"Planex Communciations Inc."
> +  #define DEV_MFR_URL		URL
> +  #define DEV_MODEL_DESCRIPTION	"Internet Gateway Device with UPnP
> support"
> +  #define DEV_MODEL		"BLW-04G"
> +  #define DEV_MODEL_NO 		CYBERTAN_VERSION
> +  #define DEV_MODEL_URL		URL
> +#else
> +  #define URL			""
> +  #define DEV_FRIENDLY_NAME	MODEL_NAME
> +  #define DEV_MFR		""
> +  #define DEV_MFR_URL		URL
> +  #define DEV_MODEL_DESCRIPTION	"Internet Access Server"
> +  #define DEV_MODEL		MODEL_NAME
> +  #define DEV_MODEL_NO		CYBERTAN_VERSION
> +  #define DEV_MODEL_URL		URL
> +#endif
> +
> +/***************************************
> + * define Parental Control link        *
> + ***************************************/
> +#if LOCALE == EUROPE
> +  #define	SIGN_UP_URL
> 	"http://pcsvc.ourlinksys.com/eu/language.jsp"
> +  #define	MORE_INFO_URL
> 	"http://www.linksys.com/pcsvc/eu/info_eu.asp"
> +  #define	ADMIN_URL	"http://pcsvc.ourlinksys.com/en"
> +#elif LOCALE == GERMANY
> +  #define	SIGN_UP_URL	"http://pcsvc.ourlinksys.com/de/trial.asp"
> +  #define	MORE_INFO_URL
> 	"http://www.linksys.com/pcsvc/de/info_de.asp"
> +  #define	ADMIN_URL	"http://pcsvc.ourlinksys.com/de/admin.asp"
> +#elif LOCALE == FRANCE
> +  #define	SIGN_UP_URL	"http://pcsvc.ourlinksys.com/fr/trial.asp"
> +  #define	MORE_INFO_URL
> 	"http://www.linksys.com/pcsvc/fr/info_fr.asp"
> +  #define	ADMIN_URL	"http://pcsvc.ourlinksys.com/fr/admin.asp"
> +#else
> +  #define	SIGN_UP_URL	"http://pcsvc.ourlinksys.com/us/trial.asp"
> +  #define	MORE_INFO_URL
> 	"http://www.linksys.com/pcsvc/info.asp"
> +  #define	ADMIN_URL	"http://pcsvc.ourlinksys.com/us/admin.asp"
> +#endif
> +
> +/***************************************
> + * define PPTP info		       *
> + ***************************************/
> +#if OEM == LINKSYS
> +#define	PPTP_VENDOR	"Linksys"
> +#else
> +#define	PPTP_VENDOR	CT_VENDOR
> +#endif
> +#define PPTP_HOSTNAME	""
> +
> +/***************************************
> + * define L2TP info		       *
> + ***************************************/
> +#if OEM == LINKSYS
> +#define	L2TP_VENDOR	"Linksys"
> +#else
> +#define	L2TP_VENDOR	CT_VENDOR
> +#endif
> +#define L2TP_HOSTNAME	MODEL_NAME //2005-03-04 by kanki
> diff --git a/tools/firmware-utils/src/linksys/typedefs.h b/tools/firmware-
> utils/src/linksys/typedefs.h
> new file mode 100644
> index 0000000000..78989745f9
> --- /dev/null
> +++ b/tools/firmware-utils/src/linksys/typedefs.h
> @@ -0,0 +1,447 @@
> +/*
> + * Copyright (C) 2009, Broadcom Corporation
> + * All Rights Reserved.
> + *
> + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO
> WARRANTIES OF ANY
> + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR
> OTHERWISE. BROADCOM
> + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF
> MERCHANTABILITY, FITNESS
> + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS
> SOFTWARE.
> + * $Id: typedefs.h,v 1.1.1.1 2010/11/24 06:37:38 gavin.ke Exp $
> + */
> +
> +#ifndef _TYPEDEFS_H_
> +#define _TYPEDEFS_H_
> +
> +#ifdef SITE_TYPEDEFS
> +
> +/*
> + * Define SITE_TYPEDEFS in the compile to include a site-specific
> + * typedef file "site_typedefs.h".
> + *
> + * If SITE_TYPEDEFS is not defined, then the code section below makes
> + * inferences about the compile environment based on defined symbols
> and
> + * possibly compiler pragmas.
> + *
> + * Following these two sections is the Default Typedefs section.
> + * This section is only processed if USE_TYPEDEF_DEFAULTS is
> + * defined. This section has a default set of typedefs and a few
> + * preprocessor symbols (TRUE, FALSE, NULL, ...).
> + */
> +
> +#include "site_typedefs.h"
> +
> +#else
> +
> +/*
> + * Infer the compile environment based on preprocessor symbols and
> pragmas.
> + * Override type definitions as needed, and include configuration-
> dependent
> + * header files to define types.
> + */
> +
> +#ifdef __cplusplus
> +
> +#define TYPEDEF_BOOL
> +#ifndef FALSE
> +#define FALSE	false
> +#endif
> +#ifndef TRUE
> +#define TRUE	true
> +#endif
> +
> +#else	/* ! __cplusplus */
> +
> +#if defined(_WIN32)
> +
> +#define TYPEDEF_BOOL
> +typedef	unsigned char	bool;			/* consistent w/BOOL
> */
> +
> +#endif /* _WIN32 */
> +
> +#endif	/* ! __cplusplus */
> +
> +#if defined(_WIN64) && !defined(EFI)
> +/* use the Windows ULONG_PTR type when compiling for 64 bit */
> +#include <basetsd.h>
> +#define TYPEDEF_UINTPTR
> +typedef ULONG_PTR uintptr;
> +#elif defined(__x86_64__)
> +#define TYPEDEF_UINTPTR
> +typedef unsigned long long int uintptr;
> +#endif
> +
> +#if defined(_HNDRTE_) && !defined(_HNDRTE_SIM_)
> +#define _NEED_SIZE_T_
> +#endif
> +
> +#if defined(_MINOSL_)
> +#define _NEED_SIZE_T_
> +#endif
> +
> +#if defined(EFI) && !defined(_WIN64)
> +#define _NEED_SIZE_T_
> +#endif
> +
> +#if defined(TARGETOS_nucleus)
> +/* for 'size_t' type */
> +#include <stddef.h>
> +
> +/* float_t types conflict with the same typedefs from the standard ANSI-C
> +** math.h header file. Don't re-typedef them here.
> +*/
> +#define TYPEDEF_FLOAT_T
> +#endif   /* TARGETOS_nucleus */
> +
> +#if defined(_NEED_SIZE_T_)
> +typedef long unsigned int size_t;
> +#endif
> +
> +#ifdef __DJGPP__
> +typedef long unsigned int size_t;
> +#endif /* __DJGPP__ */
> +
> +#ifdef _MSC_VER	    /* Microsoft C */
> +#define TYPEDEF_INT64
> +#define TYPEDEF_UINT64
> +typedef signed __int64	int64;
> +typedef unsigned __int64 uint64;
> +#endif
> +
> +#if defined(MACOSX)
> +#ifdef KERNEL
> +#include <libkern/version.h>
> +#if VERSION_MAJOR > 10
> +#define WLP2P
> +#define IO80211P2P
> +#define APSTA
> +#define WLMCHAN
> +#define WL_MULTIQUEUE
> +#define WL_BSSCFG_TX_SUPR
> +#define WIFI_ACT_FRAME
> +#define FAST_ACTFRM_TX
> +#endif
> +#endif /* KERNEL */
> +#define TYPEDEF_BOOL
> +#endif
> +
> +#if defined(__NetBSD__)
> +#define TYPEDEF_ULONG
> +#endif
> +
> +#if defined(__sparc__)
> +#define TYPEDEF_ULONG
> +#endif
> +
> +
> +#ifdef	linux
> +/*
> + * If this is either a Linux hybrid build or the per-port code of a hybrid build
> + * then use the Linux header files to get some of the typedefs.  Otherwise,
> define
> + * them entirely in this file.  We can't always define the types because we
> get
> + * a duplicate typedef error; there is no way to "undefine" a typedef.
> + * We know when it's per-port code because each file defines LINUX_PORT
> at the top.
> + */
> +#if !defined(LINUX_HYBRID) || defined(LINUX_PORT)
> +#define TYPEDEF_UINT
> +#ifndef TARGETENV_android
> +#define TYPEDEF_USHORT
> +#define TYPEDEF_ULONG
> +#endif /* TARGETENV_android */
> +#ifdef __KERNEL__
> +#include <linux/version.h>
> +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19))
> +#define TYPEDEF_BOOL
> +#endif	/* >= 2.6.19 */
> +#endif	/* __KERNEL__ */
> +#endif  /* !defined(LINUX_HYBRID) || defined(LINUX_PORT) */
> +#endif	/* linux */
> +
> +#if defined(__ECOS)
> +#define TYPEDEF_UCHAR
> +#define TYPEDEF_UINT
> +#define TYPEDEF_USHORT
> +#define TYPEDEF_ULONG
> +#define TYPEDEF_BOOL
> +#endif
> +
> +#if !defined(linux) && !defined(_WIN32) && !defined(_CFE_) &&
> !defined(_MINOSL_) && \
> +	!defined(__DJGPP__) && !defined(__ECOS) && !defined(__BOB__)
> && \
> +	!defined(TARGETOS_nucleus)
> +#define TYPEDEF_UINT
> +#define TYPEDEF_USHORT
> +#endif
> +
> +
> +/* Do not support the (u)int64 types with strict ansi for GNU C */
> +#if defined(__GNUC__) && defined(__STRICT_ANSI__)
> +#define TYPEDEF_INT64
> +#define TYPEDEF_UINT64
> +#endif
> +
> +/* ICL accepts unsigned 64 bit type only, and complains in ANSI mode
> + * for signed or unsigned
> + */
> +#if defined(__ICL)
> +
> +#define TYPEDEF_INT64
> +
> +#if defined(__STDC__)
> +#define TYPEDEF_UINT64
> +#endif
> +
> +#endif /* __ICL */
> +
> +#if !defined(_WIN32) && !defined(_CFE_) && !defined(_MINOSL_) &&
> !defined(__DJGPP__) && \
> +	!defined(__BOB__) && !defined(TARGETOS_nucleus)
> +
> +/* pick up ushort & uint from standard types.h */
> +#if defined(linux) && defined(__KERNEL__)
> +
> +/* See note above */
> +#if !defined(LINUX_HYBRID) || defined(LINUX_PORT)
> +#ifdef USER_MODE
> +#include <sys/types.h>
> +#else
> +#include <linux/types.h>	/* sys/types.h and linux/types.h are oil and
> water */
> +#endif /* USER_MODE */
> +#endif /* !defined(LINUX_HYBRID) || defined(LINUX_PORT) */
> +
> +#else
> +
> +#if defined(__ECOS)
> +#include <pkgconf/infra.h>
> +#include <cyg/infra/cyg_type.h>
> +#include <stdarg.h>
> +#endif
> +
> +#include <sys/types.h>
> +
> +#endif /* linux && __KERNEL__ */
> +
> +#endif /* !_WIN32 && !PMON && !_CFE_ && !_HNDRTE_  && !_MINOSL_
> && !__DJGPP__ */
> +
> +#if defined(MACOSX)
> +
> +#ifdef __BIG_ENDIAN__
> +#define IL_BIGENDIAN
> +#else
> +#ifdef IL_BIGENDIAN
> +#error "IL_BIGENDIAN was defined for a little-endian compile"
> +#endif
> +#endif /* __BIG_ENDIAN__ */
> +
> +#if !defined(__cplusplus)
> +
> +#if defined(__i386__)
> +typedef unsigned char bool;
> +#else
> +typedef unsigned int bool;
> +#endif
> +#define TYPE_BOOL 1
> +enum {
> +    false	= 0,
> +    true	= 1
> +};
> +
> +#if defined(KERNEL)
> +#include <IOKit/IOTypes.h>
> +#endif /* KERNEL */
> +
> +#endif /* __cplusplus */
> +
> +#endif /* MACOSX */
> +
> +
> +/* use the default typedefs in the next section of this file */
> +#define USE_TYPEDEF_DEFAULTS
> +
> +#endif /* SITE_TYPEDEFS */
> +
> +
> +/*
> + * Default Typedefs
> + */
> +
> +#ifdef USE_TYPEDEF_DEFAULTS
> +#undef USE_TYPEDEF_DEFAULTS
> +
> +#ifndef TYPEDEF_BOOL
> +typedef	/* @abstract@ */ unsigned char	bool;
> +#endif
> +
> +/* define uchar, ushort, uint, ulong */
> +
> +#ifndef TYPEDEF_UCHAR
> +typedef unsigned char	uchar;
> +#endif
> +
> +#ifndef TYPEDEF_USHORT
> +typedef unsigned short	ushort;
> +#endif
> +
> +#ifndef TYPEDEF_UINT
> +typedef unsigned int	uint;
> +#endif
> +
> +#ifndef TYPEDEF_ULONG
> +typedef unsigned long	ulong;
> +#endif
> +
> +/* define [u]int8/16/32/64, uintptr */
> +
> +#ifndef TYPEDEF_UINT8
> +typedef unsigned char	uint8;
> +#endif
> +
> +#ifndef TYPEDEF_UINT16
> +typedef unsigned short	uint16;
> +#endif
> +
> +#ifndef TYPEDEF_UINT32
> +typedef unsigned int	uint32;
> +#endif
> +
> +#ifndef TYPEDEF_UINT64
> +typedef unsigned long long uint64;
> +#endif
> +
> +#ifndef TYPEDEF_UINTPTR
> +typedef unsigned int	uintptr;
> +#endif
> +
> +#ifndef TYPEDEF_INT8
> +typedef signed char	int8;
> +#endif
> +
> +#ifndef TYPEDEF_INT16
> +typedef signed short	int16;
> +#endif
> +
> +#ifndef _SLHC_H
> +#ifndef TYPEDEF_INT32
> +typedef signed int	int32;
> +#endif
> +#endif
> +
> +#ifndef TYPEDEF_INT64
> +typedef signed long long int64;
> +#endif
> +
> +/* define float32/64, float_t */
> +
> +#ifndef TYPEDEF_FLOAT32
> +typedef float		float32;
> +#endif
> +
> +#ifndef TYPEDEF_FLOAT64
> +typedef double		float64;
> +#endif
> +
> +/*
> + * abstracted floating point type allows for compile time selection of
> + * single or double precision arithmetic.  Compiling with -DFLOAT32
> + * selects single precision; the default is double precision.
> + */
> +
> +#ifndef TYPEDEF_FLOAT_T
> +
> +#if defined(FLOAT32)
> +typedef float32 float_t;
> +#else /* default to double precision floating point */
> +typedef float64 float_t;
> +#endif
> +
> +#endif /* TYPEDEF_FLOAT_T */
> +
> +/* define macro values */
> +
> +#ifndef FALSE
> +#define FALSE	0
> +#endif
> +
> +#ifndef TRUE
> +#define TRUE	1  /* TRUE */
> +#endif
> +
> +#ifndef NULL
> +#define	NULL	0
> +#endif
> +
> +#ifndef OFF
> +#define	OFF	0
> +#endif
> +
> +#ifndef ON
> +#define	ON	1  /* ON = 1 */
> +#endif
> +
> +#define	AUTO	(-1) /* Auto = -1 */
> +
> +/* define PTRSZ, INLINE */
> +
> +#ifndef PTRSZ
> +#define	PTRSZ	sizeof(char*)
> +#endif
> +
> +
> +/* Detect compiler type. */
> +#ifdef _MSC_VER
> +	#define BWL_COMPILER_MICROSOFT
> +#elif defined(__GNUC__)
> +	#define BWL_COMPILER_GNU
> +#elif defined(__CC_ARM) && __CC_ARM
> +	#define BWL_COMPILER_ARMCC
> +#else
> +	#error "Unknown compiler!"
> +#endif /* _MSC_VER */
> +
> +
> +#ifndef INLINE
> +	#if defined(BWL_COMPILER_MICROSOFT)
> +		#define INLINE __inline
> +	#elif defined(BWL_COMPILER_GNU)
> +		#define INLINE __inline__
> +	#elif defined(BWL_COMPILER_ARMCC)
> +		#define INLINE	__inline
> +	#else
> +		#define INLINE
> +	#endif /* _MSC_VER */
> +#endif /* INLINE */
> +
> +#undef TYPEDEF_BOOL
> +#undef TYPEDEF_UCHAR
> +#undef TYPEDEF_USHORT
> +#undef TYPEDEF_UINT
> +#undef TYPEDEF_ULONG
> +#undef TYPEDEF_UINT8
> +#undef TYPEDEF_UINT16
> +#undef TYPEDEF_UINT32
> +#undef TYPEDEF_UINT64
> +#undef TYPEDEF_UINTPTR
> +#undef TYPEDEF_INT8
> +#undef TYPEDEF_INT16
> +#undef TYPEDEF_INT32
> +#undef TYPEDEF_INT64
> +#undef TYPEDEF_FLOAT32
> +#undef TYPEDEF_FLOAT64
> +#undef TYPEDEF_FLOAT_T
> +
> +#endif /* USE_TYPEDEF_DEFAULTS */
> +
> +/* Suppress unused parameter warning */
> +#define UNUSED_PARAMETER(x) (void)(x)
> +
> +/*
> + * Including the bcmdefs.h here, to make sure everyone including
> typedefs.h
> + * gets this automatically
> +*/
> +#include "bcmdefs.h"
> +/*
> + * If android target is building then include this file
> + */
> +#ifndef LINUX_HYBRID
> +#ifdef TARGETENV_android
> +#include <bcm_android_types.h>
> +#endif /* TARGETENV_android */
> +#endif /* LINUX_HYBRID */
> +
> +#endif /* _TYPEDEFS_H_ */
> --
> 2.27.0
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: openpgp-digital-signature.asc
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.openwrt.org/pipermail/openwrt-devel/attachments/20200725/ff1f8b84/attachment-0001.sig>


More information about the openwrt-devel mailing list