2009.7.21
yaffs2 在 2.6.22的 kernel 上表现很正常,但在老的 2.6.12 上,则出现问题。
无奈之下只好阅读 yaffs2 的代码
fs/yaffs2/yaffs_mtdif2.c 中的 nandmtd2_ReadChunkWithTagsFromNAND 函数从nand flash 中
读取 oob 信息, 获取 yaffs_ExtendedTags tags,
if (tags){
memcpy(&pt, dev->spareBuffer, sizeof(pt));
yaffs_UnpackTags2(tags, &pt);
if(pt.t.chunkId != -1)
{
printk("yaffs_UnpackTags2 chunkId = %x addr = %x/n", pt.t.chunkId, addr);
int i = 0;
for(; i<28; i++)
{
printk(" %02x " , dev->spareBuffer[i]);
}
printk("/n");
}
}
通过和 2.6.22 的kernel 对比,发现数据偏移了两位, 我就太阳。。
后来找到下面这篇文章:
新版本内核中的MTD驱动考虑到了与yaffs2的接口问题,与yaffs2的整合一般都很顺利。但是老版本就容易出现写进去的文件umount/mount后丢失的问题。基本上应该属于oob中数据布局的问题。MTD中的oob(2k-page)布局:
==========
yaffs2应用到较老版本linux上时的问题 (移植日记)
最新推荐文章于 2017-11-21 15:05:30 发布
在将yaffs2移植到2.6.12旧版Linux内核时遇到读取OOB信息错误,通过分析源码和文档,发现数据偏移问题。解决方案包括在读取OOB时添加2字节偏移,并避免使用`mtd->read_ecc`函数,改为分别调用`mtd->read`和`mtd->read_oob`。最终成功解决读写问题,使2.6.12内核能正常使用yaffs2。
摘要由CSDN通过智能技术生成