如何配置uClinux2.6内核使其支持jffs2格式的文件系统

如何配置uClinux2.6内核使其支持jffs2格式的文件系统,第1张

目前flash的文件系统比较多,用的比较多的就是JFFS2文件系统。基于NOR flash上的JFFS2文件系统可以说算是比较成熟了,支持NAND flash的JFFS2也已经发布了。源代码可以到http://www.linux-mtd.infradead.org上面下载。但是在我的测试过程中,在nand flash上挂接的JFFS2文件系统很不稳定,经常有CRC错误产生。特别是进行写 *** 作的时候,每次复位都会产生CRC错误,可以说支持NAND flash的JFFS2文件系统目前还不成熟。而YAFFS文件系统则是专门针对NAND flash的,源代码可以到

http://www.aleph1.co.uk/yaffs/index.html上下载。在测试过程中稳定性能比JFFS2文件系统要稳定的多,而且mount分区的时间也比JFFS2文件系统少的多。用JFFS2 mount一个2m的文件系统大约需要1s。下面分别介绍在uclinux下面使用JFFS2和YAFFS文件系统。

1、JFFS2

到http://www.linux-mtd.infradead.org上面下载最新的MTD和JFFS2压缩包。压缩包里面还有有关的内核补丁和一些MTD的相关工具。主要的补丁就是ilookup- 2.4.23.patch,因为最新的MTD驱动中要用到一个ilookup()函数。打完补丁、更新了MTD驱动和JFFS2文件系统之后就开始写自己 nand flash驱动了。如果不想把JFFS2作为根文件系统的话,还需要修改MTD_BLOCK_MAJOR。驱动可以参考里面的例子,最简单的就是参考 spia.c。

写驱动主要工作是定义flash分区结构、定义flash读写地址、写控制flash的**_hwcontrol()函数。具体的 *** 作要看所用的nand flash的芯片资料。相对NOR flash来说驱动要简单多了。:)

改完之后再配置

Memory Technology Devices(MTD)下

CONFIG_MTD=Y

CONFIG_MTD_DEBUG=Y

CONFIG_MTD_DEBUG_VERBOSE=3

CONFIG_MTD_PARTITIONS=Y

CONFIG_MTD_CHAR=Y

CONFIG_MTD_BLOCK=Y

NAND Flash Device Drivers下

CONFIG_MTD_NAND=Y

定义自己的驱动文件

File systems下

CONFIG_JFFS2_FS=Y

CONFIG_JFFS2_FS_DEBUG=2

CONFIG_JFFS2_FS_NAND=y /*这个是新加的*/

在uClinux v1.3.4 Configuration下

Flash Tools下

CONFIG_USER_MTDUTILS=Y

CONFIG_USER_MTDUTILS_ERASE=Y

CONFIG_USER_MTDUTILS_ERASEALL=Y

CONFIG_USER_MTDUTILS_MKFSJFFS2=Y

最后就是辛苦了调试工作了。:(MTD驱动调试完之后,就可以在上面挂接JFFS2文件系统了。参看flash分区情况:cat /proc/mtd,擦除分区:eraseall /dev/mtd*.例如把第一个分区mount到/mnt目录下面:

先:eraseall /dev/mtd0

然后:mount -t jffs2 /dev/mtdblock0 /mnt

2、YAFFS

YAFFS意义为'yet another flash file system',也是一个开源的文件系统。YAFFS是目前为止唯一一个专门为NAND flash设计的文件系统,具有很好的可移植性,能够在linux,uclinux,和wince

下面运行。

在http://www.aleph1.co.uk/yaffs/index.html上下载源代码。压缩包里面也包含YAFFS的说明文档。YAFFS文件系统的源文件就devextras.h,yaffs_ecc.c, yaffs_ecc.h,yaffs_guts.c,yaffs_guts.h,yaffs_mtdif.h,yaffs_mtdif.c和 yportenv.h

另外需要配置的宏:CONFIG_YAFFS_FS 和CONFIG_YAFFS_MTD_ENABLED,就是配置在mtd上面挂接YAFFS,其它还有一些辅助配置需要时也可以配置。

在fs目录下面建一个yaffs目录,把以上说的文件考里面去,新建一个makefile:

O_TARGET := yaffs.o

obj-y := yaffs_fs.o yaffs_guts.o yaffs_mtdif.o yaffs_ecc.o

obj-m := $(O_TARGET)

include $(TOPDIR)/Rules.make

接下来就是改fs目录下面config.in和makefile,在配置YAFFS的时候,把YAFFS连接进去。

如果像前面一样已经把NAND MTD驱动调好了,加YAFFS就很简单了。因为YAFFS是自己做ECC校验的,所以要把MTD驱动里面的ECC去掉。在驱动里面改成this->eccmode = NAND_ECC_NONE就可以了。

另外YAFFS是用mkyaffs来擦除flash,所以在mtd-utils中加上mkyaffs.c,一起编译进去。

最后就是编译了,呵呵。中间会有一些警告没有关系的,就是写没有用的变量和函数,不过话说回来YAFFS的代码写的确实不太规范。当然它的性能确实没话说。有兴趣的可以试一下。

嵌入应用:如何制作和使用Jffs2文件系统 (zhuan)本文主要介绍如何在AT91SAM9261EK板子上制作和使用jffs2文件系统,使用的是linux-2.6.21内核。

首先配置MTD

$ make menuconfig

进入 Memory Technology Devices (MTD) --->

<*>Memory Technology Device (MTD) support

[*] Debugging

[*] MTD partitioning support

[*] Command line partition table parsing

[*] Direct char device access to MTD devices

[*] Caching block device access to MTD devices

RAM/ROM/Flash chip drivers ----->

<*>Detect non-CFI AMD/JEDEC-compatible flash chips

<*>Support for AMD/Fujitsu flash chips

Mapping drivers for chip access --->

[*] Support non-linear mappings of flash chips

Self-contained MTD device drivers --->

[*] Support for AT45... DataFlash

NAND Flash Device Drivers ---->

[*] NAND Device Support

[*] Support for NAND Flash /SmartMedia on AT91

File systems ---->

<*>Second extended fs support

[*] Inotify file change notification support

[*] Inotify support for user space

<*>Filesystem in Userspace support

Miscellaneous filesystems

<*>Journalling Flash File System v2 (JFFS2) support

[*] JFFS2 write-buffering support

<*>Compressed ROM file system support (cramfs)

以上配置中没有列出的,都没选;其配置仅做参考,可根据自己的需要自行配置。

$ make all

其次制作mtd-util工具

从网上下载zlib-1.2.3.tar.gz 解压缩 $ cd zlib-1.2.3

$ ./configure –prefix=/usr/local/arm/3.4.1/arm-linux --shared

修改Makefile如下:

CC=arm-linux-gcc

LDSHARED=arm-linux-ld -shared

$ make all

$ make install

注意:这里是安装在/usr/local/arm/3.4.1/arm-linux目录下

由于交叉编译mtd工具时需要zlib.h文件,所以在编译之前先安装zlib库文件。

从网上下载 mtd-snapshot-20050519.tar.bz2 解压缩 $ cd mtd/util

修改该目录下的Makefile:

CROSS=arm-linux-

$ make all

然后将该目录下生成的 flash_erase,flash_eraseall, mkfs.jffs2工具放在ramdisk 文件系统中(我这里放在/bin目录下),另外在 ramdisk文件系统的dev目录下要保证有mtd0~mtd9,mtdblock0~mtdblock9这些设备,如果没有可参考 ramdisk文件系统的制作,也可从pc机相同目录下拷贝,要加上文件属性。

另外,需要将/arm-linux/lib目录下的libz.so, libz.so.1, libz.so.1.2.3文件拷贝到ramdisk文件系统的/lib目录下,否则mkfs.jffs2工具不能使用。

最后将新生成的uImage和ramdisk文件下载到板子上,起动系统,使用命令 cat /proc/mtd 可以看到

dev: size erasesize name

mtd0: 00040000 00020000 "Partition 1"

mtd1: 0ffc0000 00020000 "Partition 2"

mtd2: 00420000 00000210 "spi0.0-AT45DB321x"

这里mtd0,mtd1是nandflash上的分区; mtd2是dataflsh上的分区,该分区上放有u-boot,uImage.img,ramdisk.img,所以我们这里可以使用空的nandflash上的两个分区。使用之前要先用工具flash_erase或者flash_eraseall擦除nandflash,具体使用的步骤如下:

# flash_erase /dev/mtd1

制作jffs2映像

# cd /var/tmp

# mkdir jffs2 (jffs2下的目录可以任意建)

# mkfs.jffs2 –d jffs2/ -o jffs2.img

# cp /var/tmp/jffs2/jffs2.img /dev/mtdblock1

最后# mount -t jffs2 /dev/mtdblock1 /mnt/mtd即可,使用结束可使用$ umount /mnt/mtd 卸载.

如果只是当作普通的jffs2 来使用dataflash或者nandflash,可不必制作 jffs2映像,只需要最后一步,# mount -t jffs2 /dev/mtdblock1 /mnt/mtd即可。

AT91sam9263EK使用JFFS2根文件系统

在AT91sam9263EK成功配置了NFS根文件系统后,后来又想把JFFS2也移植到AT91sam9263EK上吧,说干就干。

1. 呵呵,其实很简单我使用的linux-2.6.20内核里已经有jffs2 文件系统支持,选上jffs2即可

File systems --->

Miscellaneous filesystems --->

<*>Journalling Flash File System v2 (JFFS2) support

(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)

[*] JFFS2 write-buffering support

[*] JFFS2 summary support (EXPERIMENTAL)

[*] JFFS2 XATTR support (EXPERIMENTAL)

[*] JFFS2 POSIX Access Control Lists

[*] JFFS2 Security Labels

[*] Advanced compression options for JFFS2

[*] JFFS2 ZLIB compression support

[*] JFFS2 RTIME compression support

[ ] JFFS2 RUBIN compression support

JFFS2 default compression mode (priority)

选上MTD支持

Device Drivers --->

Memory Technology Devices (MTD) --->

<*>Memory Technology Device (MTD) support

[ ] Debugging

<*>MTD concatenating support

[*] MTD partitioning support

<>RedBoot partition table parsing

[*] Command line partition table parsing

<*>ARM Firmware Suite partition parsing

--- User Modules And Translation Layers

<*>Direct char device access to MTD devices

<*>Caching block device access to MTD devices

<*>FTL (Flash Translation Layer) support

<*>NFTL (NAND Flash Translation Layer) support

[ ] Write support for NFTL

2. 从ttp://www.linux-mtd.infradead.org/上下载

mtd-utils-1.0.0.tar.gz 到宿主机。

解压

tar xvzf mtd-utils-1.0.0.tar.gz

进入mtd-utils-1.0.0目录修改Makefile进行编译。

编译出mkfs.jffs2,nandwrite等工具

3. 创建jffs2根文件系统:

首先要有一个其他类型的根文件系统,制作和获取方式可以参见<<AT91sam9263EK使用NFS根文件系统>>

比如可以:

mount -t cramfs rootfs_lnxdemo.cramfs tmp/ -o loop

rootfs_lnxdemo.cramfs由atmel提供当然你可以自己制作,这里直接使用atmel的省去了制作的麻烦。

tar czvf target.tar.gz tmp/

生成jffs2根文件系统镜像:

mkfs.jffs2 –l –s 0x400 –e 0x20000 –d tmp/ -o target.jffs2

4. 烧写jffs2根文件系统镜像到nand flash。

烧写方法应该有多种常用的有2种(呵呵自己认为的):

a.通过nand编程器烧写镜像文件到nand flash芯片然后再焊接到pcb.

b.挂载nfs文件系统,使用nandwrite工具写镜像文件

到mtd设备。

第一种适合生产时使用,而我们测试时候比较适合使用第二种方式。

挂载nfs文件系统:

nandwrite –o /dev/mtd1 target.jffs2

或者是在nfs 根文件系统下:

mount –t jffs2 /dev/mtdblock1 /mnt

cd /mnt

tar xvzf ../target.tar.gz

umount /mnt

5. 配置内核启动参数如下:

setenv bootargs mem=64M console=ttyS0 115200 root=/dev/mtdblock1 rootfstype=jffs2 rw

6. 重新启动,呵呵内核使用jffs2文件系统自动挂载根文件系统到mtdblock1设备上。

ls 测试一下

vi test

hello this is for test jffs2 filesystem.

保存退出。

Sync

重新启动

vi test

内容依旧。

Ok jffs2根文件系统引导成功。

Linux联盟收集整理 ,转贴请标明原始链接

进入shell。

拓展.重启完成后,进入192.168.100.1,检查光猫是否已经变成了HG8321R,变成了即为成功项目应用中,对于前人留下的JFFS2的文件,有时候我们需要修改,但是苦于没有源文件,实际 *** 作很多时候无所适从。每次支持生产之后再进行人为的升级。这样费时费力,也给生产人员增加了负担。为了解决这个问题,参考了一些资料,总算解决了这个问题基本的原理就是linux支持mount JFFS2到本地目录这是一个完整的文件目录。

我们可以修改mount后的文件目录,修改完成之后,重新使用mkfs.jffs2工具打包即可。

拓展“光纤入户”和“光纤宽带”的10M电信宽带,往往都会送一个光纤无线路由器(俗称光纤猫,或者光猫),该设备集成了modem和无线路由器的功能,可以同时完成调制解调器、路由器交换和wifi的功能,省得需要多个设备仪器工作了,这样确实方便了宽带用户。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8646520.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-19
下一篇2023-04-19

发表评论

登录后才能评论

评论列表(0条)

    保存