[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