NAND FLASH ECC校验原理与实现

由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。
为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠的进行坏区检测。
    如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。
    对数据的校验常用的有奇偶校验、CRC校验等,而在NAND Flash处理中,一般使用一种比较专用的校验——ECC。按照ECC的校验能力可以分为:1bit ECC/512Byte、4bit ECC/512Byte、8bit ECC/512Byte。
 
    NAND闪存的每一个页面上都包括额外的存储空间,它就是64个字节的空闲区(每512字节的扇区有16字节)。该区能存储ECC代码及其它像磨损评级或逻辑到物理块映射之类的信息。ECC能在硬件或软件中执行,
    但是,硬件执行有明显的性能优势。在编程操作期间,ECC单元根据扇区中存储的数据来计算误码校正代码。数据区的ECC代码然后被分别写入到各自的空闲区。
    当数据被读出时,ECC代码也被读出;运用反操作可以核查读出的数据是否正确。

能校正的错误的数量取决于所用算法的校正强度。在硬件或软件中包含ECC,就提供了强大的系统级解决方案。最简单的硬件实现方案是采用简单的汉明(Simple Hamming)码,但是,只能校正单一位错误。
瑞德索罗门(Reed-Solomon)码提供更为强大的纠错,并被目前的控制器广为采用。此外,BCH码由于比瑞德索罗门方法的效率高,应用也日益普及。
 
    目前大多数MCU厂家为了降低客户的开发周期,在MCU内部集成了NAND FLASH控制器,也就可以实现硬件ECC的功能。
    在硬件ECC的使用中,用户只需要配置相应的寄存器就可以实现数据的校验,但坏块管理还需用户自己做坏块管理表。
    然而,在有些功能简单或通用性的MCU就没有集成NAND FLASH控制器,用户在使用NAND FLASH为了包装数据的可靠性就只能使用软件ECC,当然坏块管理表也就得用户自己做了。
 
硬件ECC举例
    硬件型号:三星S3C2416 + 旺宏MX30LF1G18AC   4bit ECC/512Byte;
    说明:S3C2416集成NAND FLASH控制器,可以支持1bit、4bit、8bit ECC/512Byte;
          MX30LF1G18AC是4bit ECC/512Byte;
   
   
软件ECC举例:
     ECC方式:汉明(Simple Hamming)码;
     ECC位数:1bit ECC/512Btye;
    
ECC原理及方式:
     ECC一般每256字节原始数据生成3字节ECC校验数据,这三字节共24比特分成两部分:6比特的列校验和16比特的行校验,多余的两个比特置1,如下图所示:
                      
     ECC的列校验和生成规则如下图所示:
                      
用数学表达式表示为:
P4=D7(+)D6(+)D5(+)D4 P4`=D3(+)D2(+)D1(+)D0P2=D7(+)D6(+)D3(+)D2 P2`=D5(+)D4(+)D1(+)D0P1=D7(+)D5(+)D3(+)D1 P1`=D6(+)D4(+)D2(+)D0这里(+)表示“位异或”操作
ECC的行校验和生成规则如下图所示:
用数学表达式表示为:
P8 = bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0(+)P8……………………………………………………………………………………这里(+)同样表示“位异或”操作
 
    当往NAND Flash的page中写入数据的时候,每256字节我们生成一个ECC校验和,称之为原ECC校验和,保存到PAGE的OOB(out-of-band)数据区中。
    当从NAND Flash中读取数据的时候,每256字节我们生成一个ECC校验和,称之为新ECC校验和。
    校验的时候,根据上述ECC生成原理不难推断:将从OOB区中读出的原ECC校验和新ECC校验和按位异或,若结果为0,则表示不存在错(或是出现了ECC无法检测的错误);
    若3个字节异或结果中存在11个比特位为1,表示存在一个比特错误,且可纠正;
    若3个字节异或结果中只存在1个比特位为1,表示OOB区出错;其他情况均表示出现了无法纠正的错误。
 
 
总结:
    具体用户使用硬件ECC还是软件ECC,主要是看用户使用的MCU是否带NAND Flash控制器和用户是否对数据ECC这个要求。无论硬件或软件ECC,坏块管理的工作都是要用户自己处理的。
    对于4bit和8bit ECC,主要采用R-S码或BCH码。
    
    
    nand的纠错能力,目前有1位、4位和8位,也就是说在512字节中如果是4位的ecc那就可以纠正最多4个bit的错误,一般就是翻转的错误!
    
    oob?

      冗余区域,一般存放的是ecc纠错码,一般4位的ecc的纠错后需要的字节数为:4 bit ecc, per 512 bytes can creat 13 * 4 = 52 bit , 52 / 8 = 7 bytes ,就是需要7个字节的空间

      而我们目前的nandflash的页大小一般为2kb,也就是2kb/512bytes==4,也就是说至少需要4×7=28个ecc纠错的字节存放的地方

     oob分区一般已经由硬件厂商固定了,每512字节的oob大小为16字节,那么2kb的页就是64字节

     oob分区:

struct nand_ecclayout _nand_oob_64 = {

 .eccbytes = 24,   //ecc纠错需要的空间

 .eccpos = {       //具体存放的位置

     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,      //偏移2位,这2位主要用来存放坏块标志,0xff

        .length = 38}} //多余的部分,可以用来存放系统文件的标志,如yaffs!

};


文件系统
常见的有JFFS2、YAFFS、TrueFFS文件系统都提供了坏块管理、负载均衡,ecc纠错检错等功能。
有UBIFS,UBIFS建立在UBI层上,UBI层建立在MTD上,而上述的两个文件系统是直接建立在MTD上的。
UBI要的工作就是实现更好的负载均衡和坏块管理,减轻文件系统的工作。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值