返回列表 发帖

发现一种linux的nand_data+obb的读写算法 请管理员判断是否必要加入编程器

本人经常读写一些设备的NAND,其实大部分设备使用坏块跳过时可以很好的解决坏块问题,即使单文件不分区,因为分区模式下的坏块跳过只是为了应对 分区内剩余块数小于分区内的坏块数这一情况,也就是说不分区的情况下 出现分区数据起始地址偏移的情况必然是本区坏块数大于分区剩余块数。多分区烧录虽然可以保证每个块的起始地址不受影响 ,但是这种情况下依然不能保证存在坏块的本分区数据完整性。那么最可靠的坏块管理办法必然是设备本身的坏块管理方式,而绝大部分设备是支持跳过坏块的
回到正题
关于跳过坏块,最近遇到某一品牌设备只要跳过就无法正常启动的情况,通过简单的分析其配置文件发现对nand的一套读写方案 他在逻辑层将所有芯片的OOB_len配置为64
其实大的设备厂家往往有多个nand供应商,那么为了统一管理 很多厂家都采用对oob固定尺寸的方案
那么我硬拷贝全片数据后验证这个情况
下面是硬件环境
芯片:NW874
芯片页大小:2048
obb:128
block:2048
那么正常的数据组成应该是 2048(data)+128(oob)
那通过对备份数据的分析发现实际linux的应用为:
第一页 2048data+64oob,后面为64data+2048data+64oob 以此类推也就是说他把每一个oob拆分多2个64,第一个64作为oob数据,第二个作为data
那么除了第一页配置为2048+64外,其他页均为2112+64
这时使用我们软件默认的芯片配置 来跳过坏块必然发生错误的地址偏移或者部分data被抛弃的情况

我已经通过以上算法成功从nand备份的数据中剥离出有效数据 并通过了CRC校验,所以以上算法不用存在质疑


以上数据仅为举例,既然有厂家将原本128oob拆分为2个64使用,那么也就会有厂家将原本64的oob拆分为2个32使用
我想表达的意思就是 是否可以将linux拆分oob这一情况 考虑到软件中,新增选项让用户也可以自定义拆分oob来实现配套的读写管理。
该功能可能将解决很大一部分的nand读写问题,将是消费者福音

以上表达写的有点乱,如果没有看明白欢迎讨论,毕竟这是个有价值的线索。或许可以解决八成的nand坏块问题
如需要芯片备份出的数据 可以提供

顺便提一下 贵司内置的ECC算法通用性不好

TOP

问题2请问贵司在读取芯片时对nand的坏块数据是如何判断的
因为最近我在写一个程序用来分析nand备份出来的数据,以方便日常的工作,需要了解下相关的机制
假设每块有64页 每页2048大小
请问在是在block中第一个2048字节为全0x00时判断为坏块,还是1个block中任意一个页为全部0x00时判断为坏块

TOP

回复 3# q519948746

1, 坏块标记有几种:
        A:一个块的第一个页的OOB的第一个字节为非0(512字节大小页模式时:为OOB的第5字节非0)
        B:一个块的第1.2个页的OOB的第一个字节为非0 。
        C: 一个块的第1.与最后一个页的OOB的第一个字节为非0 。
    (默认使用方法A, 非标坏块标记需要定制算法)
2.   NAND数据块OOB的用法很多,未知格式数据的操作只能按芯片标准读取,OOB的特别处理方法,只能用DLL算法定制。
3.   跳过坏块如何使用,OOB大小没有关系的,只是要求:写入时与读取文件时,设置的OOB大小必须相同,否则跳过的地址就错了。(文件件大小必须与设置的OOB大小匹配)

TOP

返回列表 回复 发帖