王銅柱, 李 毅, 蘇先海
隨著在FPGA中集成了軟核和硬核處理器后,F(xiàn)PGA的功能越來(lái)越強(qiáng)大,在單片F(xiàn)PGA上即可完成復(fù)雜系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),而通過(guò)對(duì)FPGA進(jìn)行重新配置即可改變系統(tǒng)的功能,滿(mǎn)足用戶(hù)不同的需求,大大提高FPGA的利用率,但是丟電易失的特性使得其配置文件只能存放在非易失性存儲(chǔ)中,設(shè)計(jì)者需要考慮如何有效的管理與各種功能對(duì)應(yīng)的多個(gè)配置文件,因此移植 FatFs文件系統(tǒng)以達(dá)到對(duì)若干配置文件的管理,同時(shí)避免對(duì)存儲(chǔ)flash的直接訪(fǎng)問(wèn),避免誤操作,具有較高的實(shí)用價(jià)值。
FatFs是專(zhuān)門(mén)針對(duì)小型嵌入式系統(tǒng)的通用 FAT文件系統(tǒng)模型。FatFs依據(jù)標(biāo)準(zhǔn)C規(guī)范編寫(xiě),完全和存儲(chǔ)介質(zhì)的讀寫(xiě) I/O分開(kāi),所以可以輕松移植到各種硬件平臺(tái)上,可以在其官方主頁(yè)[1]上下載其源代碼和使用說(shuō)明等信息,同時(shí)也提供了移植到PIC和ARM等低成本的微控制器上的示例程序。FatFs主要具有以下特性:①兼容FAT文件系統(tǒng);②不受應(yīng)用平臺(tái)限制,移植性好;③代碼空間和數(shù)據(jù)空間需求量小;④多樣的配置選項(xiàng):多種存儲(chǔ)媒介支持、長(zhǎng)文件名支持、RTOS支持等。
FatFs具有良好的層次結(jié)構(gòu)和方便的移植性,如圖1所示。FatFs共分3層。頂層的應(yīng)用層提供了一系列的應(yīng)用函數(shù),如f_open,f_close,f_read,f_write等,對(duì)使用者來(lái)說(shuō)屏蔽了FAT協(xié)議和FatFs內(nèi)部復(fù)雜的函數(shù),因而可以輕松完成相關(guān)文件操作。中間層FatFs實(shí)現(xiàn)了FAT文件讀/寫(xiě)協(xié)議,同時(shí)可以方便增加RTOS。底層是使用者需要處理的存儲(chǔ)介質(zhì)讀寫(xiě)I/O,如塊讀函數(shù)和塊寫(xiě)函數(shù)等。時(shí)鐘位如圖2所示。

圖1 FatFs的分層結(jié)構(gòu)

圖2 時(shí)鐘位
SmartFusion芯片[2]集成了FPGA,Cortex-M3處理器,提供了豐富的外設(shè)資源,如圖 3所示。Cortex-M3是一款低功耗處理器,具有門(mén)數(shù)目少,中斷延遲短,調(diào)試成本低的特點(diǎn),是為要求有快速中斷響應(yīng)能力的深度嵌入式應(yīng)用而設(shè)計(jì)的,高性能,低功耗,易擴(kuò)展[3]。SPI控制器[4]以從模式與處理器通過(guò)APB總線(xiàn)連接,支持接入大存儲(chǔ)SPI flash和EEPROM器件,包含以Cortex-M3和以DMA兩種方式控制數(shù)據(jù)傳輸,本設(shè)計(jì)中選擇DMA方式進(jìn)行數(shù)據(jù)傳輸。

圖3 SmartFusion芯片架構(gòu)
FatFs移植的具體工作有兩步,即編寫(xiě)FatFs接口函數(shù)和FatFs里的配置函數(shù)。
需要給出下列若干函數(shù)來(lái)控制對(duì)物理介質(zhì)的讀和寫(xiě),如表1所示。

