当前位置: 首页 > news >正文

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

成功连接并接入网络

编译验证

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

验证成功

相关文章:

  • 从零构建CNN:框架与自定义实现对比
  • 本地部署Hive集群
  • 使用RabbitMQ实现流量削峰填谷
  • 数据结构 -图 -基础
  • 软考网络和信息安全哪个好?
  • 【推荐项目】 043-停车管理系统
  • 本地部署资源聚合搜索神器 Jackett 并实现外部访问
  • SQL注入之sqli-labs靶场搭建
  • 点云从入门到精通技术详解100篇-基于超像素分割和点云配准的电力设备红外三维建模与应用(续)
  • 【MySQL_05】语法简述(是语法,不详细介绍各种语句)
  • 【redis】事务
  • Reflect.get和target[key]有何不同?
  • C++学习之QT高级
  • FPGA前端设计适合哪些人学?该怎么学?
  • 越早越好!8 个反直觉的金钱真相|金钱心理学
  • System 类的核心 API
  • Deepseek应用技巧-chatbox搭建前端问答
  • 语音识别-FunASR-docker部署-【超简洁步骤】
  • Manus:成为AI Agent领域的标杆
  • 题解:CF633D Fibonacci-ish
  • 哈马斯与以色列在多哈举行新一轮加沙停火谈判
  • 网警打谣:传播涉刘国梁不实信息,2人被处罚
  • 纪念|脖子上挂着红领巾的陈逸飞
  • 以军证实空袭也门多个港口
  • 流失79载,国宝文物“子弹库帛书”(二、三卷)回归祖国
  • 乌克兰官员与法德英美四国官员举行会谈