linux wifi driver深度实践之内核编译加载

基础

  • 硬件基础:随处可以买到的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;

等的报错

编译报错,需要耐心纠错,直到编译成功
在这里插入图片描述
编译问题解决后,替换库里的驱动

替换驱动

  1. cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ath/ath9k/
    在这里插入图片描述

  2. sudo cp ath9k_htc.ko ath9k_htc.ko.bak (原始驱动备份)

  3. 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:
    在这里插入图片描述

成功连接并接入网络

编译验证

  • 源码修改
    在这里插入图片描述
  • 编译加载
    在这里插入图片描述
  • 内核日志:
    在这里插入图片描述

验证成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值