表1 FatFs接口APIs
SmartFusion評(píng)估板上帶一片 Atmel SPI flash,AT25DF641-MWH-T,支持通用的塊擦除(4 Kbyte,32 Kbyte,64 Kbyte)和整片擦除[4]。
存儲(chǔ)介質(zhì)初始化函數(shù)——DSTATUS disk_initialize (BYTE pdrv):本設(shè)計(jì)中就是spi flash的初始化及其解保護(hù)。pdrv是存儲(chǔ)介質(zhì)編號(hào),本設(shè)計(jì)只支持flash一個(gè)存儲(chǔ)介質(zhì),將pdrv設(shè)為0。
讀扇區(qū)函數(shù)——DRESULT disk_read (BYTE pdrv, BYTE *buff,DWORDsector,BYTE count):*buff為讀緩存,sector是起始扇區(qū)號(hào),count是需要讀的扇區(qū)數(shù)目。用spi flash函數(shù)API,以4Kb為單位進(jìn)行操作。讀取無(wú)誤返回0,錯(cuò)誤返回非0。
寫(xiě)扇區(qū)函數(shù)——DRESULT disk_write(BYTE pdrv,const BYTE *buff,DWORD sector,BYTE count):*buff為寫(xiě)緩存,sector是起始扇區(qū)號(hào),count是需要寫(xiě)的扇區(qū)數(shù)目。調(diào)用 spi flash函數(shù)API,以4Kb為單位進(jìn)行操作。寫(xiě)無(wú)誤返回0,錯(cuò)誤返回非0。
存儲(chǔ)介質(zhì)控制函數(shù)——DRESULT disk_ioctl(BYTE pdrv,BYTEcmd,void *buff):cmd是控制命令,*buff為存儲(chǔ)或接收數(shù)據(jù)緩存。本設(shè)計(jì)中只是簡(jiǎn)單的得到簇大小,簇?cái)?shù)量等信息。
實(shí)時(shí)時(shí)鐘函數(shù)——DWORD get_fattime ():直接調(diào)用SmartFusion芯片的RTC模塊,將得到一個(gè)32位無(wú)符號(hào)整數(shù),時(shí)鐘信號(hào)包含在這 32位中,如圖2所示。
文件中ffconfig.h文件定義了所有相關(guān)的FatFs配置信息,通過(guò)FatFs的配置(如表2所示),可以根據(jù)需要對(duì)代碼進(jìn)行裁剪,以獲得最合適的代碼。
如圖4所示,為帶有FatFs模塊的嵌入式系統(tǒng)的典型架構(gòu),需要在Application模塊中完成系統(tǒng)初始化,創(chuàng)建文件系統(tǒng)等工作,重寫(xiě)diskio.c文件中的若干函數(shù),在spi.c文件中完成對(duì)flash的若干操作。

表2 FatFs配置

圖4 帶有FatFs模塊的典型架構(gòu)
如圖5所示,系統(tǒng)相關(guān)初始化及創(chuàng)建文件系統(tǒng)流程,本設(shè)計(jì)將SPI配置為模式3,APB總線(xiàn)時(shí)鐘除以128,幀大小設(shè)置為8 bit[5]。

圖5 系統(tǒng)相關(guān)初始化及創(chuàng)建文件系統(tǒng)
采用DMA方式對(duì)flash進(jìn)行讀和寫(xiě)。創(chuàng)建文件系統(tǒng)時(shí),使用f_mount函數(shù)在FatFs模塊注冊(cè)一塊文件系統(tǒng)對(duì)象工作區(qū),使用f_getfree函數(shù)獲得空閑簇?cái)?shù)量,使用f_mkfs函數(shù)創(chuàng)建FAT文件系統(tǒng)。最后初始化并開(kāi)啟片上系統(tǒng)RTC,用于get_fattime函數(shù),以得到當(dāng)前時(shí)間。之后,便可以完成創(chuàng)建文件,重命名文件,復(fù)制文件等各種操作。整個(gè)操作通過(guò)串口進(jìn)行命令輸入,并打印出相關(guān)信息。最后成功創(chuàng)建了FAT12類(lèi)型文件系統(tǒng),簇大小4KB,整塊flash作為一個(gè)扇區(qū)。
本研究以SmartFusion片上系統(tǒng)芯片為核心,以spi flash作為存儲(chǔ)媒介,移植了 FatFs,實(shí)現(xiàn)了用Cortex-M3微處理器對(duì)文件進(jìn)行讀寫(xiě)等功能。在數(shù)據(jù)量比較大的嵌入式系統(tǒng)中,嵌入 FatFs文件系統(tǒng)來(lái)管理數(shù)據(jù)會(huì)非常方便靈活,同時(shí)有利于降低成本,具有較為廣闊的應(yīng)用前景[6]。另外一方面,TFTP協(xié)議為小文件傳輸通信在嵌入式系統(tǒng)的應(yīng)用提供了一個(gè)可行方案,使用網(wǎng)口來(lái)將電腦中的文件發(fā)送至flash,可以遠(yuǎn)程對(duì)設(shè)備進(jìn)行升級(jí)[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] 孟惠霞,呂書(shū)勇.基于ARM的SD卡文件系統(tǒng)設(shè)計(jì)[J].通信技術(shù),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協(xié)議在LM3S6965上的移植和應(yīng)用[J].通信技術(shù),2011,44(08):89-90,105.
[7] 曾曉洋,吳敏,韓軍,等.信息安全芯片 SoC平臺(tái)及其應(yīng)用[J].信息安全與通信保密,2005(07):358-360.