From: Shubham Vishwakarma Date: Fri, 13 Jun 2025 18:17:05 +0000 (+0530) Subject: qualcommax: ipq50xx: Add support for Yuncore AX830 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52e339b8eda31193e23e55dc63aa469ae16363e8;p=thirdparty%2Fopenwrt.git qualcommax: ipq50xx: Add support for Yuncore AX830 Specifications: SOC: Qualcomm IPQ5018 (64-bit dual-core ARM Cortex-A53 @ 1.0Ghz) Memory: 512MB DDR3L Standard: 802.11ax/ac/b/g/n Flash: SPI NOR 8MB (Winbond W25Q64DW) + NAND 128MB (Winbond W25N01GWZEIG) 2.4G Frequency: 2.4GHz - 2.484GHz 2.4G Wi-Fi standard: 802.11b/g/n/ax 5.8G Frequency: 4.9~5.9G 5.8G Wi-Fi Standard: 802.11 a/n/ac/ax Interface: Optional 1(Without 8081): 1 * 10/100 /1000Mbps RJ45 WAN Port and PoE port; 1* Gigabit Console port; Optional 2(With 8081): 1 * 10/100/1000/2500Mbps RJ45 WAN port and PoE port, 1*10/100/1000Mbps LAN port Buttons: 1 * Reset button, press 10 seconds to revert to default setting Antenna: Build in 4*4dBi dual band MIMO Antenna Data Rate: 3000Mbps (2.4G 600Mbps, 5.8G 2400Mbps) End Users: 128+ 2.4G RF Power: ≤ 23dBm 5.8G RF Power: ≤ 23dBm DC: 12V----2A PoE: 48V (IEEE 802.3at) LED Light: Sys, WAN, LAN Power Consumption: ≤ 20W BACKUP YOUR STOCK FIRMWARE: - Put openwrt-*-initramfs-uImage.itb to your TFTP server and rename it to initramfs.bin - Enable serial console and enter to u-boot cli and exec these commands: ``` tftpboot :initramfs.bin bootm ``` - Once boot completed and you get the openwrt shell execute below commands: ``` device=ax830 mkdir -p /tmp/fw_backup; cd /tmp/fw_backup rootfs=$(cat /proc/mtd | grep \"rootfs\" | cut -d: -f1) rootfs_1=$(cat /proc/mtd | grep \"rootfs_1\" | cut -d: -f1) dd if=/dev/${rootfs} of=rootfs_${rootfs} bs=1M dd if=/dev/${rootfs_1} of=rootfs_1_${rootfs_1} bs=1M cp /sys/firmware/fdt fdt.dtb md5sum * > md5sum tar -cvzf /tmp/${device}.tar.gz . sum=$(md5sum /tmp/${device}.tar.gz | cut -d' ' -f1) mv /tmp/${device}.tar.gz /tmp/${device}_${sum}.tar.gz echo "stock fw backup saved to: /tmp/${device}_${sum}.tar.gz" ``` - Upload/save your backup to a safe place. STOCK FIRMWARE RECOVERY: - Boot initramfs image - Upload your backed-up stock fw tarball to the device using scp or download it from the device using wget. - Enter device ssh cli or tty and exec: ``` cd /tmp && wget /${stock_fw_backup}.tar.gz` tar -xpzf ${stock_fw_backup}.tar.gz rootfs=$(cat /proc/mtd | grep \"rootfs\" | cut -d: -f1) rootfs_1=$(cat /proc/mtd | grep \"rootfs_1\" | cut -d: -f1) ubiformat /dev/${rootfs} -y -f /tmp/rootfs_${rootfs} ubiformat /dev/${rootfs_1} -y -f /tmp/rootfs_1_${rootfs_1} reboot ``` INSTALLATION: 1. initramfs method - Put openwrt-*-initramfs-uImage.itb to your TFTP server and rename it to initramfs.bin - Enable serial console and enter to u-boot cli and exec these commands: ``` tftpboot :initramfs.bin bootm ``` - Once boot completed and you get the openwrt shell execute below commands: ``` cd /tmp && wget /factory.ubi` export rootfs=$(cat /proc/mtd | grep rootfs | cut -d: -f1) export rootfs_1=$(cat /proc/mtd | grep rootfs_1 | cut -d: -f1) ubiformat /dev/${rootfs} -y -f factory.ubi ubiformat /dev/${rootfs_1} -y -f factory.ubi reboot ``` 2. u-boot factory.ubi image method - Put factory.ubi to your TFTP server and enter u-boot cli and exec these commands: ``` tftpboot :factory.ubi #After downloading is finished: flash rootfs flash rootfs_1 reset ``` Signed-off-by: Shubham Vishwakarma Link: https://github.com/openwrt/openwrt/pull/18968 Signed-off-by: Robert Marko --- diff --git a/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx b/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx index 3a830039561..3e590228d61 100644 --- a/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx +++ b/package/boot/uboot-tools/uboot-envtools/files/qualcommax_ipq50xx @@ -25,6 +25,11 @@ xiaomi,ax6000) ubootenv_add_mtd "0:appsblenv" "0x0" "0x10000" "0x20000" ubootenv_add_sys_mtd "bdata" "0x0" "0x10000" "0x20000" ;; +yuncore,ax830) + idx="$(find_mtd_index 0:APPSBLENV)" + [ -n "$idx" ] && \ + ubootenv_add_uci_config "/dev/mtd$idx" "0x0" "0x10000" "0x10000" + ;; esac config_load ubootenv diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile index 710331f0b6d..2ba14260dbb 100644 --- a/package/firmware/ipq-wifi/Makefile +++ b/package/firmware/ipq-wifi/Makefile @@ -84,6 +84,7 @@ ALLWIFIBOARDS:= \ xiaomi_ax6000 \ xiaomi_ax9000 \ yyets_le1 \ + yuncore_ax830 \ yuncore_ax880 \ yuncore_fap650 \ zbtlink_zbt-z800ax \ @@ -250,6 +251,7 @@ $(eval $(call generate-ipq-wifi-package,xiaomi_ax3600,Xiaomi AX3600)) $(eval $(call generate-ipq-wifi-package,xiaomi_ax6000,Xiaomi AX6000)) $(eval $(call generate-ipq-wifi-package,xiaomi_ax9000,Xiaomi AX9000)) $(eval $(call generate-ipq-wifi-package,yyets_le1,YYeTs LE1)) +$(eval $(call generate-ipq-wifi-package,yuncore_ax830,Yuncore AX830)) $(eval $(call generate-ipq-wifi-package,yuncore_ax880,Yuncore AX880)) $(eval $(call generate-ipq-wifi-package,yuncore_fap650,Yuncore FAP650)) $(eval $(call generate-ipq-wifi-package,zbtlink_zbt-z800ax,Zbtlink ZBT-Z800AX)) diff --git a/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts new file mode 100644 index 00000000000..8a6c06cdaf7 --- /dev/null +++ b/target/linux/qualcommax/files/arch/arm64/boot/dts/qcom/ipq5018-ax830.dts @@ -0,0 +1,487 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Copyright (c) 2025, Shubham Vishwakarma + */ + +/dts-v1/; + +#include "ipq5018.dtsi" +#include "ipq5018-ess.dtsi" + +#include +#include +#include + +/ { + model = "Yuncore AX830"; + compatible = "yuncore,ax830", "qcom,ipq5018"; + + aliases { + serial0 = &blsp1_uart1; + led-boot = &led_system; + led-failsafe = &led_system; + led-running = &led_system; + led-upgrade = &led_system; + }; + + chosen { + bootargs-append = " root=/dev/ubiblock0_1 swiotlb=1 coherent_pool=2M"; + stdout-path = "serial0:115200n8"; + }; + + keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + reset { + label = "reset"; + gpios = <&tlmm 38 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + leds { + compatible = "gpio-leds"; + + led_system: system { + function = LED_FUNCTION_POWER; + color = ; + gpios = <&tlmm 26 GPIO_ACTIVE_LOW>; + }; + + wlan2g { + function = LED_FUNCTION_WLAN_2GHZ; + color = ; + gpios = <&tlmm 33 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy0radio"; + }; + + wlan5g { + function = LED_FUNCTION_WLAN_5GHZ; + color = ; + gpios = <&tlmm 34 GPIO_ACTIVE_LOW>; + linux,default-trigger = "phy1radio"; + }; + }; + + reserved-memory { + q6_mem_regions: q6_mem_regions@4b000000 { + no-map; + reg = <0x0 0x4b000000 0x0 0x3000000>; + }; + }; + + gpio-watchdog { + compatible = "linux,wdt-gpio"; + gpios = <&tlmm 27 GPIO_ACTIVE_LOW>; + hw_algo = "toggle"; + hw_margin_ms = <5000>; + always-running; + }; +}; + +&switch { + status = "okay"; + + switch_mac_mode = ; + + qcom,port_phyinfo { + // MAC0 -> GE Phy + port@0 { + port_id = <1>; + mdiobus = <&mdio0>; + phy_address = <7>; + }; + + // MAC1 -> Uniphy --- SGMII --- QCA8081 + port@1 { + port_id = <2>; + mdiobus = <&mdio1>; + phy_address = <28>; + port_mac_sel = "QGMAC_PORT"; + }; + }; +}; + +// MAC0 -> GE Phy +&dp1 { + status = "okay"; + + label = "lan"; + nvmem-cells = <&hw_mac_addr 0>; + nvmem-cell-names = "mac-address"; + phy-mode = "sgmii"; +}; + +// MAC1 ---SGMII---> QCA8081 +&dp2 { + status = "okay"; + + label = "wan"; + phy-handle = <&qca8081>; + nvmem-cells = <&hw_mac_addr 1>; + nvmem-cell-names = "mac-address"; +}; + +&mdio0 { + status = "okay"; +}; + +&mdio1 { + status = "okay"; + + pinctrl-0 = <&mdio1_pins>; + pinctrl-names = "default"; + + qca8081: ethernet-phy@28 { + compatible = "ethernet-phy-id004d.d101"; + reg = <28>; + reset-deassert-us = <10000>; + reset-gpios = <&tlmm 24 GPIO_ACTIVE_LOW>; + }; +}; + +&sleep_clk { + clock-frequency = <32000>; +}; + +&xo_board_clk { + clock-frequency = <24000000>; +}; + +&blsp1_uart1 { + status = "okay"; + pinctrl-0 = <&serial_0_pins>; + pinctrl-names = "default"; +}; + +&crypto { + status = "okay"; +}; + +&cryptobam { + status = "okay"; +}; + +&prng { + status = "okay"; +}; + +&qfprom { + status = "okay"; +}; + +&qpic_bam { + status = "okay"; +}; + +&blsp1_spi1 { + status = "okay"; + + flash@0 { + #address-cells = <1>; + #size-cells = <1>; + reg = <0>; + compatible = "jedec,spi-nor"; + spi-max-frequency = <50000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "0:SBL1"; + reg = <0x00 0x30000>; + read-only; + }; + + partition@30000 { + label = "0:MIBIB"; + reg = <0x30000 0x10000>; + read-only; + }; + + partition@40000 { + label = "0:BOOTCONFIG"; + reg = <0x40000 0x10000>; + read-only; + }; + + partition@50000 { + label = "0:BOOTCONFIG1"; + reg = <0x50000 0x10000>; + read-only; + }; + + partition@60000 { + label = "0:QSEE"; + reg = <0x60000 0xa0000>; + read-only; + }; + + partition@100000 { + label = "0:QSEE_1"; + reg = <0x100000 0xa0000>; + read-only; + }; + + partition@1a0000 { + label = "0:DEVCFG"; + reg = <0x1a0000 0x10000>; + read-only; + }; + + partition@1b0000 { + label = "0:DEVCFG_1"; + reg = <0x1b0000 0x10000>; + read-only; + }; + + partition@1c0000 { + label = "0:CDT"; + reg = <0x1c0000 0x10000>; + read-only; + }; + + partition@1d0000 { + label = "0:CDT_1"; + reg = <0x1d0000 0x10000>; + read-only; + }; + + partition@1e0000 { + label = "0:APPSBLENV"; + reg = <0x1e0000 0x10000>; + }; + + partition@1f0000 { + label = "0:APPSBL"; + reg = <0x1f0000 0xa0000>; + read-only; + }; + + partition@290000 { + label = "0:APPSBL_1"; + reg = <0x290000 0xa0000>; + read-only; + }; + + partition@330000 { + label = "0:ART"; + reg = <0x330000 0x70000>; + read-only; + + nvmem-layout { + compatible = "fixed-layout"; + #address-cells = <1>; + #size-cells = <1>; + + hw_mac_addr: hw_mac_addr { + #nvmem-cell-cells = <1>; + compatible = "mac-base"; + reg = <0x0 0x6>; + }; + }; + }; + }; + }; +}; + +&qpic_nand { + pinctrl-0 = <&qpic_pins>; + pinctrl-names = "default"; + status = "okay"; + + partitions { + status = "disabled"; + }; + + nand@0 { + compatible = "spi-nand"; + reg = <0>; + #address-cells = <1>; + #size-cells = <1>; + + nand-ecc-engine = <&qpic_nand>; + nand-bus-width = <8>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "0:TRAINING"; + reg = <0x00 0x80000>; + }; + + partition@80000 { + label = "rootfs_1"; + reg = <0x80000 0x3e00000>; + }; + + partition@3e80000 { + label = "rootfs"; + reg = <0x3e80000 0x3e00000>; + }; + }; + }; +}; + +&tlmm { + button_pins: button-state { + pins = "gpio38"; + function = "gpio"; + drive-strength = <8>; + bias-pull-up; + }; + + mdio1_pins: mdio-state { + mdc-pins { + pins = "gpio36"; + function = "mdc"; + drive-strength = <8>; + bias-pull-up; + }; + + mdio-pins { + pins = "gpio37"; + function = "mdio"; + drive-strength = <8>; + bias-pull-up; + }; + }; + + qpic_pins: qpic-state { + clock-pins { + pins = "gpio9"; + function = "qspi_clk"; + drive-strength = <8>; + bias-disable; + }; + + cs-pins { + pins = "gpio8"; + function = "qspi_cs"; + drive-strength = <8>; + bias-disable; + }; + + data-pins { + pins = "gpio4", "gpio5", "gpio6", "gpio7"; + function = "qspi_data"; + drive-strength = <8>; + bias-disable; + }; + }; + + serial_0_pins: uart0-state { + pins = "gpio20", "gpio21"; + function = "blsp0_uart0"; + drive-strength = <8>; + bias-disable; + }; +}; + +&tsens { + status = "okay "; +}; + +&q6v5_wcss { + status = "okay"; + + memory-region = <&q6_mem_regions>; + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt", + "ath11k/IPQ5018/hw1.0/m3_fw.mdt", + "ath11k/QCN6122/hw1.0/m3_fw.mdt"; + + // IPQ5018 + q6_wcss_pd1: pd-1 { + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + + resets = + <&gcc GCC_WCSSAON_RESET>, + <&gcc GCC_WCSS_BCR>, + <&gcc GCC_CE_BCR>; + reset-names = + "wcss_aon_reset", + "wcss_reset", + "ce_reset"; + + clocks = + <&gcc GCC_WCSS_AHB_S_CLK>, + <&gcc GCC_WCSS_ACMT_CLK>, + <&gcc GCC_WCSS_AXI_M_CLK>; + clock-names = + "gcc_wcss_ahb_s_clk", + "gcc_wcss_acmt_clk", + "gcc_wcss_axi_m_clk"; + + interrupts-extended = + <&wcss_smp2p_in 8 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 9 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 12 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 11 IRQ_TYPE_NONE>; + interrupt-names = + "fatal", + "ready", + "spawn-ack", + "stop-ack"; + + qcom,smem-states = + <&wcss_smp2p_out 8>, + <&wcss_smp2p_out 9>, + <&wcss_smp2p_out 10>; + qcom,smem-state-names = + "shutdown", + "stop", + "spawn"; + }; + + // QCN6122 5G + q6_wcss_pd3: pd-3 { + firmware-name = "ath11k/IPQ5018/hw1.0/q6_fw.mdt"; + + interrupts-extended = + <&wcss_smp2p_in 24 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 25 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 28 IRQ_TYPE_NONE>, + <&wcss_smp2p_in 27 IRQ_TYPE_NONE>; + interrupt-names = + "fatal", + "ready", + "spawn-ack", + "stop-ack"; + + qcom,smem-states = + <&wcss_smp2p_out 24>, + <&wcss_smp2p_out 25>, + <&wcss_smp2p_out 26>; + qcom,smem-state-names = + "shutdown", + "stop", + "spawn"; + }; +}; + +&wifi0 { + // IPQ5018 + status = "okay"; + qcom,rproc = <&q6_wcss_pd1>; + qcom,ath11k-calibration-variant = "Yuncore-AX830"; + qcom,ath11k-fw-memory-mode = <1>; + qcom,bdf-addr = <0x4c400000>; +}; + +&wifi1 { + // QCN6122 5G + status = "okay"; + qcom,rproc = <&q6_wcss_pd3>; + qcom,userpd-subsys-name = "q6v5_wcss_userpd3"; + qcom,ath11k-calibration-variant = "Yuncore-AX830"; + qcom,ath11k-fw-memory-mode = <1>; + qcom,bdf-addr = <0x4d100000>; + qcom,m3-dump-addr = <0x4df00000>; +}; diff --git a/target/linux/qualcommax/image/ipq50xx.mk b/target/linux/qualcommax/image/ipq50xx.mk index 6ef61a79939..999bf1e456f 100644 --- a/target/linux/qualcommax/image/ipq50xx.mk +++ b/target/linux/qualcommax/image/ipq50xx.mk @@ -150,3 +150,18 @@ ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),) endif endef TARGET_DEVICES += xiaomi_ax6000 + +define Device/yuncore_ax830 + $(call Device/FitImage) + $(call Device/UbiFit) + DEVICE_VENDOR := Yuncore + DEVICE_MODEL := AX830 + BLOCKSIZE := 128k + PAGESIZE := 2048 + SOC := ipq5018 + DEVICE_DTS_CONFIG := config@mp03.5-c1 + DEVICE_PACKAGES := ath11k-firmware-ipq5018 \ + ath11k-firmware-qcn6122 \ + ipq-wifi-yuncore_ax830 +endef +TARGET_DEVICES += yuncore_ax830 diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network index d40cdc51697..3b98650891f 100644 --- a/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network +++ b/target/linux/qualcommax/ipq50xx/base-files/etc/board.d/02_network @@ -21,6 +21,9 @@ ipq50xx_setup_interfaces() xiaomi,ax6000) ucidef_set_interfaces_lan_wan "lan1 lan2 lan3" "wan" ;; + yuncore,ax830) + ucidef_set_interfaces_lan_wan "lan" "wan" + ;; esac } diff --git a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata index f448a75b840..f211286b4cb 100644 --- a/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata +++ b/target/linux/qualcommax/ipq50xx/base-files/etc/hotplug.d/firmware/11-ath11k-caldata @@ -34,6 +34,13 @@ case "$FIRMWARE" in xiaomi,ax6000) caldata_extract "0:art" 0x1000 0x20000 ;; + yuncore,ax830) + caldata_extract "0:ART" 0x1000 0x20000 + label_mac=$(mtd_get_mac_binary 0:ART 0) + ath11k_patch_mac $(macaddr_add $label_mac 2) 0 + ath11k_remove_regdomain + ath11k_set_macflag + ;; esac ;; "ath11k/QCN6122/hw1.0/cal-ahb-b00a040.wifi1.bin") @@ -57,6 +64,13 @@ case "$FIRMWARE" in ath11k_remove_regdomain ath11k_set_macflag ;; + yuncore,ax830) + caldata_extract "0:ART" 0x26800 0x20000 + label_mac=$(mtd_get_mac_binary 0:ART 0) + ath11k_patch_mac $(macaddr_add $label_mac 3) 0 + ath11k_remove_regdomain + ath11k_set_macflag + ;; esac ;; "ath11k/QCN9074/hw1.0/cal-pci-0000:01:00.0.bin") diff --git a/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh b/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh index b13ecb5743d..6b032d0e532 100644 --- a/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/qualcommax/ipq50xx/base-files/lib/upgrade/platform.sh @@ -145,6 +145,13 @@ platform_do_upgrade() { CI_ROOT_UBIPART="rootfs" nand_do_upgrade "$1" ;; + yuncore,ax830) + CI_UBIPART="rootfs" + remove_oem_ubi_volume ubi_rootfs + remove_oem_ubi_volume bt_fw + remove_oem_ubi_volume wifi_fw + nand_do_upgrade "$1" + ;; *) default_do_upgrade "$1" ;; diff --git a/target/linux/qualcommax/ipq50xx/config-default b/target/linux/qualcommax/ipq50xx/config-default index f920cc9c98f..95cd5eb88d7 100644 --- a/target/linux/qualcommax/ipq50xx/config-default +++ b/target/linux/qualcommax/ipq50xx/config-default @@ -1,3 +1,5 @@ +CONFIG_GPIO_WATCHDOG=y +# CONFIG_GPIO_WATCHDOG_ARCH_INITCALL is not set CONFIG_GRO_CELLS=y CONFIG_IPQ5018_PHY=y CONFIG_IPQ_CMN_PLL=y