歡迎您光臨本站 登入註冊首頁

概述

   嵌入式系統對執行速度和系統可靠性的要求,決定了嵌入式系統需要一種安全、快速的存儲設備,這種設備備同時還需要體積小、容量大、掉電數據不丟失等特點。而Flash存儲器恰……

    嵌入式系統對執行速度和系統可靠性的要求,決定了嵌入式系統需要一種安全、快速的存儲設備,這種設備備同時還需要體積小、容量大、掉電數據不丟失等特點。而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驅動的實現可廣泛應用於各種工業控制系統,具有較大的實用價值。


[admin via 研發互助社區 ] VxWorks嵌入式操作系統的TrueFFS文件系統驅動開發已經有6919次圍觀

http://cocdig.com/docs/show-post-42271.html