Hi. I know you guys a probably very busy, but could you please confirm that this is the right list to submit such patches and format of this patch is correct - so I could fix it if it's not.
Thanks! 2015-12-03 2:16 GMT-05:00 Nikolay Martynov <[email protected]>: > This router is based on MT7621 SoC, no wifi, nand. > > Works: > * Boots. > * Ethernet. > * Switch. > * Button (reset). > * Flashing OpenWrt from stock firmware. > * Upgrading OpenWrt. > > Doesn't work: > * No GPIO leds. All leds are controlled by switch, > but stock firmware was able to control them. > * SoC has crypto engine but no open driver. > * SoC has nat acceleration, but no open driver. > * This router has 2MB spi flash soldered in but MT > nand/spi drivers do not support pin sharing, > so it is not accessable and disabled. Stock > firmware could read it and it was empty. > > Unknown status: PoE support. > > Router has serial pins populated. If looking at the top > of the router, then counting from Eth sockets pins go as: > 'GND, RX, TX, GND'. 3.3v, 57600. > > U-boot bootloader supports tftpboot, controlled from serial. > This router has two kernel partitions: 'live' and 'backup'. > They are swapped during flashing (on both stock and OpenWrt). > Active partition is controlled by a flag in factory partition. > U-boot has cusotm command to switch active kernel partition. > Kernel partitions are 'bare flash' 3MB. Stock bootloader has > no UBI support. Stock rootfs is UBIFS. > > Flashing procedure. > Stock firmware uses custom kernel patch to mount squashfs > from a file that is located on UBIFS volume. This makes wiping > out this volume from within stock firmware difficult. > Instead this patch builds image that is flashable by stock firmware > and contains initrams image (with minimal set of packages > to fit into kernel partition). Once this is flashed one can reboot > into initramfs OpenWrt and use sysupgrade to flash OpenWrt including > rootfs into nand. > Note: factory image is only built if initramfs image is enabled. > > v2: Fix building all mt7621 targets along with ubnt-erx. > v3: Undo change to MT7621 nand partitions, make nand detection > less likely to affect other nands. > v4: Update as per Piotr Dymacz comments. > v5: Fix upgrading code to actually upgrade kernel. > > Signed-off-by: Nikolay Martynov <[email protected]> > --- > package/system/procd/files/nand.sh | 4 + > .../linux/ramips/base-files/etc/board.d/02_network | 1 + > target/linux/ramips/base-files/lib/ramips.sh | 5 +- > .../ramips/base-files/lib/upgrade/platform.sh | 24 +++++ > target/linux/ramips/base-files/lib/upgrade/ubnt.sh | 71 +++++++++++++ > target/linux/ramips/dts/MT7621.dts | 22 ++++ > target/linux/ramips/dts/UBNT-ERX.dts | 117 > +++++++++++++++++++++ > target/linux/ramips/dts/mt7621.dtsi | 20 ---- > target/linux/ramips/image/Makefile | 61 ++++++++++- > target/linux/ramips/mt7621/profiles/ubnt.mk | 17 +++ > .../patches-3.18/0901-spansion_nand_id_fix.patch | 43 ++++++++ > 11 files changed, 363 insertions(+), 22 deletions(-) > create mode 100644 target/linux/ramips/base-files/lib/upgrade/ubnt.sh > create mode 100644 target/linux/ramips/dts/UBNT-ERX.dts > create mode 100644 target/linux/ramips/mt7621/profiles/ubnt.mk > create mode 100644 > target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch > > diff --git a/package/system/procd/files/nand.sh > b/package/system/procd/files/nand.sh > index 0c179cb..67867da 100644 > --- a/package/system/procd/files/nand.sh > +++ b/package/system/procd/files/nand.sh > @@ -275,6 +275,10 @@ nand_upgrade_tar() { > nand_do_upgrade_stage2() { > local file_type=$(identify $1) > > + if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then > + platform_nand_pre_upgrade "$1" > + fi > + > [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs" > > case "$file_type" in > diff --git a/target/linux/ramips/base-files/etc/board.d/02_network > b/target/linux/ramips/base-files/etc/board.d/02_network > index 7e51229..de81553 100755 > --- a/target/linux/ramips/base-files/etc/board.d/02_network > +++ b/target/linux/ramips/base-files/etc/board.d/02_network > @@ -122,6 +122,7 @@ ramips_setup_interfaces() > f5d8235-v2|\ > hg255d|\ > rt-n14u|\ > + ubnt-erx|\ > ur-326n4g|\ > wrtnode|\ > wt3020|\ > diff --git a/target/linux/ramips/base-files/lib/ramips.sh > b/target/linux/ramips/base-files/lib/ramips.sh > index 92e13c0..ba23939 100755 > --- a/target/linux/ramips/base-files/lib/ramips.sh > +++ b/target/linux/ramips/base-files/lib/ramips.sh > @@ -349,6 +349,9 @@ ramips_board_detect() { > *"TEW-692GR") > name="tew-692gr" > ;; > + *"UBNT-ERX") > + name="ubnt-erx" > + ;; > *"UR-326N4G") > name="ur-326n4g" > ;; > @@ -396,7 +399,7 @@ ramips_board_detect() { > ;; > *"WizFi630A") > name="wizfi630a" > - ;; > + ;; > *"WL-330N") > name="wl-330n" > ;; > diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh > b/target/linux/ramips/base-files/lib/upgrade/platform.sh > index 073593a..b0d624e 100755 > --- a/target/linux/ramips/base-files/lib/upgrade/platform.sh > +++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh > @@ -181,12 +181,36 @@ platform_check_image() { > } > return 0 > ;; > + ubnt-erx) > + nand_do_platform_check "$board" "$1" > + return $?; > + ;; > esac > > echo "Sysupgrade is not yet supported on $board." > return 1 > } > > +platform_nand_pre_upgrade() { > + local board=$(ramips_board_name) > + > + case "$board" in > + ubnt-erx) > + platform_upgrade_ubnt_erx "$ARGV" > + ;; > + esac > +} > + > +platform_pre_upgrade() { > + local board=$(ramips_board_name) > + > + case "$board" in > + ubnt-erx) > + nand_do_upgrade "$ARGV" > + ;; > + esac > +} > + > platform_do_upgrade() { > local board=$(ramips_board_name) > > diff --git a/target/linux/ramips/base-files/lib/upgrade/ubnt.sh > b/target/linux/ramips/base-files/lib/upgrade/ubnt.sh > new file mode 100644 > index 0000000..0dc602b > --- /dev/null > +++ b/target/linux/ramips/base-files/lib/upgrade/ubnt.sh > @@ -0,0 +1,71 @@ > +# > +# Copyright (C) 2015 OpenWrt.org > +# > + > +UBNT_ERX_KERNEL_INDEX_OFFSET=160 > + > +ubnt_get_target_kernel() { > + local factory_mtd=$1 > + local current_kernel_index=$(dd if=${factory_mtd} bs=1 count=1 > skip=$UBNT_ERX_KERNEL_INDEX_OFFSET 2>/dev/null|hexdump -e '/1 "%X "') > + > + if [ $current_kernel_index == "0" ]; then > + echo 'kernel2' > + elif [ $current_kernel_index == "1" ]; then > + echo 'kernel1' > + fi > +} > + > +ubnt_update_target_kernel() { > + local factory_mtd=$1 > + local kernel_part=$2 > + > + local new_kernel_index > + if [ $kernel_part == "kernel1" ]; then > + new_kernel_index="\x00" > + elif [ $kernel_part == "kernel2" ]; then > + new_kernel_index="\x01" > + else > + echo 'Unknown kernel image index' > + exit 1 > + fi > + > + if ! (echo -e $new_kernel_index | dd of=${factory_mtd} bs=1 count=1 > seek=$UBNT_ERX_KERNEL_INDEX_OFFSET); then > + echo 'Failed to update kernel bootup index' > + exit 1 > + fi > +} > + > +platform_upgrade_ubnt_erx() { > + local factory_mtd=$(find_mtd_part factory) > + if [ ! -n "$factory_mtd" ]; then > + echo "cannot find factory partition" > + exit 1 > + fi > + > + local kernel_part="$(ubnt_get_target_kernel ${factory_mtd})" > + if [ ! -n "$kernel_part" ]; then > + echo "cannot find factory partition" > + exit 1 > + fi > + > + CI_KERNPART=${kernel_part} > + > + #Remove volume possibly left over from stock firmware > + local ubidev="$( nand_find_ubi "$CI_UBIPART" )" > + if [ ! "$ubidev" ]; then > + local mtdnum="$( find_mtd_index "$CI_UBIPART" )" > + if [ ! "$mtdnum" ]; then > + echo "cannot find ubi mtd partition $CI_UBIPART" > + return 1 > + fi > + ubiattach -m "$mtdnum" > + sync > + ubidev="$( nand_find_ubi "$CI_UBIPART" )" > + fi > + if [ -n "$ubidev" ]; then > + local troot_ubivol="$( nand_find_volume $ubidev troot )" > + [ "$troot_ubivol" ] && ubirmvol /dev/$ubidev -N troot || true > + fi > + > + ubnt_update_target_kernel ${factory_mtd} ${kernel_part} > +} > diff --git a/target/linux/ramips/dts/MT7621.dts > b/target/linux/ramips/dts/MT7621.dts > index c90fc95..96f3416 100644 > --- a/target/linux/ramips/dts/MT7621.dts > +++ b/target/linux/ramips/dts/MT7621.dts > @@ -31,4 +31,26 @@ > }; > }; > }; > + > + nand@1e003000 { > + partition@0 { > + label = "uboot"; > + reg = <0x00000 0x80000>; /* 64 KB */ > + }; > + > + partition@80000 { > + label = "uboot_env"; > + reg = <0x80000 0x80000>; /* 64 KB */ > + }; > + > + partition@100000 { > + label = "factory"; > + reg = <0x100000 0x40000>; > + }; > + > + partition@140000 { > + label = "rootfs"; > + reg = <0x140000 0xec0000>; > + }; > + }; > }; > diff --git a/target/linux/ramips/dts/UBNT-ERX.dts > b/target/linux/ramips/dts/UBNT-ERX.dts > new file mode 100644 > index 0000000..4aa3be9 > --- /dev/null > +++ b/target/linux/ramips/dts/UBNT-ERX.dts > @@ -0,0 +1,117 @@ > +/dts-v1/; > + > +/include/ "mt7621.dtsi" > + > +/ { > + compatible = "mediatek,mt7621-eval-board", "mediatek,mt7621-soc"; > + model = "UBNT-ERX"; > + > + memory@0 { > + device_type = "memory"; > + reg = <0x0 0x10000000>; > + }; > + > + chosen { > + bootargs = "console=ttyS0,57600"; > + }; > + > + palmbus@1E000000 { > + spi@b00 { > + /* This board has 2Mb spi flash soldered in and > visible > + from manufacturer's firmware. > + But this SoC shares spi and nand pins, > + and current driver desn't handle this sharing well > */ > + status = "disabled"; > + m25p80@0 { > + #address-cells = <1>; > + #size-cells = <1>; > + compatible = "m25p80"; > + reg = <1>; > + linux,modalias = "m25p80"; > + spi-max-frequency = <10000000>; > + > + partition@0 { > + label = "spi"; > + reg = <0x0 0x200000>; > + read-only; > + }; > + }; > + }; > + }; > + > + nand@1e003000 { > + compatible = "mtk,mt7621-nand"; > + bank-width = <2>; > + reg = <0x1e003000 0x800 > + 0x1e003800 0x800>; > + #address-cells = <1>; > + #size-cells = <1>; > + > + partition@0 { > + label = "u-boot"; > + reg = <0x0 0x80000>; > + read-only; > + }; > + > + partition@80000 { > + label = "u-boot-env"; > + reg = <0x80000 0x60000>; > + read-only; > + }; > + > + factory: partition@e0000 { > + label = "factory"; > + reg = <0xe0000 0x60000>; > + }; > + > + partition@140000 { > + label = "kernel1"; > + reg = <0x140000 0x300000>; > + }; > + > + partition@440000 { > + label = "kernel2"; > + reg = <0x440000 0x300000>; > + }; > + > + partition@740000 { > + label = "ubi"; > + reg = <0x740000 0xf7c0000>; > + }; > + > + }; > + > + ethernet@1e100000 { > + mtd-mac-address = <&factory 0x22>; > + }; > + > + pinctrl { > + state_default: pinctrl0 { > + gpio { > + ralink,group = "uart2", "uart3", "i2c", > "pcie", "rgmii2", "jtag"; > + ralink,function = "gpio"; > + }; > + }; > + }; > + > + sdhci@1E130000 { > + status = "disabled"; > + }; > + > + pcie@1e140000 { > + status = "disabled"; > + }; > + > + gpio-keys-polled { > + compatible = "gpio-keys-polled"; > + #address-cells = <1>; > + #size-cells = <0>; > + poll-interval = <20>; > + > + reset { > + label = "reset"; > + gpios = <&gpio0 12 1>; > + linux,code = <0x198>; > + }; > + }; > +}; > diff --git a/target/linux/ramips/dts/mt7621.dtsi > b/target/linux/ramips/dts/mt7621.dtsi > index fd2e100..c29a040 100644 > --- a/target/linux/ramips/dts/mt7621.dtsi > +++ b/target/linux/ramips/dts/mt7621.dtsi > @@ -241,26 +241,6 @@ > 0x1e003800 0x800>; > #address-cells = <1>; > #size-cells = <1>; > - > - partition@0 { > - label = "uboot"; > - reg = <0x00000 0x80000>; /* 64 KB */ > - }; > - > - partition@80000 { > - label = "uboot_env"; > - reg = <0x80000 0x80000>; /* 64 KB */ > - }; > - > - partition@100000 { > - label = "factory"; > - reg = <0x100000 0x40000>; > - }; > - > - partition@140000 { > - label = "rootfs"; > - reg = <0x140000 0xec0000>; > - }; > }; > > ethernet@1e100000 { > diff --git a/target/linux/ramips/image/Makefile > b/target/linux/ramips/image/Makefile > index 00a2923..6230688 100644 > --- a/target/linux/ramips/image/Makefile > +++ b/target/linux/ramips/image/Makefile > @@ -69,6 +69,51 @@ define Build/relocate-kernel > mv [email protected] $@ > endef > > +define Build/ubnt-erx-factory-compat > + echo '21001:6' > [email protected] > + $(TAR) -cf $@ --transform='s/^.*/compat/' [email protected] > + $(RM) [email protected] > +endef > + > +define Build/ubnt-erx-factory-kernel > + if [ -e $(BIN_DIR)/$(KERNEL_INITRAMFS_IMAGE) ]; then \ > + $(TAR) -rf $@ --transform='s/^.*/vmlinux.tmp/' > $(BIN_DIR)/$(KERNEL_INITRAMFS_IMAGE); \ > + \ > + md5sum --binary $(BIN_DIR)/$(KERNEL_INITRAMFS_IMAGE) | awk > '{print $$1}'> [email protected]; \ > + $(TAR) -rf $@ --transform='s/^.*/vmlinux.tmp.md5/' [email protected]; \ > + $(RM) [email protected]; \ > + fi > +endef > + > +define Build/ubnt-erx-factory-rootfs > + echo "dummy" > [email protected] > + $(TAR) -rf $@ --transform='s/^.*/squashfs.tmp/' [email protected] > + > + md5sum --binary [email protected] | awk '{print $$1}'> [email protected] > + $(TAR) -rf $@ --transform='s/^.*/squashfs.tmp.md5/' [email protected] > + $(RM) [email protected] > + $(RM) [email protected] > +endef > + > +define Build/ubnt-erx-factory-version > + echo '$(BOARD) $(VERSION_CODE) $(VERSION_NUMBER)' > [email protected] > + $(TAR) -rf $@ --transform='s/^.*/version.tmp/' [email protected] > + $(RM) [email protected] > +endef > + > +#We need kernel+initrams fit into kernel partition > +define Build/ubnt-erx-factory-check-size > + @[ $$(($(subst k,* 1024,$(subst m, * 1024k,$(1))))) -ge "$$($(TAR) > -xf $@ vmlinux.tmp -O | wc -c)" ] || { \ > + echo "WARNING: Initramfs kernel for image $@ is too big > (kernel size: $$($(TAR) -xf $@ vmlinux.tmp -O | wc -c), max size $(1))" >&2; \ > + $(RM) -f $@; \ > + } > + > + @[ "$$($(TAR) -xf $@ vmlinux.tmp -O | wc -c)" -gt 0 ] || { \ > + echo "WARNING: Kernel for image $@ not found" >&2; \ > + $(RM) -f $@; \ > + } > +endef > + > define MkCombineduImage > $(call PatchKernelLzma,$(2),$(3)) > if [ `stat -c%s "$(KDIR)/vmlinux-$(2).bin.lzma"` -gt `expr $(4) - 64` > ]; then \ > @@ -954,7 +999,7 @@ endif > # > > ifeq ($(SUBTARGET),mt7621) > - TARGET_DEVICES += mt7621 wsr-600 wsr-1166 dir-860l-b1 firewrt pbr-m1 > re6500 sap-g3200u3 zbt-wg2626 wf-2881 > + TARGET_DEVICES += mt7621 wsr-600 wsr-1166 dir-860l-b1 firewrt pbr-m1 > re6500 sap-g3200u3 zbt-wg2626 wf-2881 ubnt-erx > endif > > define Device/mt7621 > @@ -1018,6 +1063,20 @@ define Device/wf-2881 > IMAGE/sysupgrade.bin := append-kernel | pad-to $$(KERNEL_SIZE) | > append-ubi | check-size $$$$(IMAGE_SIZE) > endef > > +define Device/ubnt-erx > + DTS := UBNT-ERX > + FILESYSTEMS := squashfs > + KERNEL_SIZE := 3145728 > + KERNEL := $(KERNEL_DTB) | uImage lzma > + IMAGES := sysupgrade.tar factory-initramfs.tar > + IMAGE/factory-initramfs.tar := ubnt-erx-factory-compat | \ > + ubnt-erx-factory-kernel | \ > + ubnt-erx-factory-rootfs | \ > + ubnt-erx-factory-version | \ > + ubnt-erx-factory-check-size $$$$(KERNEL_SIZE) > + IMAGE/sysupgrade.tar := sysupgrade-nand > +endef > + > # > # MT7628 Profiles > # > diff --git a/target/linux/ramips/mt7621/profiles/ubnt.mk > b/target/linux/ramips/mt7621/profiles/ubnt.mk > new file mode 100644 > index 0000000..67efa60 > --- /dev/null > +++ b/target/linux/ramips/mt7621/profiles/ubnt.mk > @@ -0,0 +1,17 @@ > +# > +# Copyright (C) 2015 OpenWrt.org > +# > +# This is free software, licensed under the GNU General Public License v2. > +# See /LICENSE for more information. > +# > + > +define Profile/UBNT-ERX > + NAME:=Ubiquiti EdgeRouter X > + FEATURES += nand > + PACKAGES:=-kmod-mt76 -wpad-mini > +endef > + > +define Profile/UBNT-ERX/Description > + Package set compatible with the Ubiquiti EdgeRouter X > +endef > +$(eval $(call Profile,UBNT-ERX)) > diff --git a/target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch > b/target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch > new file mode 100644 > index 0000000..a327674 > --- /dev/null > +++ b/target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch > @@ -0,0 +1,43 @@ > +From 8b61a1a33e41456ebeafa0ebe7ec0fccf859861e Mon Sep 17 00:00:00 2001 > +From: Nikolay Martynov <[email protected]> > +Date: Wed, 25 Nov 2015 20:43:46 -0500 > +Subject: [PATCH] mtd: nand: Fix Spansion sparearea size detection > + > +According to datasheet S34ML02G2 and S34ML04G2 have > +larger sparea area size than was detected. > + > +Signed-off-by: Nikolay Martynov <[email protected]> > +--- > + drivers/mtd/nand/nand_base.c | 9 +++++++++ > + 1 file changed, 9 insertions(+) > + > +--- a/drivers/mtd/nand/nand_base.c > ++++ b/drivers/mtd/nand/nand_base.c > +@@ -3399,6 +3399,7 @@ static void nand_decode_ext_id(struct mt > + /* > + * Field definitions are in the following datasheets: > + * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32) > ++ * Spansion S34ML02G2 (p.33) > + * New Samsung (6 byte ID): Samsung K9GAG08U0F (p.44) > + * Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22) > + * > +@@ -3496,6 +3497,19 @@ static void nand_decode_ext_id(struct mt > + *busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0; > + > + /* > ++ * Spansion S34ML0[24]G2 have oobsize twice as large > ++ * as S34ML01G2 encoded in the same bit. We > ++ * differinciate them by their ID length > ++ */ > ++ if (id_data[0] == NAND_MFR_AMD > ++ && (id_data[1] == 0xda > ++ || id_data[1] == 0xdc > ++ || id_data[1] == 0xca > ++ || id_data[1] == 0xcc)) { > ++ mtd->oobsize *= 2; > ++ } > ++ > ++ /* > + * Toshiba 24nm raw SLC (i.e., not BENAND) have 32B OOB per > + * 512B page. For Toshiba SLC, we decode the 5th/6th byte as > + * follows: > -- > 2.6.3 > -- Martynov Nikolay. Email: [email protected] _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
