WiFi模块 driver驱动框架(sdio接口、pcie接口)

1、WiFi driver驱动框架

  • 应用层
  • BSD socket层
  • TCP/IP协议层
  • IP层
  • 网络设备层
  • MAC层(802.11)
    (包括扫描、认证、关联、省电状态)
  • 设备驱动层

2、SDIO-Wifi模块

1、SDIO-Wifi模块介绍

SDIO-Wifi模块是基于SDIO接口的符合WiFi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,能够实现用户主平台数据通过SDIO口到无线网络之间的转换。SDIO具有传输数据快,兼容SD、MMC接口等特点。

对于SDIO接口的WiFi,首先,它是一个SDIO的卡设备,然后具备了WiFi的功能。所以,注册的时候还是先以sdio设备去注册,然后检测到卡之后再去实现它的wifi功能。显然,他是用SDIO的协议,通过发命令和数据来控制实现WiFi功能。

SDIO 故名思义,就是 SD 的 I/O 接口(interface)的意思,不过这样解释可能还有点抽像。更具体的说明,SD 本来是记忆卡的标准,但是现在也可以把 SD 拿来插上一些外围接口使用,这样的技术便是 SDIO

所以 SDIO 本身是一种相当单纯的技术,透过 SD 的 I/O 引脚来连接外围,并且透过 SD 上的 I/O 数据引脚与这些外围传输数据,而且 SD 协会会员也推出很完整的 SDIO stack 驱动程序,使得 SDIO 外围(我们称为 SDIO 卡)的开发与应用变得相当热门。目前常见的 SDIO 外围(SDIO 卡)有:

  • Wi-Fi card(无线网络卡)
  • CMOS sensor card(照相模块)
  • GPS card
  • GSM/GPRS modem card
  • Bluetooth card

SD卡与SDIO卡的异同

1.SD卡使用的是SD卡协议,而SDIO卡使用的是SDIO协议;协议不一样,初始化/读写方式都不一样
2.ARK1600控制器既支持SD卡也支持SDIO卡,在驱动上完全可以做到同一个卡槽既支持SD卡也支持SDIO卡,甚至combo卡,因此在驱动上有个判断过程,判断插进来的是SD卡还是SDIO卡
3.两者的引脚定义不一样,尽管引脚个数都一样

2、SDIO的传输模式有三种:

  • SPI mode(required)
  • 1-bit mode
  • 4-bit mode

依据 SD 标准,所有的 SD(记忆卡)与 SDIO(外围)都必须支持 SPI mode,因此 SPI mode 是「required」。

3、SDIO的硬件电路
WiFi模块 driver驱动框架(sdio接口、pcie接口)_第1张图片
可以看到,SDIO接口总共有七个引脚,分别是DAT0-3(数据),CLK(时钟),CMD(命令),VIO(电源)。

4、MMC子系统框架

这里的MMC子系统框架包含了Linux的SDIO驱动架构,所以姑且将其看作SDIO的驱动架构。

linux/driver/mmc目录下有三个子目录:card 、core、host,分别表示区块层、核心层、主机控制层。其中card层、core层是Linux封装好的、标准的东西,不需要修改,需要修改的是host层,这一层需要驱动开发工程师根据平台来完成。
WiFi模块 driver驱动框架(sdio接口、pcie接口)_第2张图片
Linux MMC子系统主要分成三个部分:

  • MMC核心层:完成不同协议和规范的实现,为host层和设备驱动层提供接口函数。MMC核心层由三个部分组成:MMC,SD和SDIO,分别为三类设备驱动提供接口函数;
  • Host 驱动层:针对不同主机端的SDHC、MMC控制器的驱动;
  • Client 驱动层:针对不同客户端的设备驱动程序。如SD卡、T-flash卡、SDIO接口的GPS和wi-fi等设备驱动。

wifi驱动怎么知道使用那个sdio控制器?

读到这里不知道你们是不是有疑问,我们的SOC上有很多的sdio控制器,有些sdio控制器接emmc flash,有些接wifi模块,wifi驱动怎么知道我接在那个sdio控制器上呢?
其实是在wifi厂商提供的驱动里面会注册一个sdio_register_driver,当上电的时候我的emmc驱动会去扫描sdio的外围设备,当确认扫描到设备的时候会去读取设备的id即wifi模块的pid和vid,如果设备id匹配上了之后会调用使用sdio_register_driver注册进去的probe函数,从而确认我们的设备是接到那个sdio设备上。

usb wifi和sdio的wifi也是一样的,wifi模块插入usb口的时候,会读取usb模块的vid和pid,如果读取到的vid和pid和使用usb_register注册进去的设备的vid和pid是一样证明驱动匹配上了,然后调用probe函数。

原文链接:https://blog.csdn.net/qq_27809619/article/details/120281476

5、SDIO总线协议

SDIO总线 和 USB总线 类似,SDIO也有两端,其中一端是HOST端,另一端是device端。所有的通信都是由HOST端发送命令开始的,Device端只要能解析命令,就可以相互通信。 对于SDIO总线,它的HOST端是开发板mmc控制器,而device端则是各种带SDIO接口的模块,比如SDIO WiFi模块。

SDIO协议是由SD卡协议演化升级而来的,很多地方保留了SD卡的读写协议,同时SDIO协议又在SD卡协议之上添加了CMD52和CMD53命令。由于这个,SDIO和SD卡规范间的一个重要区别就是增加了低速标准。低速卡的目标应用是以最小的硬件来支持低速I/O能力。

SD总线通信是基于指令和数据比特流,起始位开始和停止位结束。SD总线通信有三个元素:

  • Command:由host发送到卡设备,使用CMD线发送;
  • Response:从card端发送到host端,作为对前一个CMD的相应,通过CMD线发送;
  • Data:即能从host传输到card,也能从card传输到host,通过data线传输。

详细的代码注册流程分析请参考:https://blog.csdn.net/weixin_45244289/article/details/110002248

https://blog.csdn.net/Enosji/article/details/121513074

你可能感兴趣的:(linux,系统,linux)