S3C2440移植linux3.4.2內核之支持YAFFS文件系統

上一節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內核之內核裁剪我們將裁剪內核。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章