OMAP-L138处理器的SD卡FAT文件系统读写
2011-06-22陈正江
陈正江
(电子科技大学 自动化工程学院,成都611731)
陈正江(硕士研究生),主要研究领域为测控技术与仪器。
引 言
德州仪器(TⅠ)公司的OMAP-L138处理器是一款将ARM和DSP整合在一起的低功耗应用处理器,其中ARM核采用的是主频为375MHz的ARM926EJ-S核,而DSP核采用TⅠ公司的型号为TMS320C6748的浮点型DSP[1]。
作为一款针对移动设备和高速数据处理的高性能应用处理器,SD卡的引入有一定的必要性。在大部分应用中OMAP-L138处理器会产生大量的数据,SD卡的使用可以大大降低板上存储数据的成本,减少数据的转移时间,提高数据的转移效率。而在SD卡上实现文件系统,有利于管理卡上数据,使之准确而迅速地转移至PC机。考虑到FAT文件系统较高的可移植性,且与PC机上常用的Windows操作系统兼容,因此在本课题中采用了FAT文件系统以便于在PC机上对数据进行分析和备份。
1 SD卡简要介绍
由于在成本控制、安全性、移动性和读写速度等方面都有不错的表现,SD卡的应用越来越广泛。下面针对SD卡在本课题中的应用进行一些简要的介绍。
1.1 SD卡结构
SD卡内部结构如图1所示。SD卡有9个引脚,以下是对除供电和接地引脚外的6个引脚的功能介绍。
①CLK:时钟信号。每个时钟周期能传输一个命令或数据位。
② CMD:命令(Command)和响应(Response)线。用于主机与SD卡之间的协调通信。
图1 SD卡内部结构
③DAT0~3:数据线。用于主机与SD卡之间的数据交换。
另外,SD卡内部有6个长短不一的寄存器,存储着SD卡的出厂日期、生产厂商、容量大小、操作条件和SD卡状态等信息。
1.2 工作模式
根据SD卡的相关标准可知[3],SD卡支持两种总线模式:一种是SPⅠ模式,即使用SPⅠ接口总线来进行数据的传输,只使用4位数据线中的DAT0进行数据传输,而CD/DAT3引脚用于片选;另一种是SD模式,该模式下可以使用单线或4线传输数据。只要主控设备提供了SPⅠ接口,SD卡就能应用于该设备,这使SD卡更具有通用性;而SD模式相比于SPⅠ模式可以提供更快的SD卡读写速度,这正是高速数据处理所需要的。
1.3 SD模式下的Command与Response介绍
Command和Response都是在CMD线上串行传输的,只是传输的方向不一样。
Command代表着一次主机到从卡操作的开始,是从主机到单卡或所有卡。
Response是对之前Command的响应,可以来自单卡或所有卡。
1.3.1Command介绍
Command分为标准CMD和ACMD,它们之间的区别就是在使用ACMD之前须向SD卡发送APP_CMD Command(CMD55)[3],而标准 CMD 是可以直接对 SD 卡使用的。以下是几个常用的Command[3]。
① GO_ⅠDLE_STATE(CMD0):重置所有卡,使它们都处于空闲态,无Response。
② ALL_SEND_CⅠD(CMD2):向所有卡询问 CⅠD号码,响应类型为R2。
③SEND_RELATⅠVE_ADDR(CMD3):询问卡的RCA(Relative Card Address,相对卡地址)。是SD卡的本地系统地址,是由SD卡在初始化期间动态分配并得到主机承认的[3],响应类型为 R6。
④ SELECT/DESELECT_CARD(CMD7):CMD7使用RCA作为命令参数,当某卡收到的是自己本身的RCA,那么它将被选择。反之,则该卡将被取消选定。当发送的RCA为0时将取消选定的所有卡,响应类型为R1b。
⑤SEND_CSD(CMD9):命令参数为 RCA,其作用是使地址为该RCA的卡给主机设备发送它的CSD信息,响应类型为R2。
⑥ STOP TRANSMⅠSSⅠON(CMD12):强制卡结束数据传输,通常用于SD卡多块读写时,响应类型为R1b。
⑦SET_BLOCKLEN(CMD16):设置 SD卡的块长度,通常的块长度都是512字节,响应类型为R1。
⑧ READ_SⅠNGLE_BLOCK(CMD17),READ_MULTⅠPLE_BLOCK(CMD18):块的读命令,前者读单块,后者读多块,响应类型都是R1。
⑨ WRⅠTE_SⅠNGLE_BLOCK(CMD24),WRⅠTE_MULTⅠPLE_BLOCK(CMD25):块的写命令,前者写单块,后者写多块,响应类型都是R1。
⑩ APP_CMD(CMD55):指明下一个命令为ACMD,响应类型为R1。
[11]SET_BUS_WⅠDTH(ACMD6):设置SD卡的数据宽度,参数为数据宽度,响应类型为R1。
[12]SD_SEND_OP_COND(ACMD41):让SD卡返回OCR寄存器内容,参数为SD卡的电压范围,响应类型为R3。
1.3.2Response介绍
Response分为R1、R1b、R2、R3、R6和R7,除去R2长度为136位外,其他的全为48位,但它们的功用和意义不一致。
R1为普通命令的响应,而R1b与R1唯一的区别就是R1b代表该卡接到命令时数据线会处于忙态。R2用于卡向主机返回SD卡CSD或CⅠD寄存器内容,R3作为ACMD41的响应,返回SD卡OCR寄存器的内容。R6返回SD卡的RCA,R7作为CMD8的响应[3]。
2 FAT文件系统
之所以引入FAT文件系统,一是便于SD卡上数据的管理,二是便于将SD卡上的数据转移至PC机上进行备份和处理。
2.1 FAT文件系统简介
目前FAT文件系统有FAT12、FAT16和FAT32三种类型,它们是由FAT表中每个FAT项所占长度来分类的,即它们的FAT表中每个FAT项占用的位数分别为12、16和32位[4]。由于FAT12文件系统能支持的最大分区容量只有8MB,再加上不能支持长文件名,现在已经很少能看到它的踪影了。FAT16能支持的分区容量为16 MB~2GB[4],FAT32能支持的分区容量为32MB~32 GB[4]。在本课题中可以灵活地选择将SD卡格式化为FAT16或FAT32。
2.2 FatFs简介
FatFs是在小型的嵌入式系统中的一个通用的FAT文件系统模块[5],也 就是 FAT 文 件系统的驱动。它连接着顶层的应用和底层的物理实现如图2所示。FatFs的引入降低了在SD卡上借助文件系统实现读写功能的难度。如图3所示,只需要实现底层SD卡的Ⅰ/O函数、RTC函数和顶层的应用函数功能就可以实现FAT文件系统的移植。
图2 FatFs模块
下面简要介绍FatFs模块中的一些常用库函数[5]。
①f_mount:用于装载或卸载一个工作区域,在使用FatFs库函数进行操作前须装载一个工作区域,操作完毕后要卸载该工作区域。
②f_read,f_write:文件的读写函数。
③f_open:用于打开或创建一个文件,在使用f_read或f_write函数之前须使用f_open打开文件。
④f_close:关闭一个文件,在完成文件的读写操作过程后须使用此函数关闭该文件。
⑤f_mkfs:格式化磁盘。
⑥f_opendir,f_readdir,f_mkdir,f_chdir:作用依次是打开、读取、创建和更改目录。
⑦f_unlink:删除一个文件或一个目录。
3 软件设计与实现
3.1 软硬件平台
本课题使用的是R0.08b版本的FatFs模块,编译调试软件为TⅠ公司的CCS v3.3;硬件平台是合众达的DEC-138开发板,其使用的芯片便是本文一开始介绍的OMAP-L138处理器,同时也提供了SD卡的接口,满足设计要求。
3.2 软件实现
FatFs的移植工作主要是根据硬件平台的不同对底层disk Ⅰ/O函数和RTC函数的编写。完成上述工作后,在了解FatFs库函数功能的情况下就可以根据自己需要编写顶层的应用函数。
3.2.1SD卡的初始化和读写函数
(1)初始化函数SD_Init
SD卡的初始化流程如图3所示。分为初始化SD控制器和识别SD卡两个主要步骤,其中关于SD卡识别中使用到的CMD的相关解释请参见1.3.1小节。另外,流程图中默认在发送ACMD之前发送了CMD55。
(2)读写函数
图3 SD卡初始化函数流程图
SD卡读/写数据示意图如图4所示。对OMAPL138而言,SD卡数据的读写都要通过SD控制器上的FⅠFO,大小可设置为32字节或64字节。MMCDRR(MMC Data Receive Register,数据接收寄存器)和MMCDXR(MMC Data Transmit Register,数据发送寄存器)长度都是32位。在读SD卡上的数据的时候,会先将SD卡的数据复制到FⅠFO中,然后 MMCDRR会分次将FⅠFO中的数据读出并发送至Host;而在写SD卡时,数据也会先放置在FⅠFO中,之后MMCDXR再依次把数据读出来写到SD卡中[6]。
图4 SD卡读/写数据示意图
SD卡的读写函数分为单块和多块,而多块的读写实际上有两种实现方法:
① 将多块分成多个单块来读写;
② 直接使用多块读写CMD完成多块的读写。
由于第一种方法在单块数据读写之前须发送多次单块读写CMD,而第二种方法只用在数据传输之前发送一个多块读写CMD,并在数据传输终止处发送一个传输结束CMD,因此后者的速度明显快于前者。
3.2.2diskI/O函数
disk Ⅰ/O函数的作用就是作为上层FatFs函数库与底层存储设备Ⅰ/O函数的纽带。
(1)磁盘的初始化函数disk_initialize
初始化SD卡,此函数的参数为无符号char型的drv,目前版本的FatFs只支持单块磁盘,其值只能为0。
(2)磁盘状态获取函数disk_status
用于获取磁盘状态,编写此函数时只需判断drv是否为0。
(3)磁盘读写函数disk_read/disk_write
disk_read/disk_write函数流程如图5所示。disk_read/disk_write即磁盘的读写函数,其作用是将磁盘的读写操作包装起来供FatFs模块中的相关函数调用。
图5 disk_read/disk_write函数流程图
(4)磁盘I/O控制函数disk_ioctl
用于返回块大小、扇区大小和容量的函数。最典型的应用是在格式化函数f_mkfs中。函数f_mkfs需从disk_ioctl中得到2个参数:磁盘的容量和扇区大小。只有disk_ioctl得到正确的参数,f_mkfs才能将SD卡正确格式化。
(5)实时时间获取函数get_fattime
此函数用于得到实时时钟,以标示文件的创建时间和修改时间。
结 语
本课题成功实现了基于OMAP-L138处理器的SD卡FAT文件系统的移植,使得该处理器对文件的读写简单易行,对文件的管理事半功倍;此外,让SD卡工作在SD模式下使得OMAP-L138在进行高速数据处理过后产生的数据能够快速地存储到SD卡中。FAT文件系统的成功移植也使OMAP-L138产生的数据能更高效地转移至PC机上加以处理和备份。
[1]Texas Ⅰnstruments.OMAP-L138Low-Power Applications Processor[EB/OL].(2009-06)[2011-07].http://www.ti.com/cn/litv/pdf/sprs586b.
[2]Texas Ⅰnstruments.OMAP-L138Applications Processor System Reference Guide[EB/OL].(2010-10-16)[2011-07].http://www.ti.com/cn/litv/pdf/sprugm7d.
[3]SD Group and SD Association.SD Specifications Part 1 Physical Layer Simplified Specification Version 3.01[EB/OL].(2010-05-18)[2011-07].http://www.sdcard.org/developers/tech/sdcard/pls/simplified_specs.
[4]刘伟.数据恢复技术深度揭秘[M].北京:电子工业出版社,2010.
[5]FatFs Generic FAT File System Module[OL].[2011-07].http://elm-chan.org/fsw/ff/00index_e.html.
[6]Texas Ⅰnstruments.TMS320C674x/OMAP-L1xProcessor Multimedia Card(MMC)/Secure Digital(SD)Card Controller User's Guide [EB/OL].(2010-08)[2011-07].http://www.ti.com/cn/litv/pdf/sprufm2b.