Nand flash驱动移植及带硬件Ecc的Jffs2文件系统制作
uclinux下Nand+Flash的JFFS2文件系统的移植
uclinux下Nand Flash的JFFS2文件系统的移植uclinux下Nand Flash的JFFS2文件系统的移植(写在前面)现在(2005-12-5),linux对mtd设备支持的好得多,远没有我当时(大概2.5年前吧)做得那么复杂了,这里仍然要发原文,是因为想给初学者提供一个参考思路,介绍一下我对linux的学习了解的整个过程,希望对大家有借鉴意义。
但是,建议还是使用最新的mtd补丁,新版本的mtd包括了对2k page 的nand flash的支持,要使用大于128MB的Nand flash,就用这个吧。
文件系统方面,建议在Nor flash上,使用jffs2(jffs3也有,但是,我没用过,没有发言权)。
在Nand flash上强烈建议使用yaffs,这比jffs2快很多,而且支持direct模式,在其他系统,比如:uCOS-II、winCE等都可以使用。
我已经做到了在uCOS-II下和Linux下通过yaffs文件系统实现共享。
但是,要想使用2k page的nand flash,只有使用yaffs2了。
现在,yaffs2开源的代码有点问题,不能直接和mtd设备配合使用,稍作修改可以实现,有兴趣,我可以专门再写一片yaffs2的移植心得。
uclinux下Nand Flash的JFFS2文件系统的移植(1)继续上一篇《uClinux下移植Ne2000兼容的网卡驱动程序》中介绍的平台和操作系统,开始写JFF2的感想。
虽然JFFS2的移植弄出来有一段时间了,但是,前一段时间忙着期末考试,无心写心得。
昨天总算考完了,我就继续罗嗦那段时期的经历吧,希望把我遇到的问题和解决的方法和大家共享。
错误之处也请不吝指出。
我使用的uClinux的硬件平台还是44B0那个板子具体的情况参见《uClinux下移植Ne2000兼容的网卡驱动程序》中的介绍。
Flash我用的是三星公司的K9F2808——16MByte的Nand Flash。
第一次挂载jffs2文件系统,出现:Node header CRC failed at
第一次挂载jffs2文件系统,出现:Node header CRC failed at使用的bootloader:redbootkernel版本:2.6.29flash类型:NOR FLASH.制作jffs2的命令:mkfs.jffs2 -U -d /mnt/winF/tet/romfs -D devtable.jffs2.txt -l -e 0x10000 -p -n -o /tftpboot/jffs2fs.img"-e":表示flash的擦除块大小为0x10000,这个值很重要,可以从datasheet中得到。
"-p":Pad output to SIZE bytes with 0xFF. If SIZE is not specified, the output is padded to the end of the final erase block.烧写命令:load -r -v -h 172.21.73.101 -b 0x8000 kernel.lzofis create -b 0x8000 -l 0x200000 -s 0x200000 -f 0x7F060000 -e 0x8000 kernel.lzoload -r -v -h 172.21.73.101 -b 0x100000 jffs2fs.imgfis write -b 0x100000 -f 0x7F260000 -l 0x250000fis create -f 0x7F260000 -l 0x590000 jffs2.imgreset问题描述:第一次启动,会出现CRC错误信息,如下:Shell invoked to run file: /etc/rcWelcome to____ _ _/ __| ||_|_ _| | | | _ ____ _ _ _ _| | | | | | || | _ \| | | |\ \/ /| |_| | |__| || | | | | |_| |/ \| ___\____|_||_|_| |_|\____|\_/\_/| ||_| ADVANTECH eAutomationFor further information check://eAutomation/Execution Finished, ExitingSash command shell (version 1.1.1)/> JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06ddc8.{ff5c,ff5c,ff5cff5c,6cedd300}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06c8c4. {ff5c,ff5c,ff5cff5c,ff5cff5c}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06b3c0. {ff5c,ff5c,ff5cff5c,ff5cff5c}JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x0006d394: read 0xc96c7e1f, calculated 0xc6974f8f.JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x0006be3c: read 0xfaffca56, calculated 0x4e72e8e5.JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x071460. {ff1c,ff1c,ff1cff1c,ff1cff1c}JFFS2 notice: (164) read_dnode: node CRC failed on dnode at 0x0709ac: read 0x8db9f359, calculated 0x22676b8JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06fea4. {ff1c,ff1c,ff1cff1c,ff1cff1c}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06f3b4. {1985,e002,0000df5e,a5032844}JFFS2 notice: (164) read_dnode: node CRC failed on dnode at 0x06e91c: read 0x603ebf95, calculated 0x28f62bdbJFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x00071d6c: read 0xe3e40d9c, calculated 0x3b79fefa.JFFS2 warning: (164) jffs2_do_read_inode_internal: Truncating ino #29 to 23732 bytes failed because it only had 12288 bytes to start with!JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x0007c694: read 0xe9808a11, calculated 0x98c8ae6e.JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x00076ba0: read 0x8207a914, calculated 0xa68949a.0x090240. {ff5c,ff5c,ff5cff5c,ff5cff5c}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x08dc84. {ff1c,ff1c,ff1cff1c,ff1cff1c}Node totlen on flash (0xdf1edf1e) != totlen from node ref (0x000009d8)JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x08d1e8. {1985,e002,ff5cff5c,415e1f8f}JFFS2 notice: (164) read_dnode: node CRC failed on dnode at 0x08c7b4: read 0x62c24375, calculated 0x4b07ea0JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x08b19c./>重启,则不会有如上CRC错误信息。
Nand flash驱动移植及带硬件Ecc的Jffs2文件系统制作
Nand flash驱动移植及带硬件Ecc的Jffs2文件系统制作cd /new_disk/weiyan/linux-2.6.25vi arch/arm/mach-s3c2440/mach-smdk2440.c修改板级配置文件,为统一驱动的配置,设备的配置信息一般在此文件中添加。
1)添加头文件#include <linux/mtd/nand.h>#include <linux/mtd/nand_ecc.h>#include <linux/mtd/partitions.h>#include <asm/plat-s3c/nand.h>#include <asm/plat-s3c24xx/pm.h>2)添加nand划分信息static struct mtd_partition wy_nand_part[] = {[0] = { //u-boot及内存存放的分区.name = "BOOT",.size = SZ_2M,.offset = 0,},[1] = { //文件系统存放的分区.name = "ROOTFS",.offset = SZ_2M,.size = SZ_32M,},[2] = { //剩余空间.name = "BACKUP",.offset = SZ_32M + SZ_2M,.size = SZ_32M - SZ_2M,},};static struct s3c2410_nand_set wy_nand_sets[] = {[0] = {.name = "NAND",.nr_chips = 1,.nr_partitions = ARRAY_SIZE(wy_nand_part),.partitions = wy_nand_part,},};3)添加nand flash的读写匹配时间,各时间定义如图static struct s3c2410_platform_nand wy_nand_info = {.tacls = 10,.twrph0 = 25,.twrph1 = 10,.nr_sets = ARRAY_SIZE(wy_nand_sets),.sets = wy_nand_sets,};4)添加nand设备到初始化表static struct platform_device *smdk2440_devices[] __initdata = { ……(此处省略其他设备,添加时请注意。
第一次挂载jffs2文件系统,出现:Node header CRC failed at
第一次挂载jffs2文件系统,出现:Node header CRC failed at使用的bootloader:redbootkernel版本:2.6.29flash类型:NOR FLASH.制作jffs2的命令:mkfs.jffs2 -U -d /mnt/winF/tet/romfs -D devtable.jffs2.txt -l -e 0x10000 -p -n -o /tftpboot/jffs2fs.img"-e":表示flash的擦除块大小为0x10000,这个值很重要,可以从datasheet中得到。
"-p":Pad output to SIZE bytes with 0xFF. If SIZE is not specified, the output is padded to the end of the final erase block.烧写命令:load -r -v -h 172.21.73.101 -b 0x8000 kernel.lzofis create -b 0x8000 -l 0x200000 -s 0x200000 -f 0x7F060000 -e 0x8000 kernel.lzoload -r -v -h 172.21.73.101 -b 0x100000 jffs2fs.imgfis write -b 0x100000 -f 0x7F260000 -l 0x250000fis create -f 0x7F260000 -l 0x590000 jffs2.imgreset问题描述:第一次启动,会出现CRC错误信息,如下:Shell invoked to run file: /etc/rcWelcome to____ _ _/ __| ||_|_ _| | | | _ ____ _ _ _ _| | | | | | || | _ \| | | |\ \/ /| |_| | |__| || | | | | |_| |/ \| ___\____|_||_|_| |_|\____|\_/\_/| ||_| ADVANTECH eAutomationFor further information check://eAutomation/Execution Finished, ExitingSash command shell (version 1.1.1)/> JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06ddc8.{ff5c,ff5c,ff5cff5c,6cedd300}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06c8c4. {ff5c,ff5c,ff5cff5c,ff5cff5c}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06b3c0. {ff5c,ff5c,ff5cff5c,ff5cff5c}JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x0006d394: read 0xc96c7e1f, calculated 0xc6974f8f.JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x0006be3c: read 0xfaffca56, calculated 0x4e72e8e5.JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x071460. {ff1c,ff1c,ff1cff1c,ff1cff1c}JFFS2 notice: (164) read_dnode: node CRC failed on dnode at 0x0709ac: read 0x8db9f359, calculated 0x22676b8JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06fea4. {ff1c,ff1c,ff1cff1c,ff1cff1c}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x06f3b4. {1985,e002,0000df5e,a5032844}JFFS2 notice: (164) read_dnode: node CRC failed on dnode at 0x06e91c: read 0x603ebf95, calculated 0x28f62bdbJFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x00071d6c: read 0xe3e40d9c, calculated 0x3b79fefa.JFFS2 warning: (164) jffs2_do_read_inode_internal: Truncating ino #29 to 23732 bytes failed because it only had 12288 bytes to start with!JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x0007c694: read 0xe9808a11, calculated 0x98c8ae6e.JFFS2 notice: (164) check_node_data: wrong data CRC in data node at 0x00076ba0: read 0x8207a914, calculated 0xa68949a.0x090240. {ff5c,ff5c,ff5cff5c,ff5cff5c}JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x08dc84. {ff1c,ff1c,ff1cff1c,ff1cff1c}Node totlen on flash (0xdf1edf1e) != totlen from node ref (0x000009d8)JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x08d1e8. {1985,e002,ff5cff5c,415e1f8f}JFFS2 notice: (164) read_dnode: node CRC failed on dnode at 0x08c7b4: read 0x62c24375, calculated 0x4b07ea0JFFS2 notice: (164) jffs2_get_inode_nodes: Node header CRC failed at 0x08b19c./>重启,则不会有如上CRC错误信息。
在NAND FLASH上建立YAFFS2文件系统
在NAND FLASH上建立YAFFS2文件系统经过了半个多月的努力,终于搞定nandflash的mtd驱动和上层的yaffs2文件系统。
这半个多月来几乎每天都要和挫败感斗争,每天都要忍受这个方面,那个方面的bug。
想想自己这半个多月来,也算看不少资料,得到不少人的帮助,总算是有点心得。
鉴于国内搞yaffs2文件系统方面的资料还是很少,就把自己的心得拿出来与大家共享。
不说闲话了,先介绍一些背景资料一. 闪存我们常说的闪存其实只是一个笼统的称呼,准确地说它是非易失随机访问存储器(NVRAM)的俗称,特点是断电后数据不消失,因此可以作为外部存储器使用。
而所谓的内存是挥发性存储器,分为DRAM和SRAM两大类,其中常说的内存主要指DRAM,也就是我们熟悉的DDR、DDR2、SDR、EDO等等。
闪存也有不同类型,其中主要分为NOR型和NAND型两大类。
闪存的分类NOR型与NAND型闪存的区别很大,打个比方说,NOR型闪存更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而NAND型更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线传送一般,而且NAND型与NOR型闪存相比,成本要低一些,而容量大得多。
因此,NOR型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行,手机就是使用NOR型闪存的大户,所以手机的“内存”容量通常不大;NAND型闪存主要用来存储资料,我们常用的闪存产品,如闪存盘、数码存储卡都是用NAND型闪存。
这里我们还需要端正一个概念,那就是闪存的速度其实很有限,它本身操作速度、频率就比内存低得多,而且NAND型闪存类似硬盘的操作方式效率也比内存的直接访问方式慢得多。
因此,不要以为闪存盘的性能瓶颈是在接口,甚至想当然地认为闪存盘采用USB2.0接口之后会获得巨大的性能提升。
前面提到NAND型闪存的操作方式效率低,这和它的架构设计和接口设计有关,它操作起来确实挺像硬盘(其实NAND型闪存在设计之初确实考虑了与硬盘的兼容性),它的性能特点也很像硬盘:小数据块操作速度很慢,而大数据块速度就很快,这种差异远比其他存储介质大的多。
Linux环境下flash文件系统JFFS2移植指南
Linux环境下flash文件系统JFFS2移植指南Linux环境下flash文件系统JFFS2移植指南目录1 文件系统 (3)2 Flash存储器 (3)3 Flash文件系统 (4)3.1 flash文件系统基本结构 (4)3.2 日志文件系统 (4)3.3 MTD驱动程序 (5)3.4 JFFS2文件系统 (5)4 JFFS2移植 (5)4.1 MTD配置 (5)4.2 FLASH分区 (7)4.3 jffs2镜像制作 (8)4.4 jffs2镜像烧写 (9)4.4.1 烧录方法1 (9)4.4.2 烧录方法2 (9)4.5 使用jffs2作为根文件系统rootfs (9)1 文件系统文件系统是一个操作系统中最重要的部分之一,它为操作系统提供了一种结构化存储和管理数据的方式。
文件系统的主要功能是对数据的物理存储进行管理,并向用户提供对数据的访问接口。
用户程序建立在文件系统上,通过文件系统访问数据,而不需要直接对物理存储设备进行操作。
最初的操作系统一般都只支持单一的一种文件系统,并且文件系统和操作系统内核紧密关联在一起,而Linux操作系统的文件系统结构是树状的,在根目录“/’下有许多子目录,每个目录都可以采用各自不同的文件系统类型。
Linux中的文件不仅指的是普通的文件和目录,而且将设备也当作一种特殊的文件,因此,每种不同的设备,从逻辑上都可以看成是一种不同的文件系统。
在Linux操作系统中,为了支持多种不同的文件系统,采用了虚拟文件系统(VFS,Visual Filesystem Switch)技术,虚拟文件系统是对多种实际文件系统的共有功能的抽象,它屏蔽了各种不同文件系统在实现细节上的差异,为用户程序提供了统一的、抽象的、标准的接口对文件系统进行访问,如open(),read(),write()等。
这样,用户程序就不需要关心所操作的具体文件是属于哪种文件系统,以及这种文件系统是如何设计与实现的,对所有文件的访问方式都是完全相同的。
如何制作和使用Jffs2文件系统
Self-contained MTD device drivers --->
[*] Support for AT45... DataFlash
<*> FTL (Flash Translation Layer) support
<*> NFTL (NAND Flash Translation Layer) support
[ ] Write support for NFTL
2. 从ttp:///上下载
tar czvf target.tar.gz tmp/
生成jffs2根文件系统镜像:
mkfs.jffs2 –l –s 0x400 –e 0x20000 –d tmp/ -o target.jffs2
4. 烧写jffs2根文件系统镜像到nand flash。
烧写方法应该有多种常用的有2种(呵呵自己认为的):
NAND Flash Device Drivers ---->
[*] NAND Device Support
[*] Support for NAND Flash /SmartMedia on AT91
File systems ---->
dev: size erasesize name
mtd0: 00040000 00020000 "Partition 1"
mtd1: 0ffc0000 00020000 "Partition 2"
mtd2: 00420000 00000210 "spi0.0-AT45DB321x"
移植Nand flash驱动了解Linux内核Nand Flash的实现_华清远见
移植Nand flash驱动了解Linux内核Nand Flash的实现如何通过移植Nand flash驱动,了解Linux内核Nand Flash的实现?本篇文章就来教你如何实行!在说到正题之前,先来介绍一下Nand Flash吧!Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。
Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。
下面回到正题。
【实验目的】Nand flash 是嵌入式系统最常用的内部存储设备,通过移植Nand flash驱动,了解Linux内核Nand Flash的实现。
说明:在本系统移植课程实验中命令行提示符“$”表示是在主机上执行,“#”表示在目标板执行。
【实验环境】● 主机:Ubuntu 10.10 (64bit);● 目标机:FS_S5PC100平台;● 交叉编译工具链:arm-eabi-4.4.0(Android4.0.4自带交叉工具链);【实验步骤】1. 添加驱动文件添加针对我们平台的Nand flash驱动。
● 拷贝s3c_nand.c到drivers/mtd/nand下;● 拷贝regs-nand.h到arch/arm/mach-s5pc100/include/mach下;cp s3c_nand.c drivers/mtd/nandcpregs-nand.h arch/arm/mach-s5pc100/include/mach2. 修改文件针对平台上的nand flash设备,修改drivers/mtd/nand/nand_base.c第2975行。
for (i = 0; i< 5; i++)3. 配置文件修改● 修改drivers/mtd/nand/Kconfig,在if mtd_nand(216行)下面添加如下内容:config MTD_NAND_S3Ctristate "NAND Flash support for S3C SoC"depends on (ARCH_S3C64XX || ARCH_S5P64XX || ARCH_S5PC1XX|| ARCH_S5PC100) && MTD_NANDhelpThis enables the NAND flash controller on the S3C.No board specfic support is done by this driver, each boardmust advertise a platform_device for the driver to attach.config MTD_NAND_S3C_DEBUGbool "S3C NAND driver debug"depends on MTD_NAND_S3ChelpEnable debugging of the S3C NAND driverconfig MTD_NAND_S3C_HWECCbool "S3C NAND Hardware ECC"depends on MTD_NAND_S3ChelpEnable the use of the S3C's internal ECC generator whenusing NAND. Early versions of the chip have had problems withincorrect ECC generation, and if using these, the default ofsoftware ECC is preferable.If you lay down a device with the hardware ECC, then you willcurrently not be able to switch to software, as there is noimplementation for ECC method used by the S3C● 修改drivers/mtd/nand/Makefile添加如下内容(19行):obj-$(CONFIG_MTD_NAND_S3C) += s3c_nand.o4. 平台代码修改修改arch/arm/mach-s5pc100/mach-smdkc100.c添加如下内容:● 添加头文件1 #if defined (CONFIG_MTD_NAND_S3C)2 #include3 #include4 #include5 #endif● 添加平台设备01 #if defined(CONFIG_MTD_NAND_S3C)02 /* Nand Flash Support */03 static structmtd_partition s5pc100_nand_part[] = {04 [0] = {05 .name = "bootloader",06 .size = SZ_1M,07 .offset = 0,08 },09 [1] = {10 .name = "kernel",11 .offset = MTDPART_OFS_APPEND,12 .size = SZ_1M*3,13 },14 [2] = {15 .name = "rootfs",16 .offset = MTDPART_OFS_APPEND,17 .size = MTDPART_SIZ_FULL,18 },19 };2021 struct s3c_nand_mtd_info s5pc100_nand_mtd_part_info = {22 .chip_nr = 1,23 .mtd_part_nr = ARRAY_SIZE(s5pc100_nand_part),24 .partition = s5pc100_nand_part,25 };2627 static struct resource s5pc100_nand_resource[] = {28 [0] = {29 .start = 0xE7200000,30 .end = 0xE7200000 + SZ_1M,31 .flags = IORESOURCE_MEM,32 }33 };3435 structplatform_device s5pc100_device_nand = {36 .name = "s5pc100-nand",37 .id = -1,38 .num_resources = ARRAY_SIZE(s5pc100_nand_resource),39 .resource = s5pc100_nand_resource,40 .dev = {41 .platform_data = &s5pc100_nand_mtd_part_info,42 }43 };44 #endif● 添加平台设备列表在smdkc100_device[]结构体数组中添加如下内容:1 #if defined(CONFIG_MTD_NAND_S3C)2 &s5pc100_device_nand,3 #endif5. 相关头文件修改修改arch/arm/plat-samsung/include/plat/nand.h添加如下内容:1 #if defined(CONFIG_MTD_NAND_S3C)2 struct s3c_nand_mtd_info {3 uintchip_nr;4 uintmtd_part_nr;5 structmtd_partition *partition;6 };7 #endif6. 配置内核$ make menuconfigDevice Drivers ---><*> Memory Technology Device (MTD) support ---><*> Caching block device access to MTD devices<*> NAND Device Support ---><*> NAND Flash support for S3C SoC[*] S3C NAND Hardware ECC-*- Enable the block layer --->Partition Types --->[*] Advanced partition selection[*] PC BIOS (MSDOS partition tables) support[*] BSD disklabel (FreeBSD partition tables) support 7. 编译内核编译内核并拷贝到tftpboot下。
在嵌入式Linux系统中挂载 jffs2 根文件系统
在嵌入式Linux系统中挂载 jffs2 根文件系统我已经在《构建基本的嵌入式Linux根文件系统》介绍了如何建立基本的嵌入式Linux根文件系统,并用NFS挂载成功。
如果要以挂载JFFS2格式的根文件系统,其基本方法就是将这个建立好的根文件系统制作成jffs2镜像,烧到FLASH中,改改Linux的启动参数即可。
具体做法如下:一、宿主机HOST编译制做MTD工具从/下载mtd-utils 的tarball,可以下载最新的。
然后解压,并在其目录下make 就好!二、制作根文件系统的JFFS2镜像。
各参数的意义:(1)-r :指定要做成image的源資料夾.(2)-o : 指定輸出image檔案的文件名.(3)-e : 每一塊要抹除的block size,預設是64KB.要注意,不同的flash, 其block size會不一樣.我的是三星的K9F1208U0B.(4)--pad (-p): 用16進制來表示所要輸出檔案的大小,也就是root.jffs2的size。
很重要的是, 為了不浪費flash空間, 這個值最好符合flash driver所規劃的區塊大小.以我的板子來說,就是5MB.(5)如果挂载后会出现类似:CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0 的警告,则加上-n 就会消失。
(6) 还有的选项,自己看帮助!-h三、烧写JFFS2镜像到NAND FLASH。
将rootfs.jffs2拷贝到NFS共享目录,然后启动开发板。
具体操作看我的开发板信息就好了:NAND: NAND flash probing at 0x4E00000064 MBIn: serialOut: serialErr: serialHit any key to stop autoboot: 0[Tekkaman2440]#nfs 0x30008000192.168.1.22:/home/tekkamanninja/working/nfs/rootfs.jffs2dm9000 i/o: 0x20000300, id: 0x90000a46MAC: 08:08:08:08:12:27operating at 100M full duplex modeFile transfer via NFS from server 192.168.1.22; our IP address is 192.168.1.2Filename '/home/tekkamanninja/working/nfs/rootfs.jffs2'.Load address: 0x30008000Loading:################################################################# ########################################################## ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# #########################################################doneBytes transferred = 5242880 (500000 hex)[Tekkaman2440]#nand erase 0xa00000 0x500000NAND erase: device 0 offset 10485760,size 5242880 ...OK[Tekkaman2440]#nand write 0x30008000 0xa00000 0x500000NAND write: device 0 offset 10485760,size 5242880 ...5242880 bytes written: OK[Tekkaman2440]#setenv bootargs noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M[Tekkaman2440]#bootdm9000 i/o: 0x20000300, id: 0x90000a46MAC: 08:08:08:08:12:27operating at 100M full duplex modeFile transfer via NFS from server 192.168.1.22; our IP address is 192.168.1.2Filename '/home/tekkamanninja/working/nfs/zImage.img'.Load address: 0x30008000Loading:################################################################# ########################################################## ################################################################# ################################################################# ############################################################ doneBytes transferred = 1600564 (186c34 hex)## Booting image at 30008000 ...Image Name: tekkamanninjaCreated: 2008-02-15 2:16:28 UTCImage Type: ARM Linux Kernel Image (uncompressed)Data Size: 1600500 Bytes = 1.5 MBLoad Address: 30008000Entry Point: 30008040Verifying Checksum ... OKXIP Kernel Image ... OKStarting kernel ...Uncompressing Linux.............................................................. .......................................... done, booting the kernel. Linux version 2.6.24 (tekkamanninja@Tekkaman-Ninja)(gcc version4.1.1) #1 Fri Feb 15 10:15:36 CST 2008CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177Machine: Tekkaman2440Memory policy: ECC disabled, Data cache writebackCPU S3C2440A (id 0x32440001)S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz S3C24XX Clocks,(c) 2004 Simtec ElectronicsCLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL onCPU0: D VIVT write-back cacheCPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets Built 1 zonelists in Zone order,mobility grouping on.Total pages:16256 Kernel command line: noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64Mirq: clearing pending ext status 00000200irq: clearing subpending status 00000003irq: clearing subpending status 00000002PID hash table entries: 256 (order: 8, 1024 bytes)timer tcon=00500000, tcnt a4ca, tcfg 00000200,00000000, usec 00001e57 Console: colour dummy device 80x30console [ttySAC0] enabledDentry cache hash table entries: 8192 (order: 3, 32768 bytes)Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)Memory: 64MB = 64MB totalMemory: 61464KB available (2960K code, 306K data, 120K init) Mount-cache hash table entries: 512CPU: Testing write buffer coherency: oknet_namespace: 64 bytesNET: Registered protocol family 16S3C2410 Power Management,(c) 2004 Simtec ElectronicsS3C2440: Initialising architectureS3C2440: IRQ SupportS3C2440: Clock Support, DVS offS3C24XX DMA Driver,(c) 2003-2004,2006 Simtec ElectronicsDMA channel 0 at c4800000, irq 33DMA channel 1 at c4800040, irq 34DMA channel 2 at c4800080, irq 35DMA channel 3 at c48000c0, irq 36usbcore: registered new interface driver usbfsusbcore: registered new interface driver hubusbcore: registered new device driver usbNET: Registered protocol family 2IP route cache hash table entries: 1024 (order: 0, 4096 bytes) TCP established hash table entries: 2048 (order: 2, 16384 bytes) TCP bind hash table entries: 2048 (order: 1, 8192 bytes)TCP: Hash tables configured (established 2048 bind 2048)TCP reno registeredNetWinder Floating Point Emulator V0.97 (double precision)JFFS2 version 2.2.(NAND)©; 2001-2006 Red Hat,Inc.fuse init (API version 7.9)yaffs Feb 15 2008 10:10:34 Installing.io scheduler noop registeredio scheduler anticipatory registered (default)io scheduler deadline registeredio scheduler cfq registeredSerial:8250/16550 driver $Revision:1.90 $ 4 ports,IRQ sharing enabled s3c2440-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440s3c2440-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440s3c2440-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize loop: module loadeddm9000 Ethernet Drivereth0: dm9000 at f6100300,f6100304 IRQ 51 MAC: 08:08:08:08:12:27 Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xxS3C24XX NAND Driver,(c) 2004 Simtec Electronicss3c2440-nand s3c2440-nand: Tacls=1, 9ns Twrph0=4 39ns, Twrph1=1 9ns NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)Scanning device for bad blocksBad eraseblock 3579 at 0x037ec000Creating 7 MTD partitions on "NAND 64MiB 3,3V 8-bit":0x00000000-0x00020000 :"U-Boot-1.3.1"0x00020000-0x00030000 :"U-Boot-1.3.1 Parameter"0x00030000-0x00500000 :"Linux2.6.24 Kernel"0x00500000-0x00a00000 :"Root(cramfs)"0x00a00000-0x00f00000 : "Root(JFFS2)"0x00f00000-0x01400000 :"Root(YAFFS)"0x01400000-0x04000000 :"DATA"usbmon: debugfs is not availables3c2410-ohci s3c2410-ohci: S3C24XX OHCIs3c2410-ohci s3c2410-ohci:new USB bus registered,assigned bus number 1s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000usb usb1: configuration #1 chosen from 1 choicehub 1-0:1.0: USB hub foundhub 1-0:1.0: 2 ports detectedmice: PS/2 mouse device common for all miceS3C24XX RTC,(c) 2004,2006 Simtec Electronicss3c2410-rtc s3c2410-rtc: rtc disabled, re-enablings3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0s3c2440-i2c s3c2440-i2c: slave address 0x10s3c2440-i2c s3c2440-i2c: bus frequency set to 98 KHzs3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapterS3C2410 Watchdog Timer,(c) 2004 Simtec Electronicss3c2410-wdt s3c2410-wdt:watchdog inactive,reset disabled,irq enabled TCP cubic registeredNET: Registered protocol family 1RPC: Registered udp transport module.RPC: Registered tcp transport module.s3c2410-rtc s3c2410-rtc: setting system clock to 2008-02-17 12:46:08 UTC (1203252368)VFS: Mounted root (jffs2 filesystem).Freeing init memory: 120Kinit started: BusyBox v1.9.1 (2008-02-16 15:04:08 CST)starting pid 779, tty '':'/etc/init.d/rcS'。
JFFS2文件系统的制作
使用新的busybox-1.13.3制作jffs2文件系统由于之前使用的文件系统中的busybox是1.5版本,结果很多工具都没有完善,这一次,在上下载了当前的最新稳定版本,busybox-1.13.3来制作,总算搞定了,但也出现了一些问题,贴出我的过程跟大家分享一下,也给有需要的人一点帮助,希望如此。
全文如下:2009-3-26陈纪煌今天尝试了移植新的文件系统,使用的是busybox-1.13.3稳定版本由于之前所使用的版本是busybox-1.5.0,结果发现很多东西无法支持,比如nfs无法挂在,并且clear等工具无法正常使用所以下了一个新的版本进行尝试1.解压该包tar xf busybox-1.13.3.tar.bz2cd busybox-1.13.32.修改Makefile找到CROSS_COMPILE ?=修改为CROSS_COMPILE ?=arm-linux-找到ARCH ?= $(SUBARCH)修改为ARCH ?= arm3.进行默认配置make defconfig4.对配置信息进行修改make menuconfig检查Miscellaneous Utilities--->taskset 是否已经去除同时设置如下:Busybox Settings --->Build Options --->[*]Build BusyBox as a static binry (no shared libs)()Cross Compiler prefix=/usr/local/arm/3.4.1/bin/Installation Options --->[*]Don't use /usrBusyBox installation=${PROJECT}/rootfs/rootfs_1.13这几个设置对于之前做过相关工作的人来说是比较熟悉的,都很容易知道为何如此做。
uClinux下Nor Flash的JFFS2文件系统构建
uClinux下Nor Flash的JFFS2文件系统构建目前的系统多用法FLASH作为主存,因此,如何有效管理FLASH上的数据十分重要文章以SST39VF160芯片为例,研究了在Nor Flash上建立的JFFS2文件系统的普通步骤,从而为FLASH上的数据管理提供了抱负的挑选方式嵌入式系统正随着Internet的进展而在各个领域得到广泛的应用,作为嵌入式应用的核心,嵌入式以其自由软件特性正日益被人们看好Linux具有内核小效率高源代码开放等优点,还内涵了完整的TCP/IP 网络协议,因此十分适于嵌入式系统的应用而作为特地运行于没有MMU的微处理器的嵌入式操作系统,uClinux更是得到广泛应用当前的嵌入式系统开发,需要便利灵便的用法Flash NOR和NAND是现在市场上两种主要的非易失闪存技术 Intel于1988年首先开发出NOR flash技术,彻底转变了原先由EPROM和EEPROM一统天下的局面 NOR 的特点是芯片内执行XIP eXe-cute In Place ,这样应用程序可以挺直在flash闪存内运行,不必再把代码读到系统RAM中 NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,因此在嵌入式系统得到广泛的应用1 JFFS2文件系统简介uClinux通常默认ROMFS作为根文件系统,它相对于普通的EXT2文件系统具有节省空间的优点但是ROMFS是一种只读的文件系统,不支持动态擦写保存虽然对于需要动态保存的数据可以采纳虚拟ram盘的办法来保存,但当系统掉电后,ram盘的内容将所有走失,而不能永远保存,因此需要实现一个可读写的文件系统 JFFS2文件系统便是一个很好的挑选JFFS文件系统是瑞典Axis通信公司开发的一种基于Flash的日志文件系统,它在设计时充分考虑了Flash的读写特性和用电池供电的嵌入式系统的特点,在这类系统中必须确保在读取文件时,假如系统骤然掉电,其文件的牢靠性不受到影响对Red Hat的David Woodhouse举第1页共7页。
uClinux下NAND FLASH的JFFS2文件系统的构建
uClinux下NAND FLASH的JFFS2文件系统的构建当前的嵌入式系统开发,需要方便灵活的使用Flash。
Nor和Nand是现在市场上两种主要的非易失闪存技术。
Nor更适合用于存放少量的代码,而Nand则是高数据存储密度的理想解决方案。
2 JFFS2文件系统简介JFFS2的底层驱动主要完成文件系统对Flash芯片的访问控制,如读、写、擦除操作。
在Linux中这部分功能是通过调用MTD驱动实现的。
相对于常规块设备驱动程序,使用MTD驱动程序的主要优点在于MTD驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的支持、更好的管理和更好的基于扇区的擦除和读写操作的接口3 Nand Flash及其与ARM CPU的硬件连接本文采用的Nand Flash是三星公司的K9F2808芯片。
它的存储空间以页为单位,一页是由512字节的数据和16字节的备用空间组成,其中备用空间可用来存春ECC纠错码、坏块信息和文件系统相关的数据。
我们只考虑数据空间即可,因此我们认为每页大小为512字节,32页组成一个块,故块的大小为16K。
4 JFFS2底层MTD驱动编写在Linux-2.4.x/drivers/mtd/nand/目录下加入44b0x.c文件,该文件是基于同一目录下其他文件(如spia.c)修改的。
主要修改如下3处:1) #define MYARM_IO_BASE 0x01d20000#define MYARM_FIO_BASE 0x2000000#define MYARM_PEDR 0x0014#define MYARM_PEDDR 0x00102) 定义Nand Flash设备的分区(根据用户需要来确定分区的大小和分区的数量)。
#ifdef CONFIG_MTD_PARTITIONSconst static struct mtd_partition partition_info[]={{ name: "NAND flash partition 1(6MB)",offset: 2*1024*1024,size: 6*1024*1024 },{ name: "NAND flash partition 2(6MB)",offset: 8*1024*1024,size: 6*1024*1024 } };#define NUM_PARTITIONS 2#endif3)定义与特定硬件相关的控制线操作函数void arm_hwcontrol(int cmd){switch(cmd){case NAND_CTL_SETCLE: (*(volatile unsigned *) (arm_io_base + arm_pedr)) |= 0x04; break;case NAND_CTL_CLRCLE: (*(volatile unsigned *) (arm_io_base + arm_pedr)) &= ~0x04; break;case NAND_CTL_SETALE: (*(volatile unsigned *) (arm_io_base + arm_pedr)) |= 0x08; break;case NAND_CTL_CLRALE: (*(volatile unsigned *) (arm_io_base + arm_pedr)) &= ~0x08; break;case NAND_CTL_SETNCE: (*(volatile unsigned *)(arm_io_base + arm_pedr)) &= ~0x02; break;case NAND_CTL_CLRNCE: (*(volatile unsigned *) (arm_io_base + arm_pedr)) |= 0x02; break;}}5 JFFS2文件系统的移植5.1修改MAKEFILE文件obj-$(CONFIG_MTD_NAND_MYARM) += 44b0x.o这样在运行对内核的Make时,就会编译44b0x.c文件了。
建立基于NOR FLASH的JFFS2根文件系统步骤
建立基于NOR FLASH的JFFS2根文件系统的步骤mafaqing, 2010-6-3文档约定:Host - 为虚拟机系统命令行环境EVM - 为U-Boot命令行环境Target - 为终端linux命令行环境1.把rootfs.jffs2和uImage_nor_jffs2上传到HOST的/opt/tftp目录下2.在HOST下执行下面的命令host # xinetd3.启动板子,并在U-BOOT环境下执行下面命令格式化NOR FLASH的内核和根文件系统分区EVM # protect off 0x02060000 0x03000000EVM # erase 0x02060000 0x03000000注: (1).切不要格式化其他分区(2).0x02040000 ~ 0x03000000为内核和文件系统存放的开始地址及结束地址4.下载新内核uImage_nor_jffs2到内存EVM # tftp 0x80700000 uImage_nor_jffs25.烧写新的内核到FLASH分区(内核)上EVM # cp.b 0x80700000 0x02060000 0x1600006.下载JFFS2文件系统镜像文件到内存EVM # tftp 0x80700000 rootfs.jffs27.烧写JFFS2文件系统镜像到FLASH分区(根文件系统)上EVM # cp.b 0x80700000 0x02240000 0x8da2fc8.修改内核启动参数,使系统使用FLASH上的JFFS2根文件系统,并保存参数EVM # setenv bootargs 'console=ttyS0,115200n8video=dm64xxfb:interface=composite:mode=pal:output=pal noinitrd rw ip=offroot=/dev/mtdblock3 rootfstype=jffs2 rw noinitrd mem=120M'EVM # saveenv9.手动断电复位板子,重新启动系统注: 首次启动系统时因为要对FLASH分区进行一些初始化,因些首次启动系统时需要等待一段时间.10.通过SSH客户端连接板子,把程序上传到FLASH系统下的/opt(不要上传到其他目录),并进行测试IP:192.168.1.33用户名:root密码:dm6446注: (1).测试程序时,在执行完loadmodules.sh后,需要再执行下面的命令target # /sbin/mdev -s(2).上传测试程序时,要注意FLASH的可用空间,如果空间不够时请删掉到/opt目录下的一些不用的程序可使用下面的命令查看当时FLASH的空间的使用情况target # /bin/df -ahFilesystem Size Used Available Use% Mounted onrootfs 13.8M 9.4M 4.4M 68% //dev/root 13.8M 9.4M 4.4M 68% /proc 0 0 0 0% /procsysfs 0 0 0 0% /systmpfs 46.1M 0 46.1M 0% /tmpmdev 64.0k 0 64.0k 0% /devdevpts 0 0 0 0% /dev/ptstmpfs 46.1M 0 46.1M 0% /dev/shmusbdevfs 0 0 0 0% /proc/bus/usbnone 46.1M 8.0k 46.1M 0% /var/runnone 46.1M 0 46.1M 0% /tmp其中 rootfs即为当前FLASH根文件系统分区的使用情况。
在CFIFLASH设备上实现JFFS2文件系统
件 系统 。包括 驱动程序 编写,内核修 改和配置 , 根文件 系统 的建 立。最终使得J F 2文件 系统可 以稳 定、可靠地运行在 A M90 FS R 2
开发 板 上 。 同 时也 指 出 了J F 2的局 限 性 和 发展 趋 势 。 FS
关键 词 :J F 2 F S ;MT D;fs ;In x l h A u ;嵌 入 式 a 中 图分 类号 :P T 31 l 文 献 标 识 码 :A
的优 点 : () F S 在 扇 区 级 别上 执 行 闪 1 JF 2
基 于 以上 的 区别 ,NO ah 主 要 应 用 在 代 码 存 储 介 质 Rfs l 中 ,而 NA D ah则更 加 适 合 于 大 容 量 的 数 据 存 储 。 N fs l
MT 及其 主要 函数 介绍 D
引言
Fah存储器 因其制造成本低廉 、存储容量大 、数据非易 ls 失 、无机械 故障 ,在 目前 的嵌入式 系统 中被广泛 用作外存储 器件 。 在嵌入式 系统 中应用 Fah存储器最好 的办法是在其上 l s
2 Fah 芯 片介绍 ls
目前 嵌 入 式 市 场 上 最 主 要 的 两 种 非 易 失 性 闪存 是 N OR 型和 NA ND 型 f s 。 It 于 18 l h a ne l 9 8年 首 先 开 发 出 N ah ORf s l 技 术 , NO ah 可 以 直 接 和 总 线 接 口相 连 , 读 写 类 似 于 R fs l
犁 f s。 l h a
R M, A 并可以直接执行程序 。9 9年 , 18 东芝公司发表 了 N ND A
No R NA ND
接口
单元 大 小
BS U
Nand flash文件系统总结
NAND flash文件系统目前flash的文件系统比较多,用的比较多的就是JFFS2文件系统。
基于NOR flash上的JFFS2文件系统可以说算是比较成熟了,支持NAND flash的JFFS2也已经发布了。
源代码可以到上面下载。
但是在我的测试过程中,在nand flash上挂接的JFFS2文件系统很不稳定,经常有CRC错误产生。
特别是进行写操作的时候,每次复位都会产生CRC错误,可以说支持NAND flash的JFFS2文件系统目前还不成熟。
而YAFFS文件系统则是专门针对NAND flash的,源代码可以到/yaffs/index.html上下载。
在测试过程中稳定性能比JFFS2文件系统要稳定的多,而且mount分区的时间也比JFFS2文件系统少的多。
用JFFS2 mount一个2m的文件系统大约需要1s。
下面分别介绍在uclinux 下面使用JFFS2和YAFFS文件系统。
1、JFFS2到上面下载最新的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=YCONFIG_MTD_DEBUG=YCONFIG_MTD_DEBUG_VERBOSE=3CONFIG_MTD_PARTITIONS=YCONFIG_MTD_CHAR=YCONFIG_MTD_BLOCK=YNAND Flash Device Drivers下CONFIG_MTD_NAND=Y定义自己的驱动文件File systems下CONFIG_JFFS2_FS=YCONFIG_JFFS2_FS_DEBUG=2CONFIG_JFFS2_FS_NAND=y /*这个是新加的*/在uClinux v1.3.4 Configuration下Flash Tools下CONFIG_USER_MTDUTILS=YCONFIG_USER_MTDUTILS_ERASE=YCONFIG_USER_MTDUTILS_ERASEALL=YCONFIG_USER_MTDUTILS_MKFSJFFS2=Y最后就是辛苦了调试工作了。
修改NORFlash分区和JFFS2文件系统支持
修改NORFlash分区和JFFS2文件系统支持修改NOR Flash分区和JFFS2文件系统支持仇洁婷,陈儒军本系统的NOR Flash用于存放启动代码、Linux内核、用户程序等,因此需要在Linux-2.6.21内核中对它进行配置和分区。
NOR Flash的驱动程序都集中的/drivers/mtd/maps里面。
通过make menuconfig对Linux2.6.21内核增加MTD和相应的文件系统的支持。
选择配置有:Devices Drivers --->Memory Technology Devices (MTD) ---><*> Memory Technology Device (MTD) support<*> MTD partitioning support<*> Direct char device access to MTD devices<*> Caching block device access to MTD devicesRAM/ROM/Flash chip drivers ---><*> Detect flash chips by Common Flash Interface (CFI) probe<*> Support for Intel/Sharp flash chipsMapping drivers for chip access ---><*> CFI Flash device mapped on AT91RM9200 由于系统采用电池供电,必须要确保在读取文件时,如果系统突然掉电,其文件的可靠性不受到影响。
JFFS2文件系统正是为这种类型的嵌入式设备创建的,它具有崩溃/掉电安全保护这一功能。
因此,本文将根文件系统挂载分区设置为JFFS2(Journalling Flash File System Version 2,闪存日志文件系统第2版)文件系统形式。
在nand flash上实现JFFS2根文件文件系统
在nand flash上实现JFFS2根文件文件系统JFFS2是Flash上应用最广的一个日志结构文件系统。
它提供的垃圾回收机制,不需要马上对擦写越界的块进行擦写,而只需要将其设置一个标志,标明为脏块,当可用的块数不足时,垃圾回收机制才开始回收这些节点。
同时,由于JFFS2基于日志结构,在意外掉电后仍然可以保持数据的完整性,而不会丢失数据。
本文阐述如何在nand flash上实现JFFS2根文件文件系统。
实验环境是:FS2410开发平台及ubantu7.04主机环境。
由于使用的ubantu7.04的环境没有安装制作JFFS2文件系统镜像的工具mkfs.jffs2,所以首先在Linux系统中安装mkfs.jffs2工具,安装的过程如下:1.下载MTD工具包本处使用的是mtd-snapshot-20050519.tar.bz2:farsight#tar–jxvf mtd-snapshot-20050519.tar.bz2farsight#cd mtdfarsight#./configurefarsight#makefarsight#make install如果系统中没有安装ZLIB库,那么首先安装ZLIB库。
具体的安装过程如下:farsight#tar–zxvf zlib-1.2.3.tar.gzfarsight#cd zlib-1.2.3farsight#./configurefarsight#makefarsight#make install完成此步骤后,系统中就有了mkfs.jffs2的工具。
注意:这个工具不同于mkfs.ext2工具,它只能制作相应的JFFS2文件系统的镜像,而不具有进行格式化的功能,而mkfs.ext2具备这以上两种功能。
然后用这个工具就可以制作JFFS2文件系统的镜像了。
2、制作JFFS2文件镜像实验平台用到的nand flash是K9F1208,在制作镜像过程添加的参数需要和它对应。
制作jffs2.img文件系统,打包下载flash系统镜像
“&&”
————————————————
CSDN @
CC 4.0 BY-SA
https:///qq_40860568/article/details/100153681
3 SPI_MISO GND
boot
fel
sunxi-fel
fel usb pc zero,
=(V3s) ver= scratchpad=00007e00 bytes.
sudo sunxi-fel -p spiflash-write 0 flashimg.bin# -p
# spiflash-info
dd =/dev/zero of=flashimg.bin count==u-boot/u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K =linux-zero-.y/arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb of=flashimg.bin bs=1K conv==linux-zero-.y/arch/arm/b
2 FEL
cpu
fel
Zero usb fel fel
1 TF spi flash
SD
spi flash fel
:2 SD fel fel-sdboot.sunxi spiflash
TF sunxi dd if=fel-sdboot.sunxi of=/dev/mmcblk0 bs=1024 seek=8
1
rootfs jffs2.imgFlash jffs2
rootfs jffs2
// sudo apt-get install mtd-utils
μClinux下NAND FLASH的JFFS2文件系统的移植
μClinux下NAND FLASH的JFFS2文件系统的移植
曾卫华;高世臣;魏秋菊
【期刊名称】《计算机应用》
【年(卷),期】2005(25)B12
【摘要】以K9F2808芯片为例,讨论了在NAND Flash上建立μClinux的JFFS2文件系统的一般步骤,为FLASH上的数据管理提供了一种选择方式。
【总页数】3页(P372-373,376)
【作者】曾卫华;高世臣;魏秋菊
【作者单位】中国地质大学(北京)信息工程学院,北京100083;河北地质职工大学,河北石家庄050081
【正文语种】中文
【中图分类】TP311.54
【相关文献】
1.嵌入式文件系统及jffs2文件系统在Flash上的实现 [J], 刘金梅;张振东;路全;杨建华
2.μClinux下JFFS2文件系统的建立 [J], 刘军良;潘刚;李平
3.JFFS2文件系统在μClinux中的应用 [J], 胡晨峰
4.JFFS2文件系统在μClinux中的实现 [J], 行喜梁;刘树东;戴学丰
5.μClinux下NAND FLASH的JFFS2文件系统的移植 [J], 曾卫华;高世臣;魏秋菊因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Nand flash驱动移植及带硬件Ecc的Jffs2文件系统制作
cd /new_disk/weiyan/linux-2.6.25
vi arch/arm/mach-s3c2440/mach-smdk2440.c
修改板级配置文件,为统一驱动的配置,设备的配置信息一般在此文件中添加。
1)添加头文件
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <asm/plat-s3c/nand.h>
#include <asm/plat-s3c24xx/pm.h>
2)添加nand划分信息
static struct mtd_partition wy_nand_part[] = {
[0] = { //u-boot及内存存放的分区
.name = "BOOT",
.size = SZ_2M,
.offset = 0,
},
[1] = { //文件系统存放的分区
.name = "ROOTFS",
.offset = SZ_2M,
.size = SZ_32M,
},
[2] = { //剩余空间
.name = "BACKUP",
.offset = SZ_32M + SZ_2M,
.size = SZ_32M - SZ_2M,
},
};
static struct s3c2410_nand_set wy_nand_sets[] = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(wy_nand_part),
.partitions = wy_nand_part,
},
};
3)添加nand flash的读写匹配时间,各时间定义如图
static struct s3c2410_platform_nand wy_nand_info = {
.tacls = 10,
.twrph0 = 25,
.twrph1 = 10,
.nr_sets = ARRAY_SIZE(wy_nand_sets),
.sets = wy_nand_sets,
};
4)添加nand设备到初始化表
static struct platform_device *smdk2440_devices[] __initdata = { ……(此处省略其他设备,添加时请注意。
)
&s3c_device_iis,
&s3c_device_nand,
};
5)添加nand初始化信息与nand设备的关联
static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_fb_info);
s3c_device_nand.dev.platform_data = &wy_nand_info;
//添加Nand初始化数据
platform_add_devices(smdk2440_devices,
ARRAY_SIZE(smdk2440_devices));
// smdk_machine_init();
s3c2410_pm_init(); //注释不需要的led初始化,增加电源管理初始化
}
6)添加硬件校验
make menuconfig
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> NAND Device Support --->
[*] S3C2410 NAND Hardware ECC
make uImage && cp arch/arm/boot/uImage /new_disk/tftp
7)重新生成jffs2文件系统
./mkfs.jffs2 -d rootfs -p -s 0x200 -e 0x4000 -n -l -U -o rootfs.jffs2
-d指定目录rootfs,-s指定页大小为0x200字节,-e指定块大小为0x4000字节,-p指定用0xff填充最后块的空闲空间,-n指定不添加清空标志,-l指定小端格式,-U指定所有文件的属主为root,-o指定输出的镜像文件名。
cp rootfs.jffs2 /new_disk/tftp
8)修改u-boot传给内核的参数
WEIYAN # set bootargs root=/dev/mtdblock1 rootfstype=jffs2 console=ttySAC0
指定分区1("ROOTFS")为存放根文件系统的分区,类型为jffs2。
9)烧写jffs2文件系统及Linux内核
WEIYAN # nand erase 0x50000
//擦除从0x50000(320K)开始的全部空间,从0~320K为保留的U-boot空间。
WEIYAN # tftp 0x31000000 rootfs.jffs2
//将jffs2根文件系统下载到0x31000000的内存段
WEIYAN # nand write.jffs2 0x31000000 0x200000 $(filesize)
//将根文件系统写入到0x200000开始的空间,写入大小为下载的大小$(filesize)。
WEIYAN # tftp 0x31000000 uImage
WEIYAN # nand write.jffs2 0x31000000 0x50000 $(filesize)
//将内核写入到0x50000开始的Nand flash,写入大小为$(filesize)。
WEIYAN # set bootread nand read.jffs2 0x31000000 0x50000 $(filesize) WEIYAN # set bootcmd $(bootread) \;bootm 0x31000000
//设置启动脚本为将Nand flash上的内核读到sdram里,并自动启动内核。
WEIYAN # save;reset //保存参数并重新启动
10)系统正常启动显示如下
VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 132K
init started: BusyBox v1.10.1 (2008-03-02 02:33:43 CST)
starting pid 771, tty '': '/etc/init.d/rcS'
Please press Enter to activate this console.。