linux下MMC/SD/SDIO驱动系列之一 ---- 概述
最近在研究WIFI驱动,驱动模块为broamd4330,基于SDIO接口,所以趁机研究了一下内核中对于SDIO设备的注册。
(我使用的linux内核版本为3.2.0 硬件为samsung 4412)
在介绍内核之前,有必要先了解一下MMC SD SDIO三种卡,从发展历程来看,是先有MMC卡,后来有SD卡,这两种都是纯粹的存储卡,而SDIO是什么呢,从字面意思理解,应该是SD+IO,也就是既有存储功能,又有IO控制功能,不过也有纯IO功能的SDIO设备(本人用到的WIFI模块就是这种)。并且,这三种卡可以使用同一个插槽,系统还能正确的识别!!,可能是由于历史原因,在开始有Linux的时候,还只存在mmc卡(不存在SD和SDIO卡),所以在linux系统里面关于这三种卡的名称统统用“mmc“来命名。
下面来看一下CPU与WIFI模块的物理连接图
从图上可以看出,我们的WIFI模块接的是CPU上的mmc3,数据线,时钟线以及命令线都一一对应,当然在CPU一端,对于mmc3模块,还有一个很重要的引脚--“xmmc3CDn”脚,CPU就是根据该引脚的电平高低来判断mmc3模块上是否有卡接入,如果电平为低,表示有卡,如果为高,表示无卡,笔者这里将该引脚固定拉低。同时在WIFI模块一端,也有一个很重要的引脚--“WL_SDIO_SPI_HSCI_SEL”引脚 ,它是用来选择模块是工作在SD模式(低电平),还是SPI模式(高电平),笔者这里也将该引脚固定拉低。
好了,简单的介绍了一些概念以及硬件后,还是要回归到程序上,从大的方面来讲,MMC/SD/SDIO的驱动程序主要分为两大块,主设备驱动和从设备驱动。对于上面的例子来说,CPU上的MMC3模块就是主设备,而WIFI模块就是从设备。该系列的博文就是分析MMC主设备在内核中的注册,以及对于同一个mmc插槽,系统是如何区分出MMC SD 以及SDIO设备的。
精彩的内容,见下一篇博文