it is still in my staging tree. i will drop it and await your V3 John
On 10/12/2016 14:34, Naoki FUKAUMI wrote: > hi > > I noticed buffalo-tag fix and mkwsrimg can be used for some other > Buffalo WxR products too. > (probably. I just checked some of official update images for now) > > if this patch is not merged yet, I want to make v3 patch ASAP to do > some more cosmetic changes (e.g. s/WSR/WxR/). > > if it's too late, I'll make new patch later. > > Regards, > > On Thu, Dec 8, 2016 at 12:01 AM, FUKAUMI Naoki <nao...@gmail.com> wrote: >> factory image has to have custom trx magic, and trx file will be written >> in the middle of the mtd3 partition (bootpartition=1 on u-boot). >> therefore, sysupgrade.bin cannot be installed directly from stock Web UI. >> >> with this patch, factory.bin will be built with initramfs image which >> can be installed from stock Web UI, and can be used to install >> sysupgrade.bin. >> >> install procedure: >> 1. install initramfs image (factory.bin) from stock Web UI >> 2. ssh root@192.168.1.1 >> 3. run "mtd erase firmware" (erase factory.bin in mtd3) >> 4. install sysupgrade.bin by sysupgrade >> >> Signed-off-by: FUKAUMI Naoki <nao...@gmail.com> >> --- >> Changes in v2: >> - cosmetic cleanup in mt7621.mk >> >> target/linux/ramips/image/mt7621.mk | 33 ++++++++++++ >> tools/firmware-utils/Makefile | 1 + >> tools/firmware-utils/src/buffalo-tag.c | 29 ++++++++--- >> tools/firmware-utils/src/mkwsrimg.c | 94 >> ++++++++++++++++++++++++++++++++++ >> tools/firmware-utils/src/trx.c | 13 ++++- >> 5 files changed, 161 insertions(+), 9 deletions(-) >> create mode 100644 tools/firmware-utils/src/mkwsrimg.c >> >> diff --git a/target/linux/ramips/image/mt7621.mk >> b/target/linux/ramips/image/mt7621.mk >> index 6d85511..d44b70b 100644 >> --- a/target/linux/ramips/image/mt7621.mk >> +++ b/target/linux/ramips/image/mt7621.mk >> @@ -192,8 +192,41 @@ define Device/wndr3700v5 >> endef >> TARGET_DEVICES += wndr3700v5 >> >> +define Build/wsr-factory-image >> + $(STAGING_DIR_HOST)/bin/trx \ >> + -M $(2) \ >> + -m $(IMAGE_SIZE) \ >> + -f $(1) \ >> + -o $(1).trx >> + $(STAGING_DIR_HOST)/bin/buffalo-enc \ >> + -l -m 'start' \ >> + -p $(3) -v '0.00' \ >> + -i $(1).trx -o $(1).trx.enc >> + $(STAGING_DIR_HOST)/bin/buffalo-tag \ >> + -a MTK \ >> + -b $(3) -p $(3) \ >> + -l JP -r JP -r JP \ >> + -s \ >> + -v '0.00' -m '0.00' \ >> + -w 1 \ >> + -W $(1).trx.enc -o $(1).tag >> + $(STAGING_DIR_HOST)/bin/buffalo-enc \ >> + -l -m 'start' \ >> + -p '' -v '' \ >> + -i $(1).tag -o $(1).tag.enc >> + $(STAGING_DIR_HOST)/bin/mkwsrimg \ >> + $(1).tag.enc $(1).trx.enc \ >> + $(call imgname,initramfs,$(4))-factory.bin >> +endef >> + >> +define Build/wsr-1166-factory-images >> + $(call Build/wsr-factory-image,$@,0x746f435c,WSR-1166DHP,wsr-1166dhp) >> + $(call >> Build/wsr-factory-image,$@,0x1fc384dd,WSR-1166DHP2,wsr-1166dhp2) >> +endef >> + >> define Device/wsr-1166 >> DTS := WSR-1166 >> + KERNEL_INITRAMFS := $$(KERNEL) | wsr-1166-factory-images >> IMAGE/sysupgrade.bin := trx | pad-rootfs | append-metadata >> IMAGE_SIZE := $(ralink_default_fw_size_16M) >> DEVICE_TITLE := Buffalo WSR-1166 >> diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile >> index 456b7a3..e7654ec 100644 >> --- a/tools/firmware-utils/Makefile >> +++ b/tools/firmware-utils/Makefile >> @@ -79,6 +79,7 @@ define Host/Compile >> $(call cc,jcgimage, -lz -Wall) >> $(call cc,mkbuffaloimg, -Wall) >> $(call cc,zyimage, -Wall) >> + $(call cc,mkwsrimg buffalo-lib, -Wall) >> endef >> >> define Host/Install >> diff --git a/tools/firmware-utils/src/buffalo-tag.c >> b/tools/firmware-utils/src/buffalo-tag.c >> index b5db72e..f255bb9 100644 >> --- a/tools/firmware-utils/src/buffalo-tag.c >> +++ b/tools/firmware-utils/src/buffalo-tag.c >> @@ -7,6 +7,7 @@ >> * >> */ >> >> +#include <stddef.h> >> #include <stdio.h> >> #include <stdlib.h> >> #include <stdint.h> >> @@ -48,6 +49,7 @@ static uint32_t base2; >> static char *region_code; >> static uint32_t region_mask; >> static int num_regions; >> +static int wsr; >> >> void usage(int status) >> { >> @@ -63,6 +65,7 @@ void usage(int status) >> " -d <base2>\n" >> " -f <flag> set flag to <flag>\n" >> " -i <file> read input from the file <file>\n" >> +" -W <file> read input from the file <file> for Buffalo WSR\n" >> " -l <language> set language to <language>\n" >> " -m <version> set minor version to <version>\n" >> " -o <file> write output to the file <file>\n" >> @@ -177,11 +180,17 @@ static void fixup_tag(unsigned char *buf, ssize_t >> buflen) >> memcpy(tag->region_code, region_code, 2); >> } >> >> - tag->len = htonl(buflen); >> - tag->data_len = htonl(fsize[0]); >> - tag->base1 = htonl(base1); >> - tag->base2 = htonl(base2); >> - tag->flag = flag; >> + if (wsr) { >> + tag->len = htonl(buflen + 200); >> + tag->base1 = htonl(buflen); >> + tag->base2 = htonl(0x01000000); >> + } else { >> + tag->len = htonl(buflen); >> + tag->data_len = htonl(fsize[0]); >> + tag->base1 = htonl(base1); >> + tag->base2 = htonl(base2); >> + tag->flag = flag; >> + } >> >> if (hwver) { >> memcpy(tag->hwv, "hwv", 3); >> @@ -270,7 +279,10 @@ static int tag_file(void) >> offset += fsize[i]; >> } >> >> - if (num_files == 1) >> + if (wsr) { >> + buflen = offsetof(struct buffalo_tag, data_len); >> + fixup_tag(buf, fsize[0]); >> + } else if (num_files == 1) >> fixup_tag(buf, buflen); >> else >> fixup_tag2(buf, buflen); >> @@ -299,7 +311,7 @@ int main(int argc, char *argv[]) >> while ( 1 ) { >> int c; >> >> - c = getopt(argc, argv, "a:b:c:d:f:hi:l:m:o:p:r:sv:w:"); >> + c = getopt(argc, argv, "a:b:c:d:f:hi:l:m:o:p:r:sv:w:W:"); >> if (c == -1) >> break; >> >> @@ -319,6 +331,9 @@ int main(int argc, char *argv[]) >> case 'f': >> flag = strtoul(optarg, NULL, 2); >> break; >> + case 'W': >> + wsr = 1; >> + /* FALLTHROUGH */ >> case 'i': >> err = process_ifname(optarg); >> if (err) >> diff --git a/tools/firmware-utils/src/mkwsrimg.c >> b/tools/firmware-utils/src/mkwsrimg.c >> new file mode 100644 >> index 0000000..48de2d4 >> --- /dev/null >> +++ b/tools/firmware-utils/src/mkwsrimg.c >> @@ -0,0 +1,94 @@ >> +/* >> + * Copyright (c) 2016 FUKAUMI Naoki <nao...@gmail.com> >> + * >> + * This program is free software; you can redistribute it and/or modify it >> + * under the terms of the GNU General Public License version 2 as published >> + * by the Free Software Foundation. >> + * >> + */ >> + >> +#include <sys/stat.h> >> +#include <err.h> >> +#include <fcntl.h> >> +#include <stdint.h> >> +#include <stdio.h> >> +#include <stdlib.h> >> +#include <string.h> >> +#include <unistd.h> >> + >> +#include "buffalo-lib.h" >> + >> +#define WSR_HEADER_SIZE 20 >> + >> +static char *progname; >> + >> +static void >> +usage(void) >> +{ >> + >> + fprintf(stderr, "usage: %s <tag> <trx> <out>\n", progname); >> + exit(EXIT_FAILURE); >> +} >> + >> +int >> +main(int argc, char *argv[]) >> +{ >> + struct stat tag_st, trx_st; >> + size_t size; >> + uint32_t crc; >> + int tag, trx, out; >> + uint8_t *buf; >> + >> + progname = argv[0]; >> + >> + if (argc != 4) >> + usage(); >> + >> + if ((tag = open(argv[1], O_RDONLY)) == -1) >> + err(EXIT_FAILURE, "%s", argv[1]); >> + >> + if (fstat(tag, &tag_st) == -1) >> + err(EXIT_FAILURE, "%s", argv[1]); >> + >> + if ((trx = open(argv[2], O_RDONLY)) == -1) >> + err(EXIT_FAILURE, "%s", argv[2]); >> + >> + if (fstat(trx, &trx_st) == -1) >> + err(EXIT_FAILURE, "%s", argv[2]); >> + >> + size = WSR_HEADER_SIZE + tag_st.st_size + trx_st.st_size; >> + >> + if ((buf = malloc(size)) == NULL) >> + err(EXIT_FAILURE, "malloc"); >> + >> + memset(buf, 0, WSR_HEADER_SIZE); >> + buf[0x0] = 0x62; >> + buf[0x1] = 0x67; >> + buf[0x2] = 0x6e; >> + buf[0xb] = 0xb1; >> + buf[0xc] = (size >> 24) & 0xff; >> + buf[0xd] = (size >> 16) & 0xff; >> + buf[0xe] = (size >> 8) & 0xff; >> + buf[0xf] = size & 0xff; >> + >> + read(tag, &buf[WSR_HEADER_SIZE], tag_st.st_size); >> + close(tag); >> + >> + read(trx, &buf[WSR_HEADER_SIZE + tag_st.st_size], trx_st.st_size); >> + close(trx); >> + >> + crc = buffalo_crc(buf, size); >> + buf[0x10] = (crc >> 24) & 0xff; >> + buf[0x11] = (crc >> 16) & 0xff; >> + buf[0x12] = (crc >> 8) & 0xff; >> + buf[0x13] = crc & 0xff; >> + >> + if ((out = open(argv[3], O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) >> + err(EXIT_FAILURE, "%s", argv[3]); >> + write(out, buf, size); >> + close(out); >> + >> + free(buf); >> + >> + return EXIT_SUCCESS; >> +} >> diff --git a/tools/firmware-utils/src/trx.c b/tools/firmware-utils/src/trx.c >> index aa1f5be..dc5bb67 100644 >> --- a/tools/firmware-utils/src/trx.c >> +++ b/tools/firmware-utils/src/trx.c >> @@ -100,7 +100,7 @@ int main(int argc, char **argv) >> int c, i, append = 0; >> size_t n; >> ssize_t n2; >> - uint32_t cur_len, fsmark=0; >> + uint32_t cur_len, fsmark=0, magic; >> unsigned long maxlen = TRX_MAX_LEN; >> struct trx_header *p; >> char trx_version = 1; >> @@ -121,7 +121,7 @@ int main(int argc, char **argv) >> in = NULL; >> i = 0; >> >> - while ((c = getopt(argc, argv, "-:2o:m:a:x:b:f:A:F:")) != -1) { >> + while ((c = getopt(argc, argv, "-:2o:m:a:x:b:f:A:F:M:")) != -1) { >> switch (c) { >> case '2': >> /* take care that nothing was written to buf >> so far */ >> @@ -243,6 +243,15 @@ int main(int argc, char **argv) >> } >> >> break; >> + case 'M': >> + errno = 0; >> + magic = strtoul(optarg, &e, 0); >> + if (errno || (e == optarg) || *e) { >> + fprintf(stderr, "illegal numeric >> string\n"); >> + usage(); >> + } >> + p->magic = STORE32_LE(magic); >> + break; >> default: >> usage(); >> } >> -- >> 2.7.4 >> > > _______________________________________________ > Lede-dev mailing list > Lede-dev@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/lede-dev > _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev