Peasant_Lee 发表于 2009-10-10 16:51

继续刷新,并等待,呵呵,,,,,,

yohoro 发表于 2009-10-30 10:42

先支持一下,需要测试一个硬件的ecc算法,谢谢lz.

carming 发表于 2010-07-01 13:47

Peasant_Lee:
“看过了楼主的所讲的原理,拜访! 看了下代码,有一个地方弄不明白。 在 TestEcc.c 中的纠错函数中,有个if判断(下面列出),理论上它的作用应该就是判断s0s1s2 是否共有11个bit为1。但是我就不明白这个判别s0s1s2有11bit个1的条件,请高手指点,先谢谢了!

/* Check for a single bit error */
    if( ((s0 ^ (s0 >> 1)) & 0x55) == 0x55 &&
      ((s1 ^ (s1 >> 1)) & 0x55) == 0x55 &&
      ((s2 ^ (s2 >> 1)) & 0x54) == 0x54)
   {
         .................
         .................
         .................
      }


hi,Peasant_Lee,你对文中提到的ECC算法还是没太理解清楚,这段if代码就是针对仅有1bit出错的处理。这里我用c5,c4,c3,c2,c1,c0表示列校验结果。根据算法本身如果仅有1bit出错,可知c5,c3,c1分别与c4,c2,c0相反,行校验同理,22bits的中一定有11bits的1,从而列校验中一定有3bits的1,如果我选择c5,c3,c1开始判断,就是判断每2bits的第2bit位,这个道理可以再仔细看看楼主的分析。S2保存了列校验结果,格式为:
bit7bit6bit5bit4bit3bit2bit1bit0
C5   C4    C3    C2    C1    C0   1      1
那么右移一位的S2再异或未右移的S2,就可以判断出c5,c3,c1是否分别与c4,c2,c0相反,也就是是否仅有1bit出错。S0,S1的算法与S2相同。
有了这个基础,以下纠错的代码就很明了了。
byteoffs = (s1 << 0) & 0x80;
                byteoffs |= (s1 << 1) & 0x40;
                byteoffs |= (s1 << 2) & 0x20;
                byteoffs |= (s1 << 3) & 0x10;

                byteoffs |= (s0 >> 4) & 0x08;
                byteoffs |= (s0 >> 3) & 0x04;
                byteoffs |= (s0 >> 2) & 0x02;
                byteoffs |= (s0 >> 1) & 0x01;

                bitnum = (s2 >> 5) & 0x04;
                bitnum |= (s2 >> 4) & 0x02;
                bitnum |= (s2 >> 3) & 0x01;

                dat ^= (1 << bitnum);
从校验原理也可以反推出,如果3bits或以上出错,则可能就无法检测出错误,因为c5,c4,c3,c2,c1,c0的值会发生矛盾,格局有点像二分法,呵呵。

bluesea666 发表于 2010-07-02 15:47

学习了.

kakabuka123 发表于 2010-08-24 15:59

{:2_163:}

imcg 发表于 2011-05-08 11:08

强力吸收,这是我觉得最及时现今为止我看到的最直白的解说.谢

wzhm2002 发表于 2011-06-26 18:15

解释的恨透切。高人啊!!

wzhm2002 发表于 2011-06-26 18:16

解释的很透彻。高人啊!!

jljerryliu 发表于 2011-08-17 10:58

生成ecc校验码的时候,最后的取反操作是为什么? 是不是ecc规定要这么做的呢?

jljerryliu 发表于 2011-08-17 11:02

生成ecc校验码的时候,最后的取反操作是为什么? 是不是ecc规定要这么做的呢?
页: 1 2 [3] 4 5
查看完整版本: [原创]Nand ECC校验和纠错原理及2.6.27内核ECC代码分析