1. 环境信息
内核版本一致的情况下,可以直接用我们编译好的驱动模块。若使用别的版本的内核,也可以参考 4. 开发过程,自己手动编译驱动模块
镜像:Ubuntu 22.04
CANN版本:6.2.RC2.alpha001
内核版本(uname -r
查看):5.10.0
2. 安装思路
-
开发板可以正常识别到AX210的网卡
# 任意终端调用
lspci
# 显示如下信息
04:00.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a)
-
只需要给AX210打上合适的驱动:iwlwifi,就能使用wifi了
-
打驱动:就是 iwlwif 驱动模块(
.ko
文件)插入到内核中,需要用到iwlwifi.ko
、iwldvm.ko
与iwlmvm.ko。另外需要装载与内核版本对应的Ax210
无线网卡固件(iwlwifi-ty-a0-gf-a0-59.ucode等),使内核能够识别无线网卡驱动。 -
要注意:
cfg80211.ko
与mac80211.ko
会与当前的 iwlwifi 驱动模块不适配,需要重装。附上两模块的介绍:• cfg80211.ko : 用于对无线设备进行配置管理。
• mac80211.ko : 是驱动开发者为无线设备写驱动的框架 。
3. 安装驱动
如果内核版本(5.10.0
)一致,可以直接使用我们编译好的内核模块.ko
文件。
a.卸载旧模块以及USB网卡驱动
进入内核模块根目录,我的是/lib/modules/5.10.0+
cd /lib/modules/$(uname -r)
卸载模块 mac80211.ko
、cfg80211.ko
以及USB网卡驱动(最好以root身份运行)
sudo rmmod rtl8192cu
sudo rmmod rtl8192c_common
sudo rmmod rtl_usb
sudo rmmod rtlwifi
sudo rmmod mac80211
sudo rmmod cfg80211
如果遇到报错类似: ERROR: Module mac80211 is in use by: rtl_usb rtl8192cu rtlwifi
意思是该内核模块被后面的模块使用,所以要先卸载后面的模块,命令是一样的 sudo rmmod 内核模块名称
把RTL8192CU (USB网卡驱动)模块文件删除,(防止开机自启动时自动导入,影响Ax210驱动模块的启动)另外,也可以把它们移动到回收站
sudo rm rtl8192cu.ko
sudo rm rtl8192c_common.ko
sudo rm rtl_usb.ko
sudo rm rtlwifi.ko
sudo rm mac80211.ko
sudo rm cfg80211.ko
b. 上传驱动文件到开发板
百度云下载需要用到的cfg80211.ko
、mac80211.ko
、iwlwifi.ko
、iwldvm.ko
与iwlmvm.ko
模块文件以及相关的.ucode文件
把 文件夹:“ko文件” 内的所有.ko 文件上传到/lib/modules/5.10.0+
把 文件夹:“UCODE文件” 内的所有.ucode 文件上传到 /lib/firmware 中
c. 安装内核模块
(在目录/lib/modules/5.10.0+下)
安装顺序是 cfg80211.ko
、mac80211.ko
、iwlwifi.ko
、iwldvm.ko
、iwlmvm.ko
sudo insmod cfg80211.ko
sudo insmod mac80211.ko
sudo insmod iwlwifi.ko
sudo insmod iwldvm.ko
sudo insmod iwlmvm.ko
用modprobe
命令手动将所有模块加载进内核,实现开机自启(root身份运行)
sudo depmod -a # 更新内核模块的依赖
modprobe cfg80211
modprobe iwlwifi
modprobe iwldvm
modprobe iwlmvm
重启开发板
sudo reboot
现在开发板内屏幕左上角点开 wifi 图标,可以启用 wifi 了
4. 开发过程
这里会详细介绍上面 iwlwifi 驱动所使用的.ko
文件是如何获得的,可以类比到别的驱动模块的安装,比如 USB 无线网卡驱动 rtl8192cu 。
a. 问题背景
由于镜像的内核是官方通过交叉编译手动编译出来的,所以缺少了内核头文件, 因此无法在线安装驱动,也无法下载驱动源码用make
编译安装。同时,内核头文件也无法连网安装。所以,我们只能下载官方的内核源码包,把整个内核编译一次。由于官方内核源码包中包含了很多驱动(iwlwifi 的驱动也有),我们仅需设定好对应的配置,编译后,可以在生成的内核模块中找到我们需要的.ko
文件。
b.参考教程
下面教程是编译 rtl8192cu
的 USB 无线网卡的教程,我在此基础上调整配置,实现编译 iwlwifi Ax210
驱动
https://www.hiascend.com/forum/thread-0260121075301055016-1-1.html
注意:
-
要分清开发环境,我们对开发版的内核是使用交叉编译的,也就是编译内核、获得模块
.ko
文件的过程都是在电脑中实现(amd架构的ubuntu 双系统 or 虚拟机中,同时,电脑ubuntu系统的版本也没太大要求,18.04、22.04都可以)。安装.ko
模块文件在开发版中实现(参考:3. 安装驱动) -
编译内核需要安装相关支撑库(电脑中),(运行
bash build.sh kernel
时,根据报错中提示,缺什么包装什么包)apt-get install bison apt-get install flex sudo apt-get install libssl-dev
-
编译内核的图形化配置界面中,
Save
时千万不能改名,保持名字为.config
。内核编译仅使用.config
里的配置,若改了别的名字,内核仍然按照初始的.config
编译,问题呈现为:为什么设定了驱动,但编译后没出现对应的.ko
文件
配置调整:
1. 生成 mac80211.ko
、cfg80211.ko
(这点和教程的一样)
Networking support --> Wireless -> 选择对应的模块(键盘按M
或者空格, 上下左右键控制选项)
2. 生成 iwlwifi.ko
、iwldvm.ko
与 iwlmvm.ko
的配置
Device Drivers --> Network device support --> Wireless LAN --> 选择生成对应的模块
3. 连续按Esc退出配置界面,耐心等待编译完成
4. 生成的 .ko 文件位于 Ascend310B-source/output/kernel_modules/ 中
c. 拓展使用
官方源码包的目录中,我们调用 bash build.sh kernel
来编译内核,这个 build.sh
文件中集成了诸多命令,可以单独取出使用。
注意:内核文件开发目录位于:Ascend310B-source/kernel/kernel/kernel/out/linux-4.19
(虽然目录写4.19,实际版本还是5.10.0的)
优化:只需编译一次内核, 后续增加驱动,仅仅会编译 .config
新加进来的驱动文件。(下面是第二次编译的流程, 需要位于内核文件开发目录)
支持用户自定义内核配置选项,交互式弹出菜单选项
make ARCH=arm64 CROSS_COMPILE=aarch64-target-linux-gnu- menuconfig
编译内核模块
make ARCH=arm64 CROSS_COMPILE=aarch64-target-linux-gnu- modules -j16
编译的 .ko 文件可能出现在 Ascend310B-source/kernel/kernel/kernel/out/linux-4.19/drivers
中,可以用locate
定位