On 06/22/2015 02:25 PM, Joseph East wrote: > Patch didn't seem to mail properly, trying again. > > From: Joseph East <east...@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 <east...@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@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel