Linux wifi driver 注册和设备探测流程

基础流程

  1. wifi驱动加载(insmod或者modprobe
    在这里插入图片描述

  2. 设备驱动匹配探测(我们常见的probe函数)
    在这里插入图片描述

整体流程
在这里插入图片描述

驱动加载 → 注册支持设备 → 设备插入 → 匹配驱动 → 初始化硬件 → 创建网络接口

明确两点

两个流程

  1. 驱动加载:指将编译好的驱动程序模块加载到内核中,使其能够被系统识别和使用。
  2. 设备探测匹配:指当设备插入时,内核如何识别该设备并绑定正确的驱动程序

两个流程的关系

  1. 驱动加载是前提,只有驱动被加载到内核,才能进行后续的设备识别和绑定。
  2. 设备探测匹配是驱动加载后的自动过程,当设备连接到系统时,内核通过设备信息(如USB的厂商ID和产品ID)查找已注册的驱动,进行匹配。
所以

驱动加载不正确,设备根本无法被识别,设备探测匹配失败,即使驱动存在,设备也无法正常工作

硬件

  • 基于tplink wn722n v1网卡

详细框架流程

  1. 无线驱动注册:内核调用 ath9k_htc_init,使用usb_register 注册将wifi驱动到 USB 子系统
  2. 设备探测:匹配设备 ID 后,调用 probe 分配资源、加载固件。
  3. mac80211 注册:通过 ieee80211_alloc_hw 和 ieee80211_register_hw 注册无线设备。
  4. 网络接口创建:由 mac80211 生成 wlan 接口,用户可配置连接。

流程解析

  1. 模块初始化
    当执行 sudo modprobe ath9k_htc 或系统自动加载驱动时,内核调用 ath9k_htc_init
    在这里插入图片描述
  2. 驱动注册:它定义了 ath9k_hif_usb 驱动的核心结构体 usb_driver,并通过 usb_register 将驱动注册到内核
    在这里插入图片描述
    驱动加载内核日志:
    在这里插入图片描述
    支持ID的列表说明:
    在这里插入图片描述
    USB驱动探测函数ath9k_hif_usb_probe的实现。当USB设备插入并匹配到驱动时,内核会调用这个函数来初始化设备
  3. 驱动探测函数(当 USB 设备插入时,内核调用此函数进行设备探测,负责设备的初始化和固件加载)
    在这里插入图片描述
  4. 固件加载
    在这里插入图片描述
  5. 固件加载完成后的回调函数负责继续设备的初始化流程
    在这里插入图片描述
    初始化 USB 设备函数在这里插入图片描述
  6. 初始化硬件(调用到关键函数)
    在这里插入图片描述
  7. ath9k_htc_probe_device 负责完成设备的探测和初始化
    在这里插入图片描述
    mac80211为所指向的驱动程序分配一个私有数据区域
    在这里插入图片描述
    初始化无线设备,包括硬件配置、固件版本检查、注册表初始化、收发队列初始化,并最终注册到 mac80211 子系统,创建网络接口
    在这里插入图片描述
    续上图
    在这里插入图片描述

一个图总结整个流程

在这里插入图片描述

ath9k_htc_init(void)           									//驱动初始化ath9k_hif_usb_init(void)									//驱动注册ath9k_hif_usb_probe()          							//设备探测ath9k_hif_request_firmware()							//请求加载固件ath9k_hif_usb_firmware_cb()							//固件加载完成后的回调→ ath9k_htc_hw_alloc									//为设备分配硬件资源(如内存、DMA 缓冲区)。ath9k_hif_usb_dev_init()							//初始化 USB 设备(将固件数据通过 USB 传输到设备,为 USB 数据传输分配URB)ath9k_htc_hw_init() 							//初始化硬件(总函数)ath9k_htc_probe_device() 						//负责探测并初始化硬件设备,完成了从分配硬件资源到注册网络接口的完整流程(上一个函数调用)ieee80211_alloc_hw(&ath9k_htc_ops)          //内核函数,分配无线硬件描述符,ath9k_htc_ops:无线硬件的操作函数集,用于管理无线硬件的操作和状态ath9k_init_device()   					//初始化无线设备硬件(如配置寄存器、启动固件),并注册到 mac80211 子系统ath9k_set_hw_capab()					//设置硬件的功能集(如支持的频段、接口类型等),设置mac地址ath9k_tx_init(priv);					//初始化队列(Queue)用于管理数据包的发送ieee80211_register_hw(hw)			//将设备注册到 mac80211 子系统,创建网络接口(如 wlan0)release_firmware();				//释放固件并标记设备就绪

疑问:

  1. wifi mac是wifi探测设备的必经流程,那mac地址是在哪获取和设置的呢
    将设备从EEPROM中读取的真实MAC地址(common->macaddr)设置为网络接口的永久硬件地址
    通过ath9k_hw_common访问到macaddr字段
    在这里插入图片描述
    设置mac地址
    在这里插入图片描述
  2. 当无线网卡设备成功被驱动探测并初始化后,内核会通过哪种方式在文件系统中显示设备信息?
    我们这里句几个除了工具不常用到的例子,都能说明设备正常被加载在这里插入图片描述
    设备通用信息:/sys/bus/usb/devices/1-1
    在这里插入图片描述
    或者:/sys/class/net
    在这里插入图片描述
    这里的常用信息
    设备的加载驱动和子系统信息:
    在这里插入图片描述
    还有就是无线物理层PHY参数
    在这里插入图片描述
    或者/proc/net/dev
    在这里插入图片描述

基础概念加深

  1. 驱动匹配机制
    匹配过程:
    1)内核遍历所有已注册的 USB 驱动(通过 usb_register_driver)。
    2)对比设备的 (VID, PID) 与驱动 id_table 中的条目。
    3)若匹配成功,调用驱动的 probe() 函数(即 ath9k_htc_probe)。
  2. 无线子系统(mac80211)
    1)mac80211 是 Linux 内核中用于实现无线wifi协议栈的核心框架,它为无线网卡驱动提供了统一的软件接口,简化了无线设备驱动的开发。
    2)它是现代 Linux 无线驱动的基石,支持多种无线模式(如 AP、STA、Monitor 等)和复杂的 Wi-Fi 功能(如加密、扫描、速率控制等)。

mac80211 的定位与作用

  1. 功能定位
    1)硬件抽象层:将底层无线硬件的操作抽象为统一的 API,驱动开发者只需实现这些接口,无需关心复杂的 802.11 协议逻辑。
    2)协议实现:处理 802.11 协议的核心功能,如帧的封装/解析、认证、关联、扫描、加密(WEP/WPA/WPA2/WPA3)等。
    3)多模式支持:支持多种无线模式(Access Point, Station, Monitor, Mesh, Ad-Hoc )
  2. 与其他子系统的关系
    1)cfg80211:mac80211 的配置层,提供用户空间工具(如 iw、hostapd)通过 nl80211(基于 Netlink)配置无线接口的接口。
    2)硬件驱动:驱动通过实现 mac80211 的回调函数(如发送/接收数据、设置频道等)与物理设备交互。
    3)用户空间工具:如 iw、wpa_supplicant,通过 cfg80211 控制无线网络行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导,为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取,从而提供了更接近人类能力的抓取指导。 论文地址:GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

快速部署Samba共享服务器作为k8s后端存储

由于Ceph Squid(v19.2.1)‌不原生支持直接导出 SMB 服务器‌,需通过手动集成 Samba 或其他第三方工具实现‌ 所以直接部署最简单的 安装软件包 apt install samba编辑配置文件 vim /etc/samba/smb.conf在最末尾添加以下 # cp /etc/samba/sm…

【时时三省】(C语言基础)选择结构和条件判断

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 选择结构和条件判断 在现实生活中需要进行判断和选择的情况是很多的。如:从北京出发上高速公路,到一个岔路口,有两个出口,一个是去上海方向,另一个是沈阳方向。驾车者到此处必须进行判断,根据自己的目的地…

【MYSQL】索引和事务

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容讲解 MySQL 中的索引和事务,在学习的过程中,我们需要经常问自己为什么 文章目录 1. 索…

计划管理工具应该具备的能(甘特图)

在当今快节奏的项目管理环境中,高效地规划和跟踪项目进度是至关重要的。甘特图,作为项目管理领域的经典工具,以其直观的时间轴和任务分配方式,深受项目管理者的青睐。 随着数字化时代的到来,甘特图线上编辑器应运而生&…

Redis分布式寻址算法

分布式寻址算法是分布式系统中用于确定数据应该存储在哪个节点的算法。这些算法对于实现高效的数据存取、负载均衡和系统扩展性至关重要。以下是几种常见的分布式寻址算法的解释: 1. Hash 算法 原理:通过哈希函数将数据的键(Key&#xff09…

CSS动画

目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数(animation-timing-function) 1. 预设值 2. 贝塞尔曲线 3. 步进函数(steps()) 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…

2025年河北省第二届职业技能大赛网络安全项目 模块 B样题任务书

2025年河北省第二届职业技能大赛网络安全项目 模块 B样题任务书 河北省第二届职业技能大赛网络安全项目-模块 B-夺旗挑战赛(CTF)一、目标系统1二、目标系统2三、目标系统3四、目标系统4 需要真题环境-培训可以私信博主! 河北省第二届职业技能…

钞票准备好了吗?鸿蒙电脑 5 月见

3月20日,在华为 Pura 先锋盛典及鸿蒙智行新品发布会上,华为常务董事、终端BG董事长、智能汽车解决方案BU董事长余承东表示,华为终端全面进入鸿蒙时代,今年5月将推出鸿蒙电脑。 在3月20日的华为Pura先锋盛典及鸿蒙智行新品发布会上…

Java高频面试之集合-15

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:解决哈希冲突有哪些方法? 1. 开放寻址法(Open Addressing) 核心思想:当哈…

【机器学习】建模流程

1、数据获取 1.1 来源 数据获取是机器学习建模的第一步,常见的数据来源包括数据库、API、网络爬虫等。 数据库是企业内部常见的数据存储方式,例如:MySQL、Oracle等关系型数据库,以及MongoDB等非关系型数据库,它们能够…

GitHub 上的 Khoj 项目:打造你的专属 AI 第二大脑

在信息爆炸的时代,高效管理和利用个人知识变得愈发重要。GitHub 上的 Khoj 项目为我们提供了一个强大的解决方案,它能成为你的 “AI 第二大脑”,帮你轻松整合、搜索和运用知识。今天,就来详细了解下 Khoj。​ Khoj 是什么&#x…

爬虫(requsets)笔记

一、request_基本使用 pip install requests -i https://pypi.douban.com/simple 一个类型六个属性 r.text 获取网站源码 r.encoding 访问或定制编码方式r.url 获取请求的urlr.content 响应的字节类型r.status_code 响应的状态码r.headers 响应的头信息 import requestsur…

centos7连不上接网络

选择编辑, 选择虚拟机网络编辑 右键虚拟机,点击设置,设置网络,选择nat模式, 配置:/etc/sysconfig/network-scripts/ifcfg-ens33 vim /etc/sysconfig/network-scripts/ifcfg-ens33设置IP地址如图所示,重…

OpenResty(Lua)+Redis实现动态封禁IP

文章目录 架构设计环境准备源码编辑安装OpenResty下载安装准备依赖编译安装配置环境变量(可选)OpenResty 服务管理命令 安装Redis配置Lua脚本测试准备测试工具测试封禁逻辑 删除版本信息清除编译安装的OpenResty 架构设计 通过 Nginx Redis 的方案&…

Turtle基本操作(前进、后退、旋转)

1. Turtle基本移动概念 在Turtle绘图中,“海龟”(Turtle)相当于一支笔,它在屏幕上移动时,会在经过的路径上留下轨迹。我们可以通过一系列简单的指令控制它的前进、后退和旋转,从而绘制各种形状和图案。 2. 前进与后退 2.1 前进(forward() 或 fd()) Turtle的 forward…

C++类与对象的第一个简单的实战练习-3.24笔记

在哔哩哔哩学习的这个老师的C面向对象高级语言程序设计教程&#xff08;118集全&#xff09;讲的真的很不错 实战一&#xff1a; 情况一&#xff1a;将所有代码写到一个文件main.cpp中 #include<iostream> //不知道包含strcpy的头文件名称是什么,问ai可知 #include<…

Jetson Orin NX使用 Ollama 本地部署 deepseek

本文记录在 jetson orin nx 上使用 ollama 部署 deepseek 的过程 有用的网站及工具 NVIDIA Jetson AI LabOllama官网Jtop 工具 > 用以查看jetson GPU/CPU/Memory 等占用情况的工具&#xff0c;安装过程如下&#xff1a; sudo apt-get install python3-pip sudo -H pip3 in…

目标检测20年(三)

对这篇论文感兴趣的小伙伴可以订阅笔者《目标检测》专栏&#xff0c;关注笔者对该文献的阅读和理解。 前两篇解读链接&#xff1a; 目标检测20年&#xff08;一&#xff09;-CSDN博客 目标检测20年&#xff08;二&#xff09;-CSDN博客 目录 四、 检测器的加速发展 4.1 特…

智能手持终端PDA在设备巡检管理中的应用

在工业制造、能源电力、轨道交通等领域&#xff0c;设备巡检是保障生产安全与连续性的核心环节。传统巡检模式存在效率低、易出错、数据滞后等痛点。上海岳冉智能设备巡检手持终端PDA&#xff0c;以智能化、数字化、高可靠为核心设计理念&#xff0c;集RFID、条码扫描、AI图像识…