X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/c41fbbc115a5f16a61cf16419a8fe70ab5d00bdd..cec23da75a4f97634d64584d28f83a85b92b2dae:/tools/firmware-utils/src/addpattern.c diff --git a/tools/firmware-utils/src/addpattern.c b/tools/firmware-utils/src/addpattern.c index 5f49b921f..da6797c9c 100644 --- a/tools/firmware-utils/src/addpattern.c +++ b/tools/firmware-utils/src/addpattern.c @@ -29,16 +29,32 @@ */ /* 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 */ +/* January 1, 2007 + * + * Modified by juan.i.gonzalez at subdown dot net + * Support added for the AG241v2 and similar + * + * Extensions: + * -r #.# adds revision hardware flags. AG241v2 and similar. + * + * AG241V2 firmware sets the hw_ver to 0x44. + * + * Example: -r 2.0 + * + * Convert 2.0 to 20 to be an integer, and add 0x30 to skip special ASCII + * #define HW_Version ((HW_REV * 10) + 0x30) -> from cyutils.h +*/ + #include #include #include @@ -58,6 +74,9 @@ #define SUPPORT_4712_CHIP 0x0001 #define SUPPORT_INTEL_FLASH 0x0002 #define SUPPORT_5325E_SWITCH 0x0004 +/* (from 3.00.24 firmware cyutils.h) */ +#define SUPPORT_4704_CHIP 0x0008 +#define SUPPORT_5352E_CHIP 0x0010 struct code_header { /* from cyutils.h */ char magic[4]; @@ -66,21 +85,58 @@ struct code_header { /* from cyutils.h */ char fwvern[3]; char id[4]; /* U2ND */ char hw_ver; /* 0: for 4702, 1: for 4712 -- new in 2.04.3 */ - char unused; - unsigned char flags[2]; /* SUPPORT_ flags new for 3.37.2 (WRT54G v2.2 and WRT54GS v1.1) */ - unsigned char res2[10]; + + unsigned char sn; // Serial Number + unsigned char flags[2]; /* SUPPORT_ flags new for 3.37.2 (WRT54G v2.2 and WRT54GS v1.1) */ + 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]; } ; +struct board_info { + char *id; + char *pattern; + char hw_ver; + char sn; + char flags[2]; +}; + +struct board_info boards[] = { + { + .id = "WRT160NL", + .pattern = "NL16", + .hw_ver = 0x00, + .sn = 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#.#.#] [-{0|1|2|4}]\n"); + fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-B board_id] [-p pattern] [-s serial] [-g] [-b] [-v v#.#.#] [-r #.#] [-{0|1|2|4|5}] -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 */ @@ -92,6 +148,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; @@ -105,7 +163,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:0124")) != -1) { + while ((c = getopt(argc, argv, "i:o:p:s:gbv:01245hr:B:")) != -1) { switch (c) { case 'i': ifn = optarg; @@ -116,6 +174,9 @@ int main(int argc, char **argv) case 'p': pattern = optarg; break; + case 's': + hdr->sn = (unsigned char) atoi (optarg); + break; case 'g': gflag = 1; break; @@ -142,17 +203,46 @@ int main(int argc, char **argv) hdr->hw_ver = 0; hdr->flags[0] = 0x1f; break; + case '5': + /* V5 is appended to trxV2 image */ + hdr->stable[0] = 0x73; // force image to be stable + hdr->stable[1] = 0x00; + hdr->try1[0] = 0x74; // force try1 to be set + hdr->try1[1] = 0x00; + hdr->try2[0] = hdr->try2[1] = 0xFF; + hdr->try3[0] = hdr->try3[1] = 0xFF; + break; + case 'r': + hdr->hw_ver = (char)(atof(optarg)*10)+0x30; + break; + case 'B': + board_id = optarg; + break; + case 'h': default: usage(); } } - if (optind != argc) { + if (optind != argc || optind == 1) { fprintf(stderr, "illegal arg \"%s\"\n", argv[optind]); 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->sn = board->sn; + 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(); @@ -219,7 +309,7 @@ int main(int argc, char **argv) return EXIT_FAILURE; } } - + if (ferror(in)) { goto FREAD_ERROR; }