X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/4f38f53ecdfac17b5632ee65165b2f570bfc2a7b..c6f1dc90c0ee615e612d519ab3f1be62752b4f9c:/tools/firmware-utils/src/addpattern.c?ds=inline diff --git a/tools/firmware-utils/src/addpattern.c b/tools/firmware-utils/src/addpattern.c index 6f2a036c0..da6797c9c 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 @@ -74,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]; @@ -82,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#.#.#] [-r #.#] [-{0|1|2|4}] -h\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 */ @@ -108,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; @@ -121,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:0124hr:")) != -1) { + while ((c = getopt(argc, argv, "i:o:p:s:gbv:01245hr:B:")) != -1) { switch (c) { case 'i': ifn = optarg; @@ -132,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; @@ -158,9 +203,21 @@ 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: @@ -173,6 +230,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->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(); @@ -239,7 +309,7 @@ int main(int argc, char **argv) return EXIT_FAILURE; } } - + if (ferror(in)) { goto FREAD_ERROR; }