嵌入式系統對執行速度和系統可靠性的要求,決定了嵌入式系統需要一種安全、快速的存放裝置,這種裝置備同時還需要體積小、容量大、掉電資料不丟失等特點。而Flash儲存空間恰恰能夠滿足上述要求。這也使得Flash儲存空間成為嵌入式系統中的主要存放裝置。
現在,Flash技術已經成熟,並已成為工業標準 但問題是如何能夠更加有效管理Flash裝置.提高Flash的使用效率.加快操作速度和管理Flash各單元的使用頻率從而提高Flash的使用壽命。因此,人們逐漸把注意力轉移到Flash的管理軟體上。M-system公司的True Flash File System (TrueFFS)就是在此背景下推出的Flash管理軟體,它的準系統是完成Flash的磁碟類比功能,使人們能像操作磁碟一樣來操作Flash 而TrueFFS則提供了一個標準的塊設介面,能夠對扇區進行讀寫操作。這樣的功能已經足夠讓檔案系統和作業系統管理Flash了
因此.True Flash也為不少嵌入式作業系統所採用.包括風河公司的VxWorks在內。正因如此,對Flash進行TrueFFS的驅動開發,已經成為嵌入式系統開發人員必做的工作之一。但是因為TrueFFS驅動的開發與硬體聯絡緊密,開發過程也有著不小的難度,而現在對TrueFFS檔案系統的階層及原理介紹等相關資料很多.而對驅動的具體開發過程卻介紹很少,所以,本文旨在對TrueFFS原理進行分析的基礎上,以三星公司的Nand Flash K9F2808UOB為例,著重介紹在VxWorks作業系統上開發TrueFFS驅動的具體過程。
TrueFFS簡介
TrueFFS能給作業系統提供完整的塊裝置功能.這使Flash能像一個標準磁碟裝置一樣由作業系統和檔案系統所管理。同時,它還提供有透明的Flash介質管理,井具有提高Flash使用壽命(損耗均衡演算法),確保資料完整(安全演算法.壞資料對應),最佳化Flash效能(片段回收)等優點 其結構1所示。
圖1 TrueFFS基本結構圖
由圖中可以看出,TrueFFS主要由三個模組組成,分別為塊裝置API(驅動層)、塊裝置類比+Flash管理層以及MTD層。
處在最頂端的是驅動層,其功能是為作業系統的檔案系統提供塊裝置服務,此層的代碼決定於不同的作業系統。
位於中間的模組是整個TrueFFS的核心部分,它包括塊裝置類比演算法和Flash管理演算法(通常被稱為翻譯層,Translation Layer或TL)。該模組的職責是將檔案系統的扇區翻譯為Flash的物理塊。在進行地址翻譯的同時,它還可同時進行損耗均衡處理,壞資料區塊映射和其它相關操作(如片段回收等)。
處於最底端的模組是MTD(Memory Technology Driver)層。它提供有對Flash進行基本的讀/寫/擦除的介面。本層的操作是由Flash管理層(Flash Management Layer)控制的。
TORNADO中的TrueFFS
Tornado中的TrueFFS是WindRiver Tornado開發環境下整合的Flash檔案管理系統。它能通過VxWorks中的DOS檔案系統對Flash進行檔案管理操作。並能通過標準檔案系統介面建立並控制一個檔案系統。這使得使用者在Flash上進行檔案的讀寫就和直接在DOS檔案系統裝置上一樣簡單。
TrueFFS在VxWorks中的位置2所示。
圖2 TrueFFS在VxWorks中的位置
由於Tornado為TureFFS提供了一個驅動層介面,因此,在VxWorks下可使用DOS檔案系統或NFS(網路檔案系統)。對於嵌入式應用程式來說,它們只需要簡單的調用相關的檔案系統介面函數即可。
Tornado中的TrueFFS階層和功能與前述的TrueFFS 基本層次結及功能一致。對於驅動層(或核心層)及翻譯層代碼,風河公司以二進位的形式提供。也就是說.驅動層及翻譯層功能的完成已經不需要驅動開發人員所關心。因此,對Flash裝置的TrueFFS驅動開發的重點就放在MTD層的開發,下面就以三星公司的Nand Flash K9F2808UOB為例, 來介紹VxWorks作業系統下Flash的TrueFFS驅動開發過程。
VxWorks下TrueFFS的驅動開發
VxWorks下的TrueFFS驅動開發主要面向MTD層。從圖1可以看出,MTD層主要用於實現Flash器件的識別、讀、寫、擦除功能 而這一部分工作和具體的Flash儲存空間以及儲存空間和系統地串連有關。也就是說,選擇不同的Flash器件,Flash晶片的串連方式將有所不同,實現MTD層的代碼檔案也都將不同。Tornado提供了幾種Flash的TrueFFS MTD層驅動方案:它們處在installDir\target\src\drv\tffs中(installDir是Tornado的安裝目錄).其中包括Intel、AMD等公司的幾種Flash的TrueFFS
MTD層驅動。這樣,如果開發人員選用了這幾種Flash晶片,就只須將相關代碼檔案複製到BSP所在的目錄下,並在MakeFile檔案MACH_EXTRA一項中添加相對應的目標代碼就可以了。但是在很多情況下,開發人員所選用的Flash晶片在Tornado中沒有提供,因此.需要開發人員自己完整編寫MTD層驅動程式代碼,這也是TrueFFS驅動開發的主要工作。
Nand Flash 儲存空間 K9F2808UOB簡介
K9F2808UOB的容量為132 Mb,儲存空間的組織由32768個 (行)、每頁528個位元組(列)的方式構成。備用的16頁位於列地址的512~527,K9F2808UOB還將儲存空間分為塊(Block),每塊由32個頁構成。因此,K9F2808UOB中共有1024個塊,其內部結構3所示。
K9F2808UOB的讀和寫都是以頁為單位進行操作的 擦除是基於塊的操作。其地址通過8位連接埠傳送,CLE和ALE訊號線可用於實現I/O口上指令和地址的複用。指令、地址和資料都通過拉低WE和CE來從I/O口寫入器件中 其指令和功能表如表1所列。
MTD層驅動程式的編寫
對MTD層進行驅動開發,實際上就是通過軟體實現Flash器件的識別、讀、寫和擦除功能。因此,開發的第一步就是在BSP目錄下建立一個MTD層驅動代碼檔案。設計時可將檔案取名為K9F2808.c。下面的工作就是在其檔案中實現對Flash的操作。此操作過程可分別通過nandMTDIdentify(),nandMTDRead(),nandMTDWrite()及nandMTDErase()這四個函數來完成。此外,還需要一個Flash記憶體映射函數nandMTDMap()。這些函數的編寫與上述K9F2808UOB的組織圖、指令和功能及其晶片引腳的串連有關。
圖4是FLASH晶片K9F2808與嵌入式ARM晶片S3C44B0X的硬體串連圖。圖中,S3C44B0X的nGCS1與nWE和nOE通過與門一起對K9F2808UOB進行讀寫控制,而地址鎖存訊號ALE和控制鎖存訊號CLE則分別由S3C44B0X的ADDR2與ADDR1控制,K9F2808UOB的狀態通過GPC8讀出,GPC9用於控製片選訊號。8根資料輸入輸出引腳分別串連S3C44B0X的8根資料線。
通過對硬體串連圖的分析可知,FLASH的基地址為0x02000000,控制鎖存地址為0x02000002,地址鎖存地址為0x02000004,設計時可將其分別定義為NFBaseAddr,NFCLEAddr,NFALEAddr。對於FLASH的寫命令來說,地址操作可由下列函數完成:
/*WRITE_COMMAND -寫命令 */
LOCAL void WRITE_COMMAND (UCHAR cmd)
{
*((volatile UCHAR *)NFCLEAdd) = cmd;
}
/* WRITE_ADDRESS -寫地址 */
LOCAL void WRITE_ADDRESS(UCHAR addr)
{
*(( volatile UCHAR *) NFALEAdd)=addr;
}
FLASH的狀態可以通過S3C44B0X的IO口控制寄存器讀出,定義如下:
#define NFRBStatus() ((*((volatile UINT32 *)S3C44B0X_PDATC))& (1<<8))
因篇幅關係,這裡無法將讀、寫及擦除函數一一列出,開發人員可參考晶片資料,按照K9F2808UOB的各種操作時序,分別寫出對Flash進行讀、寫、擦除等操作的函數。
在前面提到的五個函數中,需要特別注意的是nandMTDIdentify(), 因為此函數不僅會完成器件的辨識工作,而且還會在TrueFFS檔案系統初始化時被調用,其調用過程5所示。因此,nandMTDIdentify需要對Flash的參數進行一些設定,並將讀、寫及擦除函數在上層註冊,以供上層函數調用。但在設計時,需要在此函數中添加如下代碼:
圖5 TureFFS中Identify函數在VxWorks中的調用過程
pVol->write=nandMTDWrite;
pVol->erase=nandMTDErase;
pVol->map=nandMTDMap,
當K9F2808.c檔案完成以後,在MakeFile檔案MACH_EXTRA一項中添加K9F2808.o可將TureFFS檔案驅動程式加入系統。
Socket驅動識別及系統配置
MTD層驅動完成後,接下來就是Socket驅動的識別和TrueFFS檔案系統的配置。這部分工作相對比較簡單。Socket層的相關代碼是在sysTffs.c中完成的,開發人員可以直接複製任何一個installDir\target\src\drv\tffs\sockets下的xxx-sysTffs.c到BSP目錄下,並將其改名為sysTffs.c, 然後修改FLASH_BASE_ADRS以及FLASH_SIZE的宏定義,同時添加宏定義:
#define INCLUDE_MTD_NAND
同時將tffsConfig.c檔案複製到BSP目錄下,在tffsConfig.c中的mtdTable[]中註冊自己所寫的nandMTDIdentify:
#ifdefINCLUDE_MTD_NAND
nandMTDIdentify,
#endif
接下來就應修改在installDir\target\h\tffs中的stdcomp.h檔案。在其中添加MTD識別函數
FLStatus nandMTDIdentify(FLFlash vo1);
至此,socket驅動識別工作就算完成。最後,就可在config.h中添加所需功能的宏定義:
#define INCLUDE_TFFS
#define INCLUDE_TFFS_DOSFS
#define INCLUDE_TFFS_SHOW
實現結果
當上述所有工作都完成以後,VxWorks就會在啟動時調用tffsDrv()函數並初始化TrueFFS檔案系統。使用者可以通過tffsDevFormat函數格式化
Flash裝置,並通過usrTffsConfig函數來建立TrueFFS裝置。因為包括了DOS檔案系統的宏定義,因而使用者可以用DOS方式訪問Flash裝置。其結果如下:
->usrTffsConfig0,0,"/tffs0"
->devs
drv name
0/null
1/tyCo/0
1/tyCo/l
5 host:
6/vio
3/tffs0
-> copy "vxworks" ,"/tffs0/vxworks"
Copy OK:966996 bytes copied
->11 "/tffs0"
Listing Directory/tffs0:
-rwxrwxrwx 1 0 0 966668
Jan 1 1980 vxworks
結束語
通過TrueFFS對磁碟的模擬功能,可完成嵌入式VxWorks作業系統對FLASH裝置的讀寫、分區、格式化等一系列操作。通過對作業系統的I/O控制調用,VxWorks還可以方便的訪問FLASH裝置。另一方面,用TureFFS技術對資料在Flash中的讀寫操作進行管理,可大大提高對FLASH的寫操作次數,從而提高FLASH的使用壽命。本文以Nand Flash K9F2808UOB為例,結合嵌入式晶片S3C44B0X詳細的介紹了其在VxWorks作業系統上實現TrueFFS驅動的過程。由此可見,TrueFFS驅動的實現可廣泛應用於各種工業控制系統,具有較大的實用價值。