[openwrt/openwrt] ipq60xx: add support for ALFA Network AP120C-AX
LEDE Commits
lede-commits at lists.infradead.org
Tue May 27 14:45:14 PDT 2025
pepe2k pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/35c828c1686a7d628c05e4ac005151b12ef9d540
commit 35c828c1686a7d628c05e4ac005151b12ef9d540
Author: Piotr Dymacz <pepe2k at gmail.com>
AuthorDate: Fri Apr 4 22:42:57 2025 +0200
ipq60xx: add support for ALFA Network AP120C-AX
ALFA Network AP120C-AX is a dual-band ceiling AP, based on Qualcomm
IPQ6000 + QCN5021 + QCN5052 + QCA8072 chipsets bundle.
Specifications:
- SOC: Qualcomm IPQ6000 (quad-core Cortex-A53 1.2 GHz)
- DRAM: DDR3 512 MB (Micron MT41K256M16TW-107)
- Flash: 16 MB SPI NOR (Macronix MX25U12832F, boot device)
128 MB NAND (Macronix MX30UF1G18AC, dual-firmware)
- Ethernet: 2x 10/100/1000 Mbps Ethernet (QCA8072)
802.3at/af PoE input in WAN port
- Wi-Fi: 2x2 2.4 GHz Wi-Fi 6 (QCN5021 + RFFM8227 FEM)
2x2 5 GHz Wi-Fi 6 (QCN5152 + QPF4568 FEM)
- Antenna: for indoor version: dual-band, internal
2x (or 4x) U.FL antenna connectors on the PCB
- LED: for indoor/outdoor versions: 5x on external module (status,
2x Wi-Fi, 2x Ethernet), PoE LED on-board
8-pin on-board header for LED module (1.27 mm pitch, J14)
- Button: 1x button (reset)
- USB: 1x 4-pin on-board header for USB 2.0 (2.54 mm pitch, J22)
- UART: 1x micro USB Type-B for system console (Holtek HT42B534)
1x 4-pin on-board header (2.54 mm pitch, J11)
- Power: 802.3at/af PoE or 12 V DC/2 A (DC jack)
- Other: 8-pin and 4-pin on-board headers for external Bluetooth
module (1.27 mm pitch, J15, J16, unavailable, thus untested)
MAC addresses:
- WAN: 00:c0:ca:xx:xx:6c (art 0x0, device's label -2)
- LAN: 00:c0:ca:xx:xx:6d (art 0x6, device's label -1)
- 2.4 GHz (IPQ6000): 00:c0:ca:xx:xx:6e (art 0xc, device's label)
- 5 GHz (IPQ6000): 00:c0:ca:xx:xx:6f (device's label + 1)
Flash instructions:
Due to the lack of direct GUI based update capability and dual-firmware
partition configuration, it is recommended to use TFTP + serial console
based approach (console is available in micro USB connector):
1. Set a static IP 192.168.1.1/24 on PC and start TFTP server with the
'...-factory.ubi' image renamed to 'firmware.bin'.
2. Make sure you can access board's serial console over micro USB.
3. Power up the device, hit any key to enter U-Boot CLI and issue below
commands.
3.1 Restore U-Boot's environment to default values (double check first
the '0:APPSBLENV' partition offset using 'smem' command):
sf probe
sf erase 0x510000 0x10000
saveenv
3.2 Download and install OpenWrt in both partitions and reset the board:
tftpb 0x44000000 firmware.bin
flash rootfs
flash rootfs_1
reset
Signed-off-by: Piotr Dymacz <pepe2k at gmail.com>
---
package/firmware/ipq-wifi/Makefile | 2 +
.../arch/arm64/boot/dts/qcom/ipq6000-ap120c-ax.dts | 402 +++++++++++++++++++++
target/linux/qualcommax/image/ipq60xx.mk | 12 +
.../ipq60xx/base-files/etc/board.d/02_network | 6 +
.../etc/hotplug.d/firmware/11-ath11k-caldata | 7 +
.../ipq60xx/base-files/lib/upgrade/alfa.sh | 34 ++
.../ipq60xx/base-files/lib/upgrade/platform.sh | 5 +
7 files changed, 468 insertions(+)
diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
index 8b55b5faba..1c62e75093 100644
--- a/package/firmware/ipq-wifi/Makefile
+++ b/package/firmware/ipq-wifi/Makefile
@@ -28,6 +28,7 @@ endef
ALLWIFIBOARDS:= \
8devices_mango \
+ alfa-network_ap120c-ax \
aliyun_ap8220 \
arcadyan_aw1000 \
asus_rt-ax89x \
@@ -181,6 +182,7 @@ endef
# board-<devicename>.<qca4019|qca9888|qca9889|qca9984|qca99x0|ipq6018|ipq8074>
$(eval $(call generate-ipq-wifi-package,8devices_mango,8devices Mango))
+$(eval $(call generate-ipq-wifi-package,alfa-network_ap120c-ax,ALFA Network AP120C-AX))
$(eval $(call generate-ipq-wifi-package,aliyun_ap8220,Aliyun AP8220))
$(eval $(call generate-ipq-wifi-package,arcadyan_aw1000,Arcadyan AW1000))
$(eval $(call generate-ipq-wifi-package,asus_rt-ax89x,Asus RT-AX89X))
diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq6000-ap120c-ax.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq6000-ap120c-ax.dts
new file mode 100644
index 0000000000..e6719136c7
--- /dev/null
+++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq6000-ap120c-ax.dts
@@ -0,0 +1,402 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+/dts-v1/;
+
+#include "ipq6018-512m.dtsi"
+#include "ipq6018-ess.dtsi"
+#include "ipq6018-cp-cpu.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+
+/ {
+ model = "ALFA Network AP120C-AX";
+ compatible = "alfa-network,ap120c-ax", "qcom,ipq6018";
+
+ aliases {
+ serial0 = &blsp1_uart3;
+ serial1 = &blsp1_uart2;
+ led-boot = &led_status_green;
+ led-failsafe = &led_status_green;
+ led-running = &led_status_green;
+ led-upgrade = &led_status_green;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ bootargs-append = " root=/dev/ubiblock0_1";
+ };
+
+ keys {
+ compatible = "gpio-keys";
+ pinctrl-0 = <&button_pins>;
+ pinctrl-names = "default";
+
+ reset {
+ label = "reset";
+ linux,code = <KEY_RESTART>;
+ gpios = <&tlmm 9 GPIO_ACTIVE_LOW>;
+ };
+ };
+
+ leds {
+ compatible = "gpio-leds";
+ pinctrl-0 = <&led_pins>;
+ pinctrl-names = "default";
+
+ led_status_green: status {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_STATUS;
+ gpios = <&tlmm 55 GPIO_ACTIVE_LOW>;
+ };
+
+ wlan2g {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WLAN_2GHZ;
+ gpios = <&tlmm 37 GPIO_ACTIVE_LOW>;
+ linux,default-trigger = "phy1radio";
+ };
+
+ wlan5g {
+ color = <LED_COLOR_ID_GREEN>;
+ function = LED_FUNCTION_WLAN_5GHZ;
+ gpios = <&tlmm 35 GPIO_ACTIVE_LOW>;
+ linux,default-trigger = "phy0radio";
+ };
+ };
+};
+
+&tlmm {
+ btcoex_pins: btcoex_pinmux {
+ mux_0 {
+ pins = "gpio51";
+ function = "pta1_1";
+ drive-strength = <6>;
+ bias-pull-down;
+ };
+
+ mux_1 {
+ pins = "gpio52";
+ function = "pta1_2";
+ drive-strength = <6>;
+ bias-pull-down;
+ };
+
+ mux_2 {
+ pins = "gpio53";
+ function = "pta1_0";
+ drive-strength = <6>;
+ bias-pull-down;
+ };
+ };
+
+ btrstint_pins: btrstint_pinmux {
+ pins = "gpio78", "gpio79";
+ function = "gpio";
+ drive-strength = <8>;
+ bias-disable;
+ };
+
+ button_pins: button_pinmux {
+ pins = "gpio9";
+ function = "gpio";
+ drive-strength = <8>;
+ bias-disable;
+ };
+
+ hsuart_pins: hsuart_pinmux {
+ pins = "gpio71", "gpio72", "gpio69", "gpio70";
+ function = "blsp1_uart";
+ drive-strength = <8>;
+ bias-disable;
+ };
+
+ led_pins: led_pinmux {
+ pins = "gpio35", "gpio37", "gpio55";
+ function = "gpio";
+ drive-strength = <8>;
+ bias-pull-up;
+ };
+
+ mdio_pins: mdio_pinmux {
+ mdc {
+ pins = "gpio64";
+ function = "mdc";
+ drive-strength = <8>;
+ bias-pull-up;
+ };
+
+ mdio {
+ pins = "gpio65";
+ function = "mdio";
+ drive-strength = <8>;
+ bias-pull-up;
+ };
+ };
+
+ spi_pins: spi_pinmux {
+ pins = "gpio38", "gpio39", "gpio40", "gpio41";
+ function = "blsp0_spi";
+ drive-strength = <8>;
+ bias-pull-down;
+ };
+};
+
+&blsp1_uart3 {
+ status = "okay";
+
+ pinctrl-0 = <&serial_3_pins>;
+ pinctrl-names = "default";
+};
+
+&blsp1_uart2 {
+ status = "okay";
+
+ pinctrl-0 = <&hsuart_pins &btcoex_pins &btrstint_pins>;
+ pinctrl-names = "default";
+
+ dmas = <&blsp_dma 2>, <&blsp_dma 3>;
+ dma-names = "tx", "rx";
+};
+
+&blsp1_spi1 {
+ status = "okay";
+
+ pinctrl-0 = <&spi_pins>;
+ pinctrl-names = "default";
+
+ flash at 0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0>;
+ compatible = "jedec,spi-nor";
+ spi-max-frequency = <25000000>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition at 0 {
+ label = "0:SBL1";
+ reg = <0x00000000 0x000c0000>;
+ read-only;
+ };
+
+ partition at c0000 {
+ label = "0:MIBIB";
+ reg = <0x000c0000 0x00010000>;
+ read-only;
+ };
+
+ partition at d0000 {
+ label = "0:BOOTCONFIG";
+ reg = <0x000d0000 0x00020000>;
+ };
+
+ partition at f0000 {
+ label = "0:BOOTCONFIG1";
+ reg = <0x000f0000 0x00020000>;
+ };
+
+ partition at 110000 {
+ label = "0:QSEE";
+ reg = <0x00110000 0x001a0000>;
+ read-only;
+ };
+
+ partition at 2b0000 {
+ label = "0:QSEE_1";
+ reg = <0x002b0000 0x001a0000>;
+ read-only;
+ };
+
+ partition at 450000 {
+ label = "0:DEVCFG";
+ reg = <0x00450000 0x00010000>;
+ read-only;
+ };
+
+ partition at 460000 {
+ label = "0:DEVCFG_1";
+ reg = <0x00460000 0x00010000>;
+ read-only;
+ };
+
+ partition at 470000 {
+ label = "0:RPM";
+ reg = <0x00470000 0x00040000>;
+ read-only;
+ };
+
+ partition at 4b0000 {
+ label = "0:RPM_1";
+ reg = <0x004b0000 0x00040000>;
+ read-only;
+ };
+
+ partition at 4f0000 {
+ label = "0:CDT";
+ reg = <0x004f0000 0x00010000>;
+ read-only;
+ };
+
+ partition at 500000 {
+ label = "0:CDT_1";
+ reg = <0x00500000 0x00010000>;
+ read-only;
+ };
+
+ partition at 510000 {
+ label = "0:APPSBLENV";
+ reg = <0x00510000 0x00010000>;
+ };
+
+ partition at 520000 {
+ label = "0:APPSBL";
+ reg = <0x00520000 0x000a0000>;
+ read-only;
+ };
+
+ partition at 5c0000 {
+ label = "0:APPSBL_1";
+ reg = <0x005c0000 0x000a0000>;
+ read-only;
+ };
+
+ partition at 660000 {
+ label = "0:ART";
+ reg = <0x00660000 0x00040000>;
+
+ nvmem-layout {
+ compatible = "fixed-layout";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ macaddr_lan: macaddr at 6 {
+ reg = <0x6 0x6>;
+ };
+
+ macaddr_wan: macaddr at 0 {
+ reg = <0x0 0x6>;
+ };
+ };
+ };
+ };
+ };
+};
+
+&qpic_bam {
+ status = "okay";
+};
+
+&qpic_nand {
+ status = "okay";
+
+ /*
+ * This board uses NOR+NAND configuration which is currently not
+ * supported by 'qcomsmem' MTD parser. Let U-Boot find the NAND
+ * dt node and populate MTD partitions from SMEM partition table.
+ *
+ * This makes it possible to use QCA 'runtime failsafe' and rotate
+ * 'rootfs'/'rootfs_1' partitions between subsequent updates.
+ */
+ compatible = "qcom,ipq6018-nand", "qcom,ebi2-nandc-bam-v1.5.0";
+
+ nand at 0 {
+ reg = <0>;
+ nand-bus-width = <8>;
+ };
+};
+
+&qusb_phy_0 {
+ status = "okay";
+};
+
+&ssphy_0 {
+ status = "okay";
+};
+
+&usb3 {
+ status = "okay";
+};
+
+&mdio {
+ status = "okay";
+
+ pinctrl-0 = <&mdio_pins>;
+ pinctrl-names = "default";
+ reset-gpios = <&tlmm 75 GPIO_ACTIVE_LOW>;
+ reset-delay-us = <10000>;
+ reset-post-delay-us = <50000>;
+
+ ethernet-phy-package at 0 {
+ compatible = "qcom,qca8075-package";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ reg = <0>;
+
+ qcom,package-mode = "psgmii";
+
+ qca8072_3: ethernet-phy at 3 {
+ compatible = "ethernet-phy-ieee802.3-c22";
+ reg = <3>;
+ };
+
+ qca8072_4: ethernet-phy at 4 {
+ compatible = "ethernet-phy-ieee802.3-c22";
+ reg = <4>;
+ };
+ };
+};
+
+&switch {
+ status = "okay";
+
+ switch_lan_bmp = <ESS_PORT4>;
+ switch_wan_bmp = <ESS_PORT5>;
+
+ switch_mac_mode = <MAC_MODE_PSGMII>;
+
+ qcom,port_phyinfo {
+ port at 4 {
+ port_id = <4>;
+ phy_address = <3>;
+ };
+
+ port at 5 {
+ port_id = <5>;
+ phy_address = <4>;
+ };
+ };
+};
+
+&edma {
+ status = "okay";
+};
+
+&dp4 {
+ status = "okay";
+
+ phy-handle = <&qca8072_3>;
+ label = "lan";
+ nvmem-cells = <&macaddr_lan>;
+ nvmem-cell-names = "mac-address";
+};
+
+&dp5 {
+ status = "okay";
+
+ phy-handle = <&qca8072_4>;
+ label = "wan";
+ nvmem-cells = <&macaddr_wan>;
+ nvmem-cell-names = "mac-address";
+};
+
+&wifi {
+ status = "okay";
+
+ qcom,ath11k-fw-memory-mode = <1>;
+ qcom,ath11k-calibration-variant = "ALFA-Network-AP120C-AX";
+};
diff --git a/target/linux/qualcommax/image/ipq60xx.mk b/target/linux/qualcommax/image/ipq60xx.mk
index d525390caf..3d7f5d7d76 100644
--- a/target/linux/qualcommax/image/ipq60xx.mk
+++ b/target/linux/qualcommax/image/ipq60xx.mk
@@ -23,6 +23,18 @@ define Device/8devices_mango-dvk
endef
TARGET_DEVICES += 8devices_mango-dvk
+define Device/alfa-network_ap120c-ax
+ $(call Device/FitImage)
+ $(call Device/UbiFit)
+ DEVICE_VENDOR := ALFA Network
+ DEVICE_MODEL := AP120C-AX
+ BLOCKSIZE := 128k
+ PAGESIZE := 2048
+ SOC := ipq6000
+ DEVICE_PACKAGES := ipq-wifi-alfa-network_ap120c-ax
+endef
+TARGET_DEVICES += alfa-network_ap120c-ax
+
define Device/cambiumnetworks_xe3-4
$(call Device/FitImage)
$(call Device/UbiFit)
diff --git a/target/linux/qualcommax/ipq60xx/base-files/etc/board.d/02_network b/target/linux/qualcommax/ipq60xx/base-files/etc/board.d/02_network
index 11ed74bda5..b8b22bcffe 100644
--- a/target/linux/qualcommax/ipq60xx/base-files/etc/board.d/02_network
+++ b/target/linux/qualcommax/ipq60xx/base-files/etc/board.d/02_network
@@ -15,6 +15,9 @@ ipq60xx_setup_interfaces()
glinet,gl-axt1800)
ucidef_set_interfaces_lan_wan "lan1 lan2" "wan"
;;
+ alfa-network,ap120c-ax)
+ ucidef_set_interfaces_lan_wan "lan" "wan"
+ ;;
cambiumnetworks,xe3-4)
ucidef_set_interface_lan "lan1 lan2" "dhcp"
;;
@@ -51,6 +54,9 @@ ipq60xx_setup_macs()
local label_mac=""
case $board in
+ alfa-network,ap120c-ax)
+ label_mac=$(mtd_get_mac_binary 0:ART 12)
+ ;;
qihoo,360v6)
lan_mac=$(mtd_get_mac_ascii factory lanMac)
wan_mac=$(macaddr_add "$lan_mac" 1)
diff --git a/target/linux/qualcommax/ipq60xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata b/target/linux/qualcommax/ipq60xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
index b78a846372..8d323563bf 100644
--- a/target/linux/qualcommax/ipq60xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
+++ b/target/linux/qualcommax/ipq60xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata
@@ -12,6 +12,13 @@ case "$FIRMWARE" in
8devices,mango-dvk)
caldata_extract "0:ART" 0x1000 0x20000
;;
+ alfa-network,ap120c-ax)
+ caldata_extract "0:ART" 0x1000 0x20000
+ label_mac=$(mtd_get_mac_binary 0:ART 12)
+ ath11k_patch_mac $label_mac 1
+ ath11k_patch_mac $(macaddr_add $label_mac 1) 0
+ ath11k_set_macflag
+ ;;
cambiumnetworks,xe3-4)
caldata_extract "0:ART" 0x1000 0x10000
;;
diff --git a/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/alfa.sh b/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/alfa.sh
new file mode 100644
index 0000000000..5d30af827e
--- /dev/null
+++ b/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/alfa.sh
@@ -0,0 +1,34 @@
+. /lib/functions.sh
+
+# Flip active 'rootfs' partition in selected 'bootconfig' mtd partition
+# $1 target 'bootconfig' mtd partition name
+# $2 'offset' of the active rootfs flag byte
+alfa_bootconfig_rootfs_rotate() {
+ local part="$1"
+ local offs="$2"
+
+ local mtdnum=$(find_mtd_index "$part")
+ [ -c "/dev/mtd${mtdnum}" ] || return 1
+
+ dd if=/dev/mtd${mtdnum} of=/tmp/mtd${mtdnum} bs=1k > /dev/null 2>&1
+
+ local active="$(dd if=/tmp/mtd${mtdnum} bs=1 skip=${offs} count=1 2>/dev/null)"
+ active=$(printf "%d\n" "\"$active")
+
+ if [ "$active" = "1" ]; then
+ printf '\x00' | dd of=/tmp/mtd${mtdnum} \
+ conv=notrunc bs=1 seek=${offs} > /dev/null 2>&1
+ else
+ printf '\x01' | dd of=/tmp/mtd${mtdnum} \
+ conv=notrunc bs=1 seek=${offs} > /dev/null 2>&1
+ fi
+
+ mtd -qq write /tmp/mtd${mtdnum} /dev/mtd${mtdnum} 2>/dev/null
+
+ local mtdnum_sec=$(find_mtd_index "${part}1")
+ [ -c "/dev/mtd${mtdnum_sec}" ] && \
+ mtd -qq write \
+ /tmp/mtd${mtdnum} /dev/mtd${mtdnum_sec} 2>/dev/null
+
+ return 0
+}
diff --git a/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/platform.sh b/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/platform.sh
index 58bd08deb1..25c3f66bef 100644
--- a/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/platform.sh
@@ -106,6 +106,11 @@ EOF
platform_do_upgrade() {
case "$(board_name)" in
+ alfa-network,ap120c-ax)
+ CI_UBIPART="rootfs_1"
+ alfa_bootconfig_rootfs_rotate "0:BOOTCONFIG" "148"
+ nand_do_upgrade "$1"
+ ;;
cambiumnetworks,xe3-4)
fw_setenv bootcount 0
nand_do_upgrade "$1"
More information about the lede-commits
mailing list