2010年1月12日 星期二

SD mmc

SD和MMC记忆卡介面技术
52RD.com 2006年8月22日 司马余            评论:18条 查看 我来说两句




一般而言,MCI包含了命令暂存器、回应暂存器、资料暂存器、逾时(timeout)计数器和侦错逻辑,能够自动传送命令,必要时,还能接收相关的回应和资料。它使用极少的处理器资源。MCI支援串流、区块和多区块资料的读写,可以透过DMA通道做快速的传输,减少对处理器的依赖,和降低对缓冲记忆体的需求。
典型的MCI的工作速率是主时脉的一半,可以支援的最大时槽(slot)是16个(视不同厂牌而定),而每一个时槽可以用来连接一个MMC匯流排(最多共可连接30片MMC记忆卡)或每一个时槽可以用来连接一片SD记忆卡。在同一个时间内,只能选择一个时槽,因为时槽是多工传输的。在命令暂存器里有一个位元可以用来选择时槽。

SD记忆卡介面是使用9个脚位,这包含:时脉、命令、4条资料线、3条电源线。MMC记忆卡介面是使用7个脚位,这包含:时脉、命令、1条资料线、3条电力线。有趣的是,有些MCI的SD记忆卡介面也支援MMC读写作业,这就变成SD记忆卡和MMC记忆卡可以共用相同的插槽。SD和MMC记忆卡的最主要差别在于:初始化流程和匯流排佈线架构。

附图一是MCI的位置图示。附图二是MCI的应用图示。附图一中的脚位名称之意义如下:
.MCCDA/MCCDB:MMC或SD记忆卡的命令或回应。
.MCCK:MMC或SD记忆卡的时脉。
.MCDA0 ~ MCDA3:MMC的位元资料(DAT[0]),SD的位元资料(DAT[0 ~3])。MMC只有1条资料线(data line),SD共有4条资料线,所以,它们的资料匯流排宽度(data bus width)不同。
.MCDB0 ~ MCDB3:MMC的位元资料(DAT[0]),SD的位元资料(DAT[0 ~3])。

附图一中与MCI相关的邻近区块之功能叙述如下:
.可程式I/O(PIO):上述的SD/MMC接脚具有多工传输的功能,这是透过PIO线路达成的。韧体工程师必须先撰写PIO控制器的程式,赋予MCI接脚周边传输的功能。
.功率管理控制器(PMC):MCI可以参考PMC决定其时脉。当MCI没有被使用时,可以降低MCI的时脉速率,以节省功率。
.中断:一般的MCI介面都具有一条中断线路,它是连接至中断控制器。因此,在设定MCI中断前,必须先撰写中断控制器的程式。

附表一是MMC匯流排介面的脚位说明;附表二是SD匯流排介面的脚位说明。附图三是MMC匯流排的连接方式;附图四是SD匯流排的连接方式。附图五是MMC和SD一起被使用时的连接方式。请注意,MMC或SD匯流排的电源必须另外供给,但未在附图三或四中呈现出来。
 




图一:MCI的位置图
 

当MCI被设定成SD作业模式时,资料匯流排的宽度可以藉由暂存器(譬如:MCI_SDCR)来选择。清除此暂存器的SDCBUS位元,表示匯流排的宽度是1位元;若将此位元值设为1,则表示宽度是4位元。在MMC作业模式下,只有资料线0有被使用,其它资料线可以当成独立的PIO脚位(与SD或MMC无关)。

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)」。


(52RD.com)

沒有留言:

張貼留言