忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: wwxbei

[驱动] [原创]Nand ECC校验和纠错原理及2.6.27内核ECC代码分析 [复制链接]

论坛徽章:
0
发表于 2009-10-10 16:51 |显示全部楼层
继续刷新,并等待,呵呵,,,,,,

论坛徽章:
0
发表于 2009-10-30 10:42 |显示全部楼层
先支持一下,需要测试一个硬件的ecc算法,谢谢lz.

论坛徽章:
0
发表于 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保存了列校验结果,格式为:
bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0  
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[byteoffs] ^= (1 << bitnum);
从校验原理也可以反推出,如果3bits或以上出错,则可能就无法检测出错误,因为c5,c4,c3,c2,c1,c0的值会发生矛盾,格局有点像二分法,呵呵。

论坛徽章:
0
发表于 2010-07-02 15:47 |显示全部楼层
学习了.

论坛徽章:
0
发表于 2010-08-24 15:59 |显示全部楼层
{:2_163:}

论坛徽章:
0
发表于 2011-05-08 11:08 |显示全部楼层
强力吸收,这是我觉得最及时现今为止我看到的最直白的解说.谢

论坛徽章:
0
发表于 2011-06-26 18:15 |显示全部楼层
解释的恨透切。高人啊!!

论坛徽章:
0
发表于 2011-06-26 18:16 |显示全部楼层
解释的很透彻。高人啊!!

论坛徽章:
0
发表于 2011-08-17 10:58 |显示全部楼层
生成ecc校验码的时候,最后的取反操作是为什么? 是不是ecc规定要这么做的呢?

论坛徽章:
0
发表于 2011-08-17 11:02 |显示全部楼层
生成ecc校验码的时候,最后的取反操作是为什么? 是不是ecc规定要这么做的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP