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
大陆一直在等机会