- 论坛徽章:
- 0
|
本帖最后由 zglore 于 2012-10-23 10:24 编辑
在非M-Systems DiskOnChip devices NAND controller时,要使用NFTL时要注意三点:
1, NAND MTD分区时,一定要有个名为DiskOnChip分区,也可以在driver/mtd/nftlcore.c中注释掉只使用DiskOnChip分区作NFTL。(#13)
2, 再者就是在识别了NFTL分区后,把MTD分区挂载成NTFL分区时要读取MediaHeader, 一般的NAND 预先是没有的,所以要自动挂载成功,就要往里面写必要的MediaHeader结构体信息, 下面是我的参考代码:
- //put it in function: find_boot_record()
- //add for ICUBE NAND Controller
- ret = mtd->read(mtd, 0, SECTORSIZE, &retlen, buf);
- if(memcmp(buf, "ANAND", 6)){
- #if 0
- struct erase_info instr;
- memset(&instr, 0, sizeof(struct erase_info));
- instr.mtd = mtd;
- instr.addr = 0;
- instr.len = mtd->erasesize*2;
- printk("erase\n");
- mtd->erase(mtd, &instr);
- printk("erase end \n");
- #endif
- printk("Setup NFTLMediaHeader\n");
- memcpy(mh->DataOrgID, "ANAND", 6);
- mh->FirstPhysicalEUN = 6;
- mh->NumEraseUnits = 1980;
- mh->FormattedSize = nftl->EraseSize * 1980;
- mh->UnitSizeFactor = 0;
- printk("write block\n");
- memcpy(buf, mh, sizeof(struct NFTLMediaHeader));
- mtd->write(mtd, 0, SECTORSIZE, &retlen, buf);
- h1.EraseMark = 0x3c00;
- h1.EraseMark1 = 0x69;
- printk("write oob\n");
- nftl_write_oob(mtd, SECTORSIZE+8, 8, &retlen, (uint8_t *)(&h1));
- }
复制代码 3, 挂载成功后,发现dev下有NFTL设备了,但是不能分区及读写, 其实是因为NFTL源码太老了而且兼容性做得不好, 原因有三:
1), 只支持NAND pagesize 为512大小的, 且假定pagesize 与SECTORSIZE大小一样。
2), nftlcore.c 是SECTORSIZE固定为512, 而且没有用宏。
3), nftlcore.c 中的nftl_write()函数中有一个BUG, ops.ooboffs = offs ->ops.ooboffs = offs & (mtd->writesize - 1); 在最新版本 Linux里已经fix了.
我最终的解决方法是, 把SECTORSIZE 定义为2k, 同我用的NAND的Pagesize一样。如果这二者不一样的话,就要改不少的源代码了。 |
|