基础
- 硬件基础:随处可以买到的TP-WN722N V1网卡
- 软件基础:linux-source-5.3.0 内核源码
- 源码路径:drivers/net/wireless/ath/ath9k/
- 常见wifi接口协议:包括PCIe、USB、SDIO等。
安装内核源码包
Ubuntu 提供了内核源码包,可以通过以下命令安装,源码包会下载到 /usr/src/ 目录,解压后即可查看驱动源码
sudo apt update
sudo apt install linux-source
或者下载固定内核版本
https://kernel.ubuntu.com/mainline/
可以使用git clone来获取:
直接复制粘贴:
git clone git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack v5.4.5
注意
最好先查看自己的系统支持什么版本:
apt-cache search linux-source
然后直接安装:
sudo apt install linux-source-5.3.0
源码解压:
sudo tar -xvf linux-source-5.3.0.tar.bz2
编译
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
- 原因: ath9k_ops 结构体中的函数指针类型与 ath9k_cancel_remain_on_channel 和
ath9k_mgd_prepare_tx 函数的定义不匹配 - 背景: 内核 API 在不同版本中可能发生变化,导致函数签名不兼容。你使用的内核头文件版本与源码版本不一致
- 修改方案: ath9k_ops.cancel_remain_on_channel =
ath9k_cancel_remain_on_channel; ath9k_ops.mgd_prepare_tx =
ath9k_mgd_prepare_tx;
修改为: ath9k_ops.cancel_remain_on_channel = (void
*)ath9k_cancel_remain_on_channel; ath9k_ops.mgd_prepare_tx = (void *)ath9k_mgd_prepare_tx;
等的报错
编译报错,需要耐心纠错,直到编译成功
编译问题解决后,替换库里的驱动
替换驱动
-
cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ath/ath9k/
-
sudo cp ath9k_htc.ko ath9k_htc.ko.bak (原始驱动备份)
-
sudo cp drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/$(uname -r)/kernel/drivers/net/wireless/ath/ath9k/
卸载原有驱动
驱动加载
问题出现
内核为如下打印:
分析:
-
因为拉取代码和修改编译时一个庞大的工程,所以我并没有拉取对应linux内核版本的驱动源码
所以我换了三个ubuntu和拉取了五套源码,最终换到了与内核相同版本的源码(这只是其中两份):
-
解决编译报错后,结果都是这个(因为我尝试了相同内核版本的源码):
-
所以定位到应该不是代码问题
现在注意到这个:
并且在查看模块信息的时候,也相同类似:
所以在驱动硬件加载时,应该将其所依赖的模块一并卸载才可以接口代码匹配:
-
再次驱动加载:
报错解决
ath9k_htc驱动可能依赖于ath9k_common和ath9k_hw提供的公共代码或硬件抽象层。如果这些依赖模块没有正确加载或版本不兼容,就会导致主驱动无法正常工作,甚至出现参数无效的错误
内核打印
一定程度说明驱动加载后的功能没问题,但是还是要做功能性验证
功能性验证
- 网口已正常启动
- 连接wifi:
成功连接并接入网络
编译验证
- 源码修改
- 编译加载
在这里插入图片描述 - 内核日志: