yaffs文件系统的问题

来源:互联网 发布:淘宝上的cpu散片 编辑:程序博客网 时间:2024/06/13 23:38

   我现在用的内核是linux2.6.25,可以算是很新的了,板子有64M的K9F128x0BTSOP的NAND。刚开始,看有人把jffs2的文件系统放到nand flash中,我也试着做了,然后出现了很多问题,后来在网上搜索了好半天,总结出了主要有几个问题:

   1、 ECC的问题,uboot有自己的ECC,这里我们还没有用到,内核的mtd也有自己的ECC,yaffs也有自己的ECC。而这三个ECC中只能用一个,网上看了最好是用mtd的!要不然ECC错误把NAND的块标示为坏块之后,就没办法再用了,我刚开始就是犯了这个愚蠢的错误,产生了好多坏块,真是可惜啊!

   2、 tag的问题,使用yaffs的时候,不能选择

config YAFFS_9BYTE_TAGS
 bool "Use older-style on-NAND data format with pageStatus byte"
 depends on YAFFS_YAFFS1
 default n
 help

   Older-style on-NAND data format has a "pageStatus" byte to record
   chunk/page state.  This byte is zero when the page is discarded.
   Choose this option if you have existing on-NAND data using this
   format that you need to continue to support.  New data written
   also uses the older-style format.  Note: Use of this option
   generally requires that MTD's oob layout be adjusted to use the
   older-style format.  See notes on tags formats and MTD versions
   in yaffs_mtdif1.c.

   If unsure, say N.

选择了这个后,加载文件系统的时候会报错,我们用的是8tag的,提示需要9tags!!

    3、 mtd-util的问题,flash_eraseall 要慎用,nandwrite更是要谨慎使用!!!

还有mkyaffsimage这个东东需要修改,现在找了一篇北邮一个牛人写的:

简单的修改一下mkyaffsimage.c就行拉,可以参考nandmtd1_WriteChunkWithTagsToNAND这个函数。
把修改mkyaffsimage的关键代码贴出来
static int write_chunk(__u8 *data, __u32 objId, __u32 chunkId, __u32 nBytes)
{
    yaffs_Tags t;
    yaffs_Spare s;
    yaffs_PackedTags1 pt1; //add by hiboy
    yaffs_ExtendedTags  etags;
    __u8 oobdata[16];
    error = write(outFile,data,512);
    if(error < 0) return error;

    etags.chunkId = chunkId;
    etags.serialNumber=0;
    etags.byteCount=nBytes;
    etags.objectId=objId;
    
    yaffs_PackTags1(&pt1, &etags);
    yaffs_CalcTagsECC((yaffs_Tags *)&pt1);
    ((__u8 *)&pt1)[8] = 0xff;
    memset(oobdata,0xff,16);
    memcpy(oobdata+8,&pt1,8);
    
    nPages++;
    
    //return write(outFile,&s,sizeof(yaffs_Spare));
    return write(outFile,oobdata,16); //YTAG1_SIZE
}
这里的16字节oob符合nand mtd的要求,低8字节保留0xFF给MTD,高8字节yaffs_PackedTags1结构,符合目前yaffs2的代码。
这样通过mkyaffsimage制作的yaffsimage通过mtd_util烧到nand中就正确了:
./flasheraseall /dev/mtdX
./nandwrite -a -o /dev/mtdX YAFFSIMAGE

我准备按照这个方法试一下看看能不能解决,完nand flash上写数据不能保持的问题!!!

原创粉丝点击