[PATCH] filogic: add support for Netgear EAX17

Jascha Sundaresan flizarthanon at gmail.com
Wed Oct 15 03:09:17 PDT 2025


Hardware
--------

SOC:   MediaTek MT7981
RAM:   512MB DDR4
FLASH: 128MB SPI-NAND
WIFI:  Mediatek MT7915 (integrated) 2x2 802.11ax 2.4 / 5 GHz
ETH:   Mediatek MT7981 internal 1 GbE PHY
UART:  3V3 115200 8N1 (Pinout silkscreened / Do not connect VCC)

Installation
------------

1. Download the OpenWrt initramfs image. Copy the image to a TFTP server
2. Connect the TFTP server to the EAX17. Conect to the serial console,
   interrupt the autoboot process by pressing '0' when prompted.
3. Download & Boot the OpenWrt initramfs image.

   $ tftpboot openwrt.bin
   $ bootm

4. Wait for OpenWrt to boot. Transfer the sysupgrade image to the device
   using scp and install using sysupgrade.

   $ sysupgrade -n <path-to-sysupgrade.bin>

Signed-off-by: Jascha Sundaresan <flizarthanon at gmail.com>
---
 include/image-commands.mk                     |   1 +
 ...ilogic-add-support-for-Netgear-EAX17.patch | 543 ++++++++++++++++++
 scripts/mkits.sh                              |  32 +-
 .../mediatek/dts/mt7981b-netgear-eax17.dts    | 236 ++++++++
 .../filogic/base-files/etc/board.d/01_leds    |  11 +
 .../filogic/base-files/etc/board.d/02_network |  17 +
 .../filogic/base-files/etc/init.d/eax17-ledq  |  26 +
 .../base-files/etc/uci-defaults/99-eax17-ledq |   6 +
 .../base-files/lib/upgrade/platform.sh        |  11 +
 target/linux/mediatek/image/filogic.mk        |  34 ++
 10 files changed, 916 insertions(+), 1 deletion(-)
 create mode 100644 patches/0001-filogic-add-support-for-Netgear-EAX17.patch
 create mode 100644 target/linux/mediatek/dts/mt7981b-netgear-eax17.dts
 create mode 100644 target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq
 create mode 100644 target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq

diff --git a/include/image-commands.mk b/include/image-commands.mk
index 7b2b346aa6..b0c71909fc 100644
--- a/include/image-commands.mk
+++ b/include/image-commands.mk
@@ -439,6 +439,7 @@ define Build/fit
 				-d $(KERNEL_BUILD_DIR)/image-$$(basename $(word 2,$(1))), \
 				-d $(word 2,$(1)))) \
 		$(if $(findstring with-rootfs,$(word 3,$(1))),-r $(IMAGE_ROOTFS)) \
+		$(if $(findstring with-netgear-rootfs-node,$(word 3,$(1))),-R $(KERNEL_BUILD_DIR)/root.squashfs) \
 		$(if $(findstring with-initrd,$(word 3,$(1))), \
 			$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE), \
 				-i $(KERNEL_BUILD_DIR)/initrd$(if $(TARGET_PER_DEVICE_ROOTFS),.$(ROOTFS_ID/$(DEVICE_NAME))).cpio$(strip $(call Build/initrd_compression)))) \
