免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6053 | 回复: 5
打印 上一主题 下一主题

[驱动] Nand Flash的NFTL转化层实现问题!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-12 12:59 |只看该作者 |倒序浏览
最近在研究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???
有前辈了解这一块的请请指点,谢谢!

论坛徽章:
0
2 [报告]
发表于 2011-05-12 13:52 |只看该作者
没有人关注啊!!!!

论坛徽章:
2
水瓶座
日期:2013-09-04 15:09:57白羊座
日期:2014-04-17 16:48:13
3 [报告]
发表于 2011-05-12 14:31 |只看该作者
不知道LZ是否仔细看过内核关于NFTL的说明、这个东西是有专利的、在非DiskOnChip产品上是不能够使用的。

代码里面也有限制、具体是在/drivers/mtd/nftlcore.c的nftl_add_mtd函数中

  1. static void nftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd)
  2. {
  3.         ………………
  4.         /* OK, this is moderately ugly.  But probably safe.  Alternatives? */
  5.         if (memcmp(mtd->name, "DiskOnChip", 10))
  6.                 return;
复制代码
如果你的环境满足条件的话,每一个的mtdblockX设备都会在/dev下面有nftlX设备。对nftlX设备的访问就相当于透过NFTL层访问对应的mtdblock设备。

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

论坛徽章:
0
4 [报告]
发表于 2011-05-13 17:11 |只看该作者
I2y3n2,这个是有专利,专利主要搞大公司,是大公司的垄断!现在很少看到有一个跨国公司和小公司搞专利官司的

论坛徽章:
0
5 [报告]
发表于 2012-05-16 00:03 |只看该作者
我也正在研究这一块,请问楼主有没有遇到这个问题:
could not find valid boot record.
NFTL: could not mount device
需要修改什么地方啊?

论坛徽章:
0
6 [报告]
发表于 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结构体信息, 下面是我的参考代码:

  1. //put it in function: find_boot_record()
  2.         //add for ICUBE NAND Controller
  3.         ret = mtd->read(mtd, 0, SECTORSIZE, &retlen, buf);
  4.         if(memcmp(buf, "ANAND", 6)){
  5. #if 0
  6.                 struct erase_info instr;
  7.                 memset(&instr, 0, sizeof(struct erase_info));
  8.                 instr.mtd = mtd;
  9.                 instr.addr = 0;
  10.                 instr.len = mtd->erasesize*2;
  11.                 printk("erase\n");
  12.                 mtd->erase(mtd, &instr);
  13.                 printk("erase end \n");
  14. #endif
  15.                 printk("Setup NFTLMediaHeader\n");
  16.                 memcpy(mh->DataOrgID, "ANAND", 6);
  17.                 mh->FirstPhysicalEUN = 6;
  18.                 mh->NumEraseUnits = 1980;
  19.                 mh->FormattedSize = nftl->EraseSize * 1980;
  20.                 mh->UnitSizeFactor = 0;
  21.                 printk("write block\n");
  22.                 memcpy(buf, mh, sizeof(struct NFTLMediaHeader));
  23.                 mtd->write(mtd, 0, SECTORSIZE, &retlen, buf);
  24.                 h1.EraseMark = 0x3c00;
  25.                 h1.EraseMark1 = 0x69;
  26.                 printk("write oob\n");
  27.                 nftl_write_oob(mtd, SECTORSIZE+8, 8, &retlen, (uint8_t *)(&h1));
  28.         }

复制代码
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一样。如果这二者不一样的话,就要改不少的源代码了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP