summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorDavide Fioravanti <pantanastyle@gmail.com>2019-05-20 04:43:17 +0200
committerChristian Lamparter <chunkeey@gmail.com>2019-05-31 10:30:03 +0200
commitd95dff162ae110e82674cc1511ef851be231b232 (patch)
treea69f55840155d34d4dd8827645e5f1794f02e66e /tools
parent1bbd524e8411c669d874ca48e0bb56e1e8acc121 (diff)
downloadopenwrt-d95dff162ae110e82674cc1511ef851be231b232.tar.gz
openwrt-d95dff162ae110e82674cc1511ef851be231b232.tar.bz2
openwrt-d95dff162ae110e82674cc1511ef851be231b232.zip
firmware-utils: jcgimage: add support for 4MiB+ images
The first version of this script allowed just 4Mb factory images. With this patch is possible to set the maximum size of the payload. For an 8Mb flash, the corresponding maxsize is: 8 * 1024 * 1024 - 5 * 64 * 1024 = 8388608 - 327680 = 8060928 If the -m argument is not set, the default maximum size will be used for backward compatibility. Signed-off-by: Davide Fioravanti <pantanastyle@gmail.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/firmware-utils/src/jcgimage.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/tools/firmware-utils/src/jcgimage.c b/tools/firmware-utils/src/jcgimage.c
index 06fbb9f03e..81d9f79f52 100644
--- a/tools/firmware-utils/src/jcgimage.c
+++ b/tools/firmware-utils/src/jcgimage.c
@@ -2,6 +2,7 @@
* jcgimage - Create a JCG firmware image
*
* Copyright (C) 2015 Reinhard Max <reinhard@m4x.de>
+ * Copyright (C) 2019 Davide Fioravanti <pantanastyle@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -45,6 +46,11 @@
* requiring JTAG to revive the board. To prevent such bricking from
* happening, this tool refuses to build such overlong images.
*
+ * Using -m is possible to set the maximum size of the payload.
+ * Otherwise the default MAXSIZE will be used.
+ * For an 8Mb flash, the corresponding maxsize is:
+ * 8 * 1024 * 1024 - 5 * 64 * 1024 = 8388608 - 327680 = 8060928
+ *
* Two more conditions have to be met for a JCG image to be accepted
* as a valid update by the web interface of the stock firware:
*
@@ -92,6 +98,7 @@
#include <sys/mman.h>
#include <arpa/inet.h>
#include <assert.h>
+#include <inttypes.h>
/*
* JCG Firmware image header
@@ -292,8 +299,8 @@ craftcrc(uint32_t dcrc, uint8_t *buf, size_t len)
void
usage() {
fprintf(stderr, "Usage:\n"
- "jcgimage -o outfile -u uImage [-v version]\n"
- "jcgimage -o outfile -k kernel -f rootfs [-v version]\n");
+ "jcgimage -o outfile -u uImage [-m maxsize] [-v version]\n"
+ "jcgimage -o outfile -k kernel -f rootfs [-m maxsize] [-v version]\n");
exit(1);
}
@@ -314,6 +321,8 @@ main(int argc, char **argv)
char *file1 = NULL;
char *file2 = NULL;
char *version = NULL;
+ size_t maxsize = MAXSIZE;
+ char *endptr;
int mode = MODE_UNKNOWN;
int fdo, fd1, fd2;
size_t size1, size2, sizeu, sizeo, off1, off2;
@@ -324,7 +333,7 @@ main(int argc, char **argv)
assert(sizeof(struct uimage_header) == 64);
set_source_date_epoch();
- while ((c = getopt(argc, argv, "o:k:f:u:v:h")) != -1) {
+ while ((c = getopt(argc, argv, "o:k:f:u:v:m:h")) != -1) {
switch (c) {
case 'o':
imagefile = optarg;
@@ -350,6 +359,11 @@ main(int argc, char **argv)
mode = MODE_UIMAGE;
file1 = optarg;
break;
+ case 'm':
+ if (optarg != NULL)
+ maxsize = strtoimax(optarg, &endptr, 10);
+
+ break;
case 'v':
version = optarg;
break;
@@ -385,8 +399,8 @@ main(int argc, char **argv)
sizeo = sizeof(*jh) + sizeu;
}
- if (sizeo > MAXSIZE)
- errx(1, "payload too large: %zd > %zd\n", sizeo, MAXSIZE);
+ if (sizeo > maxsize)
+ errx(1, "payload too large: %zd > %zd\n", sizeo, maxsize);
fdo = open(imagefile, O_RDWR | O_CREAT | O_TRUNC, 00644);