免费注册 查看新帖 |

Chinaunix

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

NFTL(nand硬件翻译层)+ FAT 的应用 困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-15 17:42 |只看该作者 |倒序浏览
小弟最近在研究nftl+FAT的应用,希望可以在Nand flash上成功应用FAT32文件系统。
内核:2.6.32.2
开发板:mini2440
nand:K9F2G08U0A
现在的进展:1.mtd下的所有的对nand支持很好,读写擦除都没有问题。支持yaffs2也没有
             问题,
            2.完整的NFTL源代码,我已经研究好几遍了,(等以后贴出经验和大家共享),
             我已经单独编译成模块nftl.ko,成功通过NFS加载到内核当中,出现的设备
             是/dev/nftl_dat0
            3.nand 的分区情况是(在NFS现看到的)
             # cat /proc/mtd
               dev:    size   erasesize  name
               mtd0: 00040000 00020000 "supervivi"
               mtd1: 00020000 00020000 "param"
               mtd2: 00500000 00020000 "Kernel"
               mtd3: 0faa0000 00020000 "root"
               mtd4: 10000000 00020000 "nand"

问题:      1.也是最主要的问题,我不知道往后该怎么办了?我想通过NFTL加载FAT32文件
             系统,具体来说我是希望用第五个分区mtd4来建FAT文件系统,我该如何进行
             下一步呢?是直接在内核当中直接加入FAT的支持就行了吗?我试了好像不行?
            2.我想用mtd4来建fat文件系统,对这个分区该如果格式化呢?是mkdosfs?fdisk?
              我都试过了,都出问题。很郁闷。
            网上对NFTL的相关介绍非常的少,可能我提的问题非常简单,但是我确实已经
              花费了很大的时间在上面了,还是没有解决,希望各位大虾能指点迷津,那么
              支持说说思路,给个点拨,小的都不胜感激...

论坛徽章:
0
2 [报告]
发表于 2010-03-16 10:16 |只看该作者
就没有人能给指点一下吗?哪怕给个思路?
网上说了很多mtd+NFTL+FAT的这样的大概,
可是都没有进一步的解说该如果做,这方面的
东西太少了,这次我解决了之后,我一定把经验
和大家共享。

论坛徽章:
0
3 [报告]
发表于 2010-03-31 10:13 |只看该作者
解决了好些日子了,今天突然想到也许我的经验会对别人有用处,
就自己做个总结性的回答吧。

1>.首先定义NFTL作用的区域,这需要你将nand分成不同的区。我的nand是256MB的
我是这样划分的:
0--------896KB-----1MB-------6MB------56MB------------256MB
  bootloader  param    kernel    root       fat32(NFTL)
根据这样的分区,就需要修改MTD下的分区形式。

修改
243 static struct mtd_partition friendly_arm_default_nand_part[] = {
244         [0] = {
245                 .name   = "supervivi_896K",
246                 .size   = 0x000e0000,
247                 .offset = 0,
248         },
249         [1] = {
250                 .name   = "param_128K",
251                 .offset = 0x000e0000,
252                 .size   = 0x00020000,
253         },
254         [2] = {
255                 .name   = "Kernel_5M",
256                 .offset = MTDPART_OFS_APPEND,
257                 .size   = 0x00500000,
258         },
259         [3] = {
260                 .name   = "root_50M",
261                 .offset = MTDPART_OFS_APPEND,
262                 .size   = 0x03200000, //
263         },
264         [4] = {
265                 .name   = "usr_data_fat32_200M",
266                 .offset = MTDPART_OFS_APPEND,
267                 .size   = MTDPART_SIZ_FULL, //
268         }
269 };

