]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
mediatek: add support for Airpi AP3000M 21601/head
authorFil Dunsky <filipp.dunsky@gmail.com>
Sat, 3 Jan 2026 22:00:14 +0000 (01:00 +0300)
committerHauke Mehrtens <hauke@hauke-m.de>
Tue, 20 Jan 2026 00:49:24 +0000 (01:49 +0100)
This adds support for the Airpi AP3000M 5G CPE based on MediaTek MT7981B.

Specifications:

SoC: MediaTek MT7981B (dual-core ARM Cortex-A53)
RAM: 1GB DDR4
Storage: 8GB or 16GB eMMC
Ethernet: 1x 2.5GbE LAN, 1x 1GbE WAN
Wireless: 2.4GHz/5GHz 802.11ax
Buttons: Reset, WPS
LEDs: System, 2.4GHz WiFi, 5GHz WiFi
Cooling: PWM-controlled fan
Expansion: M.2 slot for 5G modem

The factory partition (mmcblk0p2) is empty in stock firmware.
Execute via SSH before flashing OpenWrt:
```
dd if=/lib/firmware/MT7981_iPAiLNA_EEPROM.bin of=/dev/mmcblk0p2 bs=4k count=1
MAC addresses
```
Fixed MAC addresses are derived by macaddr_generate_from_mmc_cid.

Installation via U-Boot web page

Set static IP 192.168.88.2/255.255.255.0 on your computer.
Connect to the 1GbE port (WAN) and hold the reset button while booting the device. Wait for about 6 seconds, and release the reset button.
Open U-boot web page on your browser at http://192.168.88.1
Select the OpenWRT sysupgrade image, upload it, and start the upgrade.
Wait for automatic reboot.
Installation via sysupgrade

Flash the sysupgrade file via LuCI upgrade page without saving the settings.

Signed-off-by: Fil Dunsky <filipp.dunsky@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21397
(cherry picked from commit: 6ff4557317139cc02003db9d058f4d9d6ba859ce)
Link: https://github.com/openwrt/openwrt/pull/21601
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/mediatek/dts/mt7981b-airpi-ap3000m.dts [new file with mode: 0644]
target/linux/mediatek/filogic/base-files/etc/board.d/01_leds
target/linux/mediatek/filogic/base-files/etc/board.d/02_network
target/linux/mediatek/filogic/base-files/etc/hotplug.d/ieee80211/11_fix_wifi_mac
target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh
target/linux/mediatek/image/filogic.mk

diff --git a/target/linux/mediatek/dts/mt7981b-airpi-ap3000m.dts b/target/linux/mediatek/dts/mt7981b-airpi-ap3000m.dts
new file mode 100644 (file)
index 0000000..c17e803
--- /dev/null
@@ -0,0 +1,222 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+#include "mt7981b.dtsi"
+
+/ {
+       model = "Airpi AP3000M";
+       compatible = "airpi,ap3000m", "mediatek,mt7981";
+
+       aliases {
+               ethernet0 = &gmac0;
+               ethernet1 = &gmac1;
+               serial0 = &uart0;
+
+               led-boot = &led_sys_blue;
+               led-failsafe = &led_sys_blue;
+               led-running = &led_sys_blue;
+               led-upgrade = &led_sys_blue;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+               bootargs = "root=PARTLABEL=rootfs rootwait";
+       };
+
+       memory {
+               reg = <0 0x40000000 0 0x40000000>;
+               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_sys_blue: led-0 {
+                       function = LED_FUNCTION_STATUS;
+                       color = <LED_COLOR_ID_BLUE>;
+                       gpios = <&pio 13 GPIO_ACTIVE_LOW>;
+               };
+
+               led-1 {
+                       function = LED_FUNCTION_WLAN_2GHZ;
+                       color = <LED_COLOR_ID_ORANGE>;
+                       gpios = <&pio 34 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy0tpt";
+               };
+
+               led-2 {
+                       function = LED_FUNCTION_WLAN_5GHZ;
+                       color = <LED_COLOR_ID_WHITE>;
+                       gpios = <&pio 35 GPIO_ACTIVE_LOW>;
+                       linux,default-trigger = "phy1tpt";
+               };
+       };
+
+       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;
+       };
+};
+
+&mmc0 {
+       pinctrl-names = "default", "state_uhs";
+       pinctrl-0 = <&mmc0_pins_default>;
+       pinctrl-1 = <&mmc0_pins_uhs>;
+       bus-width = <8>;
+       cap-mmc-highspeed;
+       max-frequency = <52000000>;
+       vmmc-supply = <&reg_3p3v>;
+       no-sd;
+       no-sdio;
+       non-removable;
+       status = "okay";
+
+       card@0 {
+               compatible = "mmc-card";
+               reg = <0>;
+
+               block {
+                       compatible = "block-device";
+
+                       partitions {
+                               block-partition-factory {
+                                       partname = "factory";
+
+                                       nvmem-layout {
+                                               compatible = "fixed-layout";
+                                               #address-cells = <1>;
+                                               #size-cells = <1>;
+
+                                               eeprom_factory_0: eeprom@0 {
+                                                       reg = <0x0 0x1000>;
+                                               };
+                                       };
+                               };
+                       };
+               };
+       };
+};
+
+&eth {
+       pinctrl-names = "default";
+       pinctrl-0 = <&mdio_pins>;
+       status = "okay";
+
+       gmac0: mac@0 {
+               compatible = "mediatek,eth-mac";
+               reg = <0>;
+               phy-mode = "2500base-x";
+               phy-handle = <&phy1>;
+       };
+
+       gmac1: mac@1 {
+               compatible = "mediatek,eth-mac";
+               reg = <1>;
+               phy-mode = "gmii";
+               phy-handle = <&int_gbe_phy>;
+       };
+};
+
+&mdio_bus {
+       phy1: ethernet-phy@1 {
+               compatible = "ethernet-phy-ieee802.3-c45";
+               reg = <1>;
+               reset-assert-us = <100000>;
+               reset-deassert-us = <100000>;
+               reset-gpios = <&pio 39 GPIO_ACTIVE_LOW>;
+               interrupts = <38 IRQ_TYPE_LEVEL_LOW>;
+               interrupt-parent = <&pio>;
+               realtek,aldps-enable;
+       };
+};
+
+&pio {
+       mmc0_pins_default: mmc0-pins-default {
+               mux {
+                       function = "flash";
+                       groups = "emmc_45";
+               };
+       };
+
+       mmc0_pins_uhs: mmc0-pins-uhs {
+               mux {
+                       function = "flash";
+                       groups = "emmc_45";
+               };
+       };
+
+       pwm2_pins: pwm2-pins {
+               mux {
+                       function = "pwm";
+                       groups = "pwm2";
+               };
+       };
+};
+
+&pwm {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pwm2_pins>;
+       status = "okay";
+};
+
+&fan {
+       pwms = <&pwm 2 40000 0>;
+       status = "okay";
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&usb_phy {
+       status = "okay";
+};
+
+&watchdog {
+       status = "okay";
+};
+
+&xhci {
+       vbus-supply = <&reg_5v>;
+       status = "okay";
+};
+
+&wifi {
+       nvmem-cells = <&eeprom_factory_0>;
+       nvmem-cell-names = "eeprom";
+       status = "okay";
+};
index 7384132ceadfedfba96975f8212b394788688df1..fc353de948db38a950239677889234fd19997bc4 100644 (file)
@@ -6,6 +6,10 @@ board=$(board_name)
 board_config_update
 
 case $board in
+airpi,ap3000m)
+       ucidef_set_led_netdev "wlan2g" "WLAN2G" "orange:wlan-2ghz" "phy0-ap0" "link tx rx"
+       ucidef_set_led_netdev "wlan5g" "WLAN5G" "white:wlan-5ghz" "phy1-ap0" "link tx rx"
+       ;;
 abt,asr3000)
        ucidef_set_led_netdev "wan" "WAN" "green:wan" "eth1"
        ucidef_set_led_netdev "wlan2g" "WLAN2G" "green:wlan-2ghz" "phy0-ap0"
index 165cc47a95b4c83883a9d2baf5a7071b1d416696..9e6b063b9835e4a9ca708068d2ced768bc561c39 100644 (file)
@@ -88,12 +88,6 @@ mediatek_setup_interfaces()
        bananapi,bpi-r3)
                ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 sfp2" "sfp1 wan"
                ;;
