天天看點

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

上一節S3C2440移植linux3.4.2核心之修改分區以及制作根檔案系統我們建構了根檔案系統,這節我們修改核心支援yaffs2檔案系統

@[TOC]

移植Linux3.4.2核心其他文章連結:

擷取yaffs2源碼并給核心打更新檔

首先擷取yaffs2源碼(參考git指令使用詳解)

cd /work/nfs_root

git clone [email protected]:lifeyx/yaffs2.git

//若下載下傳出現error:403,可以試試vi /etc/resolv.conf,将nameserver位址改為: 114.114.114.114

将yaffs2源碼來配置到核心裡(使核心支援yaffs2)

vi /work/nfs_root/yaffs2/README-linux

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

參考上圖:

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:指定多版本

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

如下圖所示,出現很多錯誤:

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

如上圖,問題都是出在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中。)

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

然而發現struct mtd_info *mtd的結構體mtd_info定義的是_sync成員,如下圖所示:

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

是以接下來隻有遇到與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);

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

全部修改後,将yaffs_vfs.c上傳到ubuntu,再次make uImage,

報錯如下

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

核心沒有定義 d_alloc_root

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

我們在核心搜尋下s_root看下别的檔案系統怎麼使用的。

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統
linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

全部修改後,将yaffs_vfs.c上傳到ubuntu,再次make uImage,報錯如下

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

估計是缺少下劃線

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

修改完後重新編譯

報錯

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

同樣,沒有在SI工程中找到yaffs_mtdif1.c,從ubuntu中拷貝下來,添加到si工程中。

上圖報錯的各個檔案内的函數都要添加下劃線

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

編譯報錯

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

把ubuntu上的yaffs_mtdif2.c檔案拷貝到本地假如si工程,繼續上述檔案中的下劃線

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

最終編譯成功

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

拷貝

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成功:

linux3.01 yaffs2更新檔,S3C2440移植linux3.4.2核心之支援YAFFS檔案系統

下一節S3C2440移植linux3.4.2核心之核心裁剪我們将裁剪核心。

如遇到排版錯亂的問題,可以通過以下連結通路我的CSDN。

**CSDN:[CSDN搜尋“嵌入式與Linux那些事”]

文章來源: segmentfault.com,作者:Carlos0321,版權歸原作者所有,如需轉載,請聯系作者。

原文連結:segmentfault.com/a/1190000038723000