[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>;
++ };
++
++ };
++
++};
++
++ð {
++ 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>;
+ };
+
+ };
+
+};
+
+ð {
+ 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