上一節S3C2440移植linux3.4.2內核之修改分區以及製作根文件系統我們構建了根文件系統,這節我們修改內核支持yaffs2文件系統
獲取yaffs2源碼並給內核打補丁
首先獲取yaffs2源碼(參考git命令使用詳解)
cd /work/nfs_root
git clone git@github.com:lifeyx/yaffs2.git
//若下載出現error:403,可以試試vi /etc/resolv.conf,將nameserver地址改爲: 114.114.114.114
將yaffs2源碼來配置到內核裏(使內核支持yaffs2)
vi /work/nfs_root/yaffs2/README-linux
參考上圖:
/*給內核打補丁*/
cd /work/nfs_root/yaffs2/
./patch-ker.sh c m /work/system/linux-3.4.2//c:將yffs2文件夾copy到linux-3.4.2/fs裏, m:指定多版本
/*通過menuconfig,來使內核支持yaffs2*/
cd /work/system/linux-3.4.2/
make menuconfig
搜索yaffs,找到位於:
-> File systems
-> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])
<*> yaffs2 file system support //按Y鍵,使內核支持yaffs2
編譯內核make uImage
如下圖所示,出現很多錯誤:
如上圖,問題都是出在fs/yaffs2/下,很多error都講述:調用的成員名,在struct mtd_info結構體裏沒有定義.
修改yaffs2源碼
接下來我們便將fs/yaffs2文件夾添加到內核3.4的si工程中.
然後進入yaffs2/yaffs_vfs.c,第1958行:
(linux下顯示的是yaffs_vfs.c,vi可以打開yaffs_vfs.c。但是在si工程中沒有找到yaffs_vfs.c,所以從ubuntu中拷貝一份yaffs_vfs.c添加到si中。)
然而發現struct mtd_info *mtd的結構體mtd_info定義的是_sync成員,如下圖所示:
所以接下來只有遇到與struct mtd_info有關的error,都在成員前加上: _
比如:
將yaffs_vfs.c文件2514~2515行的mtd->sync 改爲: mtd->_sync
將yaffs_vfs.c文件2702行的mtd->erase改爲: mtd->_erase
將yaffs_vfs.c文件2703行的mtd->read改爲: mtd->_read
… …
並將yaffs_vfs.c的第2967行的 root = d_alloc_root(inode);改爲: root = d_make_root(inode);
全部修改後,將yaffs_vfs.c上傳到ubuntu,再次make uImage,
報錯如下
內核沒有定義 d_alloc_root
我們在內核搜索下s_root看下別的文件系統怎麼使用的。
全部修改後,將yaffs_vfs.c上傳到ubuntu,再次make uImage,報錯如下
估計是缺少下劃線
修改完後重新編譯
報錯
同樣,沒有在SI工程中找到yaffs_mtdif1.c,從ubuntu中拷貝下來,添加到si工程中。
上圖報錯的各個文件內的函數都要添加下劃線
編譯報錯
把ubuntu上的yaffs_mtdif2.c文件拷貝到本地假如si工程,繼續上述文件中的下劃線
最終編譯成功
拷貝
cp arch/arm/boot/uIamge /work/nfs_root/uImage_yaffs
由於上章-我們製作了文件系統,名爲fs_mini_mdev_new,所以直接使用mkyaffs2image工具製作:
mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
然後通過uboot來燒寫yaffs2、燒寫uImage發現沒成功,我們用替代法查找問題
UBOOT可能有問題:換上1.1.6的UBOOT,文件系統啓動成功
發現1.1.6的UBOOT沒問題,所以就是我們移植的新UBOOT有BUG:
drivers\mtd\nand\Nand_util.c
if (!need_skip && !(flags & WITH_DROP_FFS)) {
改爲
if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) {
最後啓動yaffs2成功:
下一節S3C2440移植linux3.4.2內核之內核裁剪我們將裁剪內核。