diff --git a/patches/0001-filogic-add-support-for-Netgear-EAX17.patch b/patches/0001-filogic-add-support-for-Netgear-EAX17.patch
new file mode 100644
index 0000000000..958359b8b1
--- /dev/null
+++ b/patches/0001-filogic-add-support-for-Netgear-EAX17.patch
@@ -0,0 +1,542 @@
+From 75fa5c536e0613ad182f886ac46fe9c01ad98268 Mon Sep 17 00:00:00 2001
+From: Jascha Sundaresan <flizarthanon at gmail.com>
+Date: Thu, 18 Sep 2025 22:32:41 +0400
+Subject: [PATCH] filogic: add support for Netgear EAX17
+
+Hardware
+--------
+
+SOC:   MediaTek MT7981
+RAM:   512MB DDR4
+FLASH: 128MB SPI-NAND
+WIFI:  Mediatek MT7915 (integrated) 2x2 802.11ax 2.4 / 5 GHz
+ETH:   Mediatek MT7981 internal 1 GbE PHY
+UART:  3V3 115200 8N1 (Pinout silkscreened / Do not connect VCC)
+
+Installation
+------------
+
+1. Download the OpenWrt initramfs image. Copy the image to a TFTP server
+2. Connect the TFTP server to the EAX17. Conect to the serial console,
+   interrupt the autoboot process by pressing '0' when prompted.
+3. Download & Boot the OpenWrt initramfs image.
+
+   $ tftpboot openwrt.bin
+   $ bootm
+
+4. Wait for OpenWrt to boot. Transfer the sysupgrade image to the device
+   using scp and install using sysupgrade.
+
+   $ sysupgrade -n <path-to-sysupgrade.bin>
+
+Signed-off-by: Jascha Sundaresan <flizarthanon at gmail.com>
+---
+ include/image-commands.mk                     |   1 +
+ scripts/mkits.sh                              |  32 ++-
+ .../mediatek/dts/mt7981b-netgear-eax17.dts    | 236 ++++++++++++++++++
+ .../filogic/base-files/etc/board.d/01_leds    |  11 +
+ .../filogic/base-files/etc/board.d/02_network |  17 ++
+ .../filogic/base-files/etc/init.d/eax17-ledq  |  26 ++
+ .../base-files/etc/uci-defaults/99-eax17-ledq |   6 +
+ .../base-files/lib/upgrade/platform.sh        |  11 +
+ target/linux/mediatek/image/filogic.mk        |  34 +++
+ 9 files changed, 373 insertions(+), 1 deletion(-)
+ create mode 100644 target/linux/mediatek/dts/mt7981b-netgear-eax17.dts
+ create mode 100644 target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq
+ create mode 100644 target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq
+
+diff --git a/include/image-commands.mk b/include/image-commands.mk
+index 7b2b346aa6..b0c71909fc 100644
+--- a/include/image-commands.mk
++++ b/include/image-commands.mk
+@@ -439,6 +439,7 @@ define Build/fit
+				-d $(KERNEL_BUILD_DIR)/image-$$(basename $(word 2,$(1))), \
+				-d $(word 2,$(1)))) \
+		$(if $(findstring with-rootfs,$(word 3,$(1))),-r $(IMAGE_ROOTFS)) \
++		$(if $(findstring with-netgear-rootfs-node,$(word 3,$(1))),-R $(KERNEL_BUILD_DIR)/root.squashfs) \
+		$(if $(findstring with-initrd,$(word 3,$(1))), \
+			$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE), \
+				-i $(KERNEL_BUILD_DIR)/initrd$(if $(TARGET_PER_DEVICE_ROOTFS),.$(ROOTFS_ID/$(DEVICE_NAME))).cpio$(strip $(call Build/initrd_compression)))) \
+diff --git a/scripts/mkits.sh b/scripts/mkits.sh
+index 46ab5ee023..047034d5ab 100755
+--- a/scripts/mkits.sh
++++ b/scripts/mkits.sh
+@@ -31,6 +31,7 @@ usage() {
+	printf "\n\t-n ==> fdt unit-address 'address'"
+	printf "\n\t-d ==> include Device Tree Blob 'dtb'"
+	printf "\n\t-r ==> include RootFS blob 'rootfs'"
++	printf "\n\t-R ==> include Netgear style top level RootFS blob 'rootfs'"
+	printf "\n\t-H ==> specify hash algo instead of SHA1"
+	printf "\n\t-l ==> legacy mode character (@ etc otherwise -)"
+	printf "\n\t-o ==> create output file 'its_file'"
+@@ -49,7 +50,7 @@ LOADABLES=
+ DTOVERLAY=
+ DTADDR=
+
+-while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:s:H:" OPTION
++while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:R:s:H:" OPTION
+ do
+	case $OPTION in
+		A ) ARCH=$OPTARG;;
+@@ -67,6 +68,7 @@ do
+		o ) OUTPUT=$OPTARG;;
+		O ) DTOVERLAY="$DTOVERLAY ${OPTARG}";;
+		r ) ROOTFS=$OPTARG;;
++		R ) ROOTFS_FILE=$OPTARG;;
+		s ) FDTADDR=$OPTARG;;
+		H ) HASH=$OPTARG;;
+		v ) VERSION=$OPTARG;;
+@@ -156,6 +158,32 @@ if [ -n "${ROOTFS}" ]; then
+	LOADABLES="${LOADABLES:+$LOADABLES, }\"rootfs${REFERENCE_CHAR}${ROOTFSNUM}\""
+ fi
+
++if [ -f "${ROOTFS_FILE}" ]; then
++	ROOTFS_SIZE=$(stat -c %s ${ROOTFS_FILE})
++
++	ROOTFS_SHA1=$(
++	sha1sum "${ROOTFS_FILE}" | \
++	awk '{
++		print "<0x" substr($0, 1, 8) \
++		      " 0x" substr($0, 9, 8) \
++		      " 0x" substr($0, 17, 8) \
++		      " 0x" substr($0, 25, 8) \
++		      " 0x" substr($0, 33, 8) ">"
++		}'
++	)
++
++	TOP_LEVEL_ROOTFS="
++	rootfs {
++		size = <${ROOTFS_SIZE}>;
++
++		hash-1 {
++			value = ${ROOTFS_SHA1};
++			algo = \"sha1\";
++		};
++	};
++"
++fi
++
+ # add DT overlay blobs
+ FDTOVERLAY_NODE=""
+ OVCONFIGS=""
+@@ -222,6 +250,8 @@ ${FDTOVERLAY_NODE}
+ ${ROOTFS_NODE}
+	};
+
++${TOP_LEVEL_ROOTFS}
++
+	configurations {
+		default = \"${CONFIG}\";
+		${CONFIG} {
+diff --git a/target/linux/mediatek/dts/mt7981b-netgear-eax17.dts b/target/linux/mediatek/dts/mt7981b-netgear-eax17.dts
+new file mode 100644
+index 0000000000..6dfa8c5b90
+--- /dev/null
++++ b/target/linux/mediatek/dts/mt7981b-netgear-eax17.dts
+@@ -0,0 +1,236 @@
++// SPDX-License-Identifier: (GPL-2.0 OR MIT)
++
++/dts-v1/;
++#include "mt7981b.dtsi"
++
++/ {
++	model = "Netgear EAX17";
++	compatible = "netgear,eax17", "mediatek,mt7981-spim-snand-rfb";
++
++	aliases {
++		led-boot = &led_power_green;
++		led-failsafe = &led_power_red;
++		led-running = &led_power_green;
++		led-upgrade = &led_power_red;
++		serial0 = &uart0;
++	};
++
++	chosen {
++		stdout-path = "serial0:115200n8";
++	};
++
++	memory at 40000000 {
++		reg = <0 0x40000000 0 0x20000000>;
++		device_type = "memory";
++	};
++
++	gpio-keys {
++		compatible = "gpio-keys";
++
++		reset {
++			label = "reset";
++			linux,code = <KEY_RESTART>;
++			gpios = <&pio 1 GPIO_ACTIVE_LOW>;
++		};
++
++		wps {
++			label = "wps";
++			linux,code = <KEY_WPS_BUTTON>;
++			gpios = <&pio 0 GPIO_ACTIVE_LOW>;
++		};
++	};
++
++	gpio-leds {
++		compatible = "gpio-leds";
++
++		led_power_green: power_green {
++			color = <LED_COLOR_ID_GREEN>;
++			function = LED_FUNCTION_POWER;
++			gpios = <&pio 9 GPIO_ACTIVE_LOW>;
++		};
++
++		led_power_red: power_red {
++			color = <LED_COLOR_ID_RED>;
++			function = LED_FUNCTION_POWER;
++			gpios = <&pio 12 GPIO_ACTIVE_LOW>;
++		};
++
++		led_rlink_red: rlink_red {
++			color = <LED_COLOR_ID_RED>;
++			function = LED_FUNCTION_LAN;
++			gpios = <&pio 6 GPIO_ACTIVE_LOW>;
++		};
++
++		led_rlink_green: rlink_green {
++			color = <LED_COLOR_ID_GREEN>;
++			function = LED_FUNCTION_LAN;
++			gpios = <&pio 7 GPIO_ACTIVE_LOW>;
++		};
++
++		led_clink_red: clink_red {
++			color = <LED_COLOR_ID_RED>;
++			function = LED_FUNCTION_WAN;
++			gpios = <&pio 10 GPIO_ACTIVE_LOW>;
++		};
++
++		led_clink_green: clink_green {
++			color = <LED_COLOR_ID_GREEN>;
++			function = LED_FUNCTION_WAN;
++			gpios = <&pio 11 GPIO_ACTIVE_LOW>;
++		};
++
++		led_wps_green: wps_green {
++			color = <LED_COLOR_ID_GREEN>;
++			function = LED_FUNCTION_WPS;
++			gpios = <&pio 5 GPIO_ACTIVE_LOW>;
++		};
++
++		led_lan_speed_fast: lan_speed_fast {
++			color = <LED_COLOR_ID_GREEN>;
++			function = LED_FUNCTION_STATUS;
++			gpios = <&pio 13 GPIO_ACTIVE_LOW>;
++		};
++
++		led_lan_speed_slow: lan_speed_slow {
++			color = <LED_COLOR_ID_YELLOW>;
++			function = LED_FUNCTION_STATUS;
++			gpios = <&pio 8 GPIO_ACTIVE_LOW>;
++		};
++
++	};
++
++};
++
++&eth {
++	status = "okay";
++
++	gmac0: mac at 0 {
++		compatible = "mediatek,eth-mac";
++		reg = <0>;
++		status = "disabled";
++	};
++
++	gmac1: mac at 1 {
++		compatible = "mediatek,eth-mac";
++		reg = <1>;
++		phy-mode = "gmii";
++		phy-handle = <&int_gbe_phy>;
++	};
++};
++
++
++&crypto {
++	status = "okay";
++};
++
++&pio {
++	spi_flash_pins: spi0-pins {
++		mux {
++			function = "spi";
++			groups = "spi0", "spi0_wp_hold";
++		};
++
++		conf-pu {
++			pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
++			drive-strength = <MTK_DRIVE_8mA>;
++			bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
++		};
++
++		conf-pd {
++			pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
++			drive-strength = <MTK_DRIVE_8mA>;
++			bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
++		};
++	};
++};
++
++&spi0 {
++	pinctrl-names = "default";
++	pinctrl-0 = <&spi_flash_pins>;
++	status = "okay";
++
++	spi_nand_flash: flash at 0 {
++		#address-cells = <1>;
++		#size-cells = <1>;
++		compatible = "spi-nand";
++		reg = <0>;
++
++		spi-max-frequency = <20000000>;
++		spi-tx-bus-width = <4>;
++		spi-rx-bus-width = <4>;
++
++		partitions {
++			#address-cells = <1>;
++			#size-cells = <1>;
++			compatible = "fixed-partitions";
++
++			partition at 0 {
++				label = "BL2";
++				reg = <0x0 0x100000>;
++				read-only;
++			};
++
++			partition at 100000 {
++				label = "u-boot-env";
++				reg = <0x0100000 0x0080000>;
++			};
++
++			factory: partition at 180000 {
++				label = "Factory";
++				reg = <0x180000 0x200000>;
++			};
++
++			partition at 380000 {
++				label = "FIP";
++				reg = <0x380000 0x0200000>;
++			};
++
++			partition at 580000 {
++				label = "ubi";
++				reg = <0x580000 0x5000000>;
++			};
++
++			partition at 5580000 {
++				label = "facenv";
++				reg = <0x5580000 0x200000>;
++			};
++
++			partition at 5780000 {
++				label = "RAE";
++				reg = <0x5780000 0x600000>;
++			};
++
++			partition at 5D80000 {
++				label = "POT";
++				reg = <0x5D80000 0x020000>;
++			};
++
++			partition at 5DA0000 {
++				label = "LOG";
++				reg = <0x5DA0000 0x040000>;
++			};
++
++		};
++	};
++};
++
++&xhci {
++	status = "disabled";
++};
++
++&uart0 {
++	status = "okay";
++};
++
++&watchdog {
++	status = "okay";
++};
++
++&wifi {
++	status = "okay";
++	mediatek,mtd-eeprom = <&factory 0x0>;
++};
++
++&pcie {
++	status = "disabled";
++};
+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 7e4512f30f..785ddecffa 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
+@@ -115,6 +115,17 @@ netcore,n60-pro)
+	ucidef_set_led_netdev "wanact" "WANACT" "mdio-bus:06:green:wan" "eth1" "tx rx"
+	ucidef_set_led_netdev "wanlink" "WANLINK" "blue:wan" "eth1" "link"
+	;;
++netgear,eax17)
++	ucidef_set_led_default power_green "Power (green)" green:power 1
++	ucidef_set_led_default power_red   "Power (red)"   red:power   0
++	ucidef_set_led_default rlink_red   "Client (red)"  red:lan     0
++	ucidef_set_led_default clink_red   "Router (red)"  red:wan     0
++	ucidef_set_led_wps     wps_green   "WPS (green)"   green:wps
++	ucidef_set_led_netdev  lan_speed_fast  "LAN Link (green)"     green:status  eth0
++	uci -q set system.lan_speed_fast.mode='link'
++	ucidef_set_led_netdev  lan_speed_slow  "LAN Activity (yellow)" yellow:status eth0
++	uci -q set system.lan_speed_slow.mode='tx rx'
++	;;
+ netgear,wax220)
+	ucidef_set_led_netdev "eth0" "LAN" "green:lan" "eth0"
+	;;
+diff --git a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
+index 95af3b04e3..c242397ca6 100644
+--- a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
++++ b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
+@@ -99,6 +99,13 @@ mediatek_setup_interfaces()
+	cudy,ap3000outdoor-v1|\
+	cudy,ap3000-v1|\
+	cudy,re3000-v1|\
++	netgear,eax17|\
++	netgear,eax11v3|\
++	netgear,eax15v3|\
++	netgear,eax14v3|\
++	netgear,eax12v2|\
++	netgear,eax16|\
++	netgear,eax19|\
+	netgear,wax220|\
+	openfi,6c|\
+	ubnt,unifi-6-plus|\
+@@ -212,6 +219,16 @@ mediatek_setup_macs()
+		label_mac=$(get_mac_binary "/tmp/tp_data/default-mac" 0)
+		lan_mac=$label_mac
+		;;
++	netgear,eax17|\
++	netgear,eax11v3|\
++	netgear,eax15v3|\
++	netgear,eax14v3|\
++	netgear,eax12v2|\
++	netgear,eax16|\
++	netgear,eax19)
++		lan_mac=$(grep -aoE '([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}' /dev/ubi0_0 | head -n1)
++		label_mac=$lan_mac
++		;;
+	netgear,wax220)
+		lan_mac=$(mtd_get_mac_ascii u-boot-env mac)
+		label_mac=$lan_mac
+diff --git a/target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq b/target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq
+new file mode 100644
+index 0000000000..33b4c67f79
+--- /dev/null
++++ b/target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq
+@@ -0,0 +1,26 @@
++#!/bin/sh /etc/rc.common
++// SPDX-License-Identifier: (GPL-2.0 OR MIT)
++
++START=69
++USE_PROCD=1
++NAME=eax17-ledq
++start_service() {
++	procd_open_instance
++	procd_set_param command /bin/sh -c '
++GOOD=-60; OK=-75; BAD=-90
++on(){ echo 1 > "/sys/class/leds/$1/brightness"; }
++off(){ echo 0 > "/sys/class/leds/$1/brightness"; }
++set_color(){ g="green:$1"; r="red:$1"; case "$2" in off)off "$g";off "$r";; green)on "$g";off "$r";; amber)on "$g";on "$r";; red)off "$g";on "$r";; esac; }
++uplink_iface(){ iw dev 2>/dev/null | awk "/Interface/{i=\$2} /type managed/ {print i; exit}"; }
++best_client_dbm(){ for i in $(iw dev 2>/dev/null | awk "/Interface/{i=\$2} /type AP/ {print i}"); do iw dev "$i" station dump 2>/dev/null | awk "/signal:/ {print \$2}"; done | sort -nr | head -n1; }
++quality(){ v=$1; [ -z "$v" ] && { echo off; return; }; [ "$v" -ge "$GOOD" ] && { echo green; return; }; [ "$v" -ge "$OK" ] && { echo amber; return; }; [ "$v" -ge "$BAD" ] && { echo red; return; }; echo red; }
++while :; do
++  uplink_dbm=$(iw dev "$(uplink_iface)" link 2>/dev/null | awk "/signal:/ {print \$2}")
++  set_color wan "$(quality "$uplink_dbm")"
++  set_color lan "$(quality "$(best_client_dbm)")"
++  sleep 2
++done'
++	procd_set_param respawn 2000 1 0
++	procd_close_instance
++}
++
+diff --git a/target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq b/target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq
+new file mode 100644
+index 0000000000..b6d719c84b
+--- /dev/null
++++ b/target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq
+@@ -0,0 +1,6 @@
++#!/bin/sh
++// SPDX-License-Identifier: (GPL-2.0 OR MIT)
++
++/etc/init.d/eax17-ledq enable
++/etc/init.d/eax17-ledq start
++exit 0
+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 0e2e84c791..1e9d278c1e 100755
+--- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
++++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
+@@ -227,6 +227,17 @@ platform_do_upgrade() {
+		CI_ROOT_UBIPART=ubi
+		nand_do_upgrade "$1"
+		;;
++	netgear,eax17)
++		echo "UPGRADING SECOND SLOT"
++		CI_KERNPART="kernel2"
++		CI_ROOTPART="rootfs2"
++		nand_do_flash_file "$1" || nand_do_upgrade_failed
++		echo "UPGRADING PRIMARY SLOT"
++		CI_KERNPART="kernel"
++		CI_ROOTPART="rootfs"
++		nand_do_flash_file "$1" || nand_do_upgrade_failed
++		nand_do_upgrade_success
++		;;
+	*)
+		nand_do_upgrade "$1"
+		;;
+diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk
+index 908c63ef66..5c8d306df8 100644
+--- a/target/linux/mediatek/image/filogic.mk
++++ b/target/linux/mediatek/image/filogic.mk
+@@ -1718,6 +1718,40 @@ define Device/netcore_n60-pro
+ endef
+ TARGET_DEVICES += netcore_n60-pro
+
++define Device/netgear_eax17
++  DEVICE_VENDOR := NETGEAR
++  DEVICE_MODEL := EAX17
++  DEVICE_ALT0_VENDOR := NETGEAR
++  DEVICE_ALT0_MODEL := EAX11
++  DEVICE_ALT0_VARIANT := v3
++  DEVICE_ALT1_VENDOR := NETGEAR
++  DEVICE_ALT1_MODEL := EAX15
++  DEVICE_ALT1_VARIANT := v3
++  DEVICE_ALT2_VENDOR := NETGEAR
++  DEVICE_ALT2_MODEL := EAX14
++  DEVICE_ALT2_VARIANT := v3
++  DEVICE_ALT3_VENDOR := NETGEAR
++  DEVICE_ALT3_MODEL := EAX12
++  DEVICE_ALT3_VARIANT := v2
++  DEVICE_ALT4_VENDOR := NETGEAR
++  DEVICE_ALT4_MODEL := EAX16
++  DEVICE_ALT5_VENDOR := NETGEAR
++  DEVICE_ALT5_MODEL := EAX19
++  DEVICE_DTS := mt7981b-netgear-eax17
++  DEVICE_DTS_DIR := ../dts
++  SUPPORTED_DEVICES += mediatek,mt7981-spim-snand-rfb
++  UBINIZE_OPTS := -E 5
++  BLOCKSIZE := 128k
++  PAGESIZE := 2048
++  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware
++  KERNEL = kernel-bin | lzma | \
++	fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-netgear-rootfs-node
++  KERNEL_IN_UBI := 1
++  IMAGE_SIZE := 81920k
++  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
++endef
++TARGET_DEVICES += netgear_eax17
++
+ define Device/netgear_wax220
+   DEVICE_VENDOR := NETGEAR
+   DEVICE_MODEL := WAX220
+--
+2.39.5
diff --git a/scripts/mkits.sh b/scripts/mkits.sh
index 46ab5ee023..047034d5ab 100755
--- a/scripts/mkits.sh
+++ b/scripts/mkits.sh
@@ -31,6 +31,7 @@ usage() {
 	printf "\n\t-n ==> fdt unit-address 'address'"
 	printf "\n\t-d ==> include Device Tree Blob 'dtb'"
 	printf "\n\t-r ==> include RootFS blob 'rootfs'"
+	printf "\n\t-R ==> include Netgear style top level RootFS blob 'rootfs'"
 	printf "\n\t-H ==> specify hash algo instead of SHA1"
 	printf "\n\t-l ==> legacy mode character (@ etc otherwise -)"
 	printf "\n\t-o ==> create output file 'its_file'"
@@ -49,7 +50,7 @@ LOADABLES=
 DTOVERLAY=
 DTADDR=
 
-while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:s:H:" OPTION
+while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:R:s:H:" OPTION
 do
 	case $OPTION in
 		A ) ARCH=$OPTARG;;
@@ -67,6 +68,7 @@ do
 		o ) OUTPUT=$OPTARG;;
 		O ) DTOVERLAY="$DTOVERLAY ${OPTARG}";;
 		r ) ROOTFS=$OPTARG;;
+		R ) ROOTFS_FILE=$OPTARG;;
 		s ) FDTADDR=$OPTARG;;
 		H ) HASH=$OPTARG;;
 		v ) VERSION=$OPTARG;;
@@ -156,6 +158,32 @@ if [ -n "${ROOTFS}" ]; then
 	LOADABLES="${LOADABLES:+$LOADABLES, }\"rootfs${REFERENCE_CHAR}${ROOTFSNUM}\""
 fi
 
+if [ -f "${ROOTFS_FILE}" ]; then
+	ROOTFS_SIZE=$(stat -c %s ${ROOTFS_FILE})
+
+	ROOTFS_SHA1=$(
+	sha1sum "${ROOTFS_FILE}" | \
+	awk '{
+		print "<0x" substr($0, 1, 8) \
+		      " 0x" substr($0, 9, 8) \
+		      " 0x" substr($0, 17, 8) \
+		      " 0x" substr($0, 25, 8) \
+		      " 0x" substr($0, 33, 8) ">"
+		}'
+	)
+
+	TOP_LEVEL_ROOTFS="
+	rootfs {
+		size = <${ROOTFS_SIZE}>;
+
+		hash-1 {
+			value = ${ROOTFS_SHA1};
+			algo = \"sha1\";
+		};
+	};
+"
+fi
+
 # add DT overlay blobs
 FDTOVERLAY_NODE=""
 OVCONFIGS=""
