Browse Source

Update to v2.2 fixed checksum byte calculation for other versions than 0x2019 fixed rare problem with padsize updated info to stock firmware 2.00.20 fixed typos

Signed off by: Matthias Buecher <[email protected]>

SVN-Revision: 19683
Travis Kemen 15 years ago
parent
commit
3c5ca326ec

+ 1 - 0
target/linux/orion/image/Makefile

@@ -63,6 +63,7 @@ define Image/Build/Linksys
 	echo ":rootfs 0 ${KDIR}/root.$1" >>"${TMP_DIR}/$2_webupgrade/$2.par"
 	[ ! -f "$(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin" ] || ( \
 		echo ":u-boot 0 $(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin" >>"${TMP_DIR}/$2_webupgrade/$2.par"; )
+	echo "#version 0x2020" >>"${TMP_DIR}/$2_webupgrade/$2.par"
 # create bin file for recovery and webupgrade image
 	( cd "${TMP_DIR}/$2_webupgrade"; \
 		"${STAGING_DIR_HOST}/bin/$2-builder" \

+ 1 - 1
tools/wrt350nv2-builder/Makefile

@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=wrt350nv2-builder
-PKG_VERSION:=2.1
+PKG_VERSION:=2.2
 
 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/${PKG_NAME}-$(PKG_VERSION)
 

+ 31 - 22
tools/wrt350nv2-builder/src/wrt350nv2-builder.c

@@ -1,6 +1,6 @@
 /*
 
-	WRT350Nv2-Builder 2.1 (previously called buildimg)
+	WRT350Nv2-Builder 2.2 (previously called buildimg)
 	Copyright (C) 2008-2009 Dirk Teurlings <[email protected]>
 	Copyright (C) 2009-2010 Matthias Buecher (http://www.maddes.net/)
 
@@ -31,6 +31,7 @@
 		:kernel	0x001A0000	/path/to/uImage
 		:rootfs	0	/path/to/root.squashfs
 		:u-boot	0	/path/to/u-boot.bin
+		#version	0x2020
 
 	args:
 		1	wrt350nv2.par		parameter file describing the image layout
@@ -60,10 +61,16 @@
 	To extract everything from a Linksys style firmware image see
 	https://forum.openwrt.org/viewtopic.php?pid=92928#p92928
 
-*/
+	Changelog:
+	v2.2 - fixed checksum byte calculation for other versions than 0x2019
+	       fixed rare problem with padsize
+	       updated info to stock firmware 2.00.20
+	       fixed typos
+	v2.1 - used "wrt350n.bin" for the created image (closer to stock)
+		added option to create the image in two separate steps (-b / -z)
+	v2.0 - complete re-write
 
-// ToDo:
-// * Has NODE to be added to bin file *after* creating checksum byte?
+*/
 
 // includes
 #define _GNU_SOURCE	// for GNU's basename()
@@ -79,11 +86,11 @@
 
 // custom includes
 #include "md5.h"	// MD5 routines
-#include "upgrade.h"	// Linksys definitions from firmware 2.0.19
+#include "upgrade.h"	// Linksys definitions from firmware 2.0.19 (unchanged up to 2.0.20)
 
 
 // version info
-#define VERSION "2.1"
+#define VERSION "2.2"
 char program_info[] = "WRT350Nv2-Builder v%s by Dirk Teurlings <[email protected]> and Matthias Buecher (http://www.maddes.net/)\n";
 
 // verbosity
@@ -107,12 +114,14 @@ mtd_info mtd_uboot = { "u-boot", 0, 0, NULL, 0L, { 0, 0 } };
 
 #define ROOTFS_END_OFFSET	0x00760000
 #define ROOTFS_MIN_OFFSET	0x00640000	// should be filled up to here, to make sure that the zip file is big enough to pass the size check of the stock firmware
-						// 2.0.17: filled up to 0x00640000, 2.0.19: filled up to 0x0670000
+						// 2.0.17: filled up to 0x00640000
+						// 2.0.19: filled up to 0x00670000
+						// 2.0.20: filled up to 0x00670000
 
 // rootfs statics via: hexdump -v -e '1/1 "0x%02X, "' -s 0x0075FFE0 -n 16 "wrt350n.bin" ; echo -en "\n"
 unsigned char product_id[] = { 0x00, 0x03 };	// seems to be a fixed value
 unsigned char protocol_id[] = { 0x00, 0x00 };	// seems to be a fixed value
-unsigned char fw_version[] = { 0x20, 0x19 };
+unsigned char fw_version[] = { 0x20, 0x20 };
 unsigned char rootfs_unknown[] = { 0x90, 0xF7 };	// seems to be a fixed value
 unsigned char sign[] = { 0x65, 0x52, 0x63, 0x4F, 0x6D, 0x4D, 0x00, 0x00 };	// eRcOmM
 
@@ -130,7 +139,7 @@ unsigned char pid[] = {	0x73, 0x45, 0x72, 0x43, 0x6F, 0x4D, 0x6D, 0x00, 0x01, 0x
 				0x00, 0x00, 0x00, 0x04,
 				0x73, 0x45, 0x72, 0x43, 0x6F, 0x4D, 0x6D };	// sErCoMm
 
-// img statics via: hexdump -v -e '1/1 "0x%02X, "' -s 0 -n 512 "WRT350N-EU-ETSI-2.00.19.img" ; echo -en "\n"
+// img statics via: hexdump -v -e '1/1 "0x%02X, "' -s 0 -n 512 "WRT350N-EU-ETSI-2.00.19.img" ; echo -en "\n" (unchanged up to 2.0.20)
 unsigned char img_hdr[] = {	0x00, 0x01, 0x00, 0x00, 0x59, 0x42, 0x50, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 				0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
@@ -320,7 +329,7 @@ int parse_par_file(FILE *f_par) {
 			case '#':	// integer values
 				count = sscanf(line, "#%255s %i", string1, &value);
 				if (count != 2) {
-					printf("line %i does not meet defined format (:<variable name> <integer>\n", lineno);
+					printf("line %i does not meet defined format (#<variable name> <integer>\n", lineno);
 				} else {
 					if (!strcmp(string1, "version")) {
 						// changing version
@@ -454,10 +463,12 @@ int create_bin_file(char *bin_filename) {
 
 			// padding
 			if (padsize > 0) {
-				printf("mtd %s input file %s is too small (0x%08lX), adding 0x%08X random bytes\n", mtd->name, mtd->filename, mtd->filesize, padsize);
-
 				addsize = padsize & 0x0000FFFF;	// start on next 64KB border
 				padsize -= addsize;
+			}
+			if (padsize > 0) {
+				printf("mtd %s input file %s is too small (0x%08lX), adding 0x%08X random bytes\n", mtd->name, mtd->filename, mtd->filesize, padsize);
+
 				addsize += KERNEL_CODE_OFFSET + mtd->offset + mtd->filesize;	// get offset
 				lprintf(DEBUG, " padding offset 0x%08X length 0x%08X\n", addsize, padsize);
 
@@ -491,10 +502,12 @@ int create_bin_file(char *bin_filename) {
 		memcpy(&buffer[KERNEL_CODE_OFFSET + FW_VERSION_OFFSET + 2], rootfs_unknown, 2);
 		memcpy(&buffer[KERNEL_CODE_OFFSET + SIGN_OFFSET], sign, 8);	// eRcOmM
 
-		lprintf(DEBUG, "adding u-boot special data 1/2\n");	// ToDo: or after creating the checksum byte?
-//		memcpy(&buffer[KERNEL_CODE_OFFSET + SN_OFF], sn, 12);	// ToDo: find out what's this for?
-//		memcpy(&buffer[KERNEL_CODE_OFFSET + PIN_OFF], pin, 8);	// ToDo: find out what's this for?
-//		memcpy(&buffer[KERNEL_CODE_OFFSET + NODE_BASE_OFF], node, 25);	// ToDo: find out what's this for?
+		lprintf(DEBUG, "adding u-boot special data\n");
+//		memcpy(&buffer[KERNEL_CODE_OFFSET + SN_OFF], sn, 12);	// ToDo: currently zero, find out what's this for?
+//		memcpy(&buffer[KERNEL_CODE_OFFSET + PIN_OFF], pin, 8);	// ToDo: currently zero, find out what's this for?
+//		memcpy(&buffer[KERNEL_CODE_OFFSET + NODE_BASE_OFF], node, 25);	// ToDo: currently zero, find out what's this for?
+		memcpy(&buffer[KERNEL_CODE_OFFSET + BOOT_ADDR_BASE_OFF + PID_OFFSET], pid, 70);	// sErCoMm
+		memcpy(&buffer[KERNEL_CODE_OFFSET + BOOT_ADDR_BASE_OFF + PID_OFFSET + 57], fw_version, 2);
 
 		lprintf(DEBUG, "adding checksum byte\n");
 		csum = 0;
@@ -503,12 +516,8 @@ int create_bin_file(char *bin_filename) {
 		}
 		lprintf(DEBUG_LVL2, " checksum 0x%016lX (%li)\n", csum, csum);
 
-		buffer[KERNEL_CODE_OFFSET + NODE_BASE_OFF + 25] = ~(csum+108)+1;
+		buffer[KERNEL_CODE_OFFSET + NODE_BASE_OFF + 25] = ~csum + 1;
 		lprintf(DEBUG, " byte 0x%02X\n", buffer[KERNEL_CODE_OFFSET + NODE_BASE_OFF + 25]);
-
-		lprintf(DEBUG, "adding u-boot special data 2/2\n");
-		memcpy(&buffer[KERNEL_CODE_OFFSET + BOOT_ADDR_BASE_OFF + PID_OFFSET], pid, 70);	// sErCoMm
-		memcpy(&buffer[KERNEL_CODE_OFFSET + BOOT_ADDR_BASE_OFF + PID_OFFSET + 57], fw_version, 2);
 	}
 
 	// write bin file
@@ -847,7 +856,7 @@ int main(int argc, char *argv[]) {
   -b            -  Create only bin file, no img or zip file is created\n\
   -z            -  Have zip file, the img file will be directly created from it\n\
   -f <version>  -  Wanted firmware version to use with -z\n\
-                   Default firmware version is 0x2019 = 2.00.19.\n\
+                   Default firmware version is 0x2020 = 2.00.20.\n\
                    Note: version from parameter file will supersede this\n\
   -v            -  Increase debug verbosity level\n\n\
   Example:\n\