aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware-utils/src/mktplinkfw-lib.c
diff options
context:
space:
mode:
authorThibaut VARÈNE <hacks@slashdirt.org>2017-10-03 20:19:52 +0200
committerMathias Kresin <dev@kresin.me>2017-10-06 08:28:41 +0200
commit9e768b9aac2367057fc8d6b7d07ea456b5433b9d (patch)
tree20014481111a09f6799e5f2a00ed916854146686 /tools/firmware-utils/src/mktplinkfw-lib.c
parent10324fcb3992cdf40db651ae6ad0b3cda670d81b (diff)
downloadupstream-9e768b9aac2367057fc8d6b7d07ea456b5433b9d.tar.gz
upstream-9e768b9aac2367057fc8d6b7d07ea456b5433b9d.tar.bz2
upstream-9e768b9aac2367057fc8d6b7d07ea456b5433b9d.zip
tools/firmware-utils: mktplinkfw move build_fw() to lib
This patch moves build_fw() to mktplinkfw-lib.c The versions of mktplinkfw.c and mktplinkfw2.c had slight differences in code flow, the version from mktplinkfw.c has been preferred. While it's expected that this change will not affect mktplinkfw2, all use cases could not be tested and so this particular change is committed separately. Signed-off-by: Thibaut VARÈNE <hacks@slashdirt.org>
Diffstat (limited to 'tools/firmware-utils/src/mktplinkfw-lib.c')
-rw-r--r--tools/firmware-utils/src/mktplinkfw-lib.c78
1 files changed, 77 insertions, 1 deletions
diff --git a/tools/firmware-utils/src/mktplinkfw-lib.c b/tools/firmware-utils/src/mktplinkfw-lib.c
index 838b1792ff..18da13dd04 100644
--- a/tools/firmware-utils/src/mktplinkfw-lib.c
+++ b/tools/firmware-utils/src/mktplinkfw-lib.c
@@ -30,9 +30,22 @@
#include "mktplinkfw-lib.h"
#include "md5.h"
+extern char *ofname;
extern char *progname;
+extern uint32_t kernel_len;
+extern struct file_info kernel_info;
+extern struct file_info rootfs_info;
+extern struct flash_layout *layout;
+extern uint32_t rootfs_ofs;
+extern uint32_t rootfs_align;
+extern int combined;
+extern int strip_padding;
+extern int add_jffs2_eof;
+
static unsigned char jffs2_eof_mark[4] = {0xde, 0xad, 0xc0, 0xde};
+void fill_header(char *buf, int len);
+
struct flash_layout *find_layout(struct flash_layout *layouts, const char *id)
{
struct flash_layout *ret;
@@ -102,7 +115,7 @@ out:
return ret;
}
-int pad_jffs2(char *buf, int currlen, int maxlen)
+static int pad_jffs2(char *buf, int currlen, int maxlen)
{
int len;
uint32_t pad_mask;
@@ -193,3 +206,66 @@ inline void inspect_fw_pmd5sum(const char *label, const uint8_t *val, const char
printf(" %02x", val[i]);
printf(" %s\n", text);
}
+
+// header_size = sizeof(struct fw_header)
+int build_fw(size_t header_size)
+{
+ int buflen;
+ char *buf;
+ char *p;
+ int ret = EXIT_FAILURE;
+ int writelen = 0;
+
+ writelen = header_size + kernel_len;
+
+ if (combined)
+ buflen = writelen;
+ else
+ buflen = layout->fw_max_len;
+
+ buf = malloc(buflen);
+ if (!buf) {
+ ERR("no memory for buffer\n");
+ goto out;
+ }
+
+ memset(buf, 0xff, buflen);
+ p = buf + header_size;
+ ret = read_to_buf(&kernel_info, p);
+ if (ret)
+ goto out_free_buf;
+
+ if (!combined) {
+ if (rootfs_align)
+ p = buf + writelen;
+ else
+ p = buf + rootfs_ofs;
+
+ ret = read_to_buf(&rootfs_info, p);
+ if (ret)
+ goto out_free_buf;
+
+ if (rootfs_align)
+ writelen += rootfs_info.file_size;
+ else
+ writelen = rootfs_ofs + rootfs_info.file_size;
+
+ if (add_jffs2_eof)
+ writelen = pad_jffs2(buf, writelen, layout->fw_max_len);
+ }
+
+ if (!strip_padding)
+ writelen = buflen;
+
+ fill_header(buf, writelen);
+ ret = write_fw(ofname, buf, writelen);
+ if (ret)
+ goto out_free_buf;
+
+ ret = EXIT_SUCCESS;
+
+out_free_buf:
+ free(buf);
+out:
+ return ret;
+}