王铜柱, 李 毅, 苏先海
随着在FPGA中集成了软核和硬核处理器后,FPGA的功能越来越强大,在单片FPGA上即可完成复杂系统的设计和实现,而通过对FPGA进行重新配置即可改变系统的功能,满足用户不同的需求,大大提高FPGA的利用率,但是丢电易失的特性使得其配置文件只能存放在非易失性存储中,设计者需要考虑如何有效的管理与各种功能对应的多个配置文件,因此移植 FatFs文件系统以达到对若干配置文件的管理,同时避免对存储flash的直接访问,避免误操作,具有较高的实用价值。
FatFs是专门针对小型嵌入式系统的通用 FAT文件系统模型。FatFs依据标准C规范编写,完全和存储介质的读写 I/O分开,所以可以轻松移植到各种硬件平台上,可以在其官方主页[1]上下载其源代码和使用说明等信息,同时也提供了移植到PIC和ARM等低成本的微控制器上的示例程序。FatFs主要具有以下特性:①兼容FAT文件系统;②不受应用平台限制,移植性好;③代码空间和数据空间需求量小;④多样的配置选项:多种存储媒介支持、长文件名支持、RTOS支持等。
FatFs具有良好的层次结构和方便的移植性,如图1所示。FatFs共分3层。顶层的应用层提供了一系列的应用函数,如f_open,f_close,f_read,f_write等,对使用者来说屏蔽了FAT协议和FatFs内部复杂的函数,因而可以轻松完成相关文件操作。中间层FatFs实现了FAT文件读/写协议,同时可以方便增加RTOS。底层是使用者需要处理的存储介质读写I/O,如块读函数和块写函数等。时钟位如图2所示。
图1 FatFs的分层结构
图2 时钟位
SmartFusion芯片[2]集成了FPGA,Cortex-M3处理器,提供了丰富的外设资源,如图 3所示。Cortex-M3是一款低功耗处理器,具有门数目少,中断延迟短,调试成本低的特点,是为要求有快速中断响应能力的深度嵌入式应用而设计的,高性能,低功耗,易扩展[3]。SPI控制器[4]以从模式与处理器通过APB总线连接,支持接入大存储SPI flash和EEPROM器件,包含以Cortex-M3和以DMA两种方式控制数据传输,本设计中选择DMA方式进行数据传输。
图3 SmartFusion芯片架构
FatFs移植的具体工作有两步,即编写FatFs接口函数和FatFs里的配置函数。
需要给出下列若干函数来控制对物理介质的读和写,如表1所示。
表1 FatFs接口APIs
SmartFusion评估板上带一片 Atmel SPI flash,AT25DF641-MWH-T,支持通用的块擦除(4 Kbyte,32 Kbyte,64 Kbyte)和整片擦除[4]。
存储介质初始化函数——DSTATUS disk_initialize (BYTE pdrv):本设计中就是spi flash的初始化及其解保护。pdrv是存储介质编号,本设计只支持flash一个存储介质,将pdrv设为0。
读扇区函数——DRESULT disk_read (BYTE pdrv, BYTE *buff,DWORDsector,BYTE count):*buff为读缓存,sector是起始扇区号,count是需要读的扇区数目。用spi flash函数API,以4Kb为单位进行操作。读取无误返回0,错误返回非0。
写扇区函数——DRESULT disk_write(BYTE pdrv,const BYTE *buff,DWORD sector,BYTE count):*buff为写缓存,sector是起始扇区号,count是需要写的扇区数目。调用 spi flash函数API,以4Kb为单位进行操作。写无误返回0,错误返回非0。
存储介质控制函数——DRESULT disk_ioctl(BYTE pdrv,BYTEcmd,void *buff):cmd是控制命令,*buff为存储或接收数据缓存。本设计中只是简单的得到簇大小,簇数量等信息。
实时时钟函数——DWORD get_fattime ():直接调用SmartFusion芯片的RTC模块,将得到一个32位无符号整数,时钟信号包含在这 32位中,如图2所示。
文件中ffconfig.h文件定义了所有相关的FatFs配置信息,通过FatFs的配置(如表2所示),可以根据需要对代码进行裁剪,以获得最合适的代码。
如图4所示,为带有FatFs模块的嵌入式系统的典型架构,需要在Application模块中完成系统初始化,创建文件系统等工作,重写diskio.c文件中的若干函数,在spi.c文件中完成对flash的若干操作。
表2 FatFs配置
图4 带有FatFs模块的典型架构
如图5所示,系统相关初始化及创建文件系统流程,本设计将SPI配置为模式3,APB总线时钟除以128,帧大小设置为8 bit[5]。
图5 系统相关初始化及创建文件系统
采用DMA方式对flash进行读和写。创建文件系统时,使用f_mount函数在FatFs模块注册一块文件系统对象工作区,使用f_getfree函数获得空闲簇数量,使用f_mkfs函数创建FAT文件系统。最后初始化并开启片上系统RTC,用于get_fattime函数,以得到当前时间。之后,便可以完成创建文件,重命名文件,复制文件等各种操作。整个操作通过串口进行命令输入,并打印出相关信息。最后成功创建了FAT12类型文件系统,簇大小4KB,整块flash作为一个扇区。
本研究以SmartFusion片上系统芯片为核心,以spi flash作为存储媒介,移植了 FatFs,实现了用Cortex-M3微处理器对文件进行读写等功能。在数据量比较大的嵌入式系统中,嵌入 FatFs文件系统来管理数据会非常方便灵活,同时有利于降低成本,具有较为广阔的应用前景[6]。另外一方面,TFTP协议为小文件传输通信在嵌入式系统的应用提供了一个可行方案,使用网口来将电脑中的文件发送至flash,可以远程对设备进行升级[7]。
[1] ChaN.FatFs generic FAT file system module[EB/OL].(2013-01-23)[2013-05-11].http://elm-chan.org/fs w/ff/00index_e.html.
[2] Microsemi.SmartFusionCustomizable System-on-chip Datasheet[EB/OL].(2013-01-01)[2013-05-11].http://www.microsemi.com/fpga-soc/soc-fpga/smartfusion#documents.
[3] 孟惠霞,吕书勇.基于ARM的SD卡文件系统设计[J].通信技术,2009,42(07):135-136,150.
[4] Microsemi.SmartFusion microcontroller subsystem(MSS) user’s guide[EB/OL].(2012-09-01)[2013-05-11].http://www.microsemi.com/fpga-soc/soc-fpga/smar tfusion#documents.
[5] Microsemi.Accessing serial flash memory using SPI interface App Note[EB/OL].(2013-01-05)[2013-05-11].http://www.microsemi.com/fpga-soc/soc-fpga/smartfusion#documents.
[6] 董叶,陈小平.TFTP协议在LM3S6965上的移植和应用[J].通信技术,2011,44(08):89-90,105.
[7] 曾晓洋,吴敏,韩军,等.信息安全芯片 SoC平台及其应用[J].信息安全与通信保密,2005(07):358-360.