-       bananapi,bpi-r3-mini|\
-       edgecore,eap111|\
-       huasifei,wh3000|\
-       huasifei,wh3000-pro)
-               ucidef_set_interfaces_lan_wan eth0 eth1
-               ;;
        bananapi,bpi-r4)
                ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 sfp-lan" "wan sfp-wan"
                ;;
@@ -120,6 +114,13 @@ mediatek_setup_interfaces()
        zyxel,nwa50ax-pro)
                ucidef_set_interface_lan "eth0"
                ;;
+       airpi,ap3000m|\
+       bananapi,bpi-r3-mini|\
+       edgecore,eap111|\
+       huasifei,wh3000|\
+       huasifei,wh3000-pro)
+               ucidef_set_interfaces_lan_wan eth0 eth1
+               ;;
        cudy,m3000-v1|\
        cudy,tr3000-256mb-v1|\
        cudy,tr3000-v1|\
@@ -206,6 +207,11 @@ mediatek_setup_macs()
        local label_mac=""
 
        case $board in
+       airpi,ap3000m)
+               base_mac=$(macaddr_generate_from_mmc_cid mmcblk0)
+               lan_mac="$base_mac"
+               wan_mac="$(macaddr_add "$base_mac" 1)"
+               ;;
        acer,predator-w6|\
        acer,predator-w6d|\
        acer,vero-w6m)
index 6aa77399890951a3dc56b13da5ac1777b6093b0a..89d532b675f936588404ca558cfa2f942b8d249a 100644 (file)
@@ -33,6 +33,11 @@ case "$board" in
                [ "$PHYNBR" = "0" ] && macaddr_add $hw_mac_addr 2 > /sys${DEVPATH}/macaddress
                [ "$PHYNBR" = "1" ] && macaddr_add $hw_mac_addr 3 > /sys${DEVPATH}/macaddress
                ;;
+       airpi,ap3000m)
+               base_mac=$(macaddr_generate_from_mmc_cid mmcblk0)
+               [ "$PHYNBR" = "0" ] && macaddr_add $base_mac 2 > /sys${DEVPATH}/macaddress
+               [ "$PHYNBR" = "1" ] && macaddr_add $base_mac 3 > /sys${DEVPATH}/macaddress
+               ;;
        asus,rt-ax59u)
                CI_UBIPART="UBI_DEV"
                addr=$(mtd_get_mac_binary_ubi "Factory" 0x4)
index 5cb317b4f8a53b8f2a5f2b6502edd3eaa145c1eb..741bf7880cb1165c10f69d3e4cb31471492e1d94 100755 (executable)
@@ -124,6 +124,7 @@ platform_do_upgrade() {
        acer,predator-w6|\
        acer,predator-w6d|\
        acer,vero-w6m|\
+       airpi,ap3000m|\
        arcadyan,mozart|\
        glinet,gl-mt2500|\
        glinet,gl-mt6000|\
@@ -345,6 +346,7 @@ platform_copy_config() {
        acer,predator-w6|\
        acer,predator-w6d|\
        acer,vero-w6m|\
+       airpi,ap3000m|\
        arcadyan,mozart|\
        glinet,gl-mt2500|\
        glinet,gl-mt6000|\
index ec509fdd61c1449f5e5be173ea919093142978b4..c0596f1306966659ada1ee13af5c4fd6ad77d1ca 100644 (file)
@@ -348,6 +348,20 @@ $(call Device/adtran_smartrg)
 endef
 TARGET_DEVICES += smartrg_sdg-8734
 
+define Device/airpi_ap3000m
+  DEVICE_VENDOR := Airpi
+  DEVICE_MODEL := AP3000M
+  DEVICE_DTS := mt7981b-airpi-ap3000m
+  DEVICE_DTS_DIR := ../dts
+  DEVICE_PACKAGES := kmod-mt7915e kmod-mt7981-firmware mt7981-wo-firmware \
+       kmod-hwmon-pwmfan kmod-usb3 f2fsck mkf2fs
+  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
+  KERNEL_INITRAMFS := kernel-bin | lzma | \
+        fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k
+  IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+endef
+TARGET_DEVICES += airpi_ap3000m
+
 define Device/arcadyan_mozart
   DEVICE_VENDOR := Arcadyan
   DEVICE_MODEL := Mozart