linux NANDFLASH坏区管理

驱动代码参考:nand_base.c  nand_ecc.c


NAND Flash存储器由block (块) 构成, block的基本单元是page (页)。通常来说, 每一个block由16, 32或64个page组成。大多数的NAND Flash器件每一个page (页)内包含512个字节(或称为256个字)的Data area(数据存储区域)。每一个page内包含有一个扩展的16字节的 Spare area(备用区域)。所以每一个page的大小为512+16=528字节。我们称这样的page为small page。


坏块表(BBT,Bad Block Table)。在Linux内核MTD架构下的Nand Flash驱动,和Uboot中Nand Flash驱动中,在加载完驱动之后,如果你没有加入参数主动要求跳过坏块扫描的话,那么都会去主动扫描坏块,建立必要的BBT的,以备后面坏块管理所使用。


坏块标识:当擦写FLASH一个块失败的话,就标记该块为坏块,并更新BBT表??


flash read函数,读取FLASH和oob中的ECC对比,如果一样,该函数返回0,如果不一样,且ecc纠错失败,继续读取下一个数据,该函数最后返回负数错误


spare area,也叫oob(out of band):存有坏块标识+ECC 对2kbyte的flash来说,厂家说是前两个即第0、1个字节是坏块标志。


OOB是每个页都有的数据,里面存的有ECC(当然不仅仅);而BBT是一个FLASH才有一个;针对每个BLOCK的坏块识别则是该块第一页spare area的第?个字节。



ECC:目前有1位、4位和8位,也就是说在512字节中如果是4位的ecc那就可以纠正最多4个bit的错误
     1位/256字节 (汉明码)--- 需3字节ECC。对256字节的数据共生成了6个Bit的列校验结果,16个Bit的行校验结果,共22个Bit。在Nand中使用3个字节存放校验结果,多余的两个Bit位置1
     4位 /512字节(BCH码)---  需7字节ECC。4 bit ecc, per 512 bytes can creat 13 * 4 = 52 bit , 52 / 8 = 7 bytes ,就是需要7个字节空间 (linux内核 nandbase.c - NAND_ECC_SOFT_BCH)


static struct nand_ecclayout mylayout = {
#ifdef CONFIG_SYS_NAND_PAGE_2K
.eccbytes = 40,
.eccpos = {                                                                 //从第24个字节算起,总共40个数据的ECC数据
24, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 
},
.oobfree = {
{.offset = 2, .length = 22, },                     //前两个字节是坏块标识,后22个字节是用户可以自由使用区
},
#endif
}
 其中,.eccbytes = 40,跟初始化有关系,我们一般这样初始化:
nand->ecc.size = 512; 
nand->ecc.bytes = 10;
恩,这下明朗了,我们需要每512个字节产生10个ecc字节,因此对2kbyte页面的flash来说,一页就是4个512,因此需要4*10=40个ecc字节。


oob 区域分布如下:2字节(坏块标识) + 22字节(oobfree)  + 40字节(ecc) 


1.NANDFLASH坏区产生的条件  --- 读写FLASH,NANDFLASH的编程电压漂移均有可能导致。
 
2.NANDFLASH校验问题,分为软件校验和硬件校验,软件校验相对硬件校验就一个缺点,耗时时间比硬件校验慢。
 
3.NANDFLASH校验原理:我说通俗点  数据A + CRC值 ,每次写入FLASH,会将数据及其算的CRC一起写入(当然前提写之前会查坏块表,如果是坏块会跳过),读FLASH会读出数据后(也会跳过坏区),计算一个CRC值和之前保存的CRC对比,一样,则认为该数据有效。
 
4.NANDFLASH纠错原理: 这个CRC值比较特殊是具有纠错数据的能力,分1位,4位等,含义是一串数据如果有1位/4位有问题,通过CRC值和计算的CRC差异,是可以找到错误的位,这样自然就可以纠错。但纠错的位越多,校验码占用的字节数越多,算法也更复杂。
 
5.NANDFLASH出问题分析:
  1. 数据出问题,如果数据出问题,数据出问题的位数,决定了是否能自动纠错,如果位数较多就无法纠错。
  2. 存的CRC校验值本身出问题,无解。


参考:AM3352 uboot中对NandFlash坏块的处理
http://blog.csdn.net/lights_joy/article/details/51649765


参考:如何编写linux nandflash 驱动

http://blog.csdn.net/mrwangwang/article/details/28444009


参考:nand flash粗析(二)------NAND flash 读写

http://blog.csdn.net/fenglifeng1987/article/details/8539644



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值