转自: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上,现在就可以进行各种测试了
比如拷贝一些东西进去等等。