TransFlash存储卡在嵌入式系统调试中的应用
摘要:硬件平台基于应用处理器PXA310,软件平台基于嵌入式Linux的Android操作系统。首先介绍了TF卡与应用处理器的连接电路设计。然后介绍TF卡驱动程序的设计和Android对TF卡的挂载方法。在TF卡驱动程序设计中采用了SPI工作模式和FAT32文件系统,描述了FAT32文件系统的移植。最后介绍了系统调试,并展示了TF卡在视频数据采集单元中应用的设计结果。
关键词:TF卡;嵌入式系统;Android;自动挂载
0 引言
嵌入式系统调试一般使用串口、JTAG、USB或网卡来下载系统镜像到目标机中。使用串口下载镜像,协议简单,接口通用,但传输速率太慢。使用JTAG下载镜像,传输速率较高,但需要专用的JTAG调试器,价格较高,限制了调试环境。使用USB或网卡下载镜像速度快、接口通用,但一般做成产品后的嵌入式设备不需要留出通用的USB或以太网接口,从而增加了设计的复杂性和开发成本。在移动嵌入式产品开发过程中,如果使用TransFlash(TF)卡代替USB或以太网口,由于TF卡一般又都是移动嵌入式产品的必要构成部分,这样做一般可以减小嵌入式系统调试的复杂性和成本。本文提出使用TF卡更新镜像的方法,并在实际的嵌入式系统调试中成功应用。使用TF卡下载系统镜像,速度与通用性都很好,既省去了调试中对其他下载设备的设计需求,又解决了最终产品大容量存储器的设计问题。
1 TransFIash卡与应用处理器的连接电路设计
本文调试的嵌入式系统,是一种视频数据采集与传输单元,以PXA310为中央处理器,采集到的视频数据由PXA310进行压缩编码处理,之后发送到网络中去,供用户查看。系统调试过程中,视频数据可以存储到TF卡中。
TF卡模块在系统中主要有两个方面的作用:
一是在嵌入式系统开发调试过程中用于将系统镜像到目标版;
二是作为最终嵌入式系统产品的大容量存储器。
SD卡有两个可选的通信协议:SD模式和SPI模式。SD模式是SD卡标准的读写方式,但要求主控制器带有SD卡控制器。PXA310本身没有TF卡控制器接口,选用SD模式通信就无形中增加了产品的硬件成本,选择SPI模式可以说是一种最佳的解决方案,相对于SD模式,SPI模式接口与协议简单、易于操作。这时TF卡在PXA3 10 MMC/SD/SDIO主控制器控制下工作。
2 Blob中TF卡的驱动设计以及FAT32文件系统移植
2.1 设计TF卡SPI模式驱动
TF卡操作遵循SD卡协议,TF卡的操作完全与SD卡相同。相对于SD模式,SPI模式接口与协议简单、易于操作。PXA310带有MMC/SD/SDIO主控制器,但由于Blob中没有提供SD卡与主控制器的具体驱动,实现完整驱动的难度较大,故本文采用GPIO口模拟的SPI模式读写TF卡,运行到Linux内核后再加载主控制器驱动运行SD模式的方式,性能与实现难度都可兼顾。
SPI模式TF卡总线采用主从问答式协议。主机发送命令Command,TF卡应答回复Response。SD卡命令有两种,CMDx和ACMDx。ACMD是应用指令集,属于扩展指令集,在发送任何的ACMD之前,必须先发送CMD55激活,才可以使用ACMD指令集。发送完一个ACMD,并且卡响应了此指令之后,CMD55的作用就消失了,所以要发送多个或多次发送一个ACMD,需要循环发送CMD55+ACMD。
2.2 SPI模式初始化TF卡流程
TF卡默认的通信模式是SD模式,本文要在SPI模式下设计TF卡驱动,需要从SD模式切换到SPI。为此,先将TF卡上电,延时74个时钟周期后发送复位命令CMD0,同时将SD卡的CS片选信号置低,若此时接收到应答信号为0x01,说明TF卡进入了SPI模式。
TF卡与MMC卡都可用SPI模式驱动,故在初始化时可考虑与MMC卡的兼容性。在发送CMD0成功接收到应答信号后,连续发送CMD55+ACMD41,若CMD55回复0x01而ACMD41回复0x00,则TF卡初始化成功。若没有完整的应答,则改发CMD1,若CMD1成功回复0x00,则MMC卡初始化成功。
在SPI模式下,TF卡的初始化时钟频率不能超过400 kHz。初始化成功后,就可以配置高速时钟下TF卡的读写操作了。图2为TF卡初始化流程图。
在Blob中完成TF卡初始化,还需要初始化PXA310的GPIO口,并根据对应TF卡的引脚配置其输入输出关系。
在Blob中,PXA3 10的PXA_SD_D2、PXA_SD_D3、PXA_SD_CMD、PXA_SD_CLK、PXA_SD_D0、PXA_SD_D1这几个I/O口并没设置为GPIO口,不能在软件上进行读写操作,要使用SPI模式,必须将这几个IO口设置为GPIO。通过在MFP寄存器中配置IO口的功能号,再配置相应参数即可实现。
2.3 通过SPI读写TF卡的程序设计
TF卡的读写以块为单位,初始化完成后,使用CMD16设置SD卡读写块长度(512 B),发送CMD17和CMD24读单块写单块,发送CMD18和CMD25读多块和写多块。实现TF驱动层中读写函数的逻辑流程如图3所示。
评论