SD卡驱动分析(一)
Android下的SD卡驱动与标准LINUX下的SD卡驱动好像没有太大的区别,这里就以高通的ANDROID 2.3以代表,来简要分析一下LINUX下SD卡驱动的写法。由于小弟的技术有限,分析的有错的地方,请大家指正,可以共同学习。
一.最先来理清一下SD、MMC与SDIO的一些基本概念:
(1) MMC:(Multi Media Card)是较早的一种记忆卡标准,目前已经被 SD 标准所取代。
(2) SD:(Secure Digital Memory Card) 是一种 flash memory card 的标准,也就是一般常见的 SD 记卡,已完全兼容MMC标准。
(3) SDIO:(Secure Digital Input and Output Card)安全数字输入输出卡。SDIO是在SD标准上定义了一种外设接口,通过SD的I/O接脚来连接外围设备,并且通过SD上的 I/O数据接位与这些外围设备进行数据传输。是目前较热门的技术,目前有很多WIFI、GPS、Bluetooth、radio等模块都有了SDIO接口,也可以被称为“SDIO卡”。
(4) 接口的工作模式:工作模式是对CPU的控制器来说的,也就是说,CPU可以能过设置一些寄存器来将自身控制器设成置满足外挂设备要求的一种工作方式,即:SDIO工作模式、传统的SD模式以及MMC工作模式。这几种模式我的理解就是对应上面1-3三点的不同的外接设备。因为这三种设备的传输协议是有区别的。兼容关系是:“SDIO卡”> “SD卡”> “MMC卡”,反过来刚不成立。
(5) 接口的传输方式:传输方式也是针对CPU的控制器来讲的,一般的CPU控制器都会支持三种传输模式,即:SPI模式、1线模式、4线模式。那么如何才可以保证CPU工作在我们要求的模式以及传输方式呢?就是通过写CPU的控制寄存器来完成的。比如下面会提到的函数msmsdcc_set_ios(struct mmc_host *mmc,struct mmc_ios *ios).
(6) MMC/SD卡初始化时的指令以及各种状态:在网上找到以下的图片,可以很清楚的反映出SD卡初始化的指令,后面介绍代码时所发送的指令其实也是按照这个顺序来发送的:
二.Android(LINUX)下SD卡驱动的结构层次
我们知道,LINUX的驱动很喜欢分层,就像IIC以及输入子系统等驱动一样,LINUX下的SD卡驱动也是分了层次的,在我们的代码的kernel/drivers/mmc目录下包含了三个子目录,分别是:host、card、core三个部分:
HOST部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的,不过高通发布的CODEBASE里已经帮我们把这部分做好了。
CORE 部分: 这是整个MMC 的核心存,这部分完成了不同协议和规范的实现,并为HOST 层的驱动提供了接口函数。
CARD部分:因为这些记忆卡都是块设备,当然需要提供块设备的驱动程序,这部分就是实现了将你的SD 卡如何实现为块设备的。整个SD卡驱动的调用关系可以用如下的图来表示:
SD卡的一些基本概念这里就讲完了,下一节就主要开始分析代码喽。