返回信息流以下个人见解,我会同试验陆续补充完整,有更好的方法敬请指正。
1.遇见的问题
众所周知,NAND flash出厂存在坏块(invalid block)的情况.关于坏块的解释见下文。而通常的vivi bootloader(除了bonfs有检查坏块)中没有处理坏块,至使在某些情况下烧写param 、kernel 或rootfs时失败。比如:0-127K为vivi区,128-191K为param区,192-2M为内核区,2-4M为根文件系统区,剩下的为usr区。若在内核区有坏块的情况下,用load flash kernel x 命令烧写时会提示失败。同理在根文件系统区也存在此情况。以后的文章将针对此问题进行解决。(vivi的烧写用jfalsh.exe)
基本的方法就是烧写时避开坏块,而读时也避开坏块。
NAND Flash的坏块(先引用别人的一段介绍)
1)为什么会出现坏块
由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。
坏块的特性是:
当编程/擦除这个块时,不能将某些位拉高,这会造成Page Program和Block Erase操作时的错误,相应地反映到Status Register的相应位。
2)坏块的分类
总体上,坏块可以分为两大类
a.固有坏块
这是生产过程中产生的坏块,一般芯片原厂都会在出厂时都会将坏块第一个page的spare area的第6个byte标记为不等于0xff的值。
b.使用坏块
这是在NAND Flash使用过程中,如果Block Erase或者Page Program错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现的坏块的第一个page的spare area的第6个Byte标记为非0xff的值。
3)坏块管理
根据上面的这些叙述,可以了解NAND Flash出厂时在spare area中已经反映出了坏块信息,因此,如果在擦除一个块之前,一定要先check一下spare area的第6个byte是否是0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除。
当然,这样处理可能会犯一个错误―――“错杀伪坏块”,因为在芯片操作过程中可能由于电压不稳定等偶然因素会造成NAND操作的错误。但是,为了数据的可靠性及软件设计的简单化,我们就要奉行“蒋委员长”的“宁可错杀一千,也决不放过一个”的宗旨。
4)补充
(1)需要对前面由于Page Program错误发现的坏块进行一下特别说明。如果在对一个块的某个page进行编程的时候发生了错误就要把这个块标记为坏块,首先就要把其他好的page里面的内容备份到另外一个空的好块里面,然后,把这个块标记为坏块。
当然,这可能会犯“错杀”之误,一个补救的办法,就是在进行完页备份之后,再将这个块擦除一遍,如果Block Erase发生错误,那就证明这个块是个真正的坏块,那就毫不犹豫地将它打个“戳”吧!
(2)可能有人会问,为什么要使用spare area的第六个byte作为坏块标记。这是NAND Flash生产商的默认约定,你可以看到Samsung,Toshiba,STMicroelectronics都是使用这个Byte作为坏块标记的。
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #803同步于 2008/7/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
[讨论]vivi+linux NAND flash 坏块的处理
jklbupt
2008/7/1镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
这几天杂事太多了,一直没有更新.VIVI下确实有坏块检测的函数,只是要选择bonfs,但没有坏块跳过处理的函数.也就是说即使你检测出来做了mark,读的时候也是不会跳过坏块的(主要指加载内核到内存时).关于文件系统的读是linux内核启动后mtd里边处理的.有时间我会把相关分析总结发上来.