[OpenWrt-Devel] [PATCH] [brcm47xx] Belkin F7DXXXX (BCM47XX based) support for Linux 3.18

Hauke Mehrtens hauke at hauke-m.de
Mon Jun 22 12:01:48 EDT 2015



On 06/22/2015 02:25 PM, Joseph East wrote:
> Patch didn't seem to mail properly, trying again.
> 
> From: Joseph East <eastyjr at gmail.com>
> 
> Patchset based on previous work by Cody Schafer and Luc Forcier to allow
> TRX images with Belkin IDs to be compiled as part of the BRCM47XX
> platform for Linux 3.18.
> 
> The patchset has been tested with a Belkin F7D4401 (PlayMax N600), other
> devices part of the previous patch are untested but have been included,
> however the Belkin QA TRX signature has been removed.
> 
> The otrx tool has been modified to accept a -m argument which allows
> comparison against a user defined TRX signature, this works in tandem
> with the changes in platform.sh to verify the different Belkin TRXs for
> supported models.
> 
> Signed-off-by: Joseph East <eastyjr at gmail.com>
> ---
>  package/system/mtd/src/trx.c                       | 28 ++++++++++++--
>  package/utils/otrx/src/otrx.c                      | 31 +++++++++++++++-
>  .../brcm47xx/base-files/lib/upgrade/platform.sh    | 39
> ++++++++++++++++++++
>  target/linux/brcm47xx/image/Makefile               | 19 ++++++++++
>  .../brcm47xx/image/lzma-loader/src/decompress.c    | 25 ++++++++++++-
>  ...nclude-Belkin-F7D4XXX-F7D3XXX-TRX-for-mtd.patch | 43
> ++++++++++++++++++++++
>  6 files changed, 177 insertions(+), 8 deletions(-)
>  create mode 100644
> target/linux/brcm47xx/patches-3.18/032-11-MIPS-BCM47XX-Include-Belkin-F7D4XXX-F7D3XXX-TRX-for-mtd.patch
> 
> 
> diff --git a/package/system/mtd/src/trx.c b/package/system/mtd/src/trx.c
> index 245ee76..8e4980c 100644
> --- a/package/system/mtd/src/trx.c
> +++ b/package/system/mtd/src/trx.c
> @@ -35,7 +35,12 @@
>  #include "mtd.h"
>  #include "crc32.h"
> 
> -#define TRX_MAGIC       0x30524448      /* "HDR0" */
> +#define TRX_MAGIC               0x30524448      /* "HDR0" */
> +#define BELKIN_F7D3301_MAGIC    0x20100322
> +#define BELKIN_F7D3302_MAGIC    0x20090928
> +#define BELKIN_F7D4302_MAGIC    0x20101006
> +#define BELKIN_F7D4401_MAGIC    0x00018517
> +
>  struct trx_header {
>      uint32_t magic;        /* "HDR0" */
>      uint32_t len;        /* Length of file including header */
> @@ -55,6 +60,21 @@ struct trx_header {
>  ssize_t pread(int fd, void *buf, size_t count, off_t offset);
>  ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
> 
> +static bool is_trx_magic(uint32_t magic)
> +{
> +    magic = STORE32_LE(magic);
> +    switch (magic) {
> +    case TRX_MAGIC:
> +    case BELKIN_F7D3301_MAGIC:
> +    case BELKIN_F7D3302_MAGIC:
> +    case BELKIN_F7D4302_MAGIC:
> +    case BELKIN_F7D4401_MAGIC:
> +        return true;
> +    default:
> +        return false;
> +    }
> +}
> +
>  int
>  trx_fixup(int fd, const char *name)
>  {
> @@ -83,7 +103,7 @@ trx_fixup(int fd, const char *name)
>      }
> 
>      trx = ptr;
> -    if (trx->magic != TRX_MAGIC) {
> +    if (!is_trx_magic(trx->magic)) {
>          fprintf(stderr, "TRX header not found\n");
>          goto err;
>      }
> @@ -118,7 +138,7 @@ trx_check(int imagefd, const char *mtd, char *buf,
> int *len)
>          return 0;
>      }
> 
> -    if (trx->magic != TRX_MAGIC || trx->len < sizeof(struct trx_header)) {
> +    if (!is_trx_magic(trx->magic) || trx->len < sizeof(struct
> trx_header)) {

This is probably an unwanted line break.

Please use "git format-patch" to create the patch and "git send-email"
to send them. these two tools make sure it does not get corrupted.

>          if (quiet < 2) {
>              fprintf(stderr, "Bad trx header\n");
>              fprintf(stderr, "This is not the correct file format;
> refusing to flash.\n"
> @@ -184,7 +204,7 @@ mtd_fixtrx(const char *mtd, size_t offset)
>      }
> 
>      trx = (struct trx_header *) (buf + offset);
> -    if (trx->magic != STORE32_LE(0x30524448)) {
> +    if (!is_trx_magic(trx->magic)) {
>          fprintf(stderr, "No trx magic found\n");
>          exit(1);
>      }
> diff --git a/package/utils/otrx/src/otrx.c b/package/utils/otrx/src/otrx.c
> index 101a310..36ebe62 100644
> --- a/package/utils/otrx/src/otrx.c
> +++ b/package/utils/otrx/src/otrx.c
> @@ -47,6 +47,8 @@ struct trx_header {
> 
>  char *trx_path;
>  size_t trx_offset = 0;
> +uint8_t use_trx_override = 0;
> +uint32_t trx_override = 0;
>  char *partition[TRX_MAX_PARTS] = {};
> 
>  static inline size_t otrx_min(size_t x, size_t y) {
> @@ -143,11 +145,35 @@ uint32_t otrx_crc32(uint8_t *buf, size_t len) {
>  static void otrx_check_parse_options(int argc, char **argv) {
>      int c;
> 
> -    while ((c = getopt(argc, argv, "o:")) != -1) {
> +    while ((c = getopt(argc, argv, "m:o:")) != -1) {
>          switch (c) {
>          case 'o':
>              trx_offset = atoi(optarg);
>              break;
> +        case 'm':
> +            trx_override = strtol(optarg, NULL, 16);
> +            use_trx_override = 1;
> +            break;
> +        }
> +    }
> +}
> +
> +static int is_trx_magic(uint32_t magic) {
> +        magic = cpu_to_le32(magic);
> +    if(use_trx_override) {
> +            if(magic == trx_override) {
> +                    return 1;
> +            }
> +            else {
> +                    return 0;
> +            }
> +    }
> +    else {
> +        if(magic == TRX_MAGIC) {
> +            return 1;
> +        }
> +        else {
> +            return 0;
>          

Make this function return bool and then you can simplify it like this:
if(use_trx_override)
	return magic == trx_override;
else
	return magic == TRX_MAGIC;

>      }
>  }
> @@ -186,7 +212,7 @@ static int otrx_check(int argc, char **argv) {
>          goto err_close;
>      }
> 
> -    if (le32_to_cpu(hdr.magic) != TRX_MAGIC) {
> +    if (!is_trx_magic(le32_to_cpu(hdr.magic))) {
>          fprintf(stderr, "Invalid TRX magic: 0x%08x\n",
> le32_to_cpu(hdr.magic));
>          err =  -EINVAL;
>          goto err_close;
> @@ -548,6 +574,7 @@ static void usage() {
>      printf("Checking TRX file:\n");
>      printf("\totrx check <file> [options]\tcheck if file is a valid
> TRX\n");
>      printf("\t-o offset\t\t\toffset of TRX data in file (default: 0)\n");
> +    printf("\t-m signature\t\t\tCompare against input TRX signature\n");
>      printf("\n");
>      printf("Creating new TRX file:\n");
>      printf("\totrx create <file> [options] [partitions]\n");
> diff --git a/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
> b/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
> index cbadefb..9f12715 100644
> --- a/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/brcm47xx/base-files/lib/upgrade/platform.sh
> @@ -51,6 +51,10 @@ platform_expected_image() {
>          "Linksys WRT310N V2")    echo "cybertan 310N"; return;;
>          "Linksys WRT610N V1")    echo "cybertan 610N"; return;;
>          "Linksys WRT610N V2")    echo "cybertan 610N"; return;;
> +        "Belkin F7D3301")    echo "22031020"; return;;
> +        "Belkin F7D3302")    echo "28090920"; return;;
> +        "Belkin F7D4302")    echo "06101020"; return;;
> +        "Belkin F7D4401")       echo "17850100"; return;;
>      esac
>  }
> 
> @@ -67,6 +71,22 @@ brcm47xx_identify() {
>              echo "chk"
>              return
>              ;;
> +        "17850100")
> +            echo "beltrx"
> +                        return
> +                        ;;
> +                "06101020")

the spacing is wrong.

> +            echo "beltrx"
> +                        return
> +                        ;;
> +                "28090920")
> +            echo "beltrx"
> +                        return
> +                        ;;
> +                "22031020")
> +                        echo "beltrx"
> +                        return
> +                        ;;
>      esac
> 
>      magic=$(get_magic_long_at "$1" 14)
> @@ -124,6 +144,25 @@ platform_check_image() {
>                  error=1
>              fi
>          ;;
> +        "beltrx")
> +            local dev_board_id=$(platform_expected_image)
> +            local machine=$(platform_machine)
> +            local magic=$(get_magic_long "$1")
> +            echo "Found TRX image with Belkin Magic TRX"
> +            echo "Anticipating a $machine, checking..."
> +            [ -n "$dev_board_id" -a "$magic" != "$dev_board_id" ] &&
> +            {
> +                echo "Firmware does not match machine $machine, aborting"
> +                echo "Though it still may be an otherwise valid TRX"
> +                error=1
> +            }
> +
> +            local
> be_magic=${magic:6:2}${magic:4:2}${magic:2:2}${magic:0:2}
> +            if ! otrx check "$1" -m "$be_magic"; then
> +                echo "Not a valid TRX image"
> +                error=1
> +            fi
> +        ;;
>          *)
>              echo "Invalid image type. Please use only .trx files"
>              error=1
> diff --git a/target/linux/brcm47xx/image/Makefile
> b/target/linux/brcm47xx/image/Makefile
> index 6768820..45ed330 100644
> --- a/target/linux/brcm47xx/image/Makefile
> +++ b/target/linux/brcm47xx/image/Makefile
> @@ -34,6 +34,17 @@ endif
>      $(call prepare_generic_squashfs,$(KDIR)/fs_mark)
>  endef
> 
> +# Function for multiple Belkin Trx
> +# 1: trx input
> +# 2: bin output
> +# 3: 4 magic bytes
> +define Image/Build/Belkin_
> +    echo -ne $(3) > $(2).head
> +    dd if=$(1) of=/dev/stdout bs=4 skip=1 > $(2).tail
> +    cat $(2).head $(2).tail > $(2)
> +    rm -f $(2).head $(2).tail
> +endef
> +
>  define Image/Build/wgt634u
>      dd if=$(KDIR)/loader.elf
> of=$(BIN_DIR)/$(IMG_PREFIX)-wgt634u-$(2).bin bs=131072 conv=sync
>      cat $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx >>
> $(BIN_DIR)/$(IMG_PREFIX)-wgt634u-$(2).bin
> @@ -71,6 +82,10 @@ define Image/Build/Edi
>      $(STAGING_DIR_HOST)/bin/trx2edips $(BIN_DIR)/$(IMG_PREFIX)-$(1).trx
> $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3).bin
>  endef
> 
> +define Image/Build/Belkin
> +    $(call
> Image/Build/Belkin_,$(BIN_DIR)/$(IMG_PREFIX)-$(1).trx,$(BIN_DIR)/openwrt-$(2)-$(patsubst
> jffs2-%,jffs2,$(1)).bin,$(3))
> +endef
> +
>  define Image/Build/Huawei
>      dd if=/dev/zero of=$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3)-gz.bin bs=92
> count=1
>      echo -ne 'HDR0\x08\x00\x00\x00' >>
> $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(3)-gz.bin
> @@ -362,6 +377,10 @@ define Image/Build
>          -f $(KDIR)/vmlinux.gz \
>          $(call trxalign/$(1),$(1))
>      $(call Image/Build/$(SUBTARGET)/$(1),$(1))
> +    $(call Image/Build/Belkin,$(1),f7d3301,'\x22\x03\x10\x20')
> +    $(call Image/Build/Belkin,$(1),f7d3302,'\x28\x09\x09\x20')
> +    $(call Image/Build/Belkin,$(1),f7d4302,'\x06\x10\x10\x20')
> +    $(call Image/Build/Belkin,$(1),f7d4401,'\x17\x85\x01\x00')
>  #    $(call
> Image/Build/Chk,$(1),wgr614_v9,U12H094T00_NETGEAR,2,$(patsubst
> jffs2-%,jffs2,$(1)))
>  #    $(call
> Image/Build/Chk,$(1),wndr3400_vcna,U12H155T01_NETGEAR,2,$(patsubst
> jffs2-%,jffs2,$(1)))
>  #    $(call
> Image/Build/Chk,$(1),wnr3500U,U12H136T00_NETGEAR,2,$(patsubst
> jffs2-%,jffs2,$(1)))
> diff --git a/target/linux/brcm47xx/image/lzma-loader/src/decompress.c
> b/target/linux/brcm47xx/image/lzma-loader/src/decompress.c
> index 05681b1..076bff0 100644
> --- a/target/linux/brcm47xx/image/lzma-loader/src/decompress.c
> +++ b/target/linux/brcm47xx/image/lzma-loader/src/decompress.c
> @@ -89,6 +89,10 @@ struct trx_header {
> 
>  #define EDIMAX_PS_HEADER_MAGIC    0x36315350 /*  "PS16"  */
>  #define EDIMAX_PS_HEADER_LEN    0xc /* 12 bytes long for edimax header */
> +#define BELKIN_F7D3301_MAGIC    0x20100322 /* Belkin TRX */
> +#define BELKIN_F7D3302_MAGIC    0x20090928
> +#define BELKIN_F7D4302_MAGIC    0x20101006
> +#define BELKIN_F7D4401_MAGIC    0x00018517
> 
>  /* beyound the image end, size not known in advance */
>  extern unsigned char workspace[];
> @@ -121,6 +125,24 @@ static __inline__ unsigned char get_byte(void)
>      return read_byte(0, &buffer, &fake), *buffer;
>  }
> 
> +static int has_trx_magic(unsigned char *data)
> +{
> +    UInt32 magic = ((struct trx_header *)data)->magic;
> +
> +    switch (magic) {
> +    case TRX_MAGIC:
> +    case EDIMAX_PS_HEADER_MAGIC:
> +    case BELKIN_F7D3301_MAGIC:
> +    case BELKIN_F7D3302_MAGIC:
> +    case BELKIN_F7D4302_MAGIC:
> +    case BELKIN_F7D4401_MAGIC:
> +        return 1;
> +    default:
> +        return 0;
> +    }
> +}
> +
> +
>  /* should be the first function */
>  void entry(unsigned long icache_size, unsigned long icache_lsize,
>      unsigned long dcache_size, unsigned long dcache_lsize,
> @@ -138,8 +160,7 @@ void entry(unsigned long icache_size, unsigned long
> icache_lsize,
> 
>      /* look for trx header, 32-bit data access */
>      for (data = ((unsigned char *) KSEG1ADDR(BCM4710_FLASH));
> -        ((struct trx_header *)data)->magic != TRX_MAGIC &&
> -        ((struct trx_header *)data)->magic != EDIMAX_PS_HEADER_MAGIC;
> +         !has_trx_magic(data);
>           data += 65536);
> 
>      if (((struct trx_header *)data)->magic == EDIMAX_PS_HEADER_MAGIC)
> diff --git
> a/target/linux/brcm47xx/patches-3.18/032-11-MIPS-BCM47XX-Include-Belkin-F7D4XXX-F7D3XXX-TRX-for-mtd.patch
> b/target/linux/brcm47xx/patches-3.18/032-11-MIPS-BCM47XX-Include-Belkin-F7D4XXX-F7D3XXX-TRX-for-mtd.patch
> 
> new file mode 100644
> index 0000000..8e2c1df
> --- /dev/null
> +++
> b/target/linux/brcm47xx/patches-3.18/032-11-MIPS-BCM47XX-Include-Belkin-F7D4XXX-F7D3XXX-TRX-for-mtd.patch
> 
> @@ -0,0 +1,43 @@
> +--- a/drivers/mtd/bcm47xxpart.c
> ++++ b/drivers/mtd/bcm47xxpart.c
> +@@ -45,6 +45,10 @@
> + #define TRX_MAGIC            0x30524448
> + #define SHSQ_MAGIC            0x71736873    /* shsq (weird ZTE H218N
> endianness) */
> + #define UBI_EC_MAGIC            0x23494255    /* UBI# */
> ++#define BELKIN_F7D3301_MAGIC        0x20100322    /* Belkin TRX */
> ++#define BELKIN_F7D3302_MAGIC        0x20090928
> ++#define BELKIN_F7D4302_MAGIC        0x20101006
> ++#define BELKIN_F7D4401_MAGIC        0x00018517
> +
> + struct trx_header {
> +     uint32_t magic;
> +@@ -55,6 +59,20 @@ struct trx_header {
> +     uint32_t offset[3];
> + } __packed;
> +
> ++static bool is_trx_magic(uint32_t magic)
> ++{
> ++    switch (magic) {
> ++    case TRX_MAGIC:
> ++    case BELKIN_F7D3301_MAGIC:
> ++    case BELKIN_F7D3302_MAGIC:
> ++    case BELKIN_F7D4302_MAGIC:
> ++    case BELKIN_F7D4401_MAGIC:
> ++        return true;
> ++    default:
> ++        return false;
> ++    }
> ++}
> ++
> + static void bcm47xxpart_add_part(struct mtd_partition *part, const
> char *name,
> +                  u64 offset, uint32_t mask_flags)
> + {
> +@@ -189,7 +207,7 @@ static int bcm47xxpart_parse(struct mtd_
> +         }
> +
> +         /* TRX */
> +-        if (buf[0x000 / 4] == TRX_MAGIC) {
> ++        if (is_trx_magic(buf[0x000 / 4])) {
> +             if (BCM47XXPART_MAX_PARTS - curr_part < 4) {
> +                 pr_warn("Not enough partitions left to register trx,
> scanning stopped!\n");
> +                 break;
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list