@@ -222,6 +250,8 @@ ${FDTOVERLAY_NODE}
 ${ROOTFS_NODE}
 	};
 
+${TOP_LEVEL_ROOTFS}
+
 	configurations {
 		default = \"${CONFIG}\";
 		${CONFIG} {
diff --git a/target/linux/mediatek/dts/mt7981b-netgear-eax17.dts b/target/linux/mediatek/dts/mt7981b-netgear-eax17.dts
new file mode 100644
index 0000000000..6dfa8c5b90
--- /dev/null
+++ b/target/linux/mediatek/dts/mt7981b-netgear-eax17.dts
@@ -0,0 +1,236 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+/dts-v1/;
+#include "mt7981b.dtsi"
+
+/ {
+	model = "Netgear EAX17";
+	compatible = "netgear,eax17", "mediatek,mt7981-spim-snand-rfb";
+
+	aliases {
+		led-boot = &led_power_green;
+		led-failsafe = &led_power_red;
+		led-running = &led_power_green;
+		led-upgrade = &led_power_red;
+		serial0 = &uart0;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+
+	memory at 40000000 {
+		reg = <0 0x40000000 0 0x20000000>;
+		device_type = "memory";
+	};
+
+	gpio-keys {
+		compatible = "gpio-keys";
+
+		reset {
+			label = "reset";
+			linux,code = <KEY_RESTART>;
+			gpios = <&pio 1 GPIO_ACTIVE_LOW>;
+		};
+
+		wps {
+			label = "wps";
+			linux,code = <KEY_WPS_BUTTON>;
+			gpios = <&pio 0 GPIO_ACTIVE_LOW>;
+		};
+	};
+
+	gpio-leds {
+		compatible = "gpio-leds";
+
+		led_power_green: power_green {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_POWER;
+			gpios = <&pio 9 GPIO_ACTIVE_LOW>;
+		};
+
+		led_power_red: power_red {
+			color = <LED_COLOR_ID_RED>;
+			function = LED_FUNCTION_POWER;
+			gpios = <&pio 12 GPIO_ACTIVE_LOW>;
+		};
+
+		led_rlink_red: rlink_red {
+			color = <LED_COLOR_ID_RED>;
+			function = LED_FUNCTION_LAN;
+			gpios = <&pio 6 GPIO_ACTIVE_LOW>;
+		};
+
+		led_rlink_green: rlink_green {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_LAN;
+			gpios = <&pio 7 GPIO_ACTIVE_LOW>;
+		};
+
+		led_clink_red: clink_red {
+			color = <LED_COLOR_ID_RED>;
+			function = LED_FUNCTION_WAN;
+			gpios = <&pio 10 GPIO_ACTIVE_LOW>;
+		};
+
+		led_clink_green: clink_green {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_WAN;
+			gpios = <&pio 11 GPIO_ACTIVE_LOW>;
+		};
+
+		led_wps_green: wps_green {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_WPS;
+			gpios = <&pio 5 GPIO_ACTIVE_LOW>;
+		};
+
+		led_lan_speed_fast: lan_speed_fast {
+			color = <LED_COLOR_ID_GREEN>;
+			function = LED_FUNCTION_STATUS;
+			gpios = <&pio 13 GPIO_ACTIVE_LOW>;
+		};
+
+		led_lan_speed_slow: lan_speed_slow {
+			color = <LED_COLOR_ID_YELLOW>;
+			function = LED_FUNCTION_STATUS;
+			gpios = <&pio 8 GPIO_ACTIVE_LOW>;
+		};
+
+	};
+
+};
+
+&eth {
+	status = "okay";
+
+	gmac0: mac at 0 {
+		compatible = "mediatek,eth-mac";
+		reg = <0>;
+		status = "disabled";
+	};
+
+	gmac1: mac at 1 {
+		compatible = "mediatek,eth-mac";
+		reg = <1>;
+		phy-mode = "gmii";
+		phy-handle = <&int_gbe_phy>;
+	};
+};
+
+
+&crypto {
+	status = "okay";
+};
+
+&pio {
+	spi_flash_pins: spi0-pins {
+		mux {
+			function = "spi";
+			groups = "spi0", "spi0_wp_hold";
+		};
+
+		conf-pu {
+			pins = "SPI0_CS", "SPI0_HOLD", "SPI0_WP";
+			drive-strength = <MTK_DRIVE_8mA>;
+			bias-pull-up = <MTK_PUPD_SET_R1R0_11>;
+		};
+
+		conf-pd {
+			pins = "SPI0_CLK", "SPI0_MOSI", "SPI0_MISO";
+			drive-strength = <MTK_DRIVE_8mA>;
+			bias-pull-down = <MTK_PUPD_SET_R1R0_11>;
+		};
+	};
+};
+
+&spi0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&spi_flash_pins>;
+	status = "okay";
+
+	spi_nand_flash: flash at 0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "spi-nand";
+		reg = <0>;
+
+		spi-max-frequency = <20000000>;
+		spi-tx-bus-width = <4>;
+		spi-rx-bus-width = <4>;
+
+		partitions {
+			#address-cells = <1>;
+			#size-cells = <1>;
+			compatible = "fixed-partitions";
+
+			partition at 0 {
+				label = "BL2";
+				reg = <0x0 0x100000>;
+				read-only;
+			};
+
+			partition at 100000 {
+				label = "u-boot-env";
+				reg = <0x0100000 0x0080000>;
+			};
+
+			factory: partition at 180000 {
+				label = "Factory";
+				reg = <0x180000 0x200000>;
+			};
+
+			partition at 380000 {
+				label = "FIP";
+				reg = <0x380000 0x0200000>;
+			};
+
+			partition at 580000 {
+				label = "ubi";
+				reg = <0x580000 0x5000000>;
+			};
+
+			partition at 5580000 {
+				label = "facenv";
+				reg = <0x5580000 0x200000>;
+			};
+
+			partition at 5780000 {
+				label = "RAE";
+				reg = <0x5780000 0x600000>;
+			};
+
+			partition at 5D80000 {
+				label = "POT";
+				reg = <0x5D80000 0x020000>;
+			};
+
+			partition at 5DA0000 {
+				label = "LOG";
+				reg = <0x5DA0000 0x040000>;
+			};
+
+		};
+	};
+};
+
+&xhci {
+	status = "disabled";
+};
+
+&uart0 {
+	status = "okay";
+};
+
+&watchdog {
+	status = "okay";
+};
+
+&wifi {
+	status = "okay";
+	mediatek,mtd-eeprom = <&factory 0x0>;
+};
+
+&pcie {
+	status = "disabled";
+};
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 7e4512f30f..785ddecffa 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
@@ -115,6 +115,17 @@ netcore,n60-pro)
 	ucidef_set_led_netdev "wanact" "WANACT" "mdio-bus:06:green:wan" "eth1" "tx rx"
 	ucidef_set_led_netdev "wanlink" "WANLINK" "blue:wan" "eth1" "link"
 	;;
