这两周在tq imx6ul下调一个迈威88w8801sdio wifi模组,最后尴尬的发现tq imx6ul并不支持sdio wifi。至于不支持的原因会在后面简单说一下,小弟才疏学浅如果有大佬在tqimx6ul上成功移植过sdio wifi,也请多多指教,好了现在进入正题吧。
首先我们要搞清楚SDIO WIFI是什么,SDIO WIFI首先是一个网络设备,然后才是一个块设备。一个网络设备驱动程序,必须要具有的是收包发包函数、网络设备注册函数。接下来参照宋宝华《Linux设备驱动开发详解-基于最新的Linux4.0内核》简单介绍一下网络设备驱动程序。
Linux对网络设备驱动定义了4个层次,这4个层次为网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络设备与媒介层。
(1)网络设备协议接口层向网络层协议提供统一的数据包发送接口,不论上层协议是ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过netif_rx函数接收数据。这一层的存在使得上层协议独立于具体的设备.
(2)网络设备接口层向协议层提供统一的用于描述具体网络设备属性和操作的结构体net_deive,该结构体是设备驱动功能层中各函数的容器。实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。
(3)设备驱动功能层的各函数是网络设备接口层net_device数据结构的具体成员,是驱使网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作。
(4)网络设备与媒介层是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介、网络适配器被设备驱动功能层中的函数在物理上驱动。对于Linux而言,网络设备和媒介可以是虚拟的。
在sdio wifi涉及到网络设备部分的代码,基本上也是按照Linux网络设备驱动框架。对Linux网络设备驱动的介绍就到这,如果后面还涉及到的话再深入。接下来介绍sdio协议。
sdio卡(Secure Digital Input and Output)安全数字输入输出卡,是基于并且兼容sdio内存卡的。它的兼容性包括机械、电气、电源、信号传递和软件。sdio卡专注于提供高速数据i/o口应用在低功耗的消费类移动电子产品中。
sdio卡分为两种,全速SDIO卡和低速SDIO卡。全速SDIO卡支持SPI、1位和4位SD传输模式,时钟频率在0~25MHZ之间。全速SDIO卡传输速率最快能达到10M/秒。低速SDIO卡仅需支持SPI和1位SD传输模式,4位SD传输模式是可选的,时钟频率仅在0~400KHZ之间。低速卡的目标应用是以最小的硬件开支支持低速I/ O能力。低速卡支持类似调制解调器、条码扫描仪和GPS接受器等应用。对“组合”卡(存储器+ SDIO)而言,全速和4位操作对卡内存储器和SDIO部分都是强制要求的。在博文中我只对这两周调试sdio wifi时所涉及到的知识做一次总结,希望能再加深一下自己对sdio wifi的理解,估计在以后很长一段时间自己也不会再搞sdio wifi了,写个博文用作备忘也是极好的。首先要配置Linux内核支持SDIO WIFI:
make menuconfig
Networking support->
Wireless->
配置如图所示:
Device driver->
MMC/SD/SDIO card support ->
配置如图所示
比较关键的选项是Networking support->Wireless下的 cfg80211 wireless extensions compatibility
和Device driver->MMC/SD/SDIO card support 下的SDIO UART/GPS class support 。
如果不按照上面的配置的话,装载sdio wifi的驱动时将会报有关80211的错误和sdio_claim_host()函数找不到的错误。
因为刚才说了,sdiowifi首先是一个网络设备,其次是一个块设备, 所以在Linux下需要mmc子系统的支持。
原文:https://blog.csdn.net/qq_23235811/article/details/80554239