]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
mediatek: add support for Airpi AP3000M 21397/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, 13 Jan 2026 23:16:34 +0000 (00:16 +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
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 bfa00d1b44e370e80d101a55cfebf2ef722c56df..61536f4fdda56b4b321325a1d39aea090816ef8e 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 2519c97b9f88f42b21c3348ff78924ac602ca663..fd7c159aab67caf43f46957cd72c31ff6916ab9d 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"
                ;;
@@ -123,6 +117,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|\
@@ -210,6 +211,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 87d91b401d84d7a786d631f7957a9849602fb24c..907dd00d364c028e76c23b527f41072a46e052b6 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 94a8df37cdaacaff24f6228375c4222bf38010b7..dde54a053df6f040fe16e43946bd4476001b8639 100644 (file)
@@ -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|\
@@ -346,6 +347,7 @@ platform_copy_config() {
        acer,predator-w6|\
        acer,predator-w6d|\
        acer,vero-w6m|\
+       airpi,ap3000m|\
        arcadyan,mozart|\
        glinet,gl-mt2500|\
        glinet,gl-mt6000|\
index 3d6dd1ad23faa587c6d1741ffe04b06585ac0a7b..bd320ab343e53cf5d85171dd30a4e9930a378cff 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