+netgear,eax17)
+	ucidef_set_led_default power_green "Power (green)" green:power 1
+	ucidef_set_led_default power_red   "Power (red)"   red:power   0
+	ucidef_set_led_default rlink_red   "Client (red)"  red:lan     0
+	ucidef_set_led_default clink_red   "Router (red)"  red:wan     0
+	ucidef_set_led_wps     wps_green   "WPS (green)"   green:wps
+	ucidef_set_led_netdev  lan_speed_fast  "LAN Link (green)"     green:status  eth0
+	uci -q set system.lan_speed_fast.mode='link'
+	ucidef_set_led_netdev  lan_speed_slow  "LAN Activity (yellow)" yellow:status eth0
+	uci -q set system.lan_speed_slow.mode='tx rx'
+	;;
 netgear,wax220)
 	ucidef_set_led_netdev "eth0" "LAN" "green:lan" "eth0"
 	;;
diff --git a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
index 95af3b04e3..c242397ca6 100644
--- a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
+++ b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network
@@ -99,6 +99,13 @@ mediatek_setup_interfaces()
 	cudy,ap3000outdoor-v1|\
 	cudy,ap3000-v1|\
 	cudy,re3000-v1|\
+	netgear,eax17|\
+	netgear,eax11v3|\
+	netgear,eax15v3|\
+	netgear,eax14v3|\
+	netgear,eax12v2|\
+	netgear,eax16|\
+	netgear,eax19|\
 	netgear,wax220|\
 	openfi,6c|\
 	ubnt,unifi-6-plus|\
