mediatek: add support for Airpi AP3000M

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>
This commit is contained in:
Fil Dunsky 2026-01-04 01:00:14 +03:00 committed by Hauke Mehrtens
parent 31cdd13d22
commit 6ff4557317
6 changed files with 259 additions and 6 deletions

View file

@ -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";
};

View 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"

View 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)

View 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)

View 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|\

View 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