This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x yaffs2 文件系统移植



文件系统老是挂载失败,,不知道是不是ECC导致的

NAND:  HW ECC Hamming Code selected

256 MiB

MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1

Net:   cpsw

Hit any key to stop autoboot:  0

Card did not respond to voltage select!

no sd card

Card did not respond to voltage select!

Booting from nand ...

HW ECC BCH8 Selected

NAND read: device 0 offset 0x280000, size 0x500000

5242880 bytes read: OK

## Booting kernel from Legacy Image at 80007fc0 ...

  Image Name:   Linux-3.2.0

  Image Type:   ARM Linux Kernel Image (uncompressed)

  Data Size:    3110672 Bytes = 3 MiB

  Load Address: 80008000

  Entry Point:  80008000

  Verifying Checksum ... OK

  XIP Kernel Image ... OK

[    1.918762] yaffs: dev is 32505863 name is "mtdblock7" rw

[    1.924407] yaffs: passed flags ""

[    3.339233] VFS: Mounted root (yaffs filesystem) on device 31:7.

[    3.345916] Freeing init memory: 244K

[    3.349792] Kernel panic - not syncing: No init found.  Try passing init= opt

ion to kernel. See Linux Documentation/init.txt for guidance.

  • U-Boot# pri nand_root_fs_type

    nand_root_fs_type=yaffs2

  • 看上去是你的文件系统做的有问题,  Kernel panic - not syncing No init found.  Try passing init= opt,没有找到init

  • nandflash---MT29F2G08AB  Page Size :  (2K + 64)Byte   跟我之前用的K9F1G08U0B一样,,我用的mkyaffs2image就在KF1G08U0B上可以,,我用此开发板提供的文件系统说明制作jffs2的镜像是ok的,,说明文件系统没问题,,

  • 我的 nand_root_fs_type 设置为yaffs2 ,,内核我试过能够挂载mtdblock07为yaffs2,,说明内核开启了yaffs2支持

  • 我的jffs2文件系统可以跑起来,,,改成yaffs2  后修改了环境变量只有nand_root_fs_type  从jffs2改为yaffs2

  • 应该是内核需要修改些什么,,,我内核的yaffs2的配置和我之前移植的2.6.39一样,,,我怀疑的是ecc部分,,,

  • 2:修改/drivers/mtd/nand/s3c2410.c文件并找到如下程序段

       } else {

          chip->ecc.mode        = NAND_ECC_SOFT;

       }

    把 NAND_ECC_SOFT必成NAND_ECC_NONE,目的是使NAND驱动不进行ECC校验,否则挂载不了文件系统。

       } else {

          chip->ecc.mode        = NAND_ECC_NONE;

       }

    但是在/drivers/mtd/nand/omap2.c中我也需要修改吗???

    static int __devinit omap_nand_probe(struct platform_device *pdev)中吗??我改了也没用

  • 请问您这个问题是否已经解决了?

    我现在遇到同样的问题。在挂载时,日志中出现了许多“[  130.602203] yaffs: checking block 1955 bad”的记录。挂载后,有lost and found目录,但无法写入任何内容,因为所有的块都check bad了。

    我现在怀疑是yaffs的patch里可能有问题。我是在www.yaffs.net中git下载的最新的版本。

    请指教,多谢了。

  • Board_am335xevm.c中的evm_nand_init函数中 pdata->ecc_opt =OMAP_ECC_HAMMING_CODE_DEFAULT ,这样就会采用 NAND_ECC_SOFT,,然后用放的SD卡中启动,解压 文件系统 压缩包到指定mtd 分区,,目前我只实现解压的方式,,至于mkyaffs2img制作的img始终没有成功,,一直郁闷中

  • 挂载之前要先擦除下 mtd 的分区,,好像是flash_eraseall 这个指令

  • 谢谢回复。

    这两天看了下源码,BCH8 ECC需要14*4=56字节,OOB区就只剩下6个字节了,不够yaffs使用的。

    看来,只要使用BCH8,就不可能使用yaffs2了。

    如果能使用BCH4,那么ECC要8*4=32字节,这样有可能用yaffs2,可惜PSP不支持。不知道增加BCH4有多大的难度。

    如果使用软件纠错,我在想,还有没有必要使用yaffs? 有硬件纠错的jffs能比软件纠错的yaffs效率低吗?不知您有何高见?

  • 回你最后的那个帖子, 一个是oob的计算,请参考 processors.wiki.ti.com/.../AM335x_NAND_Driver%27s_Guide,我觉得可以用软件试试看,看性能如何

  • 终于成功了,,真他妈纠结啊,, 我用的是最新的mkyaffs2img,,是有问题的,文件大小超大,建议使用原先想就OK的mkyaffs2img,,还有就是uboot(不要用2011.09,有问题,用最新的)还有要修改参考blog.csdn.net/.../7879465  

    如果是正常的不带oob2字节偏移和ecc数据的img,烧写之前先使用nandecc sw,

  • blog.csdn.net/.../6966383   这个上面讲了MTD_OOB_RAW与MTD_OOB_AUTO的区别,MTD_OOB_RAW直接烧写数据到OOB;

    MTD_OOB_AUTO则会只修改OOB_FREE 数据,而且会增加offset(offset=2,前两字节为坏块标识,所以烧写时跳过);

    使用MTD_OOB_AUTO烧写,再配合nandecc sw,就可以自行产生uboot带的ecc;

  • 总结下我的修改:

    1、修改uboot代码中关于write.yaffs 部分(原先代码当没有坏块的情况下,直接烧写nand,没有烧写oob);

    2、将内核的ECC改为SOFT_ECC;

    3、在内核中加入yaffs2支持(最好使用以前使用过的OK的);

    4、使用mkyaffs2img(以前OK的)制作img文件,使用nandecc sw 烧写;

  • 你这个问题是怎么解决的。。

    我现在用的uboot-2013.10也是怀疑,yaffs补丁有问题。。。

  • BSP中的kernel是支持BCH4 ECC的。uboot需要自行修改代码。

    但是我下载kernel.org的linux3.10,kconfig是这样写的:

    choice
        prompt "BCH error correction capability"
        depends on MTD_NAND_OMAP_BCH

    config MTD_NAND_OMAP_BCH8
        bool "8 bits / 512 bytes (recommended)"
        help
         Support correcting up to 8 bitflips per 512-byte block.
         This will use 13 bytes of spare area per 512 bytes of page data.
         This is the recommended mode, as 4-bit mode does not work
         on some OMAP3 revisions, due to a hardware bug.

    config MTD_NAND_OMAP_BCH4
        bool "4 bits / 512 bytes"
        help
         Support correcting up to 4 bitflips per 512-byte block.
         This will use 7 bytes of spare area per 512 bytes of page data.
         Note that this mode does not work on some OMAP3 revisions, due to a
         hardware bug. Please check your OMAP datasheet before selecting this
         mode.

    endchoice

    其中提到某些OMAP3 型号的4bitecc有硬件bug,就不知道具体是哪些型号了,既然有bug,TI也敢推出来?

    对于2K页大小的SLC nand,移植yaffs最好的方案就是BCH4 ECC,如果懒得调,用uboot和内核都自带的SOFT ECC也是可以的。

    另外,BCH4的算法应该是每512字节生成7字节的ecc校验码,ELM要求取偶数,7+1 = 8, 所以对于2K页的nand,OOB共64字节,OOB区需要占用8*4 = 28字节存放ecc code,

    2 (badblock markers)+32(ecc code) + 28(yaffs tag)<64,所以说BCH4是最佳方案。