Nand ECC 校验和纠错 详解

合集下载

ECC 模拟出错验证纠错方法

ECC 模拟出错验证纠错方法

ECC 模拟出错纠正修改BUG验证方法1,进到UBOOT模式,pri 找到squashfs的起始地址,如下红框2,读出squashfs中的一个OOB区域,修改其他的数据(模拟出错)因每个分区的前20000的地址为镜像文件的头部,不需要考虑。

例子如下:A,先用nand dump 0x720000 100查看下当前PAGE的OOB数据如下:注意:我们要模拟出错的数据只能是上面红框中三行中的某一BitB, 用命令nand read.oob 0x82000000 0x720000 40 将当前Page的OOB数据读到内存地址0x82000000, 如下图:C, 用命令md 0x82000000 40 显示出内存中的数据,如下图,我们要修改的数据为红框中的部分,也即对应步骤A中的三行(你要修改它的ECC区域,它在OOB的64个字节的最后24字节)D,修改时每256Byte及其ECC只能修改一个bit, (即上图中每两组数据中只能修改一个bit, 如:9a6b5955为一组), 举例:现要将地址0x82000030处的一组数据6b5aa59b 修改为4b5aa59b,6 对应二进制:01104 对应二进制:0100即将第三Bit的1改为0修改命令如下:mw 0x82000030 4b5aa59b 1完成后查看内存中修改的数据md 0x8200000 40如下图:E,将数据写到flash中,命令:nand write.oob 0x82000000 0x720000 40F, 查看OOB区域是否修改成功,nand dump 0x720000 100如下图,修改成功G,Reset重启设备,会发现在以前的版本中设备会出现问题,或是起不来,或是起来后系统不正常等等。

说明旧的版本中此BUG确实存在。

如下图为设备起不来。

H.重新烧写新的可纠错的软件版本,看下是否同会出现同样的问题,如果设备能正常运行说明BUG解决,否则BUG重现。

ecc校验计算说明

ecc校验计算说明

ecc校验计算说明
好的,下面为你提供ECC校验计算的详细说明:
ECC(Error Correcting Code)校验是在传统奇偶检验的基础上发展而来的,主要是利用数据块的行、列奇偶校验信息生成ECC码,可以检测出给定数据块是否失真,但具有对该数据块辑位数出错、校验码冗长、不能纠错的局限性。

ECC算法思想为:ECC校验每256B(Byte)数据为一组进行操作,把256B数据看成256×8的矩阵,矩阵的每个元素表示一个比特(1bit)位。

矩阵进行编码后分别生成6bit的列校验信息和16bit的行校验信息。

ECC纠错算法检测和纠正错误的原理为:每向闪存写入256B数据时,生成22bit校验码,成为读校验码。

然后将写校验码与读校验码按位异或操作。

结果会出现以下3种情况:- 全为“0”,则数据不存在错误;
- 存在11bit为“1”,则存在一个比特错误,且可以纠正,因为在22bit数据中P和P'都是相互对立的,假如发生翻转,对写入产生的ECC和读出产生的ECC相异或,必然其中一个为1另一个为0,所以22bit中有11bit为1表示有1bit错误;
- 只存在1bit为1,则生成的校验码出错,数据本身无错。

当出现第二种情况时,改错误比特在数据组中的字节偏移量为P1024、P521、P256、P128、P64、P32、P16、P8。

错误比特所处的字节中的位偏移量为P4、P2、P1。

因此,根据字节的偏移量和字节中的位偏移量就可以确定数据中发生的翻转位,然后对其进行纠正。

内存条的错误校验与纠正(ECC)对数据安全的重要性

内存条的错误校验与纠正(ECC)对数据安全的重要性

内存条的错误校验与纠正(ECC)对数据安全的重要性随着信息技术的快速发展,数据的产生和存储量急剧增加。

无论是个人用户还是企业用户,数据的安全性已成为一个至关重要的问题。

而在数据存储过程中,内存条的错误校验与纠正(ECC)技术起到了至关重要的作用。

本文将从内存条错误校验与纠正技术的基本原理、功能以及对数据安全性的重要性等方面进行探讨。

首先,我们来了解一下内存条错误校验与纠正技术的基本原理。

ECC技术是一种通过添加校验码来检测和纠正内存数据错误的方法。

在内存条上,每个存储单元通常由多个存储芯片组成,而每个存储芯片又由多个存储单元组成。

当数据存储到内存中时,ECC技术会对每个存储单元中的数据进行校验,并将校验码存储在相应的内存地址中。

在数据读取过程中,ECC技术会再次对读取的数据进行校验,并与存储的校验码进行比对,以发现并纠正可能存在的错误。

其次,内存条错误校验与纠正技术具备多项功能。

首先,它能够检测单个位错误。

在数据传输过程中,即使是一位的错误也可能导致数据完全错误的结果。

ECC 技术通过校验码的比对,能够快速检测出这样的错误,并采取纠正措施。

其次,ECC技术还能够检测多位错误。

虽然多位错误相对较为罕见,但一旦发生,可能会导致数据的严重损坏。

有了ECC技术,我们可以快速发现这样的错误,并进行修复。

此外,内存条错误校验与纠正技术还能够检测未知错误。

有时,内存中的数据错误可能是由于电压干扰、辐射干扰或芯片老化等原因造成的。

ECC技术可以快速检测和纠正这些未知的错误,确保数据的可靠性和完整性。

内存条错误校验与纠正技术对数据安全性具备重要意义。

首先,它能够保证数据的可靠性。

数据错误可能会导致严重的后果,比如引起计算机系统崩溃、程序异常退出、系统数据损坏等。

而ECC技术能够及时发现和纠正内存中的错误,确保数据的准确性,从而提高系统的稳定性和可靠性。

其次,ECC技术协助保护数据的完整性。

在数据传输和存储过程中,数据的完整性能够防止数据被篡改、损坏或丢失。

NANDFLASH中ECC的原理与错误

NANDFLASH中ECC的原理与错误

NANDFLASH中ECC的原理与错误
向NAND Flash写数据时,每256或512字节会生成一个校验码写在每个page的OOB区,当从NAND Flash读数据时,每读取256或512字节数据,也会生成一个ECC校验码,拿这个校验码与存放在OOB区的校验吗对比看看是否一致,就可以知道读取的数据是否正确.
一般来说,kernel与cramfs是通过U-BOOT烧写到NAND Flash 中,这个过程是向NAND Flash写数据,会产生ECC码,使用的是U-BOOT的ECC机制产生的(不管是硬件产生还是软件产生),然后这些ECC码会存放在NAND Flash的OOB区域。

当你启动Kernel时,会从NAND Flash中读数据,这是时候也会产生ECC码。

使用的还是U-BOOT的ECC机制产生的,因为这个读NAND操作是还是处在U-Boot运行状态下。

然后这个ECC码与写Kernel时产生的ECC码(保存在OOB区域)做比较,看是否有错误。

由于写Kernel与读Kernel都用的是U-BOOT的ECC产生机制,所以一般不会出错。

但你读Cramfs时,这个时候已经是内核状态啦。

所以读Cramfs 时用的Kernel的ECC产生机制,前面写Cramfs用的U-Boot机制,如果两种机制不一致(包括一个是硬件产生,一个是软件产生,或是软件产生算法不一样,或是OOB区域规划不一样),就会产生错误。

ecc内存纠错的原理

ecc内存纠错的原理

ecc内存纠错的原理
ECC内存纠错是指利用纠错码技术来纠正内存中的错误。

纠错码是一种能够检测和纠正数据传输错误的编码方式,它对数据进行编码和检验,通过添加冗余信息来确保数据的完整性和正确性。

ECC内存纠错的原理是通过添加冗余的校验位来检测和纠正内存中的错误。

每个内存单元都会有一个或多个校验位,用来存储与该单元相关的数据的纠错码。

当数据被存储进内存单元时,该单元的纠错码也被计算出来并存储在校验位中。

当内存中的数据被读取时,存储器控制器会计算数据的纠错码并将其与存储在校验位中的纠错码进行比较。

如果发现纠错码不匹配,则该单元中的数据已经发生了错误。

此时,ECC内存纠错技术就会自动根据已有的纠错码信息来纠正错误的数据,从而保证内存中的数据的完整性和正确性。

ECC内存纠错技术可以检测和纠正多个内存单元中的错误,并且具有高度的可靠性和可用性。

由于其能够自动纠正内存中的错误,所以ECC内存纠错技术被广泛应用于服务器、工作站等需要高可靠性和稳定性的计算机系统中。

- 1 -。

ECC算法详解及硬件实现

ECC算法详解及硬件实现

ECC算法详解及硬件实现ECC 的全称是 Error Checking and Correction,是一种用于 Nand 的差错检测和修正算法。

如果操作时序和电路稳定性不存在问题的话, NAND Flash 出错的时候一般不会造成整个 Block 或是 Page 不能读取或是全部出错,而是整个 Page(例如512Bytes)中只有一个或几个 bit 出错。

ECC 能纠正 1 个比特错误和检测 2 个比特错误,而且计算速度很快,但对 1 比特以上的错误无法纠正,对 2 比特以上的错误不保证能检测。

校验码生成算法:ECC 校验每次对 256 字节的数据进行操作,包含列校验和行校验。

对每个待校验的 Bit 位求异或,若结果为 0,则表明含有偶数个1;若结果为 1,则表明含有奇数个 1。

列校验规则如表 1 所示。

256 字节数据形成256 行、8 列的矩阵,矩阵每个元素表示一个 Bit 位。

其中 CP0 ~ CP5 为六个 Bit 位,表示 Column Parity(列极性), CP0 为第 0、2、4、6 列的极性,CP1 为第 1、3、5、7 列的极性, CP2 为第 0、1、4、5 列的极性,CP3 为第 2、3、6、7 列的极性, CP4 为第 0、1、2、3 列的极性,CP5 为第 4、5、6、7 列的极性。

用公式表示就是: CP0=Bit0^Bit2^Bit4^Bit6,表示第 0 列内部 256 个 Bit 位异或之后再跟第 2 列 256 个 Bit 位异或,再跟第 4 列、第 6 列的每个 Bit 位异或,这样,CP0 其实是 256*4=1024 个 Bit 位异或的结果。

CP1 ~ CP5 依此类推。

行校验如下图所示其中 RP0 ~ RP15 为十六个 Bit 位,表示 Row Parity(行极性), RP0 为第 0、2、4、6、….252、254 个字节的极性 RP1-----1、3、5、7……253、255 RP2----0、1、4、5、8、9…..252、253 (处理 2 个 Byte,跳过 2 个 Byte) RP3---- 2、3、6、7、10、11…..254、255 (跳过 2 个 Byte,处理 2 个 Byte) RP4---- 处理 4 个 Byte,跳过 4 个 Byte; RP5---- 跳过 4 个 Byte,处理 4 个 Byte; RP6---- 处理 8 个 Byte,跳过 8 个 Byte RP7---- 跳过 8 个 Byte,处理 8 个 Byte; RP8---- 处理 16 个 Byte,跳过 16 个 Byte RP9---- 跳过 16 个 Byte,处理 16 个 Byte;RP10----处理 32 个 Byte,跳过 32 个 Byte RP11----跳过 32 个 Byte,处理 32 个Byte; RP12----处理 64 个 Byte,跳过 64 个 Byte RP13----跳过 64 个 Byte,处理 64 个 Byte; RP14----处理 128 个 Byte,跳过 128 个 Byte RP15----跳过 128 个 Byte,处理 128 个 Byte;可见,RP0 ~ RP15 每个 Bit 位都是 128 个字节(也就是 128 行)即 128*8=1024 个 Bit 位求异或的结果。

NANDFLASHECC校验原理与实现

NANDFLASHECC校验原理与实现

NANDFLASHECC校验原理与实现NAND闪存(NAND Flash)是一种非易失性存储设备,常见于各种电子设备中,如手机、平板电脑和固态硬盘等。

由于其高集成度和大容量的特性,NAND闪存已成为主流存储介质之一、然而,由于各种原因(如电压波动、位反转和噪声等),在数据传输过程中可能会出现错误。

为了确保数据的可靠性和完整性,NAND闪存通常使用纠错码(ECC)进行校验和纠正。

ECC校验原理:ECC校验是一种基于算法的校验方法,通过对数据进行编码和校验位的添加,以检测和纠正传输过程中的错误。

在NAND闪存中,常用的ECC算法包括BCH(Bose-Chaudhuri-Hocquenghem)和RS(Reed-Solomon)等。

BCH编码:BCH编码是一种强大的纠错编码方法,可以用于检测和纠正多个错误位。

对于数据块大小为N的NAND闪存,BCH编码将数据块划分为多个子块,每个子块的大小为K,其中n=N/K是编码的重复次数。

在每个子块中,BCH编码器计算校验位,并将其添加到子块的末尾(通常称为附加码字)。

然后,这些附加码字组成了整个数据块的校验位。

BCH解码:BCH解码基于错误位置定位和纠正位计算。

在读取NAND闪存时,ECC解码器首先读取数据块和校验位,并计算其校验位。

然后,对于每个校验位错误的数据块,解码器使用BCH解码算法确定错误的位置。

一旦错误位置确定,解码器可以使用纠正位计算算法修复错误数据,并输出正确的数据块。

ECC实现:NAND闪存的ECC实现通常是在芯片级别进行的。

在芯片内部,有专门的ECC电路来执行编码和解码操作。

编码器:编码器通常包括一个BCH编码器和一个输出缓冲区。

BCH编码器接收数据块并计算校验位,然后将结果存储在输出缓冲区中。

输出缓冲区的大小通常与数据块的大小相等。

解码器:解码器通常包括一个BCH解码器、一个错误检测和位置确定单元以及一个错误修复单元。

BCH解码器接收数据块和校验位,并计算校验位。

Nand_ECC_校验和纠错_详解

Nand_ECC_校验和纠错_详解

ECC的全称是Error Checking and Correction,是一种用于Nand的差错检测和修正算法。

如果操作时序和电路稳定性不存在问题的话,NAND Flash 出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。

ECC能纠正1个比特错误和检测2个比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的错误不保证能检测。

校验码生成算法:ECC校验每次对256字节的数据进行操作,包含列校验和行校验。

对每个待校验的Bit位求异或,若结果为0,则表明含有偶数个1;若结果为1,则表明含有奇数个1。

列校验规则如表1所示。

256字节数据形成256行、8列的矩阵,矩阵每个元素表示一个Bit位。

其中CP0 ~ CP5 为六个Bit位,表示Column Parity(列极性),CP0为第0、2、4、6列的极性,CP1为第1、3、5、7列的极性,CP2为第0、1、4、5列的极性,CP3为第2、3、6、7列的极性,CP4为第0、1、2、3列的极性,CP5为第4、5、6、7列的极性。

用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6,表示第0列内部256个Bit位异或之后再跟第2列256个Bit位异或,再跟第4列、第6列的每个Bit位异或,这样,CP0其实是256*4=1024个Bit位异或的结果。

CP1 ~ CP5 依此类推。

行校验如下图所示其中RP0 ~ RP15 为十六个Bit位,表示Row Parity(行极性),RP0为第0、2、4、6、….252、254 个字节的极性RP1-----1、3、5、7……253、255RP2----0、1、4、5、8、9…..252、253 (处理2个Byte,跳过2个Byte)RP3---- 2、3、6、7、10、11…..254、255 (跳过2个Byte,处理2个Byte)RP4---- 处理4个Byte,跳过4个Byte;RP5---- 跳过4个Byte,处理4个Byte;RP6---- 处理8个Byte,跳过8个ByteRP7---- 跳过8个Byte,处理8个Byte;RP8---- 处理16个Byte,跳过16个ByteRP9---- 跳过16个Byte,处理16个Byte;RP10----处理32个Byte,跳过32个ByteRP11----跳过32个Byte,处理32个Byte;RP12----处理64个Byte,跳过64个ByteRP13----跳过64个Byte,处理64个Byte;RP14----处理128个Byte,跳过128个ByteRP15----跳过128个Byte,处理128个Byte;可见,RP0 ~ RP15 每个Bit位都是128个字节(也就是128行)即128*8=1024个Bit位求异或的结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ECC的全称是Error Checking and Correction,是一种用于Nand的差错检测和修正算法。

如果操作时序和电路稳定性不存在问题的话,NAND Flash 出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。

ECC能纠正1个比特错误和检测2个比特错误,而且计算速度很快,但对1比特以上的错误无法纠正,对2比特以上的错误不保证能检测。

校验码生成算法:ECC校验每次对256字节的数据进行操作,包含列校验和行校验。

对每个待校验的Bit位求异或,若结果为0,则表明含有偶数个1;若结果为1,则表明含有奇数个1。

列校验规则如表1所示。

256字节数据形成256行、8列的矩阵,矩阵每个元素表示一个Bit位。

其中CP0 ~ CP5 为六个Bit位,表示Column Parity(列极性),CP0为第0、2、4、6列的极性,CP1为第1、3、5、7列的极性,CP2为第0、1、4、5列的极性,CP3为第2、3、6、7列的极性,CP4为第0、1、2、3列的极性,CP5为第4、5、6、7列的极性。

用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6,表示第0列内部256个Bit位异或之后再跟第2列256个Bit位异或,再跟第4列、第6列的每个Bit位异或,这样,CP0其实是256*4=1024个Bit位异或的结果。

CP1 ~ CP5 依此类推。

行校验如下图所示其中RP0 ~ RP15 为十六个Bit位,表示Row Parity(行极性),RP0为第0、2、4、6、….252、254 个字节的极性RP1-----1、3、5、7……253、255RP2----0、1、4、5、8、9…..252、253 (处理2个Byte,跳过2个Byte)RP3---- 2、3、6、7、10、11…..254、255 (跳过2个Byte,处理2个Byte)RP4---- 处理4个Byte,跳过4个Byte;RP5---- 跳过4个Byte,处理4个Byte;RP6---- 处理8个Byte,跳过8个ByteRP7---- 跳过8个Byte,处理8个Byte;RP8---- 处理16个Byte,跳过16个ByteRP9---- 跳过16个Byte,处理16个Byte;RP10----处理32个Byte,跳过32个ByteRP11----跳过32个Byte,处理32个Byte;RP12----处理64个Byte,跳过64个ByteRP13----跳过64个Byte,处理64个Byte;RP14----处理128个Byte,跳过128个ByteRP15----跳过128个Byte,处理128个Byte;可见,RP0 ~ RP15 每个Bit位都是128个字节(也就是128行)即128*8=1024个Bit位求异或的结果。

综上所述,对256字节的数据共生成了6个Bit的列校验结果,16个Bit的行校验结果,共22个Bit。

在Nand中使用3个字节存放校验结果,多余的两个Bit位置1。

存放次序如下表所示:以K9F1208为例,每个Page页包含512字节的数据区和16字节的OOB区。

前256字节数据生成3字节ECC校验码,后256字节数据生成3字节ECC校验码,共6字节ECC 校验码存放在OOB区中,存放的位置为OOB区的第0、1、2和3、6、7字节。

文件:MakeEccTable.rar大小:0KB下载:下载校验码生成算法的C语言实现在Linux内核中ECC校验算法所在的文件为drivers/mtd/nand/nand_ecc.c,其实现有新、旧两种,在2.6.27及更早的内核中使用的程序,从2.6.28开始已经不再使用,而换成了效率更高的程序。

可以在Documentation/mtd/nand_ecc.txt 文件中找到对新程序的详细介绍。

首先分析一下2.6.27内核中的ECC实现,源代码见:http://lxr.linux.no/linux+v2.6.27/drivers/mtd/nand/nand_ecc.c43/*44 * Pre-calculated 256-way 1 byte column parity45 */46static const u_charnand_ecc_precalc_table[] = {47 0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00,48 0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,49 0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,50 0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,51 0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,52 0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,53 0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,54 0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,55 0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,56 0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,57 0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,58 0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,59 0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,60 0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,61 0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,620x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x0063};为了加快计算速度,程序中使用了一个预先计算好的列极性表。

这个表中每一个元素都是unsigned char类型,表示8位二进制数。

表中8位二进制数每位的含义:这个表的意思是:对0~255这256个数,计算并存储每个数的列校验值和行校验值,以数作数组下标。

比如nand_ecc_precalc_table[ 13 ] 存储13的列校验值和行校验值,13的二进制表示为00001101,其CP0 = Bit0^Bit2^Bit4^Bit6 = 0;CP1 = Bit1^Bit3^Bit5^Bit7 = 1;CP2 = Bit0^Bit1^Bit4^Bit5 = 1;CP3 = Bit2^Bit3^Bit6^Bit7 = 0;CP4 = Bit0^Bit1^Bit2^Bit3 = 1;CP5 = Bit4^Bit5^Bit6^Bit7 = 0;其行极性RP = Bit0^Bit1^Bit2^Bit3^Bit4^Bit5^Bit6^Bit7 = 1;则nand_ecc_precalc_table[ 13 ] 处存储的值应该是0101 0110,即0x56.注意,数组nand_ecc_precalc_table的下标其实是我们要校验的一个字节数据。

理解了这个表的含义,也就很容易写个程序生成这个表了。

程序见附件中的MakeEccTable.c文件。

有了这个表,对单字节数据dat,可以直接查表nand_ecc_precalc_table[ dat ] 得到dat的行校验值和列校验值。

但是ECC实际要校验的是256字节的数据,需要进行256次查表,对得到的256个查表结果进行按位异或,最终结果的Bit0 ~ Bit5 即是256字节数据的CP0 ~ CP5./* Build up column parity */81 for(i = 0; i < 256; i++) {82/* Get CP0 - CP5 from table */83idx = nand_ecc_precalc_table[*dat++];84reg1 ^= (idx & 0x3f);8586 //这里省略了一些,后面会介绍91 }Reg1在这里,计算列极性的过程其实是先在一个字节数据的内部计算CP0 ~ CP5, 每个字节都计算完后再与其它字节的计算结果求异或。

而表1中是先对一列Bit0求异或,再去异或一列Bit2。

相关文档
最新文档