nandflash ECC 原理记录。
nand ECC 全称是Error Checking and correction.
该算法分为列校验和行校验。
![991711-20170301175641454-903664143.jpg](https://i-blog.csdnimg.cn/blog_migrate/9130ac4b4c1b985a905991e9e4c8e5f2.jpeg)
* 如上图所示, CP0 == 所有的 Bit0 ^ Bit2 ^ Bit4 ^ Bit6
CP1 == 所有的 Bit1 ^ Bit3 ^ Bit5 ^ Bit7
CP2 == 所有的 Bit0 ^ Bit1 ^ Bit4 ^ Bit5
CP3 == 所有的 Bit2 ^ Bit3 ^ Bit6 ^ Bit7
CP4 == 所有的 Bit0 ^ Bit1 ^ Bit2 ^ Bit3
CP5 == 所有的 Bit4 ^ Bit5 ^ Bit6 ^ Bit7
---------> 每个列校验都是 1024 位异或的结果
---------> 如果结果为1,说明有奇数个1位,结果如果为0,说明为偶数个1.
---------> 列校验结果一共有上面6位
![991711-20170301180039235-915494584.jpg](https://i-blog.csdnimg.cn/blog_migrate/e971ddbfd02d7bdbdab0c1465679add1.jpeg)
* 如上图所示,RP0 第0行以及每隔 1 行所有位的异或结果。
RP1 第1行以及每隔 1 行所有位的异或结果。
RP2,RP3 是间隔 2 行所有位的异或结果。
RP4,RP5 是间隔 4 行所有位的异或结果。
RP6,RP7 是间隔 8 行所有位的异或结果。
RP8,RP9 是间隔 16 行所有位的异或结果。
RP10,RP11 是间隔 32 行所有位的异或结果。
RP12,RP13 是间隔 64 行所有位的异或结果。
RP14,RP15 是间隔 128 行所有位的异或结果。
----> 这些结果都是8 * 128 = 1024 位的异或结果。
----> 如果结果为1,说明有奇数个1位,结果如果为0,说明为偶数个1.
----> 行校验一共有16位。
- 在nand 中常用3个字节去存储这22位结果,有下图所示:
![991711-20170301180339548-2019513253.jpg](https://i-blog.csdnimg.cn/blog_migrate/4ceb3763234cf83668d027883d805a7e.jpeg)