[LEDE-DEV] [PATCH v2] ramips: build factory images for Buffalo WSR-1166DHP/WSR-1166DHP2

Naoki FUKAUMI naobsd at gmail.com
Sat Dec 10 16:19:09 PST 2016


hi

On Sat, Dec 10, 2016 at 11:16 PM, John Crispin <john at phrozen.org> wrote:
> it is still in my staging tree. i will drop it and await your V3

I see, I'll prepare v3!

Regards,

P.S.
it seems "WxR" is too generic for Buffalo routers, I'll use "DHP" as keyword.
(there is few exception, but it should be better than "WxR")

> 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 <naobsd at 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 at 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 <naobsd at 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 <naobsd at 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 at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/lede-dev
>>



More information about the Lede-dev mailing list