mychz2011 发表于 2011-05-12 12:59

Nand Flash的NFTL转化层实现问题!!!!!

最近在研究NFTL技术,想用nand flash分区制成VFAT格式被XP系统访问,现在nftl.ko已经编好,且已经加载产生了nftla设备,但是提示nftla: unknown partition table. 所以我就有如下疑问:
1. nftla需要什么分区表支持呢? 我现在用的分区表:dos和LDM, 我试过用命令fdisk /dev/nftla可以在内存中分区成功,但是在写分区表的时候就失败了,提示还是nftla: unknown partition table,无法写入。
2. 我的用的分区只有50M,但是在用fdisk /dev/nftla的时候确实1.8G,感觉很茫然!难道是fdisk命令的BUG???
有前辈了解这一块的请请指点,谢谢!

mychz2011 发表于 2011-05-12 13:52

没有人关注啊!!!!

l2y3n2 发表于 2011-05-12 14:31

不知道LZ是否仔细看过内核关于NFTL的说明、这个东西是有专利的、在非DiskOnChip产品上是不能够使用的。

代码里面也有限制、具体是在/drivers/mtd/nftlcore.c的nftl_add_mtd函数中
static void nftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
{
        ………………
        /* OK, this is moderately ugly.But probably safe.Alternatives? */
        if (memcmp(mtd->name, "DiskOnChip", 10))
                return;
如果你的环境满足条件的话,每一个的mtdblockX设备都会在/dev下面有nftlX设备。对nftlX设备的访问就相当于透过NFTL层访问对应的mtdblock设备。

如果想要在非DiskOnChip上使用可以暂时屏蔽这段代码。不过我对NFTL也不了解、不清楚其他地方是不是还有别的限制。

mychz2011 发表于 2011-05-13 17:11

I2y3n2,这个是有专利,专利主要搞大公司,是大公司的垄断!现在很少看到有一个跨国公司和小公司搞专利官司的

bxd654871096 发表于 2012-05-16 00:03

我也正在研究这一块,请问楼主有没有遇到这个问题:
could not find valid boot record.
NFTL: could not mount device
需要修改什么地方啊?

zglore 发表于 2012-10-23 10:23

本帖最后由 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一样。如果这二者不一样的话,就要改不少的源代码了。
页: [1]
查看完整版本: Nand Flash的NFTL转化层实现问题!!!!!