Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504309
  • 博文数量: 121
  • 博客积分: 4034
  • 博客等级: 上校
  • 技术积分: 1439
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-28 12:42
文章分类

全部博文(121)

文章存档

2017年(8)

2016年(10)

2013年(2)

2012年(3)

2011年(18)

2010年(80)

分类: LINUX

2010-07-22 17:19:35

linux ecc校验

uboot和kernel的ecc计算方法有点不一样的,但是计算结果是一样的,但是至于为什么默认的kernel跑步起来,现在我没有看,将来有机会再研究:
首先需要将kernel的校验方式改为相同,在drivers/mtd/nand/s3c2410.c中:s3c2410_nand_init_chip(), 最后的位置, 改为:chip->ecc.mode = NAND_ECC_SOFT;
kernel读取函数调用过程:mtd->read = nand_read; ==> nand_do_read_ops():

1075 /* dancy note :
1076 * func ecc.read_subpage is have some error.
1077 * check ecc fail.
1078 */
1079 /* Now read the page into the buffer */
1080 if (unlikely(ops->mode == MTD_OOB_RAW))
1081 ret = chip->ecc.read_page_raw(mtd, chip, bufpoi);
1082 // else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
1083 // ret = chip->ecc.read_subpage(mtd, chip, col, bytes, bufpoi);//nand_read_subpage
1084 else
1085 ret = chip->ecc.read_page(mtd, chip, bufpoi);
1086 if (ret < 0)
1087 break;

1082和1083行注释掉, 使用read_page读取flash。
check ecc不过的就是这个函数:nand_read_subpage.

在linux2.6.29内核以后nand_read_subpage也没有什么问题了。。

nand_read_subpage引起的问题:

uncorrectable error : <3>end_request: I/O error, dev mtdblock2, sector 0
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs: auto selecting yaffs2
yaffs: restored from checkpoint
yaffs_read_super: isCheckpointed 1

是调用nand_read_subpage接口读取OOB时,读取时只读取六个字节,即aligned_len=6, 通过printk打印发现这六个字节后面的两三个有问题,不知是不是因为硬件的不稳定引起的,如果将aligned_len+=3, 就没有问题了,不知道哪个高手,可以给我指点指点这个是问什么?


阅读(1840) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~