收起左侧

Arm飞牛手动编译mt7601u无线网卡模块(针对Linux 6.12.41-trim内核)

0
回复
25
查看
[ 复制链接 ]

1

主题

1

回帖

0

牛值

江湖小虾

Arm飞牛手动编译 mt7601u 无线网卡模块(针对Linux 6.12.41-trim 内核)

最近购买了一块****明创控能 IOT-MKC3568-Main-v1.1开发板(基于RK3568-EVB1-DDR4-V10设计),但是这个开发板没有任何资料支持,连明创控能的官网都无法访问。经过一段时间的逆向研究,初步适配了Arm版本的飞牛v1.0.0固件,但开发板上的两个网口目前还处于无法使用的状态,设备树的适配仍在缓慢推进。

dutyc@MKC3568:/$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: end1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
3: end0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether _ brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether _ brd _
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
# 可以看到end0和end1都是未连接状态

于是决定先插上USB无线网卡初步测试飞牛的功能完整性(我的网卡为MT7601U芯片方案)。可惜arm飞牛并没有编译 MT7601U模块,看来只能自行编译了。

注意:由于开发板网口无法使用,编译时需要下载源码,此时要依赖互联网连接。不用着急,用数据线将开发板的 USB-HOST口和手机连接,通过安卓手机的 USB网络共享功能就可以让开发板实现联网,兼容性不错

通过串口连接进入arm飞牛的控制台,查看内核信息:

root@MKC3568:/# uname -a
Linux MKC3568 6.12.41-trim #1 SMP PREEMPT Wed Dec 31 02:09:11 UTC 2025 aarch64 GNU/Linux
​
root@MKC3568:/# sudo modprobe mt7601u
modprobe: FATAL: Module mt7601u not found in directory /lib/modules/6.12.41-trim
# 可以看到并没有编译MT7601U模块

**Linux内核从 **v4.2开始已将 mt7601u驱动合并进主线,位于:drivers/net/wireless/mediatek/mt7601u/,但飞牛系统提供的内核镜像未包含无线驱动模块。

下载内核源码

我们需要使用****完全匹配6.12.41的内核源码。

mkdir /home/kernel
cd /home/kernel
​
# 克隆时直接指定tag v6.12.41(深度为1,只下载该版本)
git clone --depth=1 --branch v6.12.41 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
​
cd linux

为什么使用内核源码中的驱动?

优先选择同版本内核源码进行编译,原因如下:

  1. 版本严格匹配:确保模块与当前运行内核的 vermagic、配置及符号表完全一致
  2. 稳定性与兼容性:主线代码经过充分测试,与内核其他组件兼容性最佳
  3. 配置继承:可直接基于当前内核配置(/proc/config.gz)启用模块
  4. 维护便捷:内核升级后可快速用相同方法重新编译对应版本驱动

第三方驱动(如 GitHub 项目)可能包含未经验证的补丁,容易引发兼容性问题,且不易随内核升级同步维护。

配置编译环境

确认当前系统中存在 /proc/config.gz默认配置文件,这个文件很关键,飞牛的内核有 -trim后缀。

root@MKC3568:/home/kernel/linux# ls /proc/config.gz
/proc/config.gz

我们这一次是在arm平台上原生编译,不需要交叉编译器。

# 设置编译架构(必须设置!否则可能编译出错误架构的模块)
export ARCH=arm64
export CROSS_COMPILE=
​
# 使用系统当前的内核配置
zcat /proc/config.gz > .config
​
# 强制启用MT7601U驱动为模块
echo 'CONFI**T7601U=m' >> .config
​
# 自动处理依赖和新选项
make olddefconfig

准备构建环境

make modules_prepare

编译mt7601u模块

KBUILD_MODPOST_WARN=1 make M=drivers/net/wireless/mediatek/mt7601u modules

重要说明:为什么要加 KBUILD_MODPOST_WARN=1参数?

虽然我们在上面执行了 make modules_prepare,但**modules_prepare并不会生成完整的 Module.symvers——它只准备头文件。而 Module.symvers必须在完整编译内核或至少编译所有built-in模块**后才会生成。直接编译会报 ERROR

但在当前场景中,我们****并不需要重新编译整个内核,只需要让模块构建系统知道当前运行内核的符号表。

由于 mt7601u纯外部模块(不依赖其他内核模块),且我们使用的是主线内核源码+完全匹配的 .config,这些"未定义符号"其实都存在于内核中(只是 modpost找不到 Module.symvers来验证)。我们可以临时允许未解析符号

KBUILD_MODPOST_WARN=1会将 ERROR降级为 WARNING,最终仍会生成 .ko文件。

验证并安装模块

最终编译会得到 drivers/net/wireless/mediatek/mt7601u/mt7601u.ko模块。

我们验证一下模块的 vermagic

modinfo drivers/net/wireless/mediatek/mt7601u/mt7601u.ko | grep vermagic

正常应该输出:

vermagic: 6.12.41-trim SMP preempt mod_unload aarch64

我们的系统内核就是 6.12.41-trim,完全匹配。

如果你意外获得了 6.12.41 SMP preempt mod_unload aarch64(缺少 -trim后缀),请重新进行编译流程,确保系统当前的内核配置被正确继承。

然后就可以安全地安装并加载驱动:

# 1. 创建目标目录(如果还没创建)
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/
​
# 2. 备份原有模块(如果有的话)
sudo cp /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko ~/mt7601u-6.12.41-trim.ko.bak 2>/dev/null || true
​
# 3. 复制新编译的模块
sudo cp drivers/net/wireless/mediatek/mt7601u/mt7601u.ko \
   /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/
​
# 4. 更新模块依赖
sudo depmod -a
​
# 5. 安装固件(两个位置都放,确保兼容)
sudo mkdir -p /lib/firmware/mediatek/
sudo wget -O /lib/firmware/mediatek/mt7601u.bin \
   https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/mediatek/mt7601u.bin
sudo cp /lib/firmware/mediatek/mt7601u.bin /lib/firmware/
​
# 6. 加载驱动
sudo modprobe mt7601u

现在我们可以插入网卡看看能否正常使用:

root@MKC3568:/home/kernel/linux# dmesg | tail -20
mt7601u 1-1:1.0: ASIC revision: 76010001 ...
mt7601u 1-1:1.0: Firmware Version: 0.1.00

通过 ip link show可以看到无线接口 wlx90de80624b0c

连接Wi-Fi

飞牛默认使用 NetworkManager,可以使用 nmcli连接WiFi:

sudo nmcli dev wifi connect "你的Wi-Fi名称" password "你的Wi-Fi密码"

设置开机自动加载模块

echo "mt7601u" | sudo tee /etc/modules-load.d/mt7601u.conf

异常处理

在飞牛收到新版本的OTA推送后,可能出现更新卡一半进度条的情况,只能被迫重启。重启后发现自行编译并加载的 mt7601u模块消失了。不必紧张,我们重新加载模块即可。

我们编译后的模块应该还在内核源码中的 drivers/net/wireless/mediatek/mt7601u/mt7601u.ko位置。

再次重复之前的操作:

sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/
sudo cp drivers/net/wireless/mediatek/mt7601u/mt7601u.ko \
   /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/
sudo depmod -a
# 加载驱动
sudo modprobe mt7601u

建议:将编译好的模块备份到安全位置(如 /home/backup/目录),以便快速恢复。

希望以上内容可以帮助到你!

收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则