我用的是K9F1208UOB.三星在出厂前对坏块进行标志。DATASHEET上说是,每个BLOCK的第一或者第二页的第517字节会有非FF数据的坏块标志。但我在友善以及立于泰等开发板的FMD_GetBlockStatus()函数中都只对第一页进行判断,万一坏块标志不在第一页,而在第二页,不就出错了啊?
包括优龙的ADS,BOOT,擦除块的时候,都先不进行坏块判断。这样不就破坏了原先的坏块标志了(datasheet上说,坏块标志可擦除的!
合理的方法当然是按规格书的位置来获取坏块信息来建立块信息映射表了。不过即使没有保存原始的坏块信息,一般问题也是不大的,因为你仍然可以通过软件来重新扫描一遍坏块信息,也就是逐块写入测试数据,通过以下环节判断该块是否坏块:(1)判断写入读取命令时是否出错;(2)检查CRC是否正确 (3)对比读出的数据是否和写入的数据相同。因此,坏块信息最重要的并不是原始的坏块标志,而是你自己建立起来的有效块映射表,因为坏块是需要动态维护的。
个人觉得2楼的做法是危险的,特别是量产。如果对nandflash操作的次数不频繁,可能没问题。如果每天都要读写的话,3个月左右就会有问题。特别是大容量的nandflash。
建议还是按照DATASHEET描述来做
BSP那处理可能是默认坏块都在第一页,三星的芯片出场的时候可能也会尽量写在第一页,偶尔才会写在第二页,但是保险起见还是采取严格一些的做法吧。
引用: 引用 2 楼 ccyu 的回复:
合理的方法当然是按规格书的位置来获取坏块信息来建立块信息映射表了。不过即使没有保存原始的坏块信息,一般问题也是不大的,因为你仍然可以通过软件来重新扫描一遍坏块信息,也就是逐块写入测试数据,通过以下环节判断该块是否坏块:(1)判断写入读取命令时是否出错;(2)检查CRC是否正确 (3)对比读出的数据是否和写入的数据相同。因此,坏块信息最重要的并不是原始的坏块标志,而是你自己建立起来的有效块映射表,因??
你指的CRC校验是ECC吧?
你这个做法是不是操作起来有点麻烦,比方我往镜像里面NK时候,也要读出来对比一下的话,速度应该会变慢很多吧。
坏块指的是出场前就存在不稳定的块,那会不会出现这种问题,某些块出场的时候是好的,但是用着用着就坏了?
引用: 引用 7 楼 aaassd_cn 的回复:
引用 4 楼 veabol 的回复:
建议还是按照DATASHEET描述来做
BSP那处理可能是默认坏块都在第一页,三星的芯片出场的时候可能也会尽量写在第一页,偶尔才会写在第二页,但是保险起见还是采取严格一些的做法吧。
没错,fae也是这么说的,厂商会尽量写在第一页的
既然是fae说的,就当是没问题了!不过多判断一个页也不是什么很大的事。搞明白就好!
以前也涉及过nandflash驱动,总体来说nandflash让我们这些开发人员用的不怎么放心,就是这个坏块问题。出厂的时候有坏块,用的过程中也会产生坏块。
就楼主的问题,我当时的做法是在三星fmd驱动里判断坏块的地方把楼主所提的两种情况都考虑进去,即出现datasheet中说的任何一种情况时均把其视作坏块。
当时做1G,2Gnandflash(也是三星的)驱动的时候,遇到一个问题,不知哪位坛友有没有遇到过。分析了这两款nandflash 的datasheet后,按照其上面说的逻辑和时序把fmd驱动写好了。调试的时候nandflash盘符也顺利地挂到系统上去了,查看容量正常,并且可以正常读写文件。但是将接近或者超过flash容量的文件拷进去时,在接近考完的时候总是不成功,并且此后nandflash盘符会消失,重启机器也没有用,相当于整个存储系统崩溃了。重现的概率100%。
哪位坛友要是遇到过并解决了,能否共享一下其原因和解决办法?