虽然yaffs号称已经更新至支持3.14了,但是我在编译3.8内核时还是不能直接加入yaffs。参考前人的经验最终成功编译并用nandsim模拟flash成功mount,在此记录以供之后参考。


  1. 发现 error: unknown type name ‘Y_LOFF_T’

    在yaffs_endian.h中加上如下定义:

    #ifndef Y_LOFF_T

    #define Y_LOFF_T loff_t

    #endif

  2. yaffs_guts.c:line: undefined reference to function

    在yaffs文件夹下的Makefile里增加一行 :

    yaffs-y += yaffs_endian.o

  3. In file included from fs/yaffs2/yaffs_nameval.c:28:0:fs/yaffs2/yaffs_nameval.c:82:5: error: conflicting types for 'nval_del' int nval_del(struct yaffs_dev *dev, char *xb, int xb_size, const YCHAR *name)     ^ In file included from fs/yaffs2/yaffs_nameval.c:28:0: fs/yaffs2/yaffs_nameval.h:21:5: note: previous declaration of 'nval_del' was here int nval_del(struct yaffs_dev *dev, char *xb, int xb_size, const YCHAR * name);     ^ fs/yaffs2/yaffs_nameval.c:100:5: error: conflicting types for 'nval_set' int nval_set(struct yaffs_dev *dev,     ^ In file included from fs/yaffs2/yaffs_nameval.c:28:0: fs/yaffs2/yaffs_nameval.h:22:5: note: previous declaration of 'nval_set' was here int nval_set(struct yaffs_dev *dev,     ^

    在yaffs_nameval.h中,结构体struct yaffs_dev的定义出现在参数列表中,而在此之前没有定义,这样会导致函数不识别这个结构体引发上面的错误。struct yaffs_dev在”yaffs_guts.h”中被定义,因此在yaffs_nameval.h文件中include下”yaffs_guts.h”就OK了。




经过以上3步,kernel可以成功编译, 但是nandsim模拟出的mtd0上不能mount yaffs。用mtdinfo查询之后发现创建的mtd0是一个8m的小设备,与nandsim命令行调用时所传参数无关。这是因为在配置.config文件时我选择将nandsim设置为in-build module。之后修改.config文件配置其成为module后重新编译重启,终于成功用以下命令创建虚拟设备并mount yaffs。


        sudo modprobe nandsim first_id_byte=0xec second_id_byte=0xd3 third_id_byte=0x10 fourth_id_byte=0xa6

        sudo mkdir -p /media/nand

        sudo mount -t yaffs /dev/mtdblock0 /media/nand

(据说fourth_id_byte=0xa6设置flash chip的page size为4k, 其余三个参数作用未知,mtdinfo显示flash的block size为256k,size为1024M,OOB size为128B)


reference:http://blog.csdn.net/flfihpv259/article/details/52102050