YAFFS2在嵌入式系统中的实现
录下。本次移植选用新代码,它移植自Lin-ux2.6.12,更加智能。移植过程分以下几步。
(1)根据具体输入时钟,修改时钟定义参数。SMDK2410开发板的默认时钟为12 MHz。
(2)依照实际开发板的内存地址分配情况修改lowlevel init.S文件。
(3)针对S3C2410,S3C2440 NAND FLASH控制器的不同,修改接口参数。
(4)仿照内核支持NAND FLASH的文件来编写片选函数。命令和控制函数,查询状态函数。
(5)根据具体NAND FLASH芯片设置时序参数。
(6)增加从NAND FLASH烧写,读取YAFFS2文件系统映像功能。
(7)修改Makefile文件,将新建文件编入U-Boot中。
在编写烧写YAFFS2文件系统映像的命令时,要注意YAFFS2文件系统映像里除了2 KB的数据外,后面还包括了64 B的OOB数据,所以映像文件大小是以2 112 B为单位。OOB中已经包含了ECC,在烧写时不需要再计算ECC校验码。烧写时,首先检查是否为坏块,是就跳过,然后写入2 KB的数据,最后写入64 B的OOB数据。还要增加对skipfirstblk参数的支持。使烧写YAFFS2文件系统映像时,跳过分区上第一个块,这是由YAFFS2文件系统特性决定的。
由于不使用ECC校验码,烧写过程中会不断提示以下信息:
Writing data without ECC to NAND-FLASH is not reeom-mended
可以修改driver/mtd/nand/nand base.C文件的nand_write_page函数,将输出这条信息的命令去掉。
最后执行make XX_config和make all命令,生成的U-Boot.bin文件即可以运行与目标板上了。将它烧入NOR FLASH后启动,在串口工具中能够看到提示信息。输入nand info命令即可查看到NAND FLASH的信息,说明U-Boot识别出了NAND FLASH。
3.2 嵌入式Linux内核移植
目前Linux内核还没有正式支持YAFFS文件系统,所以需要通过补丁修改Linux内核,另外YAFFS文件系统也需要MTD设备驱动的支持。首先下载最新版本的2.6内核,这里以linux-2.6.29.4为例。尽管Linux 2.6并不是一个真正的实时操作系统,但其改进的特性能够满足系统响应需求。再下载YAFFS代码包。内有YAFFS和YAFFS 2两个文件夹。其中YAFFS已经不再维护,进入YAFFS2。文件夹内有patch-ker.sh补丁文件,使用以下命令将YAFFS2加入到Linux内核。
以上命令完成了三件事情:
(1)修改内核fs/Kconfig。增加一行:source"fs/YAFFS2/Kconfig"。
(2)修改内核fs/Kconfig。增加一行:ojb-MYM(CONFIG_YAFFS_FS)+=YAFFS2/。
(3)在内核fs/目录下创建YAFFS2目录;将YAFFS2源码目录下面的Makefile.kernel文件复制为内核fs/YAFFS2/Makefie;将YAFFS2源码目录的Kconfig文件复制到内核fs/YAFFS2目录下;将YAFFS2源码目录下的*.C*.h文件复制到内核fs/YAFFS2目录下。
进入内核目录,修改makefile,并对内核进行默认配置进行修改,使其支持本开发板。
结合U-Boot信息修改NAND FLASH分区,使其两者结构大小保持一致。注意分区的大小要以128 kB为单位。
根据具体NAND FLASH芯片特性,修改tacls,twrph0,twrphl的值。
修改arch/arm/tools/math-types文件,使其Linux内核的机器号与Bootloader传递来的参数一致。建立好交叉编译环境,在环境变量PATH中添加交叉编译工具路径。或者直接在makefile文件内添加修改也可以。使用make s3c2410_defconfig命令,将2410的默认配置文件写到当前目录下的.config。使用make me-nuconfig命令配置内核模块的功能,要选中MTD和YAFFS2支持。在Boot options选项中增加以下语句。
使用make zImage命令,生成是zlmage映像文件。再用mkimage工具制作ulmage,uImage是U-Boot专用的映像文件,它在zImage之前加上一个长度为0x40的"头",说明这个映像文件的类型、加载位置、生成时间、大小等信息。
3.3 制作文件系统
嵌入式Linux系统都需要构建根文件系统,构建根文件系统的规则在文件系统层次标准(Filesystem Hi-erarchy Standard,FHS)文档中。首先建立根文件系统目录和动态链接库,然后使用Busybox工具可以生成根文件系统所需的bin,sbin,usr目录和linuxrc文件。Bosybox是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,为嵌入式系统提供了一个比较完整的工具集。
YAFFS2源代码包内除了本身文件系统代码外,utils 目 录下还包含了 mkYAFFSimage/mkYAFFS2image的代码,修改Makefile里的内核路径编译出mkYAFFSimage/mkYAFFS2image工具。其中mkYAFFSimage用于制作512 B的小页YAFFS文件系统,mkYAFFS2image用于制作2 KB以上的大页YAFFS2文件系统。输入以下格式命令,制作出支持大页的YAF
- linux文件系统基础(02-09)
- Linux下Ext2与Ext3文件系统的区别(04-10)
- 基于VxWorks的文件系统的研究与实现(09-18)
- 设备文件系统devfs详解(05-01)
- Linux的日志文件系统简要剖析(05-01)
- Flash文件系统剖析(05-07)