[PATCH V2 3/3] mediatek: filogic: add support for GatoNetworks GDSP
Enrico Mioso
mrkiko.rs at gmail.com
Sat Nov 9 13:47:41 PST 2024
On Sat, Nov 09, 2024 at 10:14:33PM +0100, Enrico Mioso wrote:
> The GatoNetworks GDSP is a re-branded version of the R5000 5G Industrial
> router from Yinghua Technologies.
> The re-branded device comes with OpenWrt preinstalled, and an OpenWrt-based
> U-Boot bootloader version. While the flash layout has been kept compatible
> with the OpenWrt version found on the stock device (see [5]), the image format
> changed, making a bootloader upgrade necessary.
>
> Specifications:
> SoC: Mediatek MT7981BA
> RAM: 256MB
> Flash: SPI-NOR 32 MiB (Winbond W25Q256)
> WLAN: MT7976CN DBDC AX Wi-Fi
> Switch: MT7531AE (4x LAN Gigabit ports, 1x WAN Gigabit port)
> 5G: Quectel RM520N modem
> Watchdog: an external WDT connected to GPIO 6 is present and always running;
> the built-in Mediatek watchdog is also present and effective, but
> not used at the moment.
>
> This porting has been tested only with 1x 5G modems installed (the device
> supports up to two).
>
> Installation:
> Installation is possible via sysupgrade both in the stock device and
> re-branded version. However, in the former case, updating the bootloader is
> required.
>
> OpenWrt-based U-Boot Bootloader installation
> --------------------------------------------
> The firmware flashed in the re-branded device at manifacturing time will
> flash an OpenWrt-based U-Boot bootloader with some extra recovery features
> (see [1]) at first boot.
> To update the bootloader, you need to install the mtd-rw module and
> insmod it:
>
> insmod mtd-rw i_want_a_brick=1
>
> Then update relevant flash partitions:
>
> mtd erase u-boot-env
> mtd erase BL2
> mtd erase FIP
> mtd write openwrt-mediatek-filogic-gatonetworks_gdsp-preloader.bin BL2
> mtd write openwrt-mediatek-filogic-gatonetworks_gdsp-bl31-uboot.fip FIP
>
> And reboot, making sure all previous commands ran succesfully.
> If something goes wrong, you can recover your device via the mtk_uartboot
> tool.
> In my testing, it was possible to start the process even without (un)-plugging
> the device, may be handy for remote recovery.
>
> Installation from stock device and firmware
> -------------------------------------------
> To install vanilla OpenWrt in the stock device (R5000 5G Industrial router
> from Yinghua Technologies) running the stock vendor firmware, you will need
> to update your bootloader as described in previous section. Remember to use
> -F (force upgrade) and -n (not keeping settings).
>
> U-Boot Recovery
> ---------------
> This procedure has been tested only with the OpenWrt-based U-boot bootloader.
> Assign your system static IP address 192.168.1.1 and start a TFTP server. The
... uh, I did a mistake in the commit message.
You should assign your system IP 192.168.1.10, and requess will be coming from 192.168.1.1.
May you fix that directly? Thanks a lot. Sorry.
> device will look for an initramfs image named
> openwrt-mediatek-filogic-gatonetworks_gdsp-initramfs-kernel.bin
> (so you may use openwrt/bin/targets/mediatek/filogic as root dir for your
> TFTP server).
> Power on the device while keeping the reset button pressed, until you see
> a TFTP request from 192.168.1.10. Your environment will be restored to it's
> default state.
>
> MAC addresses assignment
> ------------------------
> MAC addresses are assigned slightly differently than in stock firmware. In
> particular, the 5 GHz Wi-Fi uses 2.4 GHZ MAC + 1, rather than reusing it with
> LA bit set as done in stock firmware. This MAC address is allocated to the
> device, so it can be used.
> The 2.4 GHz Wi-Fi MAC address is the label MAC. LAN MAC is used to set the
> special U-Boot environment ethaddr variable.
>
> device MAC address U-Boot env variable factory partition offset
> 2.4 GHz Wi-Fi :84 wifi_mac 0x4
> 5.8 GHz Wi-Fi :85 not present not present
> WAN :86 wan_mac 0x24
> LAN :87 lan_mac 0x2A
>
> Notes
> -----
> [1]: the OpenWrt-based U-Boot bootloader you will find installed in the
> re-branded device is configured to request for the initramfs image via
> TFTP for $gdsp_tftp_tries times before trying normal boot from NOR flash.
> Setting this U-Boot environment variable to 0x0 will disable the feature,
> which is not implemented in this patch.
> [2]: the exposed UART port is connected to ttyS1; the ttyS0 console port is
> not exposed.
> [3]: the provided bootloader environment has no provision for operating on
> BL2 and the FIP partitions. This is an intentional choice to make it
> (slightly) more difficult to brick the device.
> [4]: it seems GPIO 6 is used both for the "SYS" LED and external WDT.
> [5] BL2 expects to find FIP payload at a fixed offset, so some constraints
> apply.
>
> Signed-off-by: Enrico Mioso <mrkiko.rs at gmail.com>
> ---
> .../dts/mt7981b-gatonetworks-gdsp.dts | 389 ++++++++++++++++++
> .../base-files/lib/upgrade/platform.sh | 1 +
> target/linux/mediatek/image/filogic.mk | 20 +
> 3 files changed, 410 insertions(+)
> create mode 100644 target/linux/mediatek/dts/mt7981b-gatonetworks-gdsp.dts
>
> diff --git a/target/linux/mediatek/dts/mt7981b-gatonetworks-gdsp.dts b/target/linux/mediatek/dts/mt7981b-gatonetworks-gdsp.dts
> new file mode 100644
> index 0000000000..cbe188b859
> --- /dev/null
> +++ b/target/linux/mediatek/dts/mt7981b-gatonetworks-gdsp.dts
> @@ -0,0 +1,389 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +
> +/dts-v1/;
> +#include "mt7981.dtsi"
> +
> +/ {
> + model = "GatoNetworks GDSP";
> + compatible = "gatonetworks,gdsp", "mediatek,mt7981";
> +
> + aliases {
> + serial0 = &uart0;
> + label-mac-device = &wifi_band_0;
> + led-boot = &sg1;
> + led-failsafe = &sg1;
> + led-running = &sg1;
> + led-upgrade = &sg1;
> + };
> +
> + chosen {
> + stdout-path = "serial0:115200n8";
> + bootargs = "console=ttyS0,115200n1 earlycon=uart8250,mmio32,0x11002000";
> + rootdisk = <&firmware>;
> + };
> +
> + memory {
> + reg = <0 0x40000000 0 0x10000000>;
> + };
> +
> + reg_3p3v: regulator-3p3v {
> + compatible = "regulator-fixed";
> + regulator-name = "fixed-3.3V";
> + regulator-min-microvolt = <3300000>;
> + regulator-max-microvolt = <3300000>;
> + regulator-boot-on;
> + regulator-always-on;
> + };
> +
> + reg_5v: regulator-5v {
> + compatible = "regulator-fixed";
> + regulator-name = "fixed-5V";
> + regulator-min-microvolt = <5000000>;
> + regulator-max-microvolt = <5000000>;
> + regulator-boot-on;
> + regulator-always-on;
> + };
> +
> + gpio-keys {
> + compatible = "gpio-keys";
> +
> + reset {
> + label = "reset";
> + linux,code = <KEY_RESTART>;
> + gpios = <&pio 1 GPIO_ACTIVE_LOW>;
> + };
> + };
> +
> + gpio-export {
> + compatible = "gpio-export";
> +
> + modem1 {
> + gpio-export,name = "modem1";
> + gpio-export,output = <0>;
> + gpios = <&pio 2 GPIO_ACTIVE_LOW>;
> + };
> +
> + modem2 {
> + gpio-export,name = "modem2";
> + gpio-export,output = <0>;
> + gpios = <&pio 14 GPIO_ACTIVE_LOW>;
> + };
> + };
> +
> + leds {
> + compatible = "gpio-leds";
> +
> + sim1 {
> + label = "green:sim1";
> + gpios = <&pio 13 GPIO_ACTIVE_LOW>;
> + };
> +
> + sim2 {
> + label = "green:sim2";
> + gpios = <&pio 0 GPIO_ACTIVE_LOW>;
> + };
> +
> + sg1: sg1 {
> + label = "green:sg1";
> + gpios = <&pio 10 GPIO_ACTIVE_LOW>;
> + };
> +
> + sg2 {
> + label = "green:sg2";
> + gpios = <&pio 11 GPIO_ACTIVE_LOW>;
> + };
> +
> + sg3 {
> + label = "green:sg3";
> + gpios = <&pio 12 GPIO_ACTIVE_LOW>;
> + };
> +
> + sg4 {
> + label = "green:sg4";
> + gpios = <&pio 7 GPIO_ACTIVE_LOW>;
> + };
> +
> + sg5 {
> + label = "green:sg5";
> + gpios = <&pio 8 GPIO_ACTIVE_LOW>;
> + };
> +
> + sg6 {
> + label = "green:sg6";
> + gpios = <&pio 9 GPIO_ACTIVE_LOW>;
> + };
> + };
> +
> + gpio-watchdog {
> + compatible = "linux,wdt-gpio";
> + gpios = <&pio 6 GPIO_ACTIVE_LOW>;
> + hw_algo = "toggle";
> + hw_margin_ms = <25000>;
> + always-running;
> + };
> +};
> +
> +&watchdog {
> + status = "okay";
> +};
> +
> +ð {
> + status = "okay";
> +
> + gmac0: mac at 0 {
> + compatible = "mediatek,eth-mac";
> + reg = <0>;
> + phy-mode = "2500base-x";
> +
> + nvmem-cells = <&macaddr_lan>;
> + nvmem-cell-names = "mac-address";
> +
> + fixed-link {
> + speed = <2500>;
> + full-duplex;
> + pause;
> + };
> + };
> +
> + mdio: mdio-bus {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + switch at 1f {
> + compatible = "mediatek,mt7531";
> + reg = <31>;
> + reset-gpios = <&pio 39 0>;
> + interrupt-controller;
> + #interrupt-cells = <1>;
> + interrupt-parent = <&pio>;
> + interrupts = <38 IRQ_TYPE_LEVEL_HIGH>;
> +
> + mdio {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + swphy0: phy at 0 {
> + reg = <0>;
> + };
> +
> + swphy1: phy at 1 {
> + reg = <1>;
> + };
> +
> + swphy2: phy at 2 {
> + reg = <2>;
> + };
> +
> + swphy3: phy at 3 {
> + reg = <3>;
> + };
> +
> + swphy4: phy at 4 {
> + reg = <4>;
> + };
> + };
> +
> + ports {
> + #address-cells = <1>;
> + #size-cells = <0>;
> +
> + port at 0 {
> + reg = <0>;
> + label = "lan1";
> + phy-handle = <&swphy0>;
> + };
> +
> + port at 1 {
> + reg = <1>;
> + label = "lan2";
> + phy-handle = <&swphy1>;
> + };
> +
> + port at 2 {
> + reg = <2>;
> + label = "lan3";
> + phy-handle = <&swphy2>;
> + };
> +
> + port at 3 {
> + reg = <3>;
> + label = "lan4";
> + phy-handle = <&swphy3>;
> + };
> +
> + port at 4 {
> + reg = <4>;
> + label = "wan";
> + nvmem-cells = <&macaddr_wan>;
> + nvmem-cell-names = "mac-address";
> + phy-handle = <&swphy4>;
> + };
> +
> + port at 6 {
> + reg = <6>;
> + ethernet = <&gmac0>;
> + phy-mode = "2500base-x";
> +
> + fixed-link {
> + speed = <2500>;
> + full-duplex;
> + pause;
> + };
> + };
> + };
> + };
> + };
> +};
> +
> +&crypto {
> + status = "okay";
> +};
> +
> +&wifi {
> + mediatek,mtd-eeprom = <&factory 0x0>;
> + status = "okay";
> +
> + wifi_band_0: band at 0 {
> + reg = <0>;
> + nvmem-cells = <&macaddr_wifi 0>;
> + nvmem-cell-names = "mac-address";
> + };
> +
> + band at 1 {
> + reg = <1>;
> + nvmem-cells = <&macaddr_wifi 1>;
> + nvmem-cell-names = "mac-address";
> + };
> +};
> +
> +&spi2 {
> + pinctrl-names = "default";
> + pinctrl-0 = <&spi2_flash_pins>;
> + status = "okay";
> +
> + flash at 0 {
> + #address-cells = <1>;
> + #size-cells = <1>;
> + compatible = "jedec,spi-nor";
> + reg = <0>;
> + spi-max-frequency = <52000000>;
> +
> + partitions {
> + compatible = "fixed-partitions";
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + partition at 00000 {
> + label = "BL2";
> + reg = <0x00000 0x0040000>;
> + read-only;
> + };
> +
> + partition at 40000 {
> + label = "u-boot-env";
> + reg = <0x40000 0x0010000>;
> + };
> +
> + factory: partition at 50000 {
> + label = "Factory";
> + reg = <0x50000 0x00B0000>;
> + read-only;
> +
> + nvmem-layout {
> + compatible = "fixed-layout";
> + #address-cells = <1>;
> + #size-cells = <1>;
> +
> + macaddr_wifi: macaddr at 4 {
> + reg = <0x4 0x6>;
> + compatible = "mac-base";
> + #nvmem-cell-cells = <1>;
> + };
> +
> + macaddr_wan: macaddr at 24 {
> + reg = <0x24 0x6>;
> + };
> +
> + macaddr_lan: macaddr at 2a {
> + reg = <0x2a 0x6>;
> + };
> + };
> + };
> +
> + partition at 100000 {
> + label = "FIP";
> + reg = <0x100000 0x0080000>;
> + read-only;
> + };
> +
> + firmware: partition at 180000 {
> + label = "firmware";
> + reg = <0x180000 0x1E80000>;
> + };
> + };
> + };
> +};
> +
> +&pio {
> + uart1_pins: uart1-pins {
> + mux {
> + function = "uart";
> + groups = "uart1_0";
> + };
> + };
> +
> + uart2_pins: uart2-pins {
> + mux {
> + function = "uart";
> + groups = "uart2_0_tx_rx";
> + };
> + };
> +
> + spi2_flash_pins: spi2-pins {
> + mux {
> + function = "spi";
> + groups = "spi2", "spi2_wp_hold";
> + };
> +
> + conf-pu {
> + pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
> + drive-strength = <MTK_DRIVE_8mA>;
> + bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
> + };
> +
> + conf-pd {
> + pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
> + drive-strength = <MTK_DRIVE_8mA>;
> + bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
> + };
> + };
> +};
> +
> +&uart0 {
> + status = "okay";
> +};
> +
> +&uart1 {
> + pinctrl-names = "default";
> + pinctrl-0 = <&uart1_pins>;
> + status = "okay";
> +};
> +
> +&uart2 {
> + pinctrl-names = "default";
> + pinctrl-0 = <&uart2_pins>;
> + status = "okay";
> +};
> +
> +&usb_phy {
> + status = "okay";
> +};
> +
> +&xhci {
> + mediatek,u3p-dis-msk = <0x0>;
> + phys = <&u2port0 PHY_TYPE_USB2>,
> + <&u3port0 PHY_TYPE_USB3>;
> + status = "okay";
> + vusb33-supply = <®_3p3v>;
> + vbus-supply = <®_5v>;
> +};
> 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 7fe2d29d31..cfd77b62d7 100755
> --- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
> @@ -70,6 +70,7 @@ platform_do_upgrade() {
> bananapi,bpi-r4|\
> bananapi,bpi-r4-poe|\
> cmcc,rax3000m|\
> + gatonetworks,gdsp|\
> h3c,magic-nx30-pro|\
> jcg,q30-pro|\
> jdcloud,re-cp-03|\
> diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk
> index 5dfde755a0..739fd54308 100644
> --- a/target/linux/mediatek/image/filogic.mk
> +++ b/target/linux/mediatek/image/filogic.mk
> @@ -670,6 +670,26 @@ define Device/edgecore_eap111
> endef
> TARGET_DEVICES += edgecore_eap111
>
> +define Device/gatonetworks_gdsp
> + DEVICE_VENDOR := GatoNetworks
> + DEVICE_MODEL := gdsp
> + DEVICE_DTS := mt7981b-gatonetworks-gdsp
> + DEVICE_DTS_DIR := ../dts
> + IMAGES := sysupgrade.itb
> + IMAGE_SIZE := 32768k
> + DEVICE_PACKAGES := fitblk kmod-mt7915e kmod-mt7981-firmware \
> + kmod-usb-net-qmi-wwan kmod-usb-serial-option kmod-usb3 \
> + mt7981-wo-firmware -kmod-phy-aquantia
> + ARTIFACTS := preloader.bin bl31-uboot.fip
> + ARTIFACT/preloader.bin := mt7981-bl2 nor-ddr3
> + ARTIFACT/bl31-uboot.fip := mt7981-bl31-uboot gatonetworks_gdsp
> + KERNEL := kernel-bin | gzip
> + KERNEL_INITRAMFS := kernel-bin | lzma | \
> + fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
> + IMAGE/sysupgrade.itb := append-kernel | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | pad-rootfs | append-metadata
> +endef
> +TARGET_DEVICES += gatonetworks_gdsp
> +
> define Device/glinet_gl-mt2500
> DEVICE_VENDOR := GL.iNet
> DEVICE_MODEL := GL-MT2500
> --
> 2.47.0
>
More information about the openwrt-devel
mailing list