From 6f216b1eadfcc3be1719d45a93d6f39d31fb1e38 Mon Sep 17 00:00:00 2001
From: Nico <github@nicoboehr.de>
Date: Tue, 29 Oct 2024 16:18:46 +0000
Subject: [PATCH] mediatek: filogic: add support for Cudy AP3000 Outdoor v1

---
 .../luasrc/usr/lib/lua/gluon/platform.lua     |   5 +
 ...-add-support-for-Cudy-AP3000-Outdoor.patch | 307 ++++++++++++++++++
 targets/mediatek-filogic                      |   4 +
 3 files changed, 316 insertions(+)
 create mode 100644 patches/openwrt/0011-mediatek-filogic-add-support-for-Cudy-AP3000-Outdoor.patch

diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua
index 014e516c4..2c98a9ee7 100644
--- a/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua
+++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua
@@ -69,6 +69,11 @@ function M.is_outdoor_device()
 		'zyxel,nwa55axe',
 	}) then
 		return true
+
+	elseif M.match('mediatek', 'filogic', {
+		'cudy,ap3000outdoor-v1',
+	}) then
+		return true
 	end
 
 	return false
diff --git a/patches/openwrt/0011-mediatek-filogic-add-support-for-Cudy-AP3000-Outdoor.patch b/patches/openwrt/0011-mediatek-filogic-add-support-for-Cudy-AP3000-Outdoor.patch
new file mode 100644
index 000000000..3324b8606
--- /dev/null
+++ b/patches/openwrt/0011-mediatek-filogic-add-support-for-Cudy-AP3000-Outdoor.patch
@@ -0,0 +1,307 @@
+From: Pawel Dembicki <paweldembicki@gmail.com>
+Date: Sun, 4 Aug 2024 22:47:47 +0200
+Subject: mediatek: filogic: add support for Cudy AP3000 Outdoor
+
+Hardware highlights:
+  - MediaTek MT7981 WiSoC
+  - 256MB DDR3 RAM
+  - 64MB SPI-NAND
+  - MediaTek MT7981 2x2 DBDC 802.11ax 2T2R (2.4 / 5)
+  - 1x LED in two colors
+  - 2x Button
+  - 1x 1GbE
+  - Two detachable antenas, two internal pcb antenas
+  - PoE powered (standalone)
+
+MAC:
+LAN MAC: label mac
+2.4G MAC: label mac -1
+5G MAC: label mac
+
+How to install:
+1. Apply Cudy Intermediate OpenWrt image for AP3000 Outdoor V1
+2. Install OpenWrt sysupgrade image
+
+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
+Link: https://github.com/openwrt/openwrt/pull/16156
+Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+
+diff --git a/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface b/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface
+index 6dfa52c291146183c67bc4b1813b48cd9bf0d7dc..8e74c577cd505bbf8b2109d8f34fe8013887dc1e 100644
+--- a/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface
++++ b/target/linux/mediatek/base-files/lib/preinit/05_set_preinit_iface
+@@ -6,6 +6,7 @@ set_preinit_iface() {
+ 		ip link set eth1 up
+ 		ifname=eth1
+ 		;;
++	cudy,ap3000outdoor-v1|\
+ 	cudy,re3000-v1|\
+ 	ubnt,unifi-6-lr|\
+ 	zyxel,nwa50ax-pro)
+diff --git a/target/linux/mediatek/dts/mt7981b-cudy-ap3000outdoor-v1.dts b/target/linux/mediatek/dts/mt7981b-cudy-ap3000outdoor-v1.dts
+new file mode 100644
+index 0000000000000000000000000000000000000000..62e406394755ac6ef5722e4070553a24261e88a7
+--- /dev/null
++++ b/target/linux/mediatek/dts/mt7981b-cudy-ap3000outdoor-v1.dts
+@@ -0,0 +1,209 @@
++// SPDX-License-Identifier: (GPL-2.0 OR MIT)
++
++/dts-v1/;
++
++#include <dt-bindings/leds/common.h>
++
++#include "mt7981.dtsi"
++
++/ {
++	model = "Cudy AP3000 Outdoor v1";
++	compatible = "cudy,ap3000outdoor-v1", "mediatek,mt7981-spim-snand-rfb";
++
++	aliases {
++		label-mac-device = &gmac1;
++		led-boot = &led_status_green;
++		led-failsafe = &led_status_red;
++		led-running = &led_status_green;
++		led-upgrade = &led_status_red;
++		serial0 = &uart0;
++	};
++
++	chosen {
++		stdout-path = "serial0:115200n8";
++	};
++
++	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>;
++		};
++	};
++
++	leds {
++		compatible = "gpio-leds";
++
++		led_status_green: led@0 {
++			function = LED_FUNCTION_STATUS;
++			color = <LED_COLOR_ID_GREEN>;
++			gpios = <&pio 10 GPIO_ACTIVE_HIGH>;
++		};
++
++		led_status_red: led_1 {
++			function = LED_FUNCTION_POWER;
++			color = <LED_COLOR_ID_RED>;
++			gpios = <&pio 11 GPIO_ACTIVE_HIGH>;
++		};
++	};
++	gpio_export {
++		compatible = "gpio-export";
++		#size-cells = <0>;
++
++		antctrl {
++			/* Not sure if this pin does anything.
++			 * It was taken from GPL sources.
++			 * Intermediate image doesn't have it.
++			 */
++			gpio-export,name = "antctrl";
++			gpio-export,output = <1>;
++			gpios = <&pio 7 GPIO_ACTIVE_HIGH>;
++		};
++	};
++
++	watchdog-hw {
++		compatible = "linux,wdt-gpio";
++		gpios = <&pio 6 GPIO_ACTIVE_HIGH>;
++		hw_algo = "level";
++		hw_margin_ms = <10000>;
++		always-running;
++	};
++};
++
++&uart0 {
++	status = "okay";
++};
++
++&watchdog {
++	status = "okay";
++};
++
++&eth {
++	pinctrl-names = "default";
++	pinctrl-0 = <&mdio_pins>;
++
++	status = "okay";
++
++	gmac1: mac@1 {
++		compatible = "mediatek,eth-mac";
++		reg = <1>;
++		phy-mode = "gmii";
++		phy-handle = <&int_gbe_phy>;
++		nvmem-cell-names = "mac-address";
++		nvmem-cells = <&macaddr_bdinfo_de00 1>;
++	};
++};
++
++&spi0 {
++	pinctrl-names = "default";
++	pinctrl-0 = <&spi0_flash_pins>;
++	status = "okay";
++
++	spi_nand: flash@0 {
++		#address-cells = <1>;
++		#size-cells = <1>;
++		compatible = "spi-nand";
++		reg = <0>;
++		spi-max-frequency = <52000000>;
++
++		spi-cal-enable;
++		spi-cal-mode = "read-data";
++		spi-cal-datalen = <7>;
++		spi-cal-data = /bits/ 8 <0x53 0x50 0x49 0x4E 0x41 0x4E 0x44>;
++		spi-cal-addrlen = <5>;
++		spi-cal-addr = /bits/ 32 <0x0 0x0 0x0 0x0 0x0>;
++
++		spi-tx-bus-width = <4>;
++		spi-rx-bus-width = <4>;
++		mediatek,nmbm;
++		mediatek,bmt-max-ratio = <1>;
++		mediatek,bmt-max-reserved-blocks = <64>;
++
++		partitions {
++			compatible = "fixed-partitions";
++			#address-cells = <1>;
++			#size-cells = <1>;
++
++			partition@0 {
++				label = "BL2";
++				reg = <0x00000 0x0100000>;
++				read-only;
++			};
++
++			partition@100000 {
++				label = "u-boot-env";
++				reg = <0x0100000 0x0080000>;
++				read-only;
++			};
++
++			factory: partition@180000 {
++				label = "Factory";
++				reg = <0x180000 0x0200000>;
++				read-only;
++				nvmem-layout {
++					compatible = "fixed-layout";
++					#address-cells = <1>;
++					#size-cells = <1>;
++
++					eeprom_factory_0: eeprom@0 {
++						reg = <0x0 0x1000>;
++					};
++				};
++			};
++
++			partition@380000 {
++				label = "bdinfo";
++				reg = <0x380000 0x0040000>;
++				read-only;
++				nvmem-layout {
++					compatible = "fixed-layout";
++					#address-cells = <1>;
++					#size-cells = <1>;
++
++					macaddr_bdinfo_de00: macaddr@de00 {
++						compatible = "mac-base";
++						reg = <0xde00 0x6>;
++						#nvmem-cell-cells = <1>;
++					};
++				};
++
++			};
++
++			partition@3C0000 {
++				label = "FIP";
++				reg = <0x3C0000 0x0200000>;
++				read-only;
++			};
++
++			partition@580000 {
++				label = "ubi";
++				reg = <0x5C0000 0x4000000>;
++				compatible = "linux,ubi";
++			};
++		};
++	};
++};
++
++
++&pio {
++	spi0_flash_pins: spi0-pins {
++		mux {
++			function = "spi";
++			groups = "spi0", "spi0_wp_hold";
++		};
++	};
++};
++
++&wifi {
++	status = "okay";
++	nvmem-cells = <&eeprom_factory_0>;
++	nvmem-cell-names = "eeprom";
++};
+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 e8ce84dd4b7648e35d6f67f3bfc0287c3c30c584..e61cbea700414326e88fda2c9d80101fee4500ae 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
+@@ -70,6 +70,7 @@ mediatek_setup_interfaces()
+ 	mercusys,mr90x-v1)
+ 		ucidef_set_interfaces_lan_wan "lan0 lan1 lan2" eth1
+ 		;;
++	cudy,ap3000outdoor-v1|\
+ 	cudy,re3000-v1|\
+ 	netgear,wax220|\
+ 	ubnt,unifi-6-plus|\
+diff --git a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
+index 053d8e09cdff1df9c49b824529062a0c17c5b7dd..515d341ff4cf57466e2869ad6faeb82ac0318ca6 100644
+--- a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
++++ b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
+@@ -67,6 +67,7 @@ case "$board" in
+ 		[ "$PHYNBR" = "0" ] && echo "$addr" > /sys${DEVPATH}/macaddress
+ 		[ "$PHYNBR" = "1" ] && macaddr_setbit_la $(macaddr_add $addr 1) > /sys${DEVPATH}/macaddress
+ 		;;
++	cudy,ap3000outdoor-v1|\
+ 	cudy,m3000-v1|\
+ 	cudy,wr3000-v1)
+ 		addr=$(mtd_get_mac_binary bdinfo 0xde00)
+diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk
+index 88b279140c4b500c4cf86b99b2332fca389c5a85..b8636ac90a3eb9d749b80d01babc9bafbd36b680 100644
+--- a/target/linux/mediatek/image/filogic.mk
++++ b/target/linux/mediatek/image/filogic.mk
+@@ -360,6 +360,23 @@ define Device/confiabits_mt7981
+ endef
+ TARGET_DEVICES += confiabits_mt7981
+ 
++define Device/cudy_ap3000outdoor-v1
++  DEVICE_VENDOR := Cudy
++  DEVICE_MODEL := AP3000 Outdoor
++  DEVICE_VARIANT := v1
++  DEVICE_DTS := mt7981b-cudy-ap3000outdoor-v1
++  DEVICE_DTS_DIR := ../dts
++  SUPPORTED_DEVICES += R51
++  UBINIZE_OPTS := -E 5
++  BLOCKSIZE := 128k
++  PAGESIZE := 2048
++  IMAGE_SIZE := 65536k
++  KERNEL_IN_UBI := 1
++  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
++  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware
++endef
++TARGET_DEVICES += cudy_ap3000outdoor-v1
++
+ define Device/cudy_m3000-v1
+   DEVICE_VENDOR := Cudy
+   DEVICE_MODEL := M3000
diff --git a/targets/mediatek-filogic b/targets/mediatek-filogic
index 9165148b9..c61bc5fd5 100644
--- a/targets/mediatek-filogic
+++ b/targets/mediatek-filogic
@@ -11,6 +11,10 @@ device('asus-tuf-ax6000', 'asus_tuf-ax6000', {
 
 -- Cudy
 
+device('cudy-ap3000outdoor-v1', 'cudy_ap3000outdoor-v1', {
+	factory = false,
+})
+
 device('cudy-wr3000-v1', 'cudy_wr3000-v1', {
 	factory = false,
 })
-- 
GitLab