|
|
本帖最后由 yangkecapf 于 2026-6-30 16:11 编辑
2026-06-30 openwrt主线已经支持040g-md机型,本教程已过时! 仅供参考!
非嵌入式开发从业者,如有不对的地方请指正。谢谢!
【感谢】
* c01 https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=8464914&extra=page%3D1&page=23//在345楼
* xiangtailiang https://github.com/xiangtailiang/OpenWrt-for-XG-040G-MD
1、准备工作。
使用Ubuntu普通用户,相应的编译环境请参考官方文档。
- git clone https://github.com/openwrt/openwrt.git
- cd openwrt
复制代码- ./scripts/feeds update -a
- ./scripts/feeds install -a
复制代码
(1)加入xg-040g-md机型支持
相关文件见附件
(2)集成第三方包
- vi feeds.conf.default
- //添加rtp2httpd iptv
- # 使用 main 分支最新代码
- src-git rtp2httpd https://github.com/stackia/rtp2httpd.git]https://github.com/stackia/rtp2httpd.git
- cd package/
- //下载aurora和argon主题,以及npu状态插件
- git clone https://github.com/eamonxg/luci-theme-aurora.git]https://github.com/eamonxg/luci-theme-aurora.git
- git clone https://github.com/eamonxg/luci-app-aurora-config.git]https://github.com/eamonxg/luci-app-aurora-config.git
- git clone https://github.com/jerrykuku/luci-theme-argon.git]https://github.com/jerrykuku/luci-theme-argon.git
- git clone https://github.com/jerrykuku/luci-app-argon-config.git]https://github.com/jerrykuku/luci-app-argon-config.git
- git clone https://github.com/rchen14b/luci-app-airoha-npu.git]https://github.com/rchen14b/luci-app-airoha-npu.git
- //修改luci-app-airoha-npu插件的Makefile(不修改编译的时候会找不到路径报错)
- vi luci-app-airoha-npu/Makefile
- include $(TOPDIR)/feeds/luci/luci.mk
- //选择好需要软件包
- make menuconfig
- make download -j8
- make V=s -j1
复制代码
2、DTS修改
- vi target/linux/airoha/dts/an7581.dtsi
复制代码
//NPU内存预留缩减:原机留了180M左右,猜测是适配8核NPU,减少后测速也没有问题(未测试bt等高并发场景)
- reserved-memory {
- #address-cells = <2>;
- #size-cells = <2>;
- ranges;
- atf@80000000 {
- no-map;
- reg = <0x0 0x80000000 0x0 0x200000>;
- };
- npu_binary: npu-binary@84000000 {
- no-map;
- reg = <0x0 0x84000000 0x0 0xa00000>;
- };
- qdma0_buf: qdma0-buf@87000000 {
- no-map;
- reg = <0x0 0x87000000 0x0 0x1000000>;
- };
- qdma1_buf: qdma1-buf@89000000 {
- no-map;
- reg = <0x0 0x89000000 0x0 0x800000>;
- };
- npu_pkt: npu-pkt@8a000000 {
- no-map;
- reg = <0x0 0x8a000000 0x0 0x1800000>;
- };
- npu_txpkt: npu-txpkt@8cc00000 {
- no-map;
- reg = <0x0 0x8cc00000 0x0 0x2000000>;
- };
- npu_txbufid: npu-txbufid@90c00000 {
- no-map;
- reg = <0x0 0x90c00000 0x0 0x6800>;
- };
- npu_ba: npu-ba@90c06800 {
- no-map;
- reg = <0x0 0x90c06800 0x0 0x200000>;
- };
- };
复制代码
//给硬件crypto加个标签,后续在机型dts中引用(不支持AES-GCM,CBC好像是可以。)
- crypto: crypto@1e004000 {
- compatible = "inside-secure,safexcel-eip93ies";
- reg = <0x0 0x1fb70000 0x0 0x1000>;
- interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
- };
复制代码
//给NPU加个状态:开启。当然加个标签然后在机型dts中引用更规范吧!
- npu: npu@1e900000 {
- compatible = "airoha,en7581-npu";
- reg = <0x0 0x1e900000 0x0 0x313000>;
- interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
- <GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
- memory-region = <&npu_binary>, <&npu_pkt>, <&npu_txpkt>,
- <&npu_txbufid>, <&npu_ba>;
- memory-region-names = "binary", "pkt", "tx-pkt",
- "tx-bufid", "ba";
- status = "okay";
- };
复制代码
//内部中断控制器逻辑循环? 系统启动会有报错信息。
- gic: interrupt-controller@9000000 {
- compatible = "arm,gic-v3";
- interrupt-controller;
- #interrupt-cells = <3>;
- #address-cells = <1>;
- #size-cells = <1>;
- reg = <0x0 0x09000000 0x0 0x20000>,
- <0x0 0x09080000 0x0 0x80000>,
- <0x0 0x09400000 0x0 0x2000>,
- <0x0 0x09500000 0x0 0x2000>,
- <0x0 0x09600000 0x0 0x20000>;
- /* interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_LOW>; */ //把这行删除
- };
复制代码
- vi target/linux/airoha/dts/an7581-bell_xg-040g-md.dts
复制代码
//内存扩容,支持最大2G
- chosen {
- bootargs = "ubi.mtd=ubi root=ubi0:rootfs rootfstype=squashfs ro rootwait console=ttyS0,115200 earlycon";
- stdout-path = "serial0:115200n8";
- /* linux,usable-memory-range = <0x0 0x80200000 0x0 0x1fe00000>; */ //删除这一行可用内存限制 or 修改第4个参数使其支持1g: 0x3FE00000 2g: 0x7FE00000
- };
- memory@80000000 {
- device_type = "memory";
- reg = <0x0 0x80000000 0x0 0x80000000>; //修改第4个参数使其支持2G内存,对于512m 1g 2g通用
- };
复制代码
//修改ubi分区大小,因为更换了更大的512M nand存储。原机256M的不用修改
- &spi_nand {
- partitions {
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
- partition@0 {
- label = "bootloader";
- reg = <0x00000000 0x00080000>;
- };
- partition@80000 {
- label = "env";
- reg = <0x00080000 0x00080000>;
- };
- partition@100000 {
- label = "ubi";
- reg = <0x00100000 0x1ff00000>; //修改这一行第2个参数
- };
- };
- };
复制代码
//开启硬件crypto
- &crypto {
- status = "okay";
- };
复制代码
3、CPU变频
前置条件:使用了pll方式调频,所以要在make kernel_menuconfig和make meuconfig开启devmem依赖,自行搜索。
- vi target/linux/airoha/dts/an7581.dtsi
复制代码
//使其支持700m ~ 1.4g变频范围,注意1.2g ~ 1.4g都使用&smcc_opp14电压
- cpu_opp_table: opp-table {
- compatible = "operating-points-v2";
- opp-shared;
- opp-700000000 {
- opp-hz = /bits/ 64 <700000000>;
- required-opps = <&smcc_opp4>;
- };
- opp-750000000 {
- opp-hz = /bits/ 64 <750000000>;
- required-opps = <&smcc_opp5>;
- };
- opp-800000000 {
- opp-hz = /bits/ 64 <800000000>;
- required-opps = <&smcc_opp6>;
- };
- opp-850000000 {
- opp-hz = /bits/ 64 <850000000>;
- required-opps = <&smcc_opp7>;
- };
- opp-9000000000 {
- opp-hz = /bits/ 64 <900000000>;
- required-opps = <&smcc_opp8>;
- };
- opp-9500000000 {
- opp-hz = /bits/ 64 <950000000>;
- required-opps = <&smcc_opp9>;
- };
- opp-10000000000 {
- opp-hz = /bits/ 64 <1000000000>;
- required-opps = <&smcc_opp10>;
- };
- opp-10500000000 {
- opp-hz = /bits/ 64 <1050000000>;
- required-opps = <&smcc_opp11>;
- };
- opp-11000000000 {
- opp-hz = /bits/ 64 <1100000000>;
- required-opps = <&smcc_opp12>;
- };
- opp-11500000000 {
- opp-hz = /bits/ 64 <1150000000>;
- required-opps = <&smcc_opp13>;
- };
- opp-12000000000 {
- opp-hz = /bits/ 64 <1200000000>;
- required-opps = <&smcc_opp14>;
- };
- opp-12500000000 {
- opp-hz = /bits/ 64 <1250000000>;
- required-opps = <&smcc_opp14>;
- };
- opp-13000000000 {
- opp-hz = /bits/ 64 <1300000000>;
- required-opps = <&smcc_opp14>;
- };
- opp-13500000000 {
- opp-hz = /bits/ 64 <1350000000>;
- required-opps = <&smcc_opp14>;
- };
- opp-14000000000 {
- opp-hz = /bits/ 64 <1400000000>;
- required-opps = <&smcc_opp14>;
- };
- };
复制代码
//加上相应的系统控制和微控制
- cpufreq: cpufreq {
- reg = <0x0 0x1fa20000 0x0 0x2c0>, <0x0 0x1efbe000 0x0 0x800>;
- reg-names = "chip-scu", "mcucfg";
- compatible = "airoha,en7581-cpufreq";
- operating-points-v2 = <&cpu_smcc_opp_table>;
- #power-domain-cells = <0>;
- #clock-cells = <0>;
- };
复制代码
//修改编译结果中的cpu调频驱动,因原文件中并没有固定或者显式调整频率的地方,只看到不同频率的电压被传递了,但硬件实际频率锁定最高1.2g: coremark跑分在4070左右 ,成功到1.4g跑分4755左右。这里使用了npu插件的pll调频逻辑
//最好完成所有修改后,完整编译一次:make V=s -j$(nproc),最后再来修改这个方法
//修改airoha_cpufreq_config_clks_nop函数
- vi build_dir/target-aarch64_cortex-a53_musl/linux-airoha_an7581/linux-6.12.80/drivers/cpufreq/airoha-cpufreq.c
复制代码- // SPDX-License-Identifier: GPL-2.0
- #include <linux/bitfield.h>
- #include <linux/cpufreq.h>
- #include <linux/module.h>
- #include <linux/platform_device.h>
- #include <linux/pm_runtime.h>
- #include <linux/slab.h>
- #include <linux/io.h> /* 修正 ioremap, readl, writel */
- #include <linux/delay.h> /* 修正 udelay */
- #include <linux/pm_opp.h> /* 修正 struct dev_pm_opp */
- #include "cpufreq-dt.h"
- #define REG_SCU_BASE 0x1fa20000
- #define REG_MCUCFG_BASE 0x1efbe000
- #define CLK_MUX 0x01e0
- #define PLL_LOCK_CTRL 0x0268
- #define ARMPLL_PCW 0x02b4
- #define ARMPLL_CHG 0x02b8
- #define MCU_CFG_U 0x0640
- #define MCU_CFG_S 0x07c0
- static int airoha_cpufreq_config_clks_nop(struct device *dev,
- struct opp_table *opp_table,
- struct dev_pm_opp *old_opp,
- struct dev_pm_opp *opp,
- void *data, bool scaling_down)
- {
- unsigned long rate = dev_pm_opp_get_freq(opp);
- u32 target_mhz = rate / 1000000;
- u32 pcw_int, posdiv, val;
- void __iomem *scu, *mcu;
- /* 計算 PCW 與 POSDIV */
- if (target_mhz < 1000) {
- posdiv = 1;
- pcw_int = target_mhz / 25;
- } else {
- posdiv = 0;
- pcw_int = target_mhz / 50;
- }
- scu = ioremap(REG_SCU_BASE, 0x1000);
- mcu = ioremap(REG_MCUCFG_BASE, 0x1000);
- if (!scu || !mcu) return -ENOMEM;
- /* Step 1 & 2: 切換到 PLL2 備用路徑 */
- writel(readl(scu + CLK_MUX) | 0x4, scu + CLK_MUX);
- writel((readl(mcu + MCU_CFG_U) & 0xFFFFFFE0) | 0x12, mcu + MCU_CFG_U);
- writel((readl(mcu + MCU_CFG_S) & 0xFFFFF9FF) | (3 << 9), mcu + MCU_CFG_S);
- /* Step 3 & 4: 解鎖並修改 PCW */
- writel((readl(scu + PLL_LOCK_CTRL) & 0xFFFFFF00) | 0x12, scu + PLL_LOCK_CTRL);
- writel((readl(scu + ARMPLL_PCW) & 0x00FFFFFF) | (pcw_int << 24), scu + ARMPLL_PCW);
- /* Step 5: 切換 POSDIV 並觸發 CHG bit (Toggle 邏輯) */
- val = readl(scu + ARMPLL_CHG);
- if (val & 0x1)
- writel((val & 0xFFFFFF8E) | (posdiv << 4), scu + ARMPLL_CHG);
- else
- writel((val & 0xFFFFFF8E) | (posdiv << 4) | 0x1, scu + ARMPLL_CHG);
- /* Step 6: 等待 PLL 穩定 */
- udelay(200);
- /* Step 7 & 8: 切換回 ARMPLL 主路徑 */
- writel(readl(scu + CLK_MUX) | 0x1, scu + CLK_MUX);
- writel((readl(mcu + MCU_CFG_U) & 0xFFFFFFE0) | 0x12, mcu + MCU_CFG_U);
- writel((readl(mcu + MCU_CFG_S) & 0xFFFFF9FF) | (1 << 9), mcu + MCU_CFG_S);
- /* Step 9 & 10: 清理路徑並重新鎖定寄存器 */
- writel(readl(scu + CLK_MUX) & 0xFFFFFFFB, scu + CLK_MUX);
- writel(readl(scu + PLL_LOCK_CTRL) & 0xFFFFFF00, scu + PLL_LOCK_CTRL);
- iounmap(scu);
- iounmap(mcu);
- return 0;
- }
复制代码
//把修改过的文件重新编译打包
- touch airpha-cpufreq.c //如果直接使用的现在文件更新一下时间
- make target/linux/compile -j$(nproc) V=s
- make target/linux/install V=s
复制代码
4、NPU卸载
//打包进内核,启动时会报错,用模块的方式加载。
//重点:pppoe接口使用了vlan,哪么vlan的mac和绑定的物理mac一定要一至,不然硬件卸载不完全会占用cpu。ipv6:nat6、npt6方式也会造成硬件无法卸载完全,使用运营商pd下发给lan。
- make kernel_menuconfig
- //直接按/来查找,按对应数字进入菜单
- {M} Airoha NPU support
- {M} Airoha SoC Gigabit Ethernet support
复制代码- //补全make menuconfig --> kernel modules --> network devices菜单
- vi package/kernel/linux/modules/netdevices.mk
- $(eval $(call KernelPackage,phy-airoha-en8811h))
- define KernelPackage/airoha-npu
- SUBMENU:=$(NETWORK_DEVICES_MENU)
- TITLE:=Airoha EN7581 NPU support
- DEPENDS:=@TARGET_airoha_an7581
- KCONFIG:=CONFIG_NET_AIROHA_NPU
- FILES:=$(LINUX_DIR)/drivers/net/ethernet/airoha/airoha_npu.ko
- AUTOLOAD:=$(call AutoLoad,18,airoha_npu,1)
- endef
- define KernelPackage/airoha-npu/description
- Kernel module support for the Airoha EN7581 Network Processor Unit (NPU)
- endef
- $(eval $(call KernelPackage,airoha-npu))
- define KernelPackage/airoha-eth
- SUBMENU:=$(NETWORK_DEVICES_MENU)
- TITLE:=Airoha SoC Ethernet support
- DEPENDS:=@TARGET_airoha_an7581 +kmod-airoha-npu
- KCONFIG:= \
- CONFIG_NET_VENDOR_AIROHA \
- CONFIG_NET_AIROHA \
- CONFIG_NET_AIROHA_FLOW_STATS
- FILES:=$(LINUX_DIR)/drivers/net/ethernet/airoha/airoha-eth.ko
- AUTOLOAD:=$(call AutoLoad,19,airoha-eth,1)
- endef
- define KernelPackage/airoha-eth/description
- Kernel module support for the Airoha SoC Ethernet controller
- endef
- $(eval $(call KernelPackage,airoha-eth))
- define KernelPackage/phy-aquantia
- SUBMENU:=$(NETWORK_DEVICES_MENU)
- TITLE:=Aquantia Ethernet PHYs
- DEPENDS:=+kmod-libphy +kmod-hwmon-core +kmod-lib-crc-itu-t
- KCONFIG:=CONFIG_AQUANTIA_PHY
- FILES:=$(LINUX_DIR)/drivers/net/phy/aquantia/aquantia.ko
- AUTOLOAD:=$(call AutoLoad,18,aquantia,1)
- endef
- define KernelPackage/phy-aquantia/description
- Kernel modules for Aquantia Ethernet PHYs
- endef
复制代码
- //选择加载模块
- make menuconfig
- //同样的按/来查找
- {*} kmod-phy-airoha-en8811h
- {*} kmod-airoha-eth
- {*} kmod-airoha-npu
复制代码
5、硬件改造
内存:K4AAG165WA-BCWE(2g)K4A8G165WC-BCWE(1g)
存储:W25N04KVZEIR (512M)
散热片:38X38x15 带胶钉(淘宝标的是南北桥芯片散热片)
待办问题
(1)samba4 usb3 2.5 hdd硬盘最高只有17M/17M读写,换成Ksmbd可以到70M左右。使用dd命令测试速度可以到120M,优化过挂载和samba参数无效。
--2026-05-11 破案了:win11默认强制加密,还是aes-gcm256,所以win11 powershell关闭再测速度就上来了:
- Set-SmbClientConfiguration -RequireSecuritySignature $false (按Y)
- Set-SmbClientConfiguration -EnableSecuritySignature $false (按Y)
- //samba4配置
- server signing = disabled
- client signing = disabled
- smb encrypt = off
- use sendfile = yes
- aio read size = 1
- aio write size = 1
- min receivefile size = 16384
- socket options = TCP_NODELAY IPTOS_LOWDELAY
复制代码
(2)内存占用和缓存占用高,同样的配置和软件包在gl mt3000上使用更低。不清楚是不是SNAPSHOT版本的原故。
总结: 使用体验相当不错,如果pon能工作那就更好了。
相关文件下载: 「xg-040g-md适配文件.7z」
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|