From e111b2d68b147d2e67b9d8da055d0b7f8fd53c37 Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
Date: Wed, 8 Jul 2009 08:17:26 +0000
Subject: [tools] firmware-utils/mktplinkfw: add option for combined images

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@16742 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 tools/firmware-utils/src/mktplinkfw.c | 62 ++++++++++++++++++++++-------------
 1 file changed, 40 insertions(+), 22 deletions(-)

(limited to 'tools/firmware-utils/src')

diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c
index c7bf9b1945..d3e9374c22 100644
--- a/tools/firmware-utils/src/mktplinkfw.c
+++ b/tools/firmware-utils/src/mktplinkfw.c
@@ -90,6 +90,7 @@ static struct board_info *board;
 static struct file_info kernel_info;
 static struct file_info rootfs_info;
 static struct file_info boot_info;
+static int combined;
 
 char md5salt_normal[MD5SUM_LEN] = {
 	0xdc, 0xd7, 0x3a, 0xa5, 0xc3, 0x95, 0x98, 0xfb,
@@ -177,6 +178,7 @@ static void usage(int status)
 "\n"
 "Options:\n"
 "  -B <board>      create image for the board specified with <board>\n"
+"  -c              use combined kernel image\n"
 "  -k <file>       read kernel image from the file <file>\n"
 "  -r <file>       read rootfs image from the file <file>\n"
 "  -o <file>       write output to the file <file>\n"
@@ -264,23 +266,32 @@ static int check_options(void)
 	if (ret)
 		return ret;
 
-	if (kernel_info.file_size > board->rootfs_ofs - sizeof(struct fw_header)) {
-		ERR("kernel image is too big");
-		return -1;
-	}
+	if (combined) {
+		if (kernel_info.file_size >
+		    board->fw_max_len - sizeof(struct fw_header)) {
+			ERR("kernel image is too big");
+			return -1;
+		}
+	} else {
+		if (kernel_info.file_size >
+		    board->rootfs_ofs - sizeof(struct fw_header)) {
+			ERR("kernel image is too big");
+			return -1;
+		}
+		if (rootfs_info.file_name == NULL) {
+			ERR("no rootfs image specified");
+			return -1;
+		}
 
-	if (rootfs_info.file_name == NULL) {
-		ERR("no rootfs image specified");
-		return -1;
-	}
+		ret = get_file_stat(&rootfs_info);
+		if (ret)
+			return ret;
 
-	ret = get_file_stat(&rootfs_info);
-	if (ret)
-		return ret;
-
-	if (rootfs_info.file_size > (board->fw_max_len - board->rootfs_ofs)) {
-		ERR("rootfs image is too big");
-		return -1;
+		if (rootfs_info.file_size >
+                    (board->fw_max_len - board->rootfs_ofs)) {
+			ERR("rootfs image is too big");
+			return -1;
+		}
 	}
 
 	if (ofname == NULL) {
@@ -313,8 +324,10 @@ static void fill_header(char *buf, int len)
 	hdr->fw_length = HOST_TO_BE32(board->fw_max_len);
 	hdr->kernel_ofs = HOST_TO_BE32(sizeof(struct fw_header));
 	hdr->kernel_len = HOST_TO_BE32(kernel_info.file_size);
-	hdr->rootfs_ofs = HOST_TO_BE32(board->rootfs_ofs);
-	hdr->rootfs_len = HOST_TO_BE32(rootfs_info.file_size);
+	if (!combined) {
+		hdr->rootfs_ofs = HOST_TO_BE32(board->rootfs_ofs);
+		hdr->rootfs_len = HOST_TO_BE32(rootfs_info.file_size);
+	}
 
 	get_md5(buf, len, hdr->md5sum1);
 }
@@ -372,10 +385,12 @@ static int build_fw(void)
 	if (ret)
 		goto out_free_buf;
 
-	p = buf + board->rootfs_ofs;
-	ret = read_to_buf(&rootfs_info, p);
-	if (ret)
-		goto out_free_buf;
+	if (!combined) {
+		p = buf + board->rootfs_ofs;
+		ret = read_to_buf(&rootfs_info, p);
+		if (ret)
+			goto out_free_buf;
+	}
 
 	fill_header(buf, buflen);
 
@@ -403,7 +418,7 @@ int main(int argc, char *argv[])
 	while ( 1 ) {
 		int c;
 
-		c = getopt(argc, argv, "B:V:N:k:r:o:v:h:");
+		c = getopt(argc, argv, "B:V:N:ck:r:o:v:h:");
 		if (c == -1)
 			break;
 
@@ -417,6 +432,9 @@ int main(int argc, char *argv[])
 		case 'N':
 			vendor = optarg;
 			break;
+		case 'c':
+			combined++;
+			break;
 		case 'k':
 			kernel_info.file_name = optarg;
 			break;
-- 
cgit v1.2.3