最近购买了一块明创控能 IOT-MKC3568-Main-v1.1 开发板(基于RK3568-EVB1-DDR4-V10设计),但是这个开发板没有任何资料支持,连明创控能的官网都无法访问。经过一段时间的逆向研究,初步适配了Arm版本的飞牛v1.0.0固件,但开发板上的两个网口目前还处于无法使用的状态,设备树的适配仍在缓慢推进。
1 2 3 4 5 6 7 8 9 10 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
于是决定先插上USB无线网卡初步测试飞牛的功能完整性(我的网卡为MT7601U芯片方案)。可惜arm飞牛并没有编译MT7601U模块,看来只能自行编译了。
注意 :由于开发板网口无法使用,编译时需要下载源码,此时要依赖互联网连接。不用着急,用数据线将开发板的USB-HOST口和手机连接,通过安卓手机的USB网络共享功能就可以让开发板实现联网,兼容性不错
通过串口连接进入arm飞牛的控制台,查看内核信息:
1 2 3 4 5 6 root@MKC3568:/# uname -a Linux MKC3568 6.12.41-trim root@MKC3568:/# sudo modprobe mt7601u modprobe: FATAL: Module mt7601u not found in directory /lib/modules/6.12.41-trim
Linux内核从 v4.2开始已将mt7601u驱动合并进主线 ,位于:drivers/net/wireless/mediatek/mt7601u/,但飞牛系统提供的内核镜像未包含无线驱动模块。
下载内核源码 我们需要使用完全匹配6.12.41 的内核源码。
1 2 3 4 5 6 7 mkdir /home/kernelcd /home/kernel git clone --depth=1 --branch v6.12.41 https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.gitcd linux
为什么使用内核源码中的驱动?
[!NOTE]
选择与当前运行内核同版本的内核源码 编译 mt7601u 驱动,是为了保证模块的 vermagic、配置和符号表与系统完全一致,从而避免加载失败。主线代码经过充分测试,与内核其他组件兼容性最佳,还能直接复用 /proc/config.gz 的配置,省去手动调整依赖的麻烦。日后内核升级时,只需用相同方法重新编译对应版本即可,维护十分方便。而第三方 GitHub 仓库中的驱动往往包含未经验证的补丁,不仅容易引发兼容性问题,也难以跟随内核同步更新。
配置编译环境 确认当前系统中存在/proc/config.gz默认配置文件,这个文件很关键,飞牛的内核有-trim后缀。
1 2 root@MKC3568:/home/kernel/linux# ls /proc/config.gz /proc/config.gz
我们这一次是在arm平台上原生编译,不需要交叉编译器。
首先安装编译工具链
1 2 apt update apt install -y build-essential flex bison libssl-dev libelf-dev bc
设置编译参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 export ARCH=arm64export CROSS_COMPILE= zcat /proc/config.gz > .configecho 'CONFIG_LOCALVERSION="-trim"' >> .configecho 'CONFIG_MT7601U=m' >> .config make olddefconfig
准备构建环境
编译mt7601u模块 1 KBUILD_MODPOST_WARN=1 make M=drivers/net/wireless/mediatek/mt7601u modules
[!NOTE]
为什么加 KBUILD_MODPOST_WARN=1 make modules_prepare 只准备了头文件,不会生成完整的 Module.symvers(需要完整编译内核才会生成),因此直接编译外部模块会因找不到符号验证文件而报错。但 mt7601u 是独立模块,不依赖其他内核模块,且源码和 .config 与当前内核完全匹配,那些 “未定义符号” 实际都存在于内核中。加上 KBUILD_MODPOST_WARN=1 可将错误降级为警告,从而正常生成 .ko 文件。
验证并安装模块 最终编译会得到drivers/net/wireless/mediatek/mt7601u/mt7601u.ko模块。
我们验证一下模块的vermagic:
1 modinfo drivers/net/wireless/mediatek/mt7601u/mt7601u.ko | grep vermagic
正常应该输出:
1 vermagic: 6.12.41-trim SMP preempt mod_unload aarch64
我们的系统内核就是6.12.41-trim,完全匹配。
如果你意外获得了6.12.41 SMP preempt mod_unload aarch64(缺少-trim后缀),请重新进行编译流程,确保系统当前的内核配置被正确继承。
然后就可以安全地安装并加载驱动:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/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 sudo cp drivers/net/wireless/mediatek/mt7601u/mt7601u.ko \ /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mediatek/mt7601u/sudo depmod -asudo 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.binsudo cp /lib/firmware/mediatek/mt7601u.bin /lib/firmware/sudo modprobe mt7601u
现在我们可以插入网卡看看能否正常使用:
1 2 3 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:
1 sudo nmcli dev wifi connect "你的Wi-Fi名称" password "你的Wi-Fi密码"
设置开机自动加载模块 1 echo "mt7601u" | sudo tee /etc/modules-load.d/mt7601u.conf
异常处理 在飞牛收到新版本的OTA推送后,可能出现更新卡一半进度条的情况,只能被迫重启。重启后发现自行编译并加载的mt7601u模块消失了。不必紧张,我们重新加载模块即可。
我们编译后的模块应该还在内核源码中的drivers/net/wireless/mediatek/mt7601u/mt7601u.ko位置。
再次重复之前的操作:
1 2 3 4 5 6 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 -asudo modprobe mt7601u
建议 :将编译好的模块备份到安全位置(如/home/backup/目录),以便快速恢复。
希望以上内容可以帮助到你!