ramips: add support for I-O DATA WN-DX1167R

I-O DATA WN-DX1167R is a 2.4/5 GHz band 11ac rotuer, based on MediaTek
MT7621A.

Specification:

- SoC		: MediaTek MT7621A
- RAM		: DDR3 128 MiB
- Flash		: NAND 128 MiB
- WLAN		: MediaTek MT7615D (2.4/5 GHz, 2T2R)
- Ethernet	: 5x 10/100/1000 Mbps
  - Switch	: MediaTek MT7621A (MT7530)
- LEDs/Input	: 2x/3x (2x buttons, 1x slide-switch)
- UART		: through-hole on PCB
  - J5: Vcc, TX, RX, NC, GND
  - 57600 bps

Flash instruction using initramfs image:

1. Boot WN-DX1167R normally
2. Access to "http://192.168.0.1/" and open firmware update page
("ファームウェア")
3. Select the OpenWrt initramfs image and click update ("更新")
button to perform firmware update
4. On the initramfs image, perform sysupgrade with squashfs-sysupgrade
image
5. Wait ~120 seconds to complete flashing

Notes:

- configuration in DeviceTree of DBDC (Dual-Band-Dual-Concurrent) mode
for MT7615D chip is not supported in mt76 driver
- last 0x80000 (512 KiB) in NAND flash is not used on stock firmware
- stock firmware requires "customized uImage header" by MSTC
(MitraStar Technology Corp.), but U-Boot doesn't
  - uImage magic (0x0 - 0x3) : 0x434F4D43 (COMC)
  - header crc32 (0x4 - 0x7) : with data length and data crc32
  - image name (0x20 - 0x37) : model ID and firmware versions
  - data length (0x38 - 0x3b): kernel + rootfs
  - data crc32 (0x3c - 0x3f) : kernel + rootfs

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
Reviewed-by: Sungbo Eo <mans0n@gorani.run>
master
INAGAKI Hiroshi 2019-04-09 14:48:31 +09:00 committed by Adrian Schmutzler
parent be4d53bf69
commit 3c0e2aa63e
6 changed files with 268 additions and 4 deletions

View File

@ -0,0 +1,31 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/dts-v1/;
#include "mt7621_iodata_wn-xx-xr.dtsi"
/ {
compatible = "iodata,wn-dx1167r", "mediatek,mt7621-soc";
model = "I-O DATA WN-DX1167R";
};
&partitions {
partition@6b00000 {
label = "idmkey";
reg = <0x6b00000 0x0100000>;
read-only;
};
partition@6c00000 {
label = "Backup";
reg = <0x6c00000 0x1380000>;
read-only;
};
};
&pcie1 {
wifi@0,0 {
compatible = "mediatek,mt76";
reg = <0x0000 0 0 0 0>;
mediatek,mtd-eeprom = <&factory 0x0>;
};
};

View File

@ -0,0 +1,140 @@
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
#include "mt7621.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
/ {
aliases {
led-boot = &led_power;
led-failsafe = &led_power;
led-running = &led_power;
led-upgrade = &led_power;
};
chosen {
bootargs = "console=ttyS0,57600";
};
leds {
compatible = "gpio-leds";
wps {
label = "iodata:green:wps";
gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
};
led_power: power {
label = "iodata:green:power";
gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
};
};
keys {
compatible = "gpio-keys";
reset {
label = "reset";
gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RESTART>;
};
repeater {
label = "repeater";
gpios = <&gpio0 7 GPIO_ACTIVE_LOW>;
linux,code = <BTN_0>;
linux,input-type = <EV_SW>;
};
wps {
label = "wps";
gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
linux,code = <KEY_WPS_BUTTON>;
};
};
};
&nand {
status = "okay";
partitions: partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "u-boot";
reg = <0x0 0x0100000>;
read-only;
};
partition@100000 {
label = "u-boot-env";
reg = <0x0100000 0x0100000>;
read-only;
};
factory: partition@200000 {
label = "factory";
reg = <0x0200000 0x0100000>;
};
partition@300000 {
label = "SecondBoot";
reg = <0x0300000 0x0100000>;
read-only;
};
partition@400000 {
label = "kernel";
reg = <0x0400000 0x0400000>;
};
partition@800000 {
label = "ubi";
reg = <0x0800000 0x2e00000>;
};
partition@3600000 {
label = "Config";
reg = <0x3600000 0x0100000>;
read-only;
};
partition@3700000 {
label = "firmware_2";
reg = <0x3700000 0x3200000>;
};
partition@6900000 {
label = "Config_2";
reg = <0x6900000 0x0100000>;
read-only;
};
partition@6a00000 {
label = "persist";
reg = <0x6a00000 0x0100000>;
};
};
};
&ethernet {
mtd-mac-address = <&factory 0xe000>;
};
&pcie {
status = "okay";
};
&state_default {
gpio {
ralink,group = "uart2", "uart3", "wdt";
ralink,function = "gpio";
};
};
&xhci {
status = "disabled";
};

