yaffs文件系統在2.6內核上的移植--操作步驟(轉載)

====================================================================
一、簡介:
Yaffs(Yet Another Flash File System)文件系統是專門針對NAND 閃存設計的嵌入式文件系統,目前有YAFFS 和YAFFS2 兩個版本,兩個版本的主要區別之一在於YAFFS2 能夠更好的支持大容量的NAND FLASH芯片。

Yaffs 文件系統有些類似於JFFS/JFFS2 文件系統,與之不同的是JFFS1/2 文件系統最初是針對NOR FLASH的應用場合設計的,而NOR FLASH 和NAND FLASH本質上有較大的區別,所以儘管JFFS1/2 文件系統也能應用於NAND FLASH,但由於它在內存佔用和啓動時間方面針對NOR 的特性做了一些取捨,所以對NAND來說通常並不是最優的方案。

 
二, yaffs/yaffs2在2.6.9中的移植
(1),下載YAFFS文件系統代碼,下載網址:
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
點擊頁面左下角的Download tarball即可下載全部相關代碼。
(2),將下載的文件yaffs.tar.gz拷貝到你的一個臨時文件夾中,假設是/tmp,並解壓:
# cd /tmp
# tar xzvf yaffs.tar.gz
解壓後得到Development文件夾,該文件夾裏有兩個子文件:yaffs和yaffs2。考慮到現在的NAND FLASH容量越做越大,而且yaffs2可以自動選擇掛載是yaffs1還是yaffs2文件系統,這裏我們移植yaffs2。當然如果你的NAND FLASH只是512+16B的,可以只移植yaffs,因爲即使你移植了yaffs2,它也會自動選擇掛載yaffs1的。
(3)在要移植的內核目錄下建立yaffs2文件夾,並將需要的文件拷貝過來:
# cd $(linuxdir)/fs
# mkdir yaffs2
# cd yafs2
# cp /tmp/Development/yaffs2/*.c .
# cp /tmp/Development/yaffs/*.h .
# cp /tmp/Development/yaffs2/Makefile-kernel Makefile
# cp /tmp/Development/yaffs2/Kconfig .
(4),修改$(linuxdir)/fs/yaffs2中的文件:
在開始未修改該目錄.c文件前,會出現很多的built-in.o的錯誤,要麼是提示某些函數未定義,要麼是某些函數重複定義,花了我很長的時間,終於找到問題所在。部分錯誤提示如下:(這是我開始編譯yaffs時的錯誤,yaffs2的錯誤更多,但類型差不多)
fs/built-in.o(.text+0x8478c): In function `yaffs_internal_read_super_mtd': 
: undefined reference to `nandmtd_WriteChunkToNAND' 
fs/built-in.o(.text+0x84790): In function `yaffs_internal_read_super_mtd': 
: undefined reference to `nandmtd_ReadChunkFromNAND' 
fs/built-in.o(.text+0x84794): In function `yaffs_internal_read_super_mtd': 
: undefined reference to `nandmtd_EraseBlockInNAND' 
fs/built-in.o(.text+0x84798): In function `yaffs_internal_read_super_mtd': 
: undefined reference to `nandmtd_InitialiseNAND'
查看.c文件,我發覺有很多是通過Kconfig文件裏定義的CONFIG常量來判斷執行的,而這些常量在你make menuconfig/xconfig後退出後會將你的選擇保存到<linux/config.h>文件中,但yaffs2目錄下的有些.c文件中引用了這些常量來判斷,卻並未加入引用config.h文件,從而會出錯。將yaffs2目錄下所有引用了這些常量的.c文件中加入對config.h的引用即可: #include <linux/config.h>
(5),修改$(linuxdir)/fs/Makefile 和 Kconfig文件。
# cd $(linuxdir)/fs
# vi Makefile  (將下面一行添加到Makefile中)
   obj-$(CONFIG_YAFFS_FS) += yaffs2/
# vi Kconfig (將下面一行添加到Kconfig中)
   source "fs/yaffs2/Kconfig
(6),在編譯內核時選擇:
<*> YAFFS2 file system support
  <*> 512 byte / page devices
   <*> Lets Yaffs do its own ECC
        <*> 2048 byte (or larger) / page devices
   <*> Autoselect yaffs2 format
   <*> Disable lazy loading
   <*> Turn off wide tnodes
  <*> Turn off debug chunk erase check
通過mkyaffsimage 製做出來的image 其OOB 中也包含它自己計算的ECC校驗數據,其校驗算法有可能和MTD NAND 驅動的校驗算法不同,如果在內核中由MTD來處理ECC,會造成MTD 認爲所有的page 都校驗錯誤。所以,這也是我前面說最好把Lets Yaffs do its own ECC 選上的原因,同時,要把MTD NAND 驅動中的ECC 校驗關閉。在$(linuxdir)/drivers/mtd/nand/your_nand.c的初始化函數中設置this-eccmode = NAND_ECC_NONE.這樣做實際是使用了yaffs的ECC,但在讀寫yaffs分區時分出現提示說:
Reading data from NAND FLASH without ECC is not recommended 
Writing data without ECC to NAND-FLASH is not recommended
個人認爲,其實已經使用了yaffs的ECC,只是在傳給MTD時,MTD沒認可,參考mtd/nand/nand_base.c文件裏的nand_read_ecc函數以及yaffs2/yaffs_fs.c 文件中在於ECC的定義。這裏應該是提示沒用NAND的ECC,而使用的是yaffs的ECC。這可以通過mkyaffsimage製作一個image來 驗證。解決方法:要麼使用nand的ECC,將yaffs的ECC屏蔽掉;要麼將nand_base.c裏的相關錯誤信息屏蔽掉。
(7),修改你要移植的芯片中的Makefile,在devices後面添加mtdX和mtdblockX設備,設備個數視你的nand的分區個數而定,這裏我的flash在your_nand.c中分成了三個區。
 \
 mtd0,c,90,0  mtd1,c,90,1  mtd2,c,90,2 \
 \
 mtdblock0,b,31,0 mtdblock1,b,31,1 mtdblock2,b,31,2
(8),編譯後將kernel和文件系統下載到板子上,查看結果並掛載。
# cat /proc/mtd     (查看分區情況)
mtd0: 00400000 00004000 "EV40 flash partition 1"
mtd1: 00400000 00004000 "EV40 flash partition 2"
mtd2: 00800000 00004000 "EV40 flash partition 3"
# cat /proc/filesystems   (查看內核支持的文件系統)
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   sockfs
nodev   futexfs
nodev   pipefs
nodev   eventpollfs
         ext2
nodev   ramfs
nodev   devfs
nodev   nfs
nodev   jffs2
         romfs
         yaffs
         yaffs2
nodev   rpc_pipefs
我們發現系統已經支持yaffs和yaffs2文件系統了。
# eraseall /dev/mtd0     (在掛載之前可以先將該分區裏的內容擦除掉)
# mount –t yaffs2 /dev/mtdblock0 /mnt    (將第1個分區掛載到/mnt目錄下)
yaffs: dev is 32505856 name is "mtdblock0"
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs: auto selecting yaffs1
我們發現如果你的flash是512+16B / page的,即使你選擇的是yaffs2文件系統,內核也會自動選擇掛載yaffs1文件系統。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章