@@ -212,6 +219,16 @@ mediatek_setup_macs()
 		label_mac=$(get_mac_binary "/tmp/tp_data/default-mac" 0)
 		lan_mac=$label_mac
 		;;
+	netgear,eax17|\
+	netgear,eax11v3|\
+	netgear,eax15v3|\
+	netgear,eax14v3|\
+	netgear,eax12v2|\
+	netgear,eax16|\
+	netgear,eax19)
+		lan_mac=$(grep -aoE '([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}' /dev/ubi0_0 | head -n1)
+		label_mac=$lan_mac
+		;;
 	netgear,wax220)
 		lan_mac=$(mtd_get_mac_ascii u-boot-env mac)
 		label_mac=$lan_mac
diff --git a/target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq b/target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq
new file mode 100644
index 0000000000..4fdab0ebb8
--- /dev/null
+++ b/target/linux/mediatek/filogic/base-files/etc/init.d/eax17-ledq
@@ -0,0 +1,25 @@
+#!/bin/sh /etc/rc.common
+# SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+START=69
+USE_PROCD=1
+NAME=eax17-ledq
+start_service() {
+	procd_open_instance
+	procd_set_param command /bin/sh -c '
+GOOD=-60; OK=-75; BAD=-90
+on(){ echo 1 > "/sys/class/leds/$1/brightness"; }
+off(){ echo 0 > "/sys/class/leds/$1/brightness"; }
+set_color(){ g="green:$1"; r="red:$1"; case "$2" in off)off "$g";off "$r";; green)on "$g";off "$r";; amber)on "$g";on "$r";; red)off "$g";on "$r";; esac; }
+uplink_iface(){ iw dev 2>/dev/null | awk "/Interface/{i=\$2} /type managed/ {print i; exit}"; }
+best_client_dbm(){ for i in $(iw dev 2>/dev/null | awk "/Interface/{i=\$2} /type AP/ {print i}"); do iw dev "$i" station dump 2>/dev/null | awk "/signal:/ {print \$2}"; done | sort -nr | head -n1; }
+quality(){ v=$1; [ -z "$v" ] && { echo off; return; }; [ "$v" -ge "$GOOD" ] && { echo green; return; }; [ "$v" -ge "$OK" ] && { echo amber; return; }; [ "$v" -ge "$BAD" ] && { echo red; return; }; echo red; }
+while :; do
+  uplink_dbm=$(iw dev "$(uplink_iface)" link 2>/dev/null | awk "/signal:/ {print \$2}")
+  set_color wan "$(quality "$uplink_dbm")"
+  set_color lan "$(quality "$(best_client_dbm)")"
+  sleep 2
+done'
+	procd_set_param respawn 2000 1 0
+	procd_close_instance
+}
diff --git a/target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq b/target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq
new file mode 100644
index 0000000000..ba61b18f68
--- /dev/null
+++ b/target/linux/mediatek/filogic/base-files/etc/uci-defaults/99-eax17-ledq
@@ -0,0 +1,6 @@
+#!/bin/sh
+# SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+/etc/init.d/eax17-ledq enable
+/etc/init.d/eax17-ledq start
+exit 0
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 0e2e84c791..1e9d278c1e 100755
--- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
@@ -227,6 +227,17 @@ platform_do_upgrade() {
 		CI_ROOT_UBIPART=ubi
 		nand_do_upgrade "$1"
 		;;
+	netgear,eax17)
+		echo "UPGRADING SECOND SLOT"
+		CI_KERNPART="kernel2"
+		CI_ROOTPART="rootfs2"
+		nand_do_flash_file "$1" || nand_do_upgrade_failed
+		echo "UPGRADING PRIMARY SLOT"
+		CI_KERNPART="kernel"
+		CI_ROOTPART="rootfs"
+		nand_do_flash_file "$1" || nand_do_upgrade_failed
+		nand_do_upgrade_success
+		;;
 	*)
 		nand_do_upgrade "$1"
 		;;
diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk
index 908c63ef66..5c8d306df8 100644
--- a/target/linux/mediatek/image/filogic.mk
+++ b/target/linux/mediatek/image/filogic.mk
@@ -1718,6 +1718,40 @@ define Device/netcore_n60-pro
 endef
 TARGET_DEVICES += netcore_n60-pro
 
+define Device/netgear_eax17
+  DEVICE_VENDOR := NETGEAR
+  DEVICE_MODEL := EAX17
+  DEVICE_ALT0_VENDOR := NETGEAR
+  DEVICE_ALT0_MODEL := EAX11
+  DEVICE_ALT0_VARIANT := v3
+  DEVICE_ALT1_VENDOR := NETGEAR
+  DEVICE_ALT1_MODEL := EAX15
+  DEVICE_ALT1_VARIANT := v3
+  DEVICE_ALT2_VENDOR := NETGEAR
+  DEVICE_ALT2_MODEL := EAX14
+  DEVICE_ALT2_VARIANT := v3
+  DEVICE_ALT3_VENDOR := NETGEAR
+  DEVICE_ALT3_MODEL := EAX12
+  DEVICE_ALT3_VARIANT := v2
+  DEVICE_ALT4_VENDOR := NETGEAR
+  DEVICE_ALT4_MODEL := EAX16
+  DEVICE_ALT5_VENDOR := NETGEAR
+  DEVICE_ALT5_MODEL := EAX19
+  DEVICE_DTS := mt7981b-netgear-eax17
+  DEVICE_DTS_DIR := ../dts
+  SUPPORTED_DEVICES += mediatek,mt7981-spim-snand-rfb
+  UBINIZE_OPTS := -E 5
+  BLOCKSIZE := 128k
+  PAGESIZE := 2048
+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware
+  KERNEL = kernel-bin | lzma | \
+	fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-netgear-rootfs-node
+  KERNEL_IN_UBI := 1
+  IMAGE_SIZE := 81920k
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+endef
+TARGET_DEVICES += netgear_eax17
+
 define Device/netgear_wax220
   DEVICE_VENDOR := NETGEAR
   DEVICE_MODEL := WAX220
-- 
2.39.5




More information about the openwrt-devel mailing list