NFTL(nand硬件翻译层)+ FAT 的应用

转自:http://bbs.csdn.net/topics/330159014

 

zhangshengheng 发帖:

小弟最近在研究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的相关介绍非常的少,可能我提的问题非常简单,但是我确实已经
              花费了很大的时间在上面了,还是没有解决,希望各位大虾能指点迷津,那么
              支持说说思路,给个点拨,小的都不胜感激...

 

--------------------------zhangshengheng 解决问题后分享---------------------------------------------------------------------------------------

 

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是操作的同一个区间,
难道是会产生冲突?可是他们虽是操作的同一个区域,但是他们却是不同的范畴
不应该相互干扰呀!想不明白为什么,以后再来仔细研究吧,如果另有高见,望
告知:[email protected]

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这两个工具上,有时间再来看吧。如果有知详情者,望告知[email protected].
不胜感激。

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

你可能感兴趣的:(Linux)