加载nand模块的时候的显示的分区信息
Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x000e0000 : "supervivi_896K"
0x000e0000-0x00100000 : "param_128K"
0x00100000-0x00600000 : "Kernel_5M"
0x00600000-0x03800000 : "root_50M"
0x03800000-0x10000000 : "usr_data_fat32_200M"
在NFS上查看分区的结果:运行结果
# cat /proc/mtd*
dev:    size   erasesize  name
mtd0: 000e0000 00020000 "supervivi_896K"
mtd1: 00020000 00020000 "param_128K"
mtd2: 00500000 00020000 "Kernel_5M"
mtd3: 03200000 00020000 "root_50M"
mtd4: 0c800000 00020000 "usr_data_fat32_200M"
# cat /proc/partitions
major minor  #blocks  name

  31        0        896 mtdblock0
  31        1        128 mtdblock1
  31        2       5120 mtdblock2
  31        3      51200 mtdblock3
  31        4     204800 mtdblock4



在开始的时候 ,我是按照上面的分区来弄的,可是不知道为什么,nftl根本加载不上去,
后在尝试了一下下面这个分区方式,竟然可以了。
245 static struct mtd_partition friendly_arm_default_nand_part[] = {
246         [0] = {
247                 .name   = "supervivi_896K",
248                 .size   = 0x000e0000,
249                 .offset = 0,
250         },
251         [1] = {
252                 .name   = "param_128K",
253                 .offset = 0x000e0000,
254                 .size   = 0x00020000,
255         },
256         [2] = {
257                 .name   = "Kernel_5M",
258                 .offset = MTDPART_OFS_APPEND,
259                 .size   = 0x00500000,
260         },
261         [3] = {
262                 .name   = "root_80M",
263                 .offset = MTDPART_OFS_APPEND,
264                 .size   = 0x05000000, //
265         },
266         [4] = {
267                 .name   = "nand_chip",
268                 .offset = 0x00000000,
269                 .size   = 0x10000000,
270         }
271
272 };

nand模块加载时的信息:
Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x000e0000 : "supervivi_896K"
0x000e0000-0x00100000 : "param_128K"
0x00100000-0x00600000 : "Kernel_5M").
0x00600000-0x05600000 : "root_80M"
0x00000000-0x10000000 : "nand_chip"
在NFS上查看的相关信息如下:
[root@FriendlyARM /]# cat /proc/mtd*
dev:    size   erasesize  name
mtd0: 000e0000 00020000 "supervivi_896K"
mtd1: 00020000 00020000 "param_128K"
mtd2: 00500000 00020000 "Kernel_5M"
mtd3: 05000000 00020000 "root_80M"
mtd4: 10000000 00020000 "nand_chip"
[root@FriendlyARM /]# cat /proc/partitions
major minor  #blocks  name

  31        0        896 mtdblock0
  31        1        128 mtdblock1
  31        2       5120 mtdblock2
  31        3      81920 mtdblock3
  31        4     262144 mtdblock4

为什么会出现上面的结果,我的分析是:其实按照前面一种分区方式分的分区
mtd4:usr_data_fat32_200M,和将要加载的nftl是操作的同一个区间,
难道是会产生冲突?可是他们虽是操作的同一个区域,但是他们却是不同的范畴
不应该相互干扰呀!想不明白为什么,以后再来仔细研究吧,如果另有高见,望
告知:zhangshengheng@126.com

2>.
将NFTL模块加载成功之后,
# cat /proc/partitions
major minor  #blocks  name

  31        0        896 mtdblock0
  31        1        128 mtdblock1
  31        2       5120 mtdblock2
  31        3      51200 mtdblock3
  31        4     262144 mtdblock4
  96        0     261120 nftla0
# ls /dev/n*
/dev/network_latency     /dev/nftla0
/dev/network_throughput  /dev/null
# ls -alh /dev/nftla0
brw-r----- 1 0 0 96, 0 Feb  8 05:39 /dev/nftla0