View File

@ -65,6 +65,22 @@ define Build/iodata-factory
fi fi
endef endef
define Build/iodata-mstc-header
( \
data_size_crc="$$(dd if=$@ ibs=64 skip=1 2>/dev/null | \
gzip -c | tail -c 8 | od -An -tx8 --endian little | tr -d ' \n')"; \
echo -ne "$$(echo $$data_size_crc | sed 's/../\\x&/g')" | \
dd of=$@ bs=8 count=1 seek=7 conv=notrunc 2>/dev/null; \
)
dd if=/dev/zero of=$@ bs=4 count=1 seek=1 conv=notrunc 2>/dev/null
( \
header_crc="$$(dd if=$@ bs=64 count=1 2>/dev/null | \
gzip -c | tail -c 8 | od -An -N4 -tx4 --endian little | tr -d ' \n')"; \
echo -ne "$$(echo $$header_crc | sed 's/../\\x&/g')" | \
dd of=$@ bs=4 count=1 seek=1 conv=notrunc 2>/dev/null; \
)
endef
define Build/ubnt-erx-factory-image define Build/ubnt-erx-factory-image
if [ -e $(KDIR)/tmp/$(KERNEL_INITRAMFS_IMAGE) -a "$$(stat -c%s $@)" -lt "$(KERNEL_SIZE)" ]; then \ if [ -e $(KDIR)/tmp/$(KERNEL_INITRAMFS_IMAGE) -a "$$(stat -c%s $@)" -lt "$(KERNEL_SIZE)" ]; then \
echo '21001:6' > $(1).compat; \ echo '21001:6' > $(1).compat; \
@ -336,6 +352,22 @@ define Device/iodata_wn-ax1167gr
endef endef
TARGET_DEVICES += iodata_wn-ax1167gr TARGET_DEVICES += iodata_wn-ax1167gr
define Device/iodata_wn-dx1167r
BLOCKSIZE := 128k
PAGESIZE := 2048
UBINIZE_OPTS := -E 5
UIMAGE_MAGIC := 0x434f4d43
KERNEL_SIZE := 4096k
IMAGE_SIZE := 51200k
DEVICE_VENDOR := I-O DATA
DEVICE_MODEL := WN-DX1167R
KERNEL_INITRAMFS := $(KERNEL_DTB) | custom-initramfs-uimage 3.10(XIK.1)b10 | \
iodata-mstc-header
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
DEVICE_PACKAGES := kmod-mt7615e wpad-basic
endef
TARGET_DEVICES += iodata_wn-dx1167r
define Device/iodata_wn-gx300gr define Device/iodata_wn-gx300gr
IMAGE_SIZE := 7616k IMAGE_SIZE := 7616k
DEVICE_VENDOR := I-O DATA DEVICE_VENDOR := I-O DATA

View File

@ -72,6 +72,7 @@ ramips_setup_interfaces()
elecom,wrc-1900gst|\ elecom,wrc-1900gst|\
elecom,wrc-2533gst|\ elecom,wrc-2533gst|\
iodata,wn-ax1167gr|\ iodata,wn-ax1167gr|\
iodata,wn-dx1167r|\
iodata,wn-gx300gr|\ iodata,wn-gx300gr|\
iodata,wnpr2600g|\ iodata,wnpr2600g|\
iptime,a8004t) iptime,a8004t)
@ -222,6 +223,11 @@ ramips_setup_macs()
xiaoyu,xy-c5) xiaoyu,xy-c5)
wan_mac=$(macaddr_add "$(mtd_get_mac_binary factory 0x4)" 1) wan_mac=$(macaddr_add "$(mtd_get_mac_binary factory 0x4)" 1)
;; ;;
iodata,wn-dx1167r|\
xiaomi,mir3g-v2)
wan_mac=$(mtd_get_mac_binary factory 0xe006)
label_mac=$wan_mac
;;
iodata,wnpr2600g) iodata,wnpr2600g)
wan_mac=$(mtd_get_mac_ascii u-boot-env wanaddr) wan_mac=$(mtd_get_mac_ascii u-boot-env wanaddr)
label_mac=$wan_mac label_mac=$wan_mac
@ -266,10 +272,6 @@ ramips_setup_macs()
lan_mac=$(mtd_get_mac_binary factory 0xe006) lan_mac=$(mtd_get_mac_binary factory 0xe006)
label_mac=$lan_mac label_mac=$lan_mac
;; ;;
xiaomi,mir3g-v2)
wan_mac=$(mtd_get_mac_binary factory 0xe006)
label_mac=$wan_mac
;;
zbtlink,zbt-we1326) zbtlink,zbt-we1326)
wan_mac=$(mtd_get_mac_binary factory 0xe006) wan_mac=$(mtd_get_mac_binary factory 0xe006)
label_mac=$(mtd_get_mac_binary factory 0x4) label_mac=$(mtd_get_mac_binary factory 0x4)

View File

@ -0,0 +1,55 @@
#
# Copyright (C) 2019 OpenWrt.org
#
. /lib/functions.sh
iodata_mstc_prepare_fail() {
echo "failed to check and prepare the environment, rebooting..."
umount -a
reboot -f
}
# I-O DATA devices manufactured by MSTC (MitraStar Technology Corp.)
# have two important flags:
# - bootnum: switch between two os images
# use 1st image in OpenWrt
# - debugflag: enable/disable debug
# users can interrupt Z-Loader for recovering the device if enabled
iodata_mstc_upgrade_prepare() {
local persist_mtd="$(find_mtd_part persist)"
local factory_mtd="$(find_mtd_part factory)"
if [ -z "$persist_mtd" -o -z "$factory_mtd" ]; then
echo 'cannot find mtd partition(s), "factory" or "persist"'
iodata_mstc_prepare_fail
fi
local bootnum=$(hexdump -s 4 -n 1 -e '"%x"' ${persist_mtd})
local debugflag=$(hexdump -s 65141 -n 1 -e '"%x"' ${factory_mtd})
if [ "$bootnum" != "1" -a "$bootnum" != "2" ]; then
echo "failed to get bootnum, please check the value at 0x4 in ${persist_mtd}"
iodata_mstc_prepare_fail
fi
if [ "$debugflag" != "0" -a "$debugflag" != "1" ]; then
echo "failed to get debugflag, please check the value at 0xFE75 in ${factory_mtd}"
iodata_mstc_prepare_fail
fi
echo "current: bootnum => ${bootnum}, debugflag => ${debugflag}"
if [ "$bootnum" = "2" ]; then
if ! (echo -ne "\x01" | dd bs=1 count=1 seek=4 conv=notrunc of=${persist_mtd} 2>/dev/null); then
echo "failed to set bootnum"
iodata_mstc_prepare_fail
fi
echo "### switch to 1st os-image on next boot ###"
fi
if [ "$debugflag" = "0" ]; then
if ! (echo -ne "\x01" | dd bs=1 count=1 seek=65141 conv=notrunc of=${factory_mtd} 2>/dev/null); then
echo "failed to set debugflag"
iodata_mstc_prepare_fail
fi
echo "### enable debug ###"
fi
}

View File

@ -53,6 +53,10 @@ platform_do_upgrade() {
xiaomi,mir3p) xiaomi,mir3p)
nand_do_upgrade "$1" nand_do_upgrade "$1"
;; ;;
iodata,wn-dx1167r)
iodata_mstc_upgrade_prepare
nand_do_upgrade "$1"
;;
ubiquiti,edgerouterx|\ ubiquiti,edgerouterx|\
ubiquiti,edgerouterx-sfp) ubiquiti,edgerouterx-sfp)
platform_upgrade_ubnt_erx "$1" platform_upgrade_ubnt_erx "$1"