From 4b0c6e828aa81ac250bd1a338b5c6ca4471eefae Mon Sep 17 00:00:00 2001
From: juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Thu, 6 Aug 2009 09:15:05 +0000
Subject: [tools] firmware-utils/addpattern: add support for the WRT160NL

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17140 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 tools/firmware-utils/src/addpattern.c | 60 ++++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 5 deletions(-)

diff --git a/tools/firmware-utils/src/addpattern.c b/tools/firmware-utils/src/addpattern.c
index 6f2a036c0..dbd07e684 100644
--- a/tools/firmware-utils/src/addpattern.c
+++ b/tools/firmware-utils/src/addpattern.c
@@ -29,11 +29,11 @@
  */
 
 /* January 12, 2005
- * 
+ *
  * Modified by rodent at rodent dot za dot net
  * Support added for the new WRT54G v2.2 and WRT54GS v1.1 "flags"
  * Without the flags set to 0x7, the above units will refuse to flash.
- * 
+ *
  * Extensions:
  *  -{0|1|2} sets {0|1} sets hw_ver flag to 0/1. {2} sets hw_ver to 1
  *     and adds the new hardware "flags" for the v2.2/v1.1 units
@@ -87,16 +87,48 @@ struct code_header {			/* from cyutils.h */
 	unsigned char res2[10];
 } ;
 
+struct board_info {
+	char	*id;
+	char	*pattern;
+	char	hw_ver;
+	char	unused;
+	char	flags[2];
+};
+
+struct board_info boards[] = {
+	{
+		.id		= "WRT160NL",
+		.pattern	= "NL16",
+		.hw_ver		= 0x00,
+		.unused		= 0x0f,
+		.flags		= {0x3f, 0x00},
+	}, {
+		/* Terminating entry */
+		.id	= NULL,
+	}
+};
+
 /**********************************************************************/
 
 void usage(void) __attribute__ (( __noreturn__ ));
 
 void usage(void)
 {
-	fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-p pattern] [-g] [-b] [-v v#.#.#] [-r #.#] [-{0|1|2|4}] -h\n");
+	fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-B board_id] [-p pattern] [-g] [-b] [-v v#.#.#] [-r #.#] [-{0|1|2|4}] -h\n");
 	exit(EXIT_FAILURE);
 }
 
+struct board_info *find_board(char *id)
+{
+	struct board_info *board;
+
+	for (board = boards; board->id != NULL; board++)
+		if (strcasecmp(id, board->id) == 0)
+			return board;
+
+	return NULL;
+}
+
 int main(int argc, char **argv)
 {
 	char buf[1024];	/* keep this at 1k or adjust garbage calc below */
@@ -108,6 +140,8 @@ int main(int argc, char **argv)
 	char *pattern = CODE_PATTERN;
 	char *pbotpat = PBOT_PATTERN;
 	char *version = CYBERTAN_VERSION;
+	char *board_id = NULL;
+	struct board_info *board = NULL;
 	int gflag = 0;
 	int pbotflag = 0;
 	int c;
@@ -121,7 +155,7 @@ int main(int argc, char **argv)
 	hdr = (struct code_header *) buf;
 	memset(hdr, 0, sizeof(struct code_header));
 
-	while ((c = getopt(argc, argv, "i:o:p:gbv:0124hr:")) != -1) {
+	while ((c = getopt(argc, argv, "i:o:p:gbv:0124hr:B:")) != -1) {
 		switch (c) {
 			case 'i':
 				ifn = optarg;
@@ -161,6 +195,9 @@ int main(int argc, char **argv)
                         case 'r':
                                 hdr->hw_ver = (char)(atof(optarg)*10)+0x30;
                                 break;
+                        case 'B':
+                                board_id = optarg;
+                                break;
 
                         case 'h':
 			default:
@@ -173,6 +210,19 @@ int main(int argc, char **argv)
 		usage();
 	}
 
+	if (board_id) {
+		board = find_board(board_id);
+		if (board == NULL) {
+			fprintf(stderr, "unknown board \"%s\"\n", board_id);
+			usage();
+		}
+		pattern = board->pattern;
+		hdr->hw_ver = board->hw_ver;
+		hdr->unused = board->unused;
+		hdr->flags[0] = board->flags[0];
+		hdr->flags[1] = board->flags[1];
+	}
+
 	if (strlen(pattern) != 4) {
 		fprintf(stderr, "illegal pattern \"%s\": length != 4\n", pattern);
 		usage();
@@ -239,7 +289,7 @@ int main(int argc, char **argv)
 			return EXIT_FAILURE;
 		}
 	}
-	
+
 	if (ferror(in)) {
 		goto FREAD_ERROR;
 	}
-- 
cgit v1.2.3