在/dev/下就会多出一个nftla0的块设备。这个就是我们将来要
操作的对象了。注意其中nftla是mtd_blktrans_ops的名字。
结构体定义如下:
static struct mtd_blktrans_ops nftl_tr = {
        .name                   = "nftla",
        .major                  = 96,
        .part_bits              = 0,
        .blksize                = SECTORSIZE,
        .getgeo                 = nftl_getgeo,
        .readsect               = nftl_readsect,
        .writesect              = nftl_writesect,                     
        .add_mtd                = nftl_add_mtd,
        .remove_dev             = nftl_remove_dev,
        .owner                  = THIS_MODULE,
        .flush                  = nftl_flush,
};

3>.
格式化NFTL管辖的nand flash,也就是格式化nftl块设备/dev/nftla0。
注意虽然我们已经定义了后200MB是NFTL的作用区域,但是我们知道了,程序
是不知道的,我们需要修改NFTL的源码,使得他的作用区域是后200MB。要不然
的话,到时候会把你的bootloader和kernel等信息给你破坏掉。
# mkfs.vfat /dev/nftla0

查看格式化信息:
# fdisk /dev/nftla0
Command (m for help): p

Disk /dev/nftla0: 267 MB, 267386880 bytes
16 heads, 32 sectors/track, 1020 cylinders
Units = cylinders of 512 * 512 = 262144 bytes
Device Boot      Start         End      Blocks  Id Syste

查看磁盘的剩余容量:
# df -h /mnt        
Filesystem                Size      Used Available Use% Mounted on
/dev/nftla0             251.1M    143.4M    107.7M  57% /mnt
# df -h /dev/nftla0
Filesystem                Size      Used Available Use% Mounted on
df: /dev/nftla0: can't find mount point
# mount -t vfat /dev/nftla0  /mnt
FAT: utf8 is not a recommended IO charset for FAT filesystems,
filesystem will be case sensitive!
# df -h /dev/nftla0
Filesystem                Size      Used Available Use% Mounted on
/dev/nftla0             251.1M    111.5K    251.0M   0% /mnt

还有这里,我不知道为什么我明明在NFTL的代码中明确的定义了NFTL的作用区域是后200MB,
可是用fdisk和df工具得出的NFTL可以使用的显示容量却不是200MB,我认为问题处在fdisk,
df这两个工具上,有时间再来看吧。如果有知详情者,望告知zhangshengheng@126.com.
不胜感激。

4>.
到现在位置,在/dev/nftla0已经以FAT32的格式被挂载在了/mnt上,现在就可以进行各种测试了
比如拷贝一些东西进去等等。

论坛徽章:
0
4 [报告]
发表于 2010-04-06 17:56 |只看该作者
用mtdblock也可以,将 flash设备模拟为块设备,然后就可以使用磁盘文件系统的工具了.
mtdblock和NFTL有哪些区别呢?我只知道官网上说是不推荐使用mtdblock的

论坛徽章:
0
5 [报告]
发表于 2011-04-26 11:08 |只看该作者
关注中!这方面的资料太少了。谢谢楼主分享!

论坛徽章:
0
6 [报告]
发表于 2011-04-27 19:55 |只看该作者
MTD相关资料貌似是比较少…… 顶楼主

论坛徽章:
0
7 [报告]
发表于 2011-05-23 10:17 |只看该作者
楼主请教一个问题:就是nand flash的page size和NFTL的逻辑上的page size有什么关系?我现在用的nand 8K的page size,但是如果NFTL的逻辑大小是512的page size, 这个不导致8k只能用到其中的512字节。

论坛徽章:
0
8 [报告]
发表于 2011-05-24 18:05 |只看该作者
FTL层主要是管理逻辑层,硬件page下来,会经过FTL层映射。
FAT的分配时需要在DATA区,保留一部分存储FAT链表,和FAT头信息

论坛徽章:
0
9 [报告]
发表于 2011-05-25 18:11 |只看该作者
你说的是,请问一下是怎么映射的?nand写的单位就page,8K的page的nand,逻辑上写一次512字节,其不是将整个page占用了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP