在分析WIFI驱动前,分享一下个人对Linux驱动的一些了解,其实纵观Linux众多的设备驱动,几乎都是以总线为载体,所有的数据传输都是基于总线形式的,即使设备没有所谓的总线接口,但是Linux还是会给它添加一条虚拟总线,如platform总线等;介于WIFI的驱动实在是太庞大了,同时又是基于比较复杂的USB总线,所以建议读者在看此文章之前,先了解一下USB设备驱动和网络设备驱动。

我们要看懂WIFI驱动,首先要明白WIFI的工作原理。所以前期有几篇文章都是讲解WIFI的工作原理。从这篇文章开始,我们将进入WIFI的代码世界。对于支持802.11n、802.11ac这些比较新的无线标准的WIFI芯片,其驱动程序也会越来越复杂。那么我们怎么入手去了解及分析它呢?

特别声明:以下文章是以Station的角色去分析WIFI的驱动。

网上很多文章分析Linux设备驱动都是从模块加载入手去分析它的驱动源码。以博主从事Linux设备驱动多年的经验,这确实是一条很直观又非常好的思路。但是这只局限于设备功能少、接口较简单、驱动源码较少的设备驱动。对于功能复杂、驱动源码庞大的设备驱动,根据这条思路,很多开发者可能会无耐心走下去,或者会走向死胡同。

现在我们可以这样来看,从硬件层面上看,WIFI设备与CPU通信是通过USB接口的,与其他WIFI设备之间的通信是通过无线射频(RF)。从软件层面上看,Linux操作系统要管理WIFI设备,那么就要将WIFI设备挂载到USB总线上,通过USB子系统实现管理。而同时为了对接网络,又将WIFI设备封装成一个网络设备。

我们以USB接口的WIFI模块进行分析:

(1)从USB总线的角度去看,它是USB设备;

(2)从Linux设备的分类上看,它又是网络设备;

(3)从WIFI本身的角度去看,它又有自己独特的功能及属性,因此它又是一个私有的设备;

通过上述的分析,我们只要抓住这三条线索深入去分析它的驱动源码,整个WIFI驱动框架就会浮现在你眼前。

         1、现在我们先从USB设备开始,要写一个USB设备驱动,那么大致步骤如下:

(1)需要针对该设备定义一个USB驱动,对应到代码中即定义一个usb_driver结构体变量。代码如下:

struct usb_driver xxx_usb_wifi_driver;

(2)填充该设备的usb_driver结构体成员变量。代码如下:

static struct usb_driver xxx_usb_wifi_driver = {

.name =             "XXX_USB_WIFI",

.probe=   xxx_probe,

.disconnect=   xxx_disconnect,

.suspend=        xxx_suspend,

.resume=         xxx_resume,

.id_table=        xxx_table,

};

(3)将该驱动注册到USB子系统。代码如下:

usb_register(&xxx_usb_wifi_driver);

以上步骤只是一个大致的USB驱动框架流程,而最大和最复杂的工作是填充usb_driver结构体成员变量。以上步骤的主要工作是将USB接口的WIFI设备挂载到USB总线上,以便Linux系统在USB总线上就能够找到该设备。

         2、接下来是网络设备的线索,网络设备驱动大致步骤如下:

(1)定义一个net_device结构体变量ndev。代码如下:

struct net_device *ndev;

(2)初始化ndev变量并分配内存。代码如下:

ndev=alloc_etherdev();

(3)填充ndev -> netdev_ops结构体成员变量。代码如下:

static const struct net_device_ops xxx_netdev_ops= {

                           .ndo_init= xxx_ndev_init,

                            .ndo_uninit= xxx _ndev_uninit,

                            .ndo_open= netdev_open,

                             .ndo_stop= netdev_close,

                              .ndo_start_xmit= xxx_xmit_entry,

                               .ndo_set_mac_address= xxx_net_set_mac_address,

                              .ndo_get_stats= xxx_net_get_stats,

                              .ndo_do_ioctl= xxx_ioctl,

                           };

(4)填充ndev->wireless_handlers结构体成员变量,该变量是无线扩展功能。代码如下:

ndev->wireless_handlers = (struct iw_handler_def *)&xxx_handlers_def;

(5)将ndev设备注册到网络子系统。代码如下:

register_netdev(ndev);

         3、WIFI设备本身私有的功能及属性,如自身的配置及初始化、建立与用户空间的交互接口、自身功能的实现等。

(1)自身的配置及初始化。代码如下:

xxx_read_chip_info();

xxx_chip_configure();

xxx_hal_init();

(2)主要是在proc和sys文件系统上建立与用户空间的交互接口。代码如下:

xxx_drv_proc_init();

xxx_ndev_notifier_register();

(3)自身功能的实现,在前面章节上我们已经讲解过WIFI的网络及接入原理,如扫描等。同时由于WIFI在移动设备中,相对功耗比较大,因此,对于功耗、电源管理也会在驱动中体现。

本文章只是博主结合自身工作经验分享一个大致的对wifi驱动框架的理解,后期文章将会细化这些内容。敬请读者期待,谢谢!

wifi驱动的理解(1)——驱动架构相关推荐

  1. 谈谈对WiFi P2P的理解

    谈谈对WiFi P2P的理解 概述 P2P架构简介 P2P Discovery介绍 Device Discovery 流程 Service Discovery Group Formation P2P ...

  2. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店...

    原文:[.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店 一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Bytear ...

  3. 「领域驱动设计」DDD,六边形架构,洋葱架构,整洁架构,CQRS的整合架构

    这篇文章是软件架构编年史的一部分,一系列关于软件架构的文章.在这些文章中,我写了我对软件架构的了解,我如何看待它,以及我如何使用这些知识.如果您阅读了本系列以前的文章,那么本文的内容可能更有意义. 大 ...

  4. 【PCI】ARM架构——PCI总线驱动、RC驱动、Host Bridge驱动、xilinx xdma ip驱动(八)

    本文以xilinx RC IP为例,讲解ARM的RC驱动(PL). IP例程参考网址:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/188 ...

  5. 无线图传领域AR1021X系列WiFi模块选型参考及驱动探讨

    AR1021X是高通旗下最热销USB接口WiFi方案,先可以这样理解:AR1021X是AR9375的升级替代版本(双通符合IEEE 802.11a/b/g/n标准双频),AR1201G是AR9374的 ...

  6. 浅谈如何理解领域驱动设计

    本文作者为长沙.NET社区开发者微笑刺客,转载已获得作者授权. 前言 什么是领域,我习惯描述的是制药领域.环境领域.建筑领域.金融领域等,而在领域内,各种业务规则.业务知识盛行,如何有效的把控规则的变 ...

  7. 从实际业务出发,浅显的聊聊如何理解领域驱动设计

    前言 什么是领域,我习惯描述的是制药领域.环境领域.建筑领域.金融领域等,而在领域内,各种业务规则.业务知识盛行,如何有效的把控规则的变化,应对复杂知识,有一个很关键的四字词语,分而治之.分治法在很多 ...

  8. Linux(Ubuntu)下WiFi网卡(intel ax201)驱动与Nvidia显卡驱动冲突的解决办法

    Linux(Ubuntu)下WiFi网卡(intel ax201)驱动与Nvidia显卡驱动冲突的解决办法 环境: 系统 Ubuntu 22.04 LTS 网卡ax201(微星b660m迫击炮wifi ...

  9. 华为linux版本wifi驱动,Ubuntu安装无线网卡驱动 Wifi/BT BCM4330 (AP6383)

    像BCM4330 (AP6383)这样的Wifi/蓝牙一体化芯片常见于一些平板电脑.笔记本和mini pc中.特别是z3735.z8300.core m这些芯片的平板电脑很常见.AP6210也比较常见 ...

  10. linux内核led驱动开发,从Linux内核LED驱动来理解字符设备驱动开发流程

    目录 博客说明 开发环境 1. Linux字符设备驱动的组成 1.1 字符设备驱动模块加载与卸载函数 1.2 字符设备驱动的file_operations 结构体中的成员函数 2. 字符设备驱动--设 ...

最新文章

  1. Linux下gcc中各种文件后缀说明
  2. 续上篇随笔:陈勇提示做分批载入需要用到的数据
  3. Java中外部类访问内部类的方法
  4. MyEclipse使用总结——使用MyEclipse打包带源码的jar包
  5. 龙图 VP 李翀:数据化运营及云计算下的运维
  6. 无法访问你试图使用的功能所在的网络位置_[steam实用工具]解决无法访问商店/社区/好友列表的问题...
  7. 一步步编写操作系统 38 一级页表与虚拟地址3
  8. 系统管理员节日 网民的感恩日
  9. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖
  10. JavaScript中对于函数的形参实参个数匹配是如何做的?
  11. css3 border
  12. sql server中replace()函数,可用于字符串替换
  13. windows 下安装图片标注软件 labelling和出错解决
  14. 计算机的cup颗数、核数、线程数
  15. Win10 系统设置共享文件
  16. 草履虫纳米机器人_纳米机器人的研究进展如何?
  17. 最新码支付源码+完整版+免挂监听回调+微信、支付宝、qq监控APP打包教程
  18. 安防工程商遇六大挑战考验 能否披荆斩棘?
  19. 6.4 GitHub - 管理组织
  20. echarts图表生成base64

热门文章

  1. maya自动安装脚本
  2. ERA5再分析数据(二)
  3. Unity基础学习六,网络同步
  4. 少儿英语趣味小精灵软件界面收录
  5. 使用扫描枪扫描条码时字符识别写入缓慢问题(针对element-ui的el-input)优化
  6. 激光巨幕拿什么对飚IMAX?
  7. 重视网络安全,红客联盟最新开源分享“黑客零基础入门学习路线+笔记”堪称黑客入门天花板教程
  8. jq的.click().on('click')
  9. AFPM100消防设备电源监控系统在国航重庆分公司维修基地项目中的应用-安科瑞苏月婷
  10. 学习记录 Python 计算图片集的像素总平均值