Chinaunix首页 | 论坛 | 博客
  • 博客访问: 712531
  • 博文数量: 104
  • 博客积分: 4320
  • 博客等级: 上校
  • 技术积分: 1948
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-30 14:42
文章分类

全部博文(104)

文章存档

2012年(4)

2011年(65)

2010年(35)

分类: LINUX

2011-12-13 17:38:17

手头的上课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的驱动驱动这一模块

阅读(3605) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~