NAND flash檔案系統
目前flash的檔案系統比較多,用的比較多的就是JFFS2檔案系統。基於NOR flash上的JFFS2檔案系統可以說算是比較成熟了,支援NAND flash的JFFS2也已經發布了。原始碼可以到http://www.linux-mtd.infradead.org上面下載。但是在我的測試過程中,在nand flash上掛接的JFFS2檔案系統很不穩定,經常有CRC錯誤產生。特別是進行寫操作的時候,每次複位都會產生CRC錯誤,可以說支援NAND flash的JFFS2檔案系統目前還不成熟。而YAFFS檔案系統則是專門針對NAND flash的,原始碼可以到
http://www.aleph1.co.uk/yaffs/index.html上下載。在測試過程中穩定效能比JFFS2檔案系統要穩定的多,而且mount分區的時間也比JFFS2檔案系統少的多。用JFFS2 mount一個2m的檔案系統大約需要1s。下面分別介紹在uclinux下面使用JFFS2和YAFFS檔案系統。
1、JFFS2
到http://www.linux-mtd.infradead.org上面下載最新的MTD和JFFS2壓縮包。壓縮包裡面還有有關的核心補丁和一些MTD的相關工具。主要的補丁就是ilookup-2.4.23.patch,因為最新的MTD驅動中要用到一個ilookup()函數。打完補丁、更新了MTD驅動和JFFS2檔案系統之後就開始寫自己nand flash驅動了。如果不想把JFFS2作為根檔案系統的話,還需要修改MTD_BLOCK_MAJOR。驅動可以參考裡面的例子,最簡單的就是參考spia.c。
寫驅動主要工作是定義flash分區結構、定義flash讀寫地址、寫控制flash的**_hwcontrol()函數。具體的操作要看所用的nand flash的晶片資料。相對NOR flash來說驅動要簡單多了。:)
改完之後再配置
Memory Technology Devices(MTD)下
CONFIG_MTD=Y
CONFIG_MTD_DEBUG=Y
CONFIG_MTD_DEBUG_VERBOSE=3
CONFIG_MTD_PARTITIONS=Y
CONFIG_MTD_CHAR=Y
CONFIG_MTD_BLOCK=Y
NAND Flash Device Drivers下
CONFIG_MTD_NAND=Y
定義自己的驅動檔案
File systems下
CONFIG_JFFS2_FS=Y
CONFIG_JFFS2_FS_DEBUG=2
CONFIG_JFFS2_FS_NAND=y /*這個是新加的*/
在uClinux v1.3.4 Configuration下
Flash Tools下
CONFIG_USER_MTDUTILS=Y
CONFIG_USER_MTDUTILS_ERASE=Y
CONFIG_USER_MTDUTILS_ERASEALL=Y
CONFIG_USER_MTDUTILS_MKFSJFFS2=Y
最後就是辛苦了調試工作了。:(MTD驅動調試完之後,就可以在上面掛接JFFS2檔案系統了。參看flash分區情況:cat /proc/mtd,擦除分區:eraseall /dev/mtd*.例如把第一個分區mount到/mnt目錄下面:
先:eraseall /dev/mtd0
然後:mount -t jffs2 /dev/mtdblock0 /mnt
2、YAFFS
YAFFS意義為'yet another flash file system',也是一個開源的檔案系統。YAFFS是目前為止唯一一個專門為NAND flash設計的檔案系統,具有很好的可移植性,能夠在linux,uclinux,和wince
下面運行。
在http://www.aleph1.co.uk/yaffs/index.html上下載原始碼。壓縮包裡面也包含YAFFS的說明文檔。YAFFS檔案系統的源檔案就devextras.h,yaffs_ecc.c,yaffs_ecc.h,yaffs_guts.c,yaffs_guts.h,yaffs_mtdif.h,yaffs_mtdif.c和yportenv.h
另外需要配置的宏:CONFIG_YAFFS_FS 和CONFIG_YAFFS_MTD_ENABLED,就是配置在mtd上面掛接YAFFS,其它還有一些輔助配置需要時也可以配置。
在fs目錄下面建一個yaffs目錄,把以上說的檔案考裡面去,建立一個makefile:
O_TARGET := yaffs.o
obj-y := yaffs_fs.o yaffs_guts.o yaffs_mtdif.o yaffs_ecc.o
obj-m := $(O_TARGET)
include $(TOPDIR)/Rules.make
接下來就是改fs目錄下面config.in和makefile,在配置YAFFS的時候,把YAFFS串連進去。
如果像前面一樣已經把NAND MTD驅動調好了,加YAFFS就很簡單了。因為YAFFS是自己做ECC校正的,所以要把MTD驅動裡面的ECC去掉。在驅動裡面改成this->eccmode = NAND_ECC_NONE就可以了。
另外YAFFS是用mkyaffs來擦除flash,所以在mtd-utils中加上mkyaffs.c,一起編譯進去。
最後就是編譯了,呵呵。中間會有一些警告沒有關係的,就是寫沒有用的變數和函數,不過話說回來YAFFS的代碼寫的確實不太規範。當然它的效能確實沒話說。有興趣的可以試一下。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/iltaek/archive/2009/05/01/4140884.aspx