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

发布于 2022-10-15 07:12:03 字数 350 浏览 19 评论 0

最近在研究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???
有前辈了解这一块的请请指点,谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

街角迷惘 2022-10-22 07:12:03

没有人关注啊!!!!

洛阳烟雨空心柳 2022-10-22 07:12:03

不知道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也不了解、不清楚其他地方是不是还有别的限制。

花桑 2022-10-22 07:12:03

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

南街九尾狐 2022-10-22 07:12:03

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

静赏你的温柔 2022-10-22 07:12:03

本帖最后由 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一样。如果这二者不一样的话,就要改不少的源代码了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文