b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

dm368 ecc 移植ubifs到dm368成功(3)

电脑杂谈  发布时间:2017-06-04 14:03:05  来源:网络整理

if(unlikely(raw))

chip->ecc.write_page_raw(mtd,chip, buf);

else

chip->ecc.write_page(mtd,chip, buf);

/*

* Cached progamming disabled for now, Not sureif its worth the

* trouble. The speed gain is not veryimpressive. (2.3->2.6Mib/s)

*/

cached= 0;

这里需要注意的就是raw,如果是MTD_OOB_RAW,那么不会做ECC校验,也不会把ECC码写入OOB;

如果是这样,在read的时候也必须指定是MTD_OOB_RAW,不需要ECC校验;否则,就会出现我们最开始看到的错误;

if(mtd->ecc_stats.failed - stats.failed)

return-EBADMSG;

那么,从这里的情况来看,我们可能已经找到出错的原因了;ubi使用了subpage write,而底层nand flash驱动实际上是不支持subpage write的,尽管ubi一次只写了512字节,但这个page的其他部分已经不能再次写入新的数据了。

从Nand_base.c(drivers\mtd\nand)来看,large page的nand flash,对subpage write的支持是不完善的,限制条件比较多,比如,不能是MLC的nand flash,不能用硬件ECC;

更严重的问题是代码存在缺陷,在写入部分data的时候,将其他部分的数据填充为0xff了,然后write整个page,并写入全部ecc码到oob,也许这就是前面ecc校验出错的原因吧。dm368 eccdm368 ecc

nand_do_write_ops()

/*Partial page write ? */

memset(chip->buffers->databuf, 0xff, mtd->writesize);

memcpy(&chip->buffers->databuf[column],buf, bytes);

因此,我想到的解决办法就是在nand驱动中禁止subpage write。

第一步,在chip options中增加NAND_NO_SUBPAGE_WRITE;

static struct davinci_nand_pdatadavinci_nand_data = {

.options = NAND_USE_FLASH_BBT|NAND_NO_SUBPAGE_WRITE,

然后重新编译下载kernel,但问题依旧;

root@dm368-evm:~# ubiattach/dev/ubi_ctrl -m 3

UBI: attaching mtd3 to ubi0

UBI: physical eraseblock size: 131072 bytes (128 KiB)

UBI: logical eraseblock size: 129024 bytes

UBI: smallest flash I/O unit: 2048

UBI: sub-page size: 512

UBI: VID header offset: 512 (aligned 512)

心想很奇怪,为什么sub-page size还是512?

回头查看代码,想看看sub page size是怎样计算出来的,

if (!(chip->options & NAND_NO_SUBPAGE_WRITE) &&


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/dianqi/article-51076-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...