From: INAGAKI Hiroshi Date: Sun, 27 Apr 2025 11:46:02 +0000 (+0900) Subject: mediatek: add support for ELECOM WRC-X3000GS3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ccaa4933b187d465a20a8256d375b15f4390c481;p=thirdparty%2Fopenwrt.git mediatek: add support for ELECOM WRC-X3000GS3 ELECOM WRC-X3000GS3 is a 2.4/5 GHz band 11ax (Wi-Fi 6) router, based on MT7981B. Specification: - SoC : MediaTek MT7981B - RAM : DDR3 512 MiB (Winbond W634GU6QB-09) - Flash : SPI-NOR 128 MiB (Winbond W25N01GVZEIG) - WLAN : 2.4/5 GHz 2T2R (MediaTek MT7981B (SoC)) - Ethernet : 5x 10/100/1000 Mbps - wan (phy) : MediaTek MT7981B (SoC) - lan (switch) : MediaTek MT7531A - LEDs/Keys (GPIO): 8x/4x - UART : through-hole on PCB (J500) - assignment : 3.3V, TX, RX, NC, GND from tri-angle marking - settings : 115200n8 - Power : 12 VDC, 1 A (Max. 12.8 W) Flash instruction using factory.bin image: 1. Boot WRC-X3000GS3 in router mode normally 2. Access to the WebUI ("http://192.168.2.1/") on the device and open the firmware update page ("ファームウェア更新") 3. Select the OpenWrt factory.bin image and click apply ("適用") button 4. Wait ~120 seconds to complete flashing Switching to the stock firmware: 1. Load the elecom.sh script . /lib/upgrade/elecom.sh 2. Check the current index of firmware partition mstc_rw_bootnum 3. Set the bootnum to opposite value between 1 and 2 mstc_rw_bootnum example: - step2 returned "1": mstc_rw_bootnum 2 - step2 returned "2": mstc_rw_bootnum 1 4. Reboot Notes: - ELECOM sells (or sold) multiple models as AX3000 class with different hardwares: - WRC-X3000GS(N) : Lantiq(Intel) GRX350/GRX550 - WRC-X3000GS(T)2: Qualcomm IPQ5018 - WRC-X3000GS3 : MediaTek MT7981B MAC Addresses: LAN : 38:97:A4:xx:xx:40 (Factory, 0x2A(hex)/Ubootenv,"ethaddr"(text)) WAN : 38:97:A4:xx:xx:43 (Factory, 0x24(hex)) 2.4GHz: 38:97:A4:xx:xx:41 (Factory, 0x4 (hex)) 5GHz : 38:97:A4:xx:xx:42 (Factory, 0xA (hex)) Signed-off-by: INAGAKI Hiroshi Link: https://github.com/openwrt/openwrt/pull/18976 Signed-off-by: Hauke Mehrtens --- diff --git a/target/linux/mediatek/dts/mt7981b-elecom-wrc-x3000gs3.dts b/target/linux/mediatek/dts/mt7981b-elecom-wrc-x3000gs3.dts new file mode 100644 index 00000000000..195f05c6fab --- /dev/null +++ b/target/linux/mediatek/dts/mt7981b-elecom-wrc-x3000gs3.dts @@ -0,0 +1,382 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +/dts-v1/; + +#include "mt7981b.dtsi" + +/ { + model = "ELECOM WRC-X3000GS3"; + compatible = "elecom,wrc-x3000gs3", "mediatek,mt7981b"; + + aliases { + label-mac-device = &gmac1; + led-boot = &led_power_green; + led-failsafe = &led_power_red; + led-running = &led_power_green; + led-upgrade = &led_power_green; + serial0 = &uart0; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + keys { + compatible = "gpio-keys"; + + button-wps { + label = "wps"; + gpios = <&pio 0 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + button-reset { + label = "reset"; + gpios = <&pio 1 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + switch-ap { + label = "ap"; + gpios = <&pio 6 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + switch-router { + label = "router"; + gpios = <&pio 7 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + leds { + compatible = "gpio-leds"; + + led-0 { + function = LED_FUNCTION_WAN; + color = ; + gpios = <&pio 8 GPIO_ACTIVE_LOW>; + }; + + led_power_red: led-1 { + function = LED_FUNCTION_POWER; + color = ; + gpios = <&pio 9 GPIO_ACTIVE_LOW>; + }; + + led_power_green: led-2 { + function = LED_FUNCTION_POWER; + color = ; + gpios = <&pio 10 GPIO_ACTIVE_LOW>; + }; + + led-3 { + function = LED_FUNCTION_WLAN_2GHZ; + color = ; + gpios = <&pio 11 GPIO_ACTIVE_LOW>; + }; + + led-4 { + function = LED_FUNCTION_WLAN_2GHZ; + color = ; + gpios = <&pio 12 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0tpt"; + }; + + led-5 { + function = LED_FUNCTION_WPS; + color = ; + gpios = <&pio 13 GPIO_ACTIVE_LOW>; + }; + + led-6 { + function = LED_FUNCTION_WLAN_5GHZ; + color = ; + gpios = <&pio 34 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1tpt"; + }; + + led-7 { + function = LED_FUNCTION_WLAN_5GHZ; + color = ; + gpios = <&pio 35 GPIO_ACTIVE_LOW>; + }; + }; +}; + +ð { + pinctrl-0 = <&mdio_pins>; + pinctrl-names = "default"; + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-connection-type = "2500base-x"; + + nvmem-cells = <&macaddr_factory_2a>; + nvmem-cell-names = "mac-address"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + gmac1: mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; + label = "wan"; + phy-connection-type = "gmii"; + phy-handle = <&int_gbe_phy>; + + nvmem-cells = <&macaddr_factory_24>; + nvmem-cell-names = "mac-address"; + }; +}; + +&mdio_bus { + switch@1f { + compatible = "mediatek,mt7531"; + reg = <31>; + reset-gpios = <&pio 39 GPIO_ACTIVE_HIGH>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@1 { + reg = <1>; + label = "lan4"; + }; + + port@2 { + reg = <2>; + label = "lan3"; + }; + + port@3 { + reg = <3>; + label = "lan2"; + }; + + port@4 { + reg = <4>; + label = "lan1"; + }; + + port@6 { + reg = <6>; + ethernet = <&gmac0>; + phy-connection-type = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + }; + }; +}; + +&pio { + spi0_flash_pins: spi0-pins { + mux { + function = "spi"; + groups = "spi0", "spi0_wp_hold"; + }; + + conf-pu { + pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP"; + drive-strength = ; + bias-pull-up = ; + }; + + conf-pd { + pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO"; + drive-strength = ; + bias-pull-down = ; + }; + }; +}; + +&spi0 { + pinctrl-0 = <&spi0_flash_pins>; + pinctrl-names = "default"; + status = "okay"; + + spi_nand: spi_nand@0 { + compatible = "spi-nand"; + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + + spi-max-frequency = <52000000>; + spi-tx-bus-width = <4>; + spi-rx-bus-width = <4>; + + mediatek,nmbm; + mediatek,bmt-max-ratio = <1>; + mediatek,bmt-max-reserved-blocks = <64>; + mediatek,bmt-remap-range = + <0x0000000 0x5a0000>, /* BL2 - Fwheader (5.625 MiB) */ + <0x37a0000 0x3a0000>, /* Config - Fwheader2 (3.625 MiB) */ + <0x6d40000 0x840000>; /* Config2 - Backup (8.25 MiB) */ + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "BL2"; + reg = <0x0 0x100000>; + read-only; + }; + + partition@100000 { + label = "u-boot-env"; + reg = <0x100000 0x80000>; + }; + + partition@180000 { + label = "Factory"; + reg = <0x180000 0x200000>; + read-only; + + nvmem-layout { + compatible = "fixed-layout"; + #address-cells = <1>; + #size-cells = <1>; + + eeprom_factory_0: eeprom@0 { + reg = <0x0 0x1000>; + }; + + macaddr_factory_4: mac-address@4 { + reg = <0x4 0x6>; + }; + + macaddr_factory_a: mac-address@a { + reg = <0xa 0x6>; + }; + + macaddr_factory_24: mac-address@24 { + reg = <0x24 0x6>; + }; + + macaddr_factory_2a: mac-address@2a { + reg = <0x2a 0x6>; + }; + }; + }; + + partition@380000 { + label = "FIP"; + reg = <0x380000 0x200000>; + read-only; + }; + + partition@580000 { + label = "Fwheader"; + reg = <0x580000 0x20000>; + read-only; + }; + + /* stock: "ubi" */ + partition@5a0000 { + compatible = "mstc,boot"; + label = "firmware1"; + reg = <0x5a0000 0x3200000>; + mstc,bootnum = <1>; + mstc,persist = <&mtd_persist>; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label-base = "ubi"; + reg = <0x0 0x3200000>; + }; + }; + + partition@37a0000 { + label = "Config"; + reg = <0x37a0000 0x380000>; + read-only; + }; + + partition@3b20000 { + label = "Fwheader_2"; + reg = <0x3b20000 0x20000>; + read-only; + }; + + /* stock: "ubi_2" */ + partition@3b40000 { + compatible = "mstc,boot"; + label = "firmware2"; + reg = <0x3b40000 0x3200000>; + mstc,bootnum = <2>; + mstc,persist = <&mtd_persist>; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label-base = "ubi"; + reg = <0x0 0x3200000>; + }; + }; + + partition@6d40000 { + label = "Config_2"; + reg = <0x6d40000 0x380000>; + read-only; + }; + + mtd_persist: partition@70c0000 { + label = "persist"; + reg = <0x70c0000 0x100000>; + }; + + partition@71c0000 { + label = "Mrd"; + reg = <0x71c0000 0x40000>; + read-only; + }; + + partition@7200000 { + label = "Backup"; + reg = <0x7200000 0x380000>; + read-only; + }; + }; + }; +}; + +&uart0 { + status = "okay"; +}; + +&watchdog { + status = "okay"; +}; + +&wifi { + nvmem-cells = <&eeprom_factory_0>; + nvmem-cell-names = "eeprom"; + status = "okay"; + + band@0 { + reg = <0>; + nvmem-cells = <&macaddr_factory_4>; + nvmem-cell-names = "mac-address"; + }; + + band@1 { + reg = <1>; + nvmem-cells = <&macaddr_factory_a>; + nvmem-cell-names = "mac-address"; + }; +}; diff --git a/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds b/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds index 852c17b9027..cd1958fd690 100644 --- a/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds +++ b/target/linux/mediatek/filogic/base-files/etc/board.d/01_leds @@ -64,6 +64,9 @@ cudy,wr3000h-v1) ucidef_set_led_netdev "wan" "wan" "white:wan" "wan" "link tx rx" ucidef_set_led_netdev "internet" "internet" "white:wan-online" "wan" "link" ;; +elecom,wrc-x3000gs3) + ucidef_set_led_netdev "wan" "wan" "green:wan" "wan" + ;; glinet,gl-x3000|\ glinet,gl-xe3000) ucidef_set_led_default "power" "POWER" "green:power" "1" diff --git a/target/linux/mediatek/filogic/base-files/lib/upgrade/elecom.sh b/target/linux/mediatek/filogic/base-files/lib/upgrade/elecom.sh new file mode 100755 index 00000000000..e66c24024e8 --- /dev/null +++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/elecom.sh @@ -0,0 +1,33 @@ +. /lib/functions.sh + +# Read or update the "bootnum" in the "persist" partition +# +# parameters: +# $1: index of active partition to set (1/2) +# +# operations: +# read : mstc_rw_bootnum +# write: mstc_rw_bootnum +mstc_rw_bootnum() { + local mtd + local curval setval="$1" + + case "$setval" in + 1|2|"") ;; + *) echo "invalid bootnum specified \"$setval\""; return 1 ;; + esac + + mtd=$(find_mtd_part "persist") + if [ -z "$mtd" ]; then + echo "cannot find "persist" mtd partition" + return 1 + fi + + curval=$(hexdump -s 4 -n 1 -e '"%d"' $mtd) + [ -z "$setval" ] && + echo "$curval" && return 0 + + [ "$curval" != "$setval" ] && + printf "\x$setval" | \ + dd of=$mtd bs=1 seek=4 conv=notrunc +} diff --git a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh index d0e2fff6eb4..8138b8c0c74 100755 --- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh +++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh @@ -146,6 +146,21 @@ platform_do_upgrade() { fw_setenv sw_tryactive 0 nand_do_upgrade "$1" ;; + elecom,wrc-x3000gs3) + local bootnum="$(mstc_rw_bootnum)" + case "$bootnum" in + 1|2) + CI_UBIPART="ubi$bootnum" + [ -z "$(find_mtd_index $CI_UBIPART)" ] && + CI_UBIPART="ubi" + ;; + *) + v "invalid bootnum found ($bootnum), rebooting..." + nand_do_upgrade_failed + ;; + esac + nand_do_upgrade "$1" + ;; mercusys,mr80x-v3|\ mercusys,mr90x-v1|\ tplink,archer-ax80-v1|\ diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk index 89d17a82e1d..51a79d50374 100644 --- a/target/linux/mediatek/image/filogic.mk +++ b/target/linux/mediatek/image/filogic.mk @@ -82,6 +82,22 @@ define Build/append-openwrt-one-eeprom dd if=$(STAGING_DIR_IMAGE)/mt7981_eeprom_mt7976_dbdc.bin >> $@ endef +define Build/mstc-header + $(eval version=$(word 1,$(1))) + $(eval magic=$(word 2,$(1))) + gzip -c $@ | tail -c8 > $@.crclen + ( \ + printf "$(magic)"; \ + tail -c+5 $@.crclen; head -c4 $@.crclen; \ + dd if=/dev/zero bs=4 count=2; \ + printf "$(version)" | dd bs=56 count=1 conv=sync 2>/dev/null; \ + dd if=/dev/zero bs=$$((0x20000 - 0x84)) count=1 conv=sync 2>/dev/null | \ + tr "\0" "\377"; \ + cat $@; \ + ) > $@.new + mv $@.new $@ +endef + define Build/zyxel-nwa-fit-filogic $(TOPDIR)/scripts/mkits-zyxel-fit-filogic.sh \ $@.its $@ "80 e1 ff ff ff ff ff ff ff ff" @@ -952,6 +968,19 @@ define Device/edgecore_eap111 endef TARGET_DEVICES += edgecore_eap111 +define Device/elecom_wrc-x3000gs3 + DEVICE_VENDOR := ELECOM + DEVICE_MODEL := WRC-X3000GS3 + DEVICE_DTS := mt7981b-elecom-wrc-x3000gs3 + DEVICE_DTS_DIR := ../dts + IMAGES += factory.bin + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata + IMAGE/factory.bin := sysupgrade-tar | mstc-header 5.04(XZQ.0)b90 COMD | \ + elecom-product-header WRC-X3000GS3 + DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware +endef +TARGET_DEVICES += elecom_wrc-x3000gs3 + define Device/gatonetworks_gdsp DEVICE_VENDOR := GatoNetworks DEVICE_MODEL := gdsp