SDIO WiFi模块分析

转载 2012年03月21日 15:44:26
分类: 底层开发

Andrew Huang <bluedrum@163.com> 转载请注明作者及网址.


  手头的上课s3c6410开发板,带了SDIO接口的WiFi模块,但是没有Linux下的驱动,因此在上网络驱动时课参考s3c2440的实现试着分析和调试一下SDIO的WiFi驱动。

   我手头使用模块是WM-G-MR-09模块,其主控实际采用了marvell8686的IC来作为主控芯片,是由台湾环隆出的模块。网上能找到最接近的Linux驱动是针对 s3c2440的官方出的 GSPI-8686-LINUX26-BULVERDE-9.70.3.p29-26409.P50.tar
      官方的源码包提供的动态模块形式的驱动和命令行工具。经过简单修改Makefile,并且调步几个iw_函数的调用后,成功的在linux 2.6.28下编译成功,但是其中部分代码拷贝自s3c2440,因此这个驱动必然不会正常运行。因此必须要分析其模块的来改写成s3c6410的模块。

  首先这个模块是WiFi+Bluetooth 的2合一的模块。并且带了SDIO/G-SPI的接口与CPU进行交互.

    
      
    SDIO接口比较明白,是源于SD卡的交互接口,后来扩展到多个硬件模块的对接,比如SDIO的蓝牙,WIFI模块等。
    G-SPI是一个什么接口呢?它实际上是SPI总线的扩展。原来在早期推广SDIO接口,为了取得更大兼容性,在设计硬件接口时,留出几个PIN脚完全兼容SPI的接口。这样就能让只带SPI的总线接口的CPU上也能使用SD卡。
   SPI是一个三线工业控制总线,它分别是 SPICLK(时钟线),MOSI(主设备发送/从设备接收线),MISO(主设备接收/从设备发送),完全的SPI还有一根片选线 (CS线),如果缺省这一根,则只能主设备固定为某一个设备。
   
    而G-SPI在这四根线上再进入扩展了一个CLK_REQ线和 一个外部中断线 G-SPI_SINTn
其中外部中断脚分析驱动象是用于唤醒和休眠的功能,而CLK_REQ是休眠时的时钟频率线(?)
两种接口的对应关系如下。



  而CPU采用哪一种接口完全取决于硬件设计,在模块的说明到,取决于IF_SEL_1和IF_SEL_2两个pin脚的接法,即23/24号脚的接线,如果想配成SDIO的接口,两个脚悬空,否则则成焊上两个100K的下拉电阻.


在模块原理图也说得更清楚,即是否焊上r8,r9两个电阻就决定软件使用哪一个接口。
   

 虽然模块支持两个接口,但是所有代码提供都是G-SPI的实始化代码,硬件上也是如下设计.
 不巧的是手头的模块,以及学员手中模块居然全是没有焊r8/r9两个电阻的模块,即只能用使用SDIO接口。在打电话询问了做Marvell的FAE的学员,他也无法确定SDIO接口的命令格式与G-SPI的命令格式完全一致,因此用SDIO直接初始化模块的方案就放弃了。只采用G-SPI的接口来工作。
   
  接收下来确定S3C6410 上是否也支持这种SDIO的管脚上复用SPI的用法。因为S3c6410同时支持SDIO和SPI的模块,但是如果 SDIO的PIN不能被SPI控制器接管,只能采用自行模拟时序的方法来通讯,这样无疑大大增加了工作量,因此我查询s3c6410的GPIO的配置,在GPIO的配置上,SPI的管脚是和SDIO复用的。但仔细分仔发现SDIO的管脚并没有完全与SPI的复用。如果想使用G-SPI,必须在接线直接接在SPI的管脚上,并且把G-SPI外部中断脚接在某一个外部中断的GPIO之中。

  

而且关于模块的中断脚,这只是一个简单低电平有效的外部中断.
   
而这个管脚按照原理图,它正好接在了GPH4上,即是第6组的第4个中断脚


至此,在s3c6410下的模块驱动移植工作就变成了如下两个工作.
   1.实现SPI S3c6410的驱动
   2.按对外部中断脚,实现wan_interrupt响应

其余工作重用官方驱动即可

SDIO驱动
   仔细分析s3c6410的关于SDIO的接口。发现在S3C6410有三个SDIO的channel 0使用GPG组,Channel 1使用GPH组。而channel 2使用 GPC组。但是只有channel 2才有SPI与SDIO管脚复用的可能性。而我手头开发板其接在channel 1上,即GPH组上。因此软件采用SPI的难度相当大。而且仔细分析,只能采用SDIO实现方法。




Linux 内核对Marvell网卡支持。

用Marvell关键字搜索 Linux 2.6.28 目录下的drivers/net/wireless目录,发现libertas就是对MW 8686的支持代码。从源码看直接 PCMIA接口(if_cs.c),USB接口(if_usb.c)和SDIO接口(if_sdio.c).并且分析源码,发现其支持
  •    PCMIA支持 CF8385
  •    USB支持USB8388
  •    SDIO支持 sd8385/sd8686
而最新的linux 2.6.38.5支持的接口更多。把g-spi接口的支持也增加进来(if_spi.c)。芯片支持更加丰富
  • PCMIA支持CF8305/CF8381/CF8385
  • USB支持 USB8388/8682
  • SDIO支持 sd8385/sd8686/sd8688
  • G-SPI支持gspi8385/gspi8686/gspi8688

  
   
  因此在Linux 下可以直接使用SDIO的驱动驱动这一模块

SDIO接口 wifi 无线模块 RTL8189ES芯片 高性能 低功耗 体积小

品牌: B-LinK型号: BL-LW08成色: 全新是否无线: 无线网卡插口: 其他/other传输速度: 150Mbps   1.产品简介 BL-R8189RM2是一款高性能、低功耗、体...
  • xgbing
  • xgbing
  • 2014年02月26日 15:49
  • 19133

LabVIEW中查找范例的举例使用

LabVIEW         是一种程序开发环境,由美国国家仪器(NI)公司研制开发,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本...

使用directshow的一点路径包含问题

在一个名字为VideoCapMFC工程中,使用directshow程序文件时,我们将directshow文件夹放在了E:\OpenCV_study\MyProjects\VideoCapMFC文件夹下...

S3C6410硬件模块分析 -- SDIO WiFi模块分析

转载至:http://www.linuxidc.com/Linux/2011-06/37480.htm 手头的上课s3c6410开发板,带了SDIO接口的WiFi模块,但是没有Linux下的驱动,因...

WIFI模块SDIO

  • 2014年07月14日 16:35
  • 993KB
  • 下载

【程序】Marvell 88W8686 WiFi模块与SD内存卡同时插在SDIO总线上的初始化代码

本程序所用的单片机型号为:STM32F103RE PB12端口为外接的WiFi模块电源开关,当PB12输出低电平时接通电源。 注意:WM-G-MR-09模块的芯片组(Chip Set)就是Marvel...
  • ZLK1214
  • ZLK1214
  • 2017年08月06日 13:56
  • 303

SDIO WIFI模块调试的问题

上周开始,在我们的AM3358开发板上调试WIFI模块,模块是RTL8189ES。当底层使用CMD53命令读时,会出现CRC校验错误。这个问题的原因是连接SDIO模块的线太长了,把连接线弄短就好了。 ...

将wifi固件编译进内核,成功加载sdio wifi模块

Wifi驱动以编译进内核的形式加载,因此需要将wifi所需的固件一同编译进内核,首先将helper_sd.bin sd8686.bin两个固件复制到内核源代码目录下的firmware目录下。将help...

[Android6.0][RK3399] SDIO 接口 Wifi 驱动流程分析 (AP6354)

Platform: RockChip OS: Android 6.0 Kernel: 4.4 WiFi/BT/FM 模组: AP6354 前面的基本概念搜罗于网络; 后面的驱动流程分析是根...
  • dearsq
  • dearsq
  • 2016年11月24日 12:00
  • 3419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SDIO WiFi模块分析
举报原因:
原因补充:

(最多只允许输入30个字)