基于VxWorks的三星 NAND FLASH驅動程序設計
西南林學院 張晴暉 李俊萩
摘要: 在VxWorks實現(xiàn)上,涉及文件系統(tǒng)的文章不少,但一般都是針對容量較小,,操作相對簡單的NORFLASH實現(xiàn)的。本文討論了如何在以AMCC公司的Power PC芯片PPC440epx為核心的嵌入式平臺上,利用三星公司的大容量NAND FLASH實現(xiàn)文件系統(tǒng)的具體辦法。
Abstract:
Key words :
隨著電子技術的不斷發(fā)展,計算機技術也得到飛速的發(fā)展,,產(chǎn)生了很多新技術,。但就計算機的基本結構來說,還是基本采用了馮·諾依曼結構,。然而馮·諾依曼結構的一個中心點就是存儲一控制,,所以存儲器在計算機系統(tǒng)中的作用是非常重要的。嵌入式計算機作為計算機中的一個類別,,對執(zhí)行速度和系統(tǒng)可靠性都有較強的要求,,這也決定了嵌入式系統(tǒng)不僅要有實時性很強的操作系統(tǒng),同時也需要一種安全,、快速的存儲設備,。同時,嵌入式系統(tǒng)經(jīng)常會涉及到海量數(shù)據(jù)的存儲,,這就要求存儲設備必須具有可靠性高,,功耗低,容量大,,掉電數(shù)據(jù)不丟失等特點,,而NAND FLASH芯片正好具有這些優(yōu)點。
VxWorks是嵌入式領域內公認的最有特色的高性能實時操作系統(tǒng)之一,。它以其良好的可靠性和卓越的實時性,,被廣泛地應用在通信、軍事,、航空,、航天等高精尖技術及實時性要求極高的領域中,,如衛(wèi)星通信、軍事演習,、彈道制導,、飛機導航等。
目前,,在VxWorks實現(xiàn)上,,涉及文件系統(tǒng)的文章不少,但一般都是針對容量較小,,操作相對簡單的NORFLASH實現(xiàn)的,。本文討論了如何在以AMCC公司的Power PC芯片PPC440epx為核心的嵌入式平臺上,利用三星公司的大容量NAND FLASH實現(xiàn)文件系統(tǒng)的具體辦法,。
1 三星NAND FLASH芯片K9F2G08QOM
K9F2G08QOM芯片的容量為256 M×8 b="2" Gb的數(shù)據(jù)區(qū),,再加上64 Mb的備用區(qū)。一塊這種芯片被分為2 048個塊,,每個塊又分為64頁,,每頁由2 KB的數(shù)據(jù)區(qū)加上64 B的備用區(qū)組成。如圖1所示,,列地址為12 b(A11~A0),。當A12為0時,A10~A0確定對每頁中2 KP,;數(shù)據(jù)的訪問,;當A12為1時,訪問的是64 B的備用區(qū),。由于NANDFLASH芯片在出廠時就可能出現(xiàn)壞塊(塊中的某個或多個bit不能有效的進行讀寫),,為了將其標注出來,三星公司保證每個壞塊的第一頁和第二頁備用區(qū)第一個byte的數(shù)據(jù)沒有被初始化為0xFF,。設計人員要確保在對該芯片進行擦除之前,,先將這個信息保留起來(建一個壞塊表)。行地址為17 b(A28~A12),。它確定了對2 048塊×64頁=128 K個頁中的某一頁進行訪問,。為了簡化NAND FLASH芯片的管腳,其地址和數(shù)據(jù)信息共享8個I/O管腳,,因此,,其29 B的地址信息被設計為5個周期進行傳輸。具體操作如表1所示,。
注:起始地址是列地址,;L表示必須置為低電平
對NAND FLASH的操作流程比較簡單,即在第一個周期里送操作相關的命令字,,然后送地址,,以及相應的數(shù)據(jù),,最后送確認字。需要說明的是,,由于地址,、命令和數(shù)據(jù)都共用8個I/O管腳來進行傳輸,因此在硬件上必須要有專用的管腳來區(qū)分傳輸類型(在傳輸命令的時候,,命令鎖存使能信號CLE有效,;在傳輸?shù)刂返臅r候,地址鎖存使能信號ALE有效),。具體的命令字,、時序和操作流程在K9F2G08Q0M的數(shù)據(jù)手冊上有較詳細的描述,在此不一一詳述,。
2 PPC440epx的NAND FLASH接口
AMCC公司的PPC440epx芯片是一款性能指標較高的嵌入式CPU芯片,,其主頻可以達到667 MHz,擁有DDR2接口,,可支持千兆以太網(wǎng),,USB 2.0接口,支持浮點運算,,同時還支持NAND FLASH芯片,。
PPC440epx使用一個NAND FLASH Controller作為外部NAND FLASH與其外部總線通信的接口電路,該控制器最多可以支持4個NAND FLASH芯片,,每個芯片的容量可以為4~256 MB,每頁的大小可以為512 B+16 B或者2 KB+64 B,。NDFC(NANDFLASH Controller)的存在使得對NAND FLASH的操作變的非常簡單,。根據(jù)前面對K9F2G08Q0M的介紹可知,對NAND FLASH的操作需要在硬件上產(chǎn)生ALE,,CLE信號來區(qū)分傳輸類型,。NDFC給程序設計人員提供兩種實現(xiàn)時序的方法:硬件實現(xiàn),軟件實現(xiàn),。如果是前者,, NDFC提供了幾個寄存器:命令寄存器、地址寄存器,、數(shù)據(jù)寄存器,、配置寄存器和狀態(tài)寄存器。通過對這幾個寄存器執(zhí)行相應的讀/寫操作就可以產(chǎn)生相應的時序,。例如,,如果需要對NAND FLASH寫命令字80H,則只需將80H寫人命令寄存器即可,。NDFC自動將80H送到I/O7~I/O0上,,同時置CLE為有效狀態(tài),。而軟件實現(xiàn)方法是根據(jù)K9F2G08Q0M的時序要求,通過對硬件控制寄存器中相應的bit寫1或者0,,使得對應的控制信號為高電平或者低電平,。設計人員可以根據(jù)自己的情況,選擇實現(xiàn)方法,。這里推薦采用硬件實現(xiàn)的方法,。不過,在有問題時,,可采用軟件實現(xiàn)的方法來進行調試,。
3 TrueFFS簡介
TureFFS(Ture Flash File System)是M-Systems公司為VxWorks操作系統(tǒng)定制的實現(xiàn)FLASH塊設備的接口。通過使用TFFS,,應用程序對FLASH的讀寫就像對擁有MS-DOS文件系統(tǒng)的磁盤設備操作一樣,。對于上層設計人員,TFFS屏蔽了底層多種多樣FLASH設備的具體細節(jié),。同時,,由于FLASH存儲芯片自身的一些特性(如擦除、編程次數(shù)有限并且操作時間較長,;容易進入過度編程狀態(tài)等),,TFFS采用虛擬塊、損耗均衡,、碎片回收,、錯誤恢復等機制來提高 FLASH的使用壽命,確保數(shù)據(jù)完整,,優(yōu)化性能,。
4 TrueFFS的實現(xiàn)
4.1 TrueFFS的基本結構
TrueFFS由1個核心層和3個功能層組成,它們是翻譯層(Translation Layer),、MTD(Memory Tech-nology Drivers Layer)層和Socket層,,其結構框圖如圖2所示。
(1)交互功能,。它包含了控制FLASH映射到塊,、wear-lev-eling、碎片回收和數(shù)據(jù)完整性所需的智能化處理功能,。目前,,有三種不同的翻譯層模塊可供選擇。選擇哪一種層需要看所用的FLASH介質是采用NOR-based,,還是NAND-based,,或者SSFDC-based技術而定。
(2)MTD(Memory Technology Driver)層實現(xiàn)具體的FLASH芯片底層程序設計,包括讀,、寫,、擦、ID識別,、映射等功能,,以及一些與FLASH芯片相關的參數(shù)設置。
(3)Socket層提供了TrueFFS和硬件之間的接口服務,,負責電源管理,、檢測設備插拔、硬件寫保護,、窗口管理和向系統(tǒng)注冊Socket等,;
(4)核心層將其他3層有機結合起來,另外還處理全局問題,,如信號量,、碎片回收、計時器和其他系統(tǒng)資源等,。
在VxWorks中,,由于翻譯層和核心層以二進制形式提供給設計人員的,因此實現(xiàn)TFFS的主要工作集中在對MTD層和Socket層的設計上,。
4.2 Socket層的實現(xiàn)
如果VxWorks中包含TFFS,,在系統(tǒng)啟動后,先完成內核的初始化,,之后開始進行I/O的初始化操作,。系統(tǒng)調用UsrRoot()函數(shù),該函數(shù)再調用 tffsDrv()函數(shù),,這樣就產(chǎn)生如圖3所示的調用流程,。調用這些函數(shù)的目的之一就是注冊socket驅動函數(shù)。最后的注冊操作都是由 xxxRegister()函數(shù)完成(這個函數(shù)和sysTff-sInit()函數(shù)的定義都在sysTffs.c中)的,。該函數(shù)是通過更新 FLSocket結構體來完成注冊操作的,。該結構體的定義以及相關細節(jié)可以通過閱讀VxWorks的幫助文件獲得,,在此不詳述,。
sysTffs.C文件的編寫,可以參考其他的BSP來完成,。config目錄下的任何一個BSP都有該文件,,設計人員可以復制其中一個到自己的BSP目錄下。例如:復制wrPpmc440gp目錄下的sysTffs.c文件,,再根據(jù)自己的硬件電路修改FLASH BASE ADRS以及FLASHSIZE的宏定義,,同時添加宏定義:#define INCLUDE_MTD_NAND。其他地方一般不需要改動。
4.3 MTD層驅動程序的實現(xiàn)
要創(chuàng)建一個TFFS塊設備,,首先應該調用函數(shù)tffsDevCreate(),,這樣就產(chǎn)生了如圖4所示的一系列的調用函數(shù)。系統(tǒng)通過這一系列的調用函數(shù)來確認具體的MTD層程序,。確認過程在flIdentifyFlash()函數(shù)中完成,。flIdentifyFlash()通過逐個執(zhí)行 xxxIdentify()表中的程序來確定合適的MTD。如果系統(tǒng)只有一種FLASH,,則只需寫一個Identify()函數(shù)可,。與Socket層類似,MTD層的核心工作也是針對一個數(shù)據(jù)結構(FLFLASH)而進行的初始化操作,。通過初始化操作來注冊FLASH芯片的處理函數(shù),,具體的實現(xiàn)是在函數(shù) xxxldentify()中完成的。
根據(jù)前面的介紹知道,,MTD層的主要功能是實現(xiàn)對FLASH芯片的讀,、寫、擦,、ID識別,、映射等操作。而對不同F(xiàn)LASH芯片的相應操作是有一定差別的,,所以使用不同的FLASH芯片時,,MTD層的程序設計也是不一樣的。開發(fā)人員的工作是根據(jù)系統(tǒng)使用的具體FLASH芯片來完成相應的程序設計,。
Tornado提供了幾種FLASH的TrueFFS MTD層驅動的參考設計,。在installDir\target\src\drv\tffs中,主要包括Intel,,AMD等公司的幾種FLASH的 TrueFFS MTD層驅動,。雖然沒有需要的K9F2G08驅動程序,但可以根據(jù)其結構來設計自己的MTD程序,。具體做法是在BSP目錄下建立一個MTD層驅動文件,,將其取名為K9F2G08Mtd.C。在該文件中首先編寫函數(shù)nandMTDIdentify(),,如下所示為程序片段:
完成上述代碼后,,剩下的工作就是完成在函數(shù)nandMTDIdentify()中引用的readFlashID(),nand-MTDRead(),。 nandMTDWrite(),,nandMTDErase(),nandMTDMap()這幾個函數(shù)的代碼編寫,。由于不同的FLASH芯片,,時序不同,因此這幾個函數(shù)的實現(xiàn)也不同。必須根據(jù)芯片K9F2G08的數(shù)據(jù)手冊上時序的要求,,對PPC440epx的相應寄存器進行讀/寫操作,,以完成這些功能。由于篇幅原因,,這幾個函數(shù)的具體代碼就不再贅述,。建議在Boot Loader工作正常后,先在應用程序中對這些函數(shù)進行調試,。這樣就可以利用單步和斷點等工具進行調試,,并且在修改后可立即通過網(wǎng)絡下載程序。
4.4 TrueFFS的配置
在完成上述代碼的編寫后,,還要做如下工作:在配置文件config.h中增加定義INCLUDE_TFFS和IN-CLUDE_DOSFS,,使得 TrueFFS組件和DOS文件系統(tǒng)被包含進來。并且要在MakeFile文件MACH_EXTRA一項中添加K9F2G08Mtd.o,,這樣可將 TureFFS文件驅動程序加入系統(tǒng),。另外,還要在tffsConfig.c文件中的mtdTable[]表中添加上述的函數(shù)nandMTDI- dentify,。
在此介紹如何在由AMCC公司的CPU芯片PPC440epx,、三星公司的NAND FLASH構成的硬件平臺上和VxWorks軟件平臺上,實現(xiàn)TrueFFS,。按照上述設計流程,,實現(xiàn)了NAND FLASH的驅動程序設計。能夠對K9F2G08進行正常的讀,、寫,、擦、ID識別,、映射等操作,。同時,在VxWorks操作系統(tǒng)上,,實現(xiàn)了 TrueFFS,。這樣就提高FLASH使用壽命,確保數(shù)據(jù)完整,,優(yōu)化了FLAsH的性能,。以此為基礎的系統(tǒng)在某機載設備上得到成功運用。
來源:現(xiàn)代電子技術
此內容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉載,。