| |||||||
MMC传输作业 开机重置之后,MMC的初始化是透过一种特殊的匯流排通信协定来完成。此通信协定的信息格式具有下列几种类型: .命令:表示开始执行一个作业。它是从主机发出,至单一的MMC记忆卡(单一位址的命令),或至全部有连接的MMC记忆卡(广播命令)。此命令信息是在CMD线上以串列方式传输。 .回应:它的传送方向和命令信息相反,它是从一个特定位址的MMC记忆卡,或全部的MMC记忆卡同步地传送给主机,是对之前接收到的命令信息之回应。 .资料:此信息是从主机或MMC记忆卡发出。 MMC记忆卡的位址是由匯流排控制器在初始化时设定的。它们的唯一的CID号码代表它们自己。MMC有两种资料传输命令,如下所示: .序列式命令:这个命令会启动连续性的资料串流。唯有收到停止命令时,传输作业才会结束。这个模式可以减少传送额外的命令。 .区块式命令:此命令在传送一个资料区块之后,会传送CRC位元。它的读写作业支援单一区块或多区块的传输。和序列式命令类似,在收到停止命令时,多区块传输作业才会结束。 图二:MCI的应用图示 表一:MMC匯流排介面的脚位说明 表二:SD匯流排介面的脚位说明 图三:MMC匯流排的连接方式 图四:SD匯流排的连接方式 图五:MMC和SD一起被使用时的连接方式 | |||||||
MMC的「命令—回应」作业 重 置之后,MCI是关闭的,透过MCI控制暂存器的位元设定,可以将MCI开启。假设MCI_CMDR是控制命令讯息的暂存器,它被设定的各栏位值如附表三 所示;ALL_SEND_CID是一个命令名称,它要求所有的MMC记忆卡送出它们自己的CID号码,如附表四的说明。在本范例中, ALL_SEND_CID的引数(argument)栏位之内容是储存在另一个暂存器(MCI_ARGR)中。要传送ALL_SEND_CID命令,韧体 工程师必须执行下列步骤: .将ALL_SEND_CID的引数值填入MCI_ARGR暂存器中。 .设定命令暂存器(MCI_CMDR)。 命 令暂存器被写入值之后,ALL_SEND_CID命令就会立即被送出。当传送完成之后,状态暂存器(MCI_SR)的状态位元会生效 (assert)。ALL_SEND_CID需要回应,这可以透过读取MCI回应暂存器里的值来达成。根据命令的需要,回应信息的大小可以在48位元至 136位元之间。MCI会在这些信息中加入侦错码,以防止在传输中发生资料毁损。 表三:MCI_CMDR暂存器 表四:ALL_SEND_CID命令 | |||||||
MMC的资料作业 MMC的资料读写作业可以包含:单一区块、多区块、串流的传输。这些作业可以透过DMA来加速传输,这是藉由设定模式暂存器(mode register)的位元值来做切换。区块的长度也必须在模式暂存器中设定。 下列所述是读取单一区块,使用或不使用DMA时的作业流程。读取作业结束时,可以採用轮询(polling)或中断的方式来处理,本范例中是使用轮询的方法。这些都是属于韧体工程师的程式设计工作。 .送出SEL_DESEL_CARD命令,来选择MMC记忆卡。 .送出SET_BLOCKLEN命令。 .如果是透过DMA来读取,则按照附图六右侧的流程,否则按照附图六左侧的流程。 MMC 的写入作业使用模式暂存器来定义在写入非多区块大小时的填充值(padding value),这是藉由写入模式暂存器的一个位元来决定。例如:对该位元写入0,代表填充值是0x00;若写入1,则代表填充值是0xFF。MMC写入单 一区块作业流程的前面两个步骤与上述的MMC读取作业流程相同,如果是透过DMA来读取,则按照附图七右侧的流程,否则按照附图七左侧的流程。 图六:MMC的资料读取作业流程 图七:MMC的资料写入作业流程 | |||||||
SD传输作业 SD 记忆卡包含了版权保护功能,它遵守SDMI标准,可以避免资料被盗拷。由于它的传输速率比较快,所以适用于需要记忆容量较大的应用。除了少数的额外功能以 外,SD在尺寸大小、脚位数目和功能、传输通信协定方面,大致上是和MMC相容的。因此,SD的读写作业程序也和上述的MMC读写作业程序类似。 透过SD控制暂存器(MCI_SDCR),可以选择插槽位置和资料匯流排的宽度。SD匯流排的资料线路数目也可以被动态地设定,开机后的预设值是DAT0;初始化时,韧体工程师可以改变这个值,以符合实体的资料线路之数目。SD控制暂存器如附图八所示。 图八:SD控制暂存器 | |||||||
MMC驱动程式 对任何一种记忆卡应用而言,它必须具备下列的基本功能: .热插拔。 .当记忆卡插入或移除时,中断服务常式(ISR)必须能够立即发现和反应。 .当记忆卡插入时,ISR必须能将新加入的记忆卡位址或名称在应用程式中显示出来。移除时,此记忆卡位址或名称也能从应用程式中消失。 .当记忆卡插入时,记忆卡必须像硬碟一样,被「挂(mount)」在硬碟的根目录底下。同理,当记忆卡被移除时,它就会被「卸下(unmount)」。 . 如果记忆卡内部具有档案系统,它虽然可以被虚拟成硬碟—-亦即「区块装置(block device)」,但是当系统发出移除记忆卡的请求时,发现记忆卡早已不存在了,此时,「区块层」程式会不知所措,认为是错误。所以,在系统发出移除记忆 卡的请求之前,区块层必须能先侦测出记忆卡是否有存在。而且如果它不存在,就立即终止这项请求。因此,在设计记忆卡的最底层驱动程式时,必须提供一个函式 (function),而且它必须指向上层的「区块层」。 在应用层,若使用Linux 2.6的hotplug「剧本(script)」程式和mmc.agent来设定与控制记忆卡。当移除MMC记忆卡时,mmc_block.c的 mmc_blk_issue_rq( )会发出移除命令,如果此时MMC记忆卡有存在,则可以顺利移除,并且执行end_that_request_chunk( )来结束此I/O请求。不过,如果MMC记忆卡不存在,则end_that_request_chunk( )会发出类似下列的错误信息,并停止作业。 mmcblk0: error 1 sending read/write command end_request: I/O error, dev mmcblk0, sector 2 Buffer I/O error on device mmcblk0, logical block 1 lost page write due to I/O error on mmcblk0 如 果在移除MMC记忆卡之前,没有正确地先将它的档案系统「卸下」,则MMC记忆卡的内容可能就无法确保。机械式的插拔通常是突然发生的,但从应用层的「剧 本」程式至区块层驱动程式(mmc_block.c),需要一点反应时间,如果这时间拖得太久,就会发生上述的错误。 在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技术在此「恶劣」的情况下,也是无能为力的。 | |||||||
SD驱动程式 目前Linux 2.6核心尚未支援SD驱动程式。不过,可以试着将Linux 2.6的MMC驱动程式功能延伸,使它也能支援SD记忆卡,其要领大致如下: .自动侦测所连接的是SD或MMC记忆卡。因为最多只能连接一片SD记忆卡,所以若连接SD记忆卡时,必须提醒主机进入SD模式。 .读取SD或MMC暂存器之资料,并读取SD记忆卡的卡片特定资料。 .支援4-bit模式,这不只可以支援SD传输作业,还能支援MMC传输作业。 .如果SD记忆卡是唯读装置,可以另外设计一个中断唿叫函式来处理。 在ftp://ftp.arm.linux.org.uk/pub/armlinux/kernel/v2.6/网站中,可以免费下载支援ARM处理器的MMC/SD驱动程式,这是www.arm.linux.org.uk修改(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。 | |||||||
SDIO简介 SDIO 卡能够延伸一个装置的功能。目前有许多种SDIO卡被开发出来,例如:数字相机、蓝芽、GPS、WLAN都有它们各自的SDIO卡。SDIO 1.0标准定义了两种类型的SDIO卡:1.全速的SDIO卡,传输率可以超过100 Mbps;2.低速的SDIO卡,支援的时脉速率在0至400 KHz之间。SDIO卡只需要SPI和1-bit资料宽度的SD传输模式,4-bit模式是一个选项。低速的SDIO卡可以用最少的硬体支援低速的I/O 装置,这些装置包含:数据机、条码扫描机、GPS接收机……等。如果这种记忆卡是一种「组合式(combo)」的卡片(记忆体加SDIO),就必须使用全 速的模式和4-bit的传输模式,这是SDIO 1.0标准规定的。附图九是两个4-bit模式的SDIO卡的线路连接图。 图九:两个4-bit模式的SDIO卡的线路连接方式 SDIO的信号传输模式有SPI、1-bit、4-bit三种。在SPI模式中,第8脚位被当成中断信号。其它脚位的功能和通信协定与SD记忆卡的标准规范一样。附表五是SDIO的每个脚位在不同信号模式下的定义。 表五:SDIO的脚位定义 | |||||||
SDIO内部的记忆体映射 SDIO 记忆卡内部具有固定的记忆体映射,这包含暂存器空间或称为「一般资讯区域(common information area;CIA)」,以及特殊功能区域(function unique area)。CIA包含了与SDIO记忆卡有关的资讯,以及一些必要的(mandatory)和可选择的(optional)暂存器,它们都位于固定的位 址上。藉此,SDIO的主机(譬如:可携式装置)能够得到SDIO记忆卡的有关资讯,并执行一般性的作业。特殊功能区域储存了许多种不同的功能,这是由供 应商定义的,因此,不同厂牌的SDIO记忆卡可能会有不同的功能。附图十是具有许多种不同功能的SDIO记忆卡内部的固定记忆体映射空间。其中,RFU是 「保留给未来使用(Reserved for Future Use)」的意思。CIA所包含的暂存器可以开启或关闭I/O作业、处理硬件中断、载入韧体(这是选项)。这些暂存器也提供与SDIO记忆卡功能相关的资 讯和要求。CIA支援下列3种暂存器: .一般控制暂存器(Card Common Control Register;CCCR):能快速检查SDIO主机,并依照不同的SDIO记忆卡之功能控制它们的启动和中断能力。即使在开机后,SDIO记忆卡的 I/O功能尚未被启动,但是CCCR是可以被存取的,这使得SDIO主机于系统初始化后,可以立即启动SDIO记忆卡的I/O功能。 .基本功能暂 存器(Function Basic Register;FBR):每一个I/O功能具有256 bytes的记忆体空间,这使得SDIO主机能够快速地判定每一个I/O功能的能力和要求,并启动韧体下载功能。这个空间位址是从0x00n00至 0x00nFF,n是功能编号(从0x1至0x7)。 .记忆卡资讯结构(Card Information Structure;CIS):CIS提供更完整的记忆卡功能的相关资讯。这是仿照PCMCIA标准所制定的规格。SDIO记忆卡的每一个功能都各有一个 CIS区域,以及一个共用的CIS区域;共用的CIS区域储存了所有功能的共同特性,每一个功能的CIS区域则储存了该功能所具备的特性。CCCR和 FBR各具有一个指标指向相对应的CIS位址。 图十: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
转载请注明:在路上 » SD和MMC记忆卡介面技术[ZT]