王銅柱, 李 毅, 蘇先海
隨著在FPGA中集成了軟核和硬核處理器后,F(xiàn)PGA的功能越來越強大,在單片F(xiàn)PGA上即可完成復(fù)雜系統(tǒng)的設(shè)計和實現(xiàn),而通過對FPGA進行重新配置即可改變系統(tǒng)的功能,滿足用戶不同的需求,大大提高FPGA的利用率,但是丟電易失的特性使得其配置文件只能存放在非易失性存儲中,設(shè)計者需要考慮如何有效的管理與各種功能對應(yīng)的多個配置文件,因此移植 FatFs文件系統(tǒng)以達到對若干配置文件的管理,同時避免對存儲flash的直接訪問,避免誤操作,具有較高的實用價值。
FatFs是專門針對小型嵌入式系統(tǒng)的通用 FAT文件系統(tǒng)模型。FatFs依據(jù)標準C規(guī)范編寫,完全和存儲介質(zhì)的讀寫 I/O分開,所以可以輕松移植到各種硬件平臺上,可以在其官方主頁[1]上下載其源代碼和使用說明等信息,同時也提供了移植到PIC和ARM等低成本的微控制器上的示例程序。FatFs主要具有以下特性:①兼容FAT文件系統(tǒng);②不受應(yīng)用平臺限制,移植性好;③代碼空間和數(shù)據(jù)空間需求量小;④多樣的配置選項:多種存儲媒介支持、長文件名支持、RTOS支持等。
FatFs具有良好的層次結(jié)構(gòu)和方便的移植性,如圖1所示。FatFs共分3層。頂層的應(yīng)用層提供了一系列的應(yīng)用函數(shù),如f_open,f_close,f_read,f_write等,對使用者來說屏蔽了FAT協(xié)議和FatFs內(nèi)部復(fù)雜的函數(shù),因而可以輕松完成相關(guān)文件操作。中間層FatFs實現(xiàn)了FAT文件讀/寫協(xié)議,同時可以方便增加RTOS。底層是使用者需要處理的存儲介質(zhì)讀寫I/O,如塊讀函數(shù)和塊寫函數(shù)等。時鐘位如圖2所示。
圖1 FatFs的分層結(jié)構(gòu)
圖2 時鐘位
SmartFusion芯片[2]集成了FPGA,Cortex-M3處理器,提供了豐富的外設(shè)資源,如圖 3所示。Cortex-M3是一款低功耗處理器,具有門數(shù)目少,中斷延遲短,調(diào)試成本低的特點,是為要求有快速中斷響應(yīng)能力的深度嵌入式應(yīng)用而設(shè)計的,高性能,低功耗,易擴展[3]。SPI控制器[4]以從模式與處理器通過APB總線連接,支持接入大存儲SPI flash和EEPROM器件,包含以Cortex-M3和以DMA兩種方式控制數(shù)據(jù)傳輸,本設(shè)計中選擇DMA方式進行數(shù)據(jù)傳輸。
圖3 SmartFusion芯片架構(gòu)
FatFs移植的具體工作有兩步,即編寫FatFs接口函數(shù)和FatFs里的配置函數(shù)。
需要給出下列若干函數(shù)來控制對物理介質(zhì)的讀和寫,如表1所示。
表1 FatFs接口APIs
SmartFusion評估板上帶一片 Atmel SPI flash,AT25DF641-MWH-T,支持通用的塊擦除(4 Kbyte,32 Kbyte,64 Kbyte)和整片擦除[4]。
存儲介質(zhì)初始化函數(shù)——DSTATUS disk_initialize (BYTE pdrv):本設(shè)計中就是spi flash的初始化及其解保護。pdrv是存儲介質(zhì)編號,本設(shè)計只支持flash一個存儲介質(zhì),將pdrv設(shè)為0。
讀扇區(qū)函數(shù)——DRESULT disk_read (BYTE pdrv, BYTE *buff,DWORDsector,BYTE count):*buff為讀緩存,sector是起始扇區(qū)號,count是需要讀的扇區(qū)數(shù)目。用spi flash函數(shù)API,以4Kb為單位進行操作。讀取無誤返回0,錯誤返回非0。
寫扇區(qū)函數(shù)——DRESULT disk_write(BYTE pdrv,const BYTE *buff,DWORD sector,BYTE count):*buff為寫緩存,sector是起始扇區(qū)號,count是需要寫的扇區(qū)數(shù)目。調(diào)用 spi flash函數(shù)API,以4Kb為單位進行操作。寫無誤返回0,錯誤返回非0。
存儲介質(zhì)控制函數(shù)——DRESULT disk_ioctl(BYTE pdrv,BYTEcmd,void *buff):cmd是控制命令,*buff為存儲或接收數(shù)據(jù)緩存。本設(shè)計中只是簡單的得到簇大小,簇數(shù)量等信息。
實時時鐘函數(shù)——DWORD get_fattime ():直接調(diào)用SmartFusion芯片的RTC模塊,將得到一個32位無符號整數(shù),時鐘信號包含在這 32位中,如圖2所示。
文件中ffconfig.h文件定義了所有相關(guān)的FatFs配置信息,通過FatFs的配置(如表2所示),可以根據(jù)需要對代碼進行裁剪,以獲得最合適的代碼。
如圖4所示,為帶有FatFs模塊的嵌入式系統(tǒng)的典型架構(gòu),需要在Application模塊中完成系統(tǒng)初始化,創(chuàng)建文件系統(tǒng)等工作,重寫diskio.c文件中的若干函數(shù),在spi.c文件中完成對flash的若干操作。
表2 FatFs配置
圖4 帶有FatFs模塊的典型架構(gòu)
如圖5所示,系統(tǒng)相關(guān)初始化及創(chuàng)建文件系統(tǒng)流程,本設(shè)計將SPI配置為模式3,APB總線時鐘除以128,幀大小設(shè)置為8 bit[5]。
圖5 系統(tǒng)相關(guān)初始化及創(chuàng)建文件系統(tǒng)
采用DMA方式對flash進行讀和寫。創(chuàng)建文件系統(tǒng)時,使用f_mount函數(shù)在FatFs模塊注冊一塊文件系統(tǒng)對象工作區(qū),使用f_getfree函數(shù)獲得空閑簇數(shù)量,使用f_mkfs函數(shù)創(chuàng)建FAT文件系統(tǒng)。最后初始化并開啟片上系統(tǒng)RTC,用于get_fattime函數(shù),以得到當(dāng)前時間。之后,便可以完成創(chuàng)建文件,重命名文件,復(fù)制文件等各種操作。整個操作通過串口進行命令輸入,并打印出相關(guān)信息。最后成功創(chuàng)建了FAT12類型文件系統(tǒng),簇大小4KB,整塊flash作為一個扇區(qū)。
本研究以SmartFusion片上系統(tǒng)芯片為核心,以spi flash作為存儲媒介,移植了 FatFs,實現(xiàn)了用Cortex-M3微處理器對文件進行讀寫等功能。在數(shù)據(jù)量比較大的嵌入式系統(tǒng)中,嵌入 FatFs文件系統(tǒng)來管理數(shù)據(jù)會非常方便靈活,同時有利于降低成本,具有較為廣闊的應(yīng)用前景[6]。另外一方面,TFTP協(xié)議為小文件傳輸通信在嵌入式系統(tǒng)的應(yīng)用提供了一個可行方案,使用網(wǎng)口來將電腦中的文件發(fā)送至flash,可以遠程對設(shè)備進行升級[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卡文件系統(tǒng)設(shè)計[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平臺及其應(yīng)用[J].信息安全與通信保密,2005(07):358-360.