yaffs2和MLC 4G nand flash驱动问题

hellochick 2011-09-23 09:41:21
最近在做MLC 4G nand flash驱动,现在驱动完成。
但是mount -t yaffs2 /dev/mtdblock0 /root/nand/之后,
执行cp文件到/root/nand/,或者其他操作,有下面的错误:
1,
**>> Block 203 needs retiring
**>> yaffs write required 2 attempts
……
2,还会调用nand_default_block_markbad标记坏块(其实不是坏块)
3,__nand_correct_data 中 uncorrectable error

初步推测是因为4G nand flash,有溢出??ecc??
fs/yaffs2/需要修改??
之前没做过,没思路,网上搜索,yaffs2蛮复杂,求指导...
...全文
483 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellochick 2011-10-20
  • 打赏
  • 举报
回复

使用纠正1bit错误的ecc算法,比较nandwrite 和 nanddump 数据,是正确的;
或者flashcp,校验也正确;

但是,通过mount,yaffs2文件系统,cp 等操作,就会出错!
uncorrectable error
并且,拷贝的文件越多越容易出错(跟大小关系不大)
为什么呢?至今没明白!

之所以出现uncorrectable error,是因为出现了1bit以上的位错误,
改用bch纠正4——8bit,可以解决问题,但是速度慢了很多。
hellochick 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zmlovelx 的回复:]

你用 mtd utils 工具中的nandwrite写yaffs镜像进去看看. 记得写前先探除下.
[/Quote]

调试文件系统发现,写入数据后,调用verify检测,发现有数据错误,而且无规律,(也有正确的)

而且,对照时序图,检查寄存器配置,之后,问题依然存在。

会不会是nand_ecc.c只是针对slc来做的校验,

而mlc,更容易出现位错误,所以ecc没办法校验,导致出错呢?
帅得不敢出门 2011-09-23
  • 打赏
  • 举报
回复
你用 mtd utils 工具中的nandwrite写yaffs镜像进去看看. 记得写前先探除下.

hellochick 2011-09-23
  • 打赏
  • 举报
回复
kernel:2.6.32

nand flash:
page size 4096byte
block size 1M
chip size 4G
hellochick 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zmlovelx 的回复:]

mtdblock0一般是存放u-boot的,u-boot 并非yaffs2格式.

yaffs的确让很多人苦了一把, 从 yaffs mtd utils u-boot kernel都有可能出问题

新的yaffs倒是对oob的部分做了调整与kernel一致了.

uncorrectable error 这个可能是写u-boot中写时采用的ecc规则与kernel中的不一致.
……
[/Quote]
zmlovelx你好,

上述/dev/mtdblock0是没加入nor flash情况下,加入nor,换成/dev/mtdblock2是一样的。
是在kernel中进行的,不是u-boot,而且nand flash是用的soft ecc。
kernel加载nand flash之后,进入nfs文件系统:
[root@AM3517CPB /root]# mount -t yaffs2 /dev/mtdblock2 /root/nand/
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
block 15 is bad
block 21 is bad
yaffs_read_super: isCheckpointed 0

[root@AM3517CPB nand]# cp /yaffs.tgz .
uncorrectable error :
**>> Block 249 needs retiring
**>> yaffs write required 2 attempts
++nand_default_block_markbad++
**>> Block 249 retired
Block 249 is in state 9 after gc, should be erased
uncorrectable error :
**>> Block 264 needs retiring
**>> yaffs write required 2 attempts
++nand_default_block_markbad++
**>> Block 264 retired
Block 264 is in state 9 after gc, should be erased
……

(其中++nand_default_block_markbad++是我自己加的调试信息,其他是yaffs2里面的)

[root@AM3517CPB nand]# ls -lh
drwx------ 1 root root 4.0k Jan 1 00:02 lost+found
-rw-r--r-- 1 root root 125.6M Jan 1 00:03 yaffs.tgz

yaffs.tgz是拷贝过来了,但是这过程中间不应该有坏块啊。。。

而且,多尝试几次,在这里tar zxf yaffs.tgz有可能出错:tar: crc error

说明数据读写有问题,该怎么调呢?
帅得不敢出门 2011-09-23
  • 打赏
  • 举报
回复
mtdblock0一般是存放u-boot的,u-boot 并非yaffs2格式.

yaffs的确让很多人苦了一把, 从 yaffs mtd utils u-boot kernel都有可能出问题

新的yaffs倒是对oob的部分做了调整与kernel一致了.

uncorrectable error 这个可能是写u-boot中写时采用的ecc规则与kernel中的不一致.
如果都是在kernel中写的, 也有可能是本身ecc 配置不对, 我遇到是采用硬件ecc,写时与读时产生的ecc不同, 每次读时都会出现这个,改成软件ecc没事.

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