分类: LINUX
2013-05-17 17:19:30
原文地址:SD和MMC记忆卡介面技术 作者:dixiaobing
|
|||||||
MMC记忆卡的位址是由匯流排控制器在初始化时设定的。它们的唯一的CID号码代表它们自己。MMC有两种资料传输命令,如下所示: .序列式命令:这个命令会启动连续性的资料串流。唯有收到停止命令时,传输作业才会结束。这个模式可以减少传送额外的命令。 .区块式命令:此命令在传送一个资料区块之后,会传送CRC位元。它的读写作业支援单一区块或多区块的传输。和序列式命令类似,在收到停止命令时,多区块传输作业才会结束。
图二:MCI的应用图示
表一:MMC匯流排介面的脚位说明
表二:SD匯流排介面的脚位说明
图三:MMC匯流排的连接方式
图四:SD匯流排的连接方式
图五:MMC和SD一起被使用时的连接方式 |
|||||||
|
|||||||
命 令暂存器被写入值之后,ALL_SEND_CID命令就会立即被送出。当传送完成之后,状态暂存器(MCI_SR)的状态位元会生效 (assert)。ALL_SEND_CID需要回应,这可以透过读取MCI回应暂存器里的值来达成。根据命令的需要,回应信息的大小可以在48位元至 136位元之间。MCI会在这些信息中加入侦错码,以防止在传输中发生资料毁损。
表三:MCI_CMDR暂存器
表四:ALL_SEND_CID命令 |
|||||||
|
|||||||
下列所述是读取单一区块,使用或不使用DMA时的作业流程。读取作业结束时,可以採用轮询(polling)或中断的方式来处理,本范例中是使用轮询的方法。这些都是属于韧体工程师的程式设计工作。 .送出SEL_DESEL_CARD命令,来选择MMC记忆卡。 .送出SET_BLOCKLEN命令。 .如果是透过DMA来读取,则按照附图六右侧的流程,否则按照附图六左侧的流程。 MMC 的写入作业使用模式暂存器来定义在写入非多区块大小时的填充值(padding value),这是藉由写入模式暂存器的一个位元来决定。例如:对该位元写入0,代表填充值是0×00;若写入1,则代表填充值是0xFF。MMC写入单 一区块作业流程的前面两个步骤与上述的MMC读取作业流程相同,如果是透过DMA来读取,则按照附图七右侧的流程,否则按照附图七左侧的流程。
图六:MMC的资料读取作业流程
图七:MMC的资料写入作业流程 |
|||||||
|
|||||||
透过SD控制暂存器(MCI_SDCR),可以选择插槽位置和资料匯流排的宽度。SD匯流排的资料线路数目也可以被动态地设定,开机后的预设值是DAT0;初始化时,韧体工程师可以改变这个值,以符合实体的资料线路之数目。SD控制暂存器如附图八所示。
图八:SD控制暂存器 |
|||||||
|
|||||||
在Linux 2.6的MMC区块层的mmc_blk_issue_rq( )程式中,有下列一段处理错误的程式码和註解: mmc_card_release_host(card); /* * 这有一点严峻,但是直到我们还能想出更好的处理错误的方法之 * 前,这已经是我们能够尽力达到的了—-尤其是在错误发生之前,有* 些主机无法知道有多少资料已经被传送了。 */ spin_lock_irq(&md->lock); ……………………………………………………… 这 说明了Linux 2.6的MMC区块层驱动程式仍有瑕疵存在,使用时必须注意。理论上,「卸下」MMC记忆卡的档案系统的速度应该要比机械式的插拔速度要快很多才对— -这是热插拔装置的理想目标,但是因为各种硬件和作业系统的设计不尽相同,就会发生这样的问题。解决之道,就是要尽量缩短区块层驱动程式的反应时间,并且 要随时掌握MMC记忆卡的状态;在移除的瞬间,区块层能知道要「卸下」的档案系统是哪一个,而且先对MMC记忆卡做出回应,以确保MMC记忆卡里的资料之 完整性,之后,再去执行最耗时的「卸下」动作。当然,上述的情况都是指MMC记忆卡不处于读写的传输状态中,否则任何系统都无法确保记忆卡里面的资料,即 使是硬碟、软碟、USB………等其它I/O技术在此「恶劣」的情况下,也是无能为力的。 |
|||||||
|
|||||||
在ftp://ftp.arm.linux.org.uk/pub/armlinux/kernel/v2.6/网站中,可以免费下载支援ARM处理器的MMC/SD驱动程式,这是修改(patch)Linux 2.6核心程式后的结果。简略说明其修改的位置和新增的功能如下: mmc.c : 侦测SD记忆卡、将读取到的SD暂存器资料註册。 mmc_block.c : 检查是否是唯读的记忆卡(不是SD规格)。 mmc_sysfs.c : 公开SD控制(设定)暂存器的位置 mmc.h : 增加新的定义。 下面的起始档是新增的: card.h : 新增一些旗标(flag)来代表卡片的类型、唯读属性和新的暂存器。 host.h : 新增一些旗标来代表匯流排宽度、唯读测试和模式(SD/MMC)。 protocol.h : 须新增的SD命令。 这 个SD/MMC驱动程式的特点是:1.支援4-bit的资料宽度;2.支援唯读的记忆卡(可以读取唯读开关的状态)。Linux 2.6的MMC驱动程式只支援1-bit的资料宽度和读写的功能。不过,这个驱动程式仍然有一些错误(bug),若传输很小的资料(小于16 bytes)时,可能会失效。此外,请注意,MMC的功能不能从此驱动程式中去除,因为系统在侦测SD之前,会先侦测MMC。 |
|||||||
|
|||||||
图九:两个4-bit模式的SDIO卡的线路连接方式 SDIO的信号传输模式有SPI、1-bit、4-bit三种。在SPI模式中,第8脚位被当成中断信号。其它脚位的功能和通信协定与SD记忆卡的标准规范一样。附表五是SDIO的每个脚位在不同信号模式下的定义。
表五:SDIO的脚位定义 |
|||||||
|
|||||||
图十:SDIO记忆卡内部的固定记忆体映射空间 此 外,由于SDIO记忆卡的每一个功能可能需要包含额外的记忆体空间,用来储存驱动程式或应用程式。而且,因为SDIO记忆卡可能必须支援不同的平 台,所以每一个驱动程式或应用程式可能会有许多种版本。解决的方法有两种:一种是使用SD的标准规范(如附图十一),来设计「组合卡」;另一种是使用嵌入 式的「程式码储存区域(Code Storage Area;CSA)」。
图十一:SD的记忆体映射空间。SMC是「静态记忆体控制器(Static Memory Controller)」、BFC是「暴量传输的(burst)FLASH控制器(Burst Flash Controller)」。 |
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1530256