免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jn200002
打印 上一主题 下一主题

关于nand_ecc.c的菜鸟级问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-06-24 15:45 |只看该作者

回复 #10 sep 的帖子

看过了,帖子被MR.BIT 给捞起来,我看好几回了~ 可我对ARM都没搞清楚...看你的帖子也晕呼的..

论坛徽章:
0
12 [报告]
发表于 2008-06-24 15:46 |只看该作者
原帖由 jn200002 于 2008-6-24 15:23 发表
我看明白这图了~ 第4张图画的多余... 第3张不已经都画全了吗...又或者~我还是没能看懂吧...

哈哈 多谢 MR.BIT  那个256的数组用来干吗呢~?



第4張稍有不同,看顏色,區分行校驗的 P* 及 P*'
當然你看懂了它就多餘了.恭喜

那256byte的數組
Pre-calculated 256-way 1 byte column parity


是預存的,我想是用於校驗NAND Flash用的,因為它肯定存在NAND Flash裏


另.MR.BIT 這個不中不英的名字好奇怪, 叫我大白牙好了

[ 本帖最后由 bitmilong 于 2008-6-24 15:47 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2008-06-24 15:55 |只看该作者

回复 #12 bitmilong 的帖子

没问题 MR.大白牙( ) 恩,那底下的代码就都是上面图的实现了吗?? 为啥一接触到代码看的比图还晕.... 用SI好好看看...

论坛徽章:
0
14 [报告]
发表于 2008-06-24 15:57 |只看该作者
原帖由 jn200002 于 2008-6-24 15:55 发表
没问题 MR.大白牙( ) 恩,那底下的代码就都是上面图的实现了吗?? 为啥一接触到代码看的比图还晕.... 用SI好好看看...



要是代碼比圖明白還要圖幹啥呀

论坛徽章:
0
15 [报告]
发表于 2008-06-24 16:10 |只看该作者
原帖由 bitmilong 于 2008-6-24 15:57 发表



要是代碼比圖明白還要圖幹啥呀



C实在太差,看的少,写的更少,看到代码有恐惧心理了... 很难对着代码读完能有个整体的印象~ 慢慢来吧

那个数组 kernel里 nand_ecc.c  /*Pre-calculated 256-way 1 byte column parity*/  汗ING 1个字节有256种 列奇偶校验啊...

[ 本帖最后由 jn200002 于 2008-6-24 16:17 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2008-06-24 16:19 |只看该作者
原帖由 jn200002 于 2008-6-24 16:10 发表



C实在太差,看的少,写的更少,看到代码有恐惧心理了... 很难对着代码读完能有个整体的印象~ 慢慢来吧

那个数组 kernel里 nand_ecc.c  /*Pre-calculated 256-way 1 byte column pa ...



2^8=256

论坛徽章:
0
17 [报告]
发表于 2008-06-24 16:39 |只看该作者

回复 #16 bitmilong 的帖子

2^8=256? 什么意思~?不明白

那nand的ecc是传256个字节,结合图 列:bit7是P1 一列共256位,算奇/偶 得0或1 然后bit7的P1与bit6的P1'再算一次得到P2, 类推 P2 P2'算出P4 吗?  然后最后存在相应的 那3字节的 6位里.

再结合上面的图,列校验怎么会用到这么多校验字符啊,还有,每次的列校验并不知道是奇还是偶校验啊.

我晕了,这句话对我来讲太真实了..

[ 本帖最后由 jn200002 于 2008-6-24 17:08 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2008-06-24 18:28 |只看该作者
原帖由 jn200002 于 2008-6-24 16:10 发表
那个数组 kernel里 nand_ecc.c  /*Pre-calculated 256-way 1 byte column parity*/  汗ING 1个字节有256种 列奇偶校验啊...


2^8=256
2的八次方即为256
为什么是八次方,因为1byte含有8个bit
256种排列组合

原帖由 jn200002 于 2008-6-24 16:39 发表
2^8=256? 什么意思~?不明白

那nand的ecc是传256个字节,结合图 列:bit7是P1 一列共256位,算奇/偶 得0或1 然后bit7的P1与bit6的P1'再算一次得到P2, 类推 P2 P2'算出P4 吗?  然后最后存在相应的 那3字节的 6位里.

再结合上面的图,列校验怎么会用到这么多校验字符啊,还有,每次的列校验并不知道是奇还是偶校验啊.


  用数学表达式表示为:
    P4=D7(+)D6(+)D5(+)D4  P4`=D3(+)D2(+)D1(+)D0
    P2=D7(+)D6(+)D3(+)D2  P2`=D5(+)D4(+)D1(+)D0
    P1=D7(+)D5(+)D3(+)D1  P1`=D6(+)D4(+)D2(+)D0



P1是能通bit7/bit5/bit3/bit1运算得来的
同理其它的就出来了

这种算法并不是你想的P1能推出P2/P4那么简单,你再研究下示意图
其实是非常精练巧妙,毕竟是3byte校验256byte呀

论坛徽章:
0
19 [报告]
发表于 2008-06-25 09:12 |只看该作者

回复 #18 bitmilong 的帖子

恩,P1 = BIT7(256个0/1) ^ BIT5(256个0/1) ^BIT3(256个0/1) ^BIT1(256个0/1)

有没可能最后P1的结果还有2位以上?如果是的话 又做了什么处理让P1按位异或的结果变成
1个bit的了,

结果只有可能是 1个0/1  因为P1也只占1位吧.

论坛徽章:
0
20 [报告]
发表于 2008-06-25 11:20 |只看该作者

回复 bitmilong 的帖子

我又看了看代码,int nand_correct_data()中
else
a = (d1 ^ (d1 >> 1)) & 0x55;
b = (d2 ^ (d2 >> 1)) & 0x55;
c = (d3 ^ (d3 >> 1)) & 0x54;
在之前的calc_ecc与read_ecc比较后,0是无错,如果不为0,d1异或d1右移1位, 再与1010101做与 这是个什么意思呢?这可能是个常用的什么手法吧?右移1位再与自身异或?我假设了d1为
00010001右移1后 10001000再与自身异或 10011001 再与1010101(0x55)得到 00010001 我汗,又做回原来的值了...

[ 本帖最后由 jn200002 于 2008-6-25 11:31 编辑 ]

评分

参与人数 1可用积分 +6 收起 理由
bitmilong + 6 鼓勵細致的研究

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP