嵌入式操作系統VxWorks中TFFS文件系統的構建

  摘要:目前的嵌入式系統多使用FLASH作爲主存,因此,如何有效管理FLASH上的數據非常重要。文章以MX29LV160BT芯片爲例,討論了在VxWorks操作系統下Nor Flash上建立TFFS文件系統的一般步驟,從而爲FLASH上的數據管理提供了理想的選擇方式,同時也爲開發者和用戶升級程序提供了方便。

關鍵詞:VxWorks  Flash  MTD  TFFS   文件系統

    嵌入式系統正隨着Internet的發展而在各個領域得到廣泛的應用,作爲一個優秀的操作系統,VxWorks實現了比其他實時操作系統更好的有效性、商用性、可裁減性以及互操作性,廣泛應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。

如今越來越多的嵌入式操作系統中,通常都使用FLASH作爲主存介質。許多開發者和用戶爲了方便以後升級用戶程序,通常在FLASH上建立TFFS文件系統,建立文件系統後,我們就可以象在windows操作系統下對硬盤操作一樣,進行數據的拷貝、刪除以及文件的建立等操作。

    NOR和NAND是現在市場上兩種主要的非易失閃存技術。Intel於1988年首先開發出NOR flash技術,徹底改變了原先有EPROM和EEPROM一統天下的局面。NOR的特點是芯片內執行XIP execute In Place,這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,因此在嵌入式系統得到廣泛的應用。

一、TFFS文件系統結構簡介

    Tornado的TrueFFS是和VxWorks兼容的一種M-Systems Flite實現方式,版本爲2.0。它爲種類繁多的flash存儲設備提供了統一的塊設備接口,並且具有可重入、線程安全的特點,支持大多數流行的CPU構架。有了Tornado的TrueFFS,應用程序對flash存儲設備的讀寫就好象它們對擁有MS-DOS文件系統的磁碟設備的操作一樣。
     如圖1所示,TrueFFS由核心層(core layer)和三個功能層,翻譯層(translation layer),MTD層(MTD layer),socket層(socket layer)組成。

  核心層(Core layer):核心層主要起相互連接其他幾層的功能。同時它也可以進行碎片回收、定時器和其他系統資源的維護。通常WindRiver公司將這部分內容以二進制文件提供。

    翻譯層:主要實現TrueFFS和dosFs之間的高級交互功能。它也包含了控制flash映射到塊、wear-leveling、碎片回收和數據完整性所需的智能化處理功能。目前有三種不同的翻譯層模塊可供選擇。選擇哪一種層要看你所用的flash介質是採用NOR-based, 還是NAND-based, 或者SSFDC-based技術而定。

  Socket層:則是提供TrueFFS和板卡硬件(如flash卡)的接口服務。其名字來源於用戶可以插入flash卡的物理插槽。用來向系統註冊socket設備,檢測設備拔插,硬件寫保護等。後面將詳細講解它的功能。

  MTD層(Memory Technology Drivers):功能主要是實現對具體的flash進行讀、寫、擦、ID識別等驅動,並設置與flash密切相關的一些參數。TrueFFS已經包含了支持Intel,AMD以及samsung部分flash芯片的MTD層驅動。新的芯片需要新的MTD支持,你可以使用一個標準的接口來加入這些驅動。

  以上四部分,我們通常要的工作就是後兩層。

  當在VxWorks下配置TrueFFS時,你必須爲每一層至少包含一個軟件模塊。後面我們將詳細討論。

二、    MX29LV160BT芯片上建立TrueFFS文件系統

1、配置相關文件

在此,我以Nor Flash MX29LV160BT爲例,開發工具爲Tornado2.2 for PPC。要在VxWorks映像中包含TrueFFS文件系統,首先必須在config.h文件中定義INCLUDE_TFFS。這使得VxWorks的初始化代碼調用tffsDrv()來創建管理TrueFFS所需的結構和全局變量,併爲所有掛接了的flash設備註冊socket組件驅動。在鏈接的時候,通過解析與tffsDrv()相關聯的符號(symbols)可以將TrueFFS所必需的軟件模塊鏈接到VxWorks映象中。

爲了支持TrueFFS,每一個BSP目錄下都必須包含一個sysTffs.c文件。它將TrueFFS所有的層(翻譯層,socket層和MTD層)鏈接到一起並和VxWorks綁定。因此,我必須編輯這個文件並決定哪一種MTD和翻譯層模塊應該包含到TrueFFS中。即:

#define INCLUDE_MTD_MX29LV           
#define INCLUDE_TL_FTL                  
#define    FLASH_BASE_ADRS        0x2a10000 
#undef FLASH_SIZE
#define    FLASH_SIZE        0x001f0000    

其他無關的MTD driver包含頭都#undef掉,同時定義Flash在系統中的基地址和大小。另外,還必須編輯sysLib.c中的sysPhysMemDesc[ ]數組,將Flash基地址和大小加入到MMU中,以供將來訪問Flash,否則訪問Flash會失敗。如果BSP目錄下沒有sysTffs.c文件,那麼我們可以從其他BSP目錄下拷貝一個即可,然後做上述修改,其他的內容基本可以不用修改。

接下來需要修改tffsConfig.c文件,爲了方便管理,通常我們將src/drv/tffs/目錄下該文件拷貝到我們BSP目錄下,然後再做出修改。在MTDidentifyRoutine mtdTable[]表中加入如下語句:

#ifdef  INCLUDE_MTD_MX29LV
    mx29lvMTDIdentify,
#endif  
並在該文件開頭聲明。
#ifdef  INCLUDE_MTD_MX29LV
FLStatus  mx29lvMTDIdentify (FLFlash vol);
#endif   
最後就是將我們的flash相關MTD驅動加入到makefile中。即:
MACH_EXTRA   = mx29lvMtd.o
爲了方便我們調試MTD驅動,應該在重新編譯VxWorks映象前將諸如格式化flash、創建TrueFFS塊設備、綁定此塊設備到dosFs所必要的功能包含到VxWorks映像中。比如如下定義:
#define  INCLUDE_TFFS
#ifdef INCLUDE_TFFS
#define INCLUDE_TFFS_DOSFS
#define INCLUDE_TFFS_SHOW
#define INCLUDE_DOSFS        
#define INCLUDE_SHOW_ROUTINES    
#define INCLUDE_TL_FTL
#define INCLUDE_IO_SYSTEM
#define INCLUDE_DISK_UTIL
#endif 

2、MTD驅動簡介
   做了上述配置後,進入VxWorks操作系統後,我們在shell上利用tffsShow工具來顯示flash的信息。TffsShow函數最終會調用MTD驅動中的mx29lvMtdIdentiy( )函數,在mx29lvMtdIdentiy ( )函數主要是通過讀取MX29LV160BT芯片的設備和廠商ID來識別它,然後對FLFlash結構成員進行初始化,最主要的幾個參數是:
type
    Flash內存的JEDEC ID號。

erasableBlockSize

Flash內存的擦除塊大小(字節)。設置這個值時應考慮到interleaving。因此,通常通過如下方法來設置它的大小。
Vol.erasableBlockSize = MX29LV_MTD_SECTOR_SIZE * vol.interleaving;
對於MX29LV160BT,MX29LV_MTD_SECTOR_SIZE爲64K字節。
chipSize
使用來構建TrueFFS文件系統的flash實際大小(字節)。
noOfChips
使用來構建TrueFFS文件系統的flash實際片數。
interleaving
   Flash內存交叉因子(interleaving factor)。即擴展數據總線的設備數。比如,一個32位數據總線上,我們可以使用4片8位或2片16位的設備。
map
   指向flash內存映射(map)函數。該函數將flash映射到內存區。
read
   指向flash內存的讀函數。在MTD驅動識別函數中,這個成員函數已經被初始化爲缺省的讀函數。通常情況下,我們不需要再初始化它,否則還需要修改很多相關的函數。
write
指向flash內存的寫函數。這個成員必須初始化,這是我們要做的一個重要工作。
erase
指向flash內存的擦除函數。這個成員必須初始化,這也是我們要做的一個重要工作。

針對FLFlash結構成員,我們所關心的兩個函數就是寫和擦除函數。在mx29lvMtdIdentiy()函數中必須有如下定義:
vol.write = mx29lvWrite;
vol.erase = mx29lvErase;
在mx29lvWrite()函數中主要是實現將數據寫到flash中。首先需要對扇區進行解鎖,然後寫入寫命令,之後才能進行數據的寫入。最後需要判斷數據是否寫完。爲了確保操作成功,我們應該在寫完每個數據後進行數據的比較,比較正確後方能進行下一個數據的操作。
在mx29lvErase ()函數中主要是實現flash扇區的擦除。如今的flash一般都是按照扇區進行擦除操作的。在擦除操作之前也應該首先對扇區進行解鎖,然後寫擦除建立和扇區擦除命令。擦除成功後,flash中的內容應該是0xffff。所以爲了確保成功,我們還是應該在擦除後進行比較,比較正確後方能進入下一個扇區的擦除操作,否則返回擦除錯誤標誌。
所以,對於MTD驅動的調試,基本上就是調試寫和擦除兩個函數。在調試過程中,我們可以在這兩個函數相應位置加入打印語句來調試。爲了能調試這兩個函數,我們通過在shell上輸入命令tffsDevFormat來格式化flash,tffsDevFormat最終會調用mx29lvErase和mx29lvWrite函數,如果成功就會返回0,否則返回-1。當然也可以調用tffsDevCreate函數來驗證我們的寫和擦除函數的正確性。圖2說明了tffsDevCreate調用過程。

 

在shell上利用tffsShow來驗證mx29lvMtdIdentiy。
è    tffsShow 
0: socket=RFA: type=0x2249, unitSize=0x10000, mediaSize=0x1f0000 
value = 49 = 0x31 = "1"
說明已正確識別到MX29LV160BT設備,設備號爲0x2249。

三、    建立TFFS設備
1、掛接設備名
MTD驅動調試成功後,我們就可以給flash設備掛接上dos設備名,如下操作:
格式化:
è    tffsDevFormat 
value = 1
è    usrTffsConfig 0,0,”/tffs0”
value = 0
然後通過devs來查看掛接的設備名。
è    devs
drv name                
  0 /null               
  1 /tyCo/0             
  1 /tyCo/1             
  5 host:               
  6 /pty/rlogin.S       
  7 /pty/rlogin.M       
  3 /tffs0/             
  8 /vio                
value = 25 = 0x19
看到/tffs0/說明掛接設備已經成功,接下來就可以利用dosFs文件系統相關命令來操作flash了。如,ls、copy等。

2、從Flash中啓動並下載VxWorks映像
    要從flash中下載VxWorks映像,首先需要把VxWorks映像拷貝到flash中,在shell中的操作命令爲copy “VxWorks”,”/tffs0/VxWorks”,然後修改config.h文件中引導行,如下:
#define DEFAULT_BOOT_LINE /
"tffs=0,0(0,0)host:/tffs0/VxWorks h=192.168.0.153 e=192.168.0.154 u=target pw=target o=cpm"
修改完後,重新編譯生成bootrom_uncmp.bin,並把它燒寫到flash中(注意:該flash與上面建立TFFS文件系統的flash不一樣,它並沒有建立文件系統)。然後重新啓動,即可看到如下啓動畫面:
boot device          : tffs=0,0
unit number          : 0 
processor number     : 0 
host name            : host
file name            : /tffs0/VxWorks
inet on ethernet (e) : 192.168.0.154
host inet (h)        : 192.168.0.153
user (u)             : target
ftp password (pw)    : target
flags (f)            : 0x0 
other (o)            : cpm
Attaching to TFFS... done.
Loading /tffs0/VxWorks...894304
Starting at 0x10000...

Development System
        VxWorks version 5.5.1  
        KERNEL: WIND version 2.6
        Copyright Wind River Systems, Inc., 1984-2003
    CPU: Motorola ADS - PowerPC 860.  Processor #0.
    Memory Size: 0x1000000.  BSP version 1.2/5.
    WDB Comm Type: WDB_COMM_END
                 WDB: Ready.

到此,說明引導成功。flash整個TFFS文件系統就已經建立成功。

四、    結論
VxWorks操作系統中支持TFFS文件系統,我們將VxWorks映像作爲文件放到flash上,這就有利於開發者和用戶更新應用程序而不需要影響bootrom,直接更新VxWorks映像或者將應用程序直接copy到flash中,然後裝載到RAM中運行。

參考文獻
1  VxWorks 5.5 Programmer’s Guide.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章