新闻中心

EEPW首页>嵌入式系统>设计应用> YAFFS2在嵌入式系统中的实现

YAFFS2在嵌入式系统中的实现

作者: 时间:2010-06-01 来源:网络 收藏


表1说明了文件数据在NANDFLASH的备用空间内的存储布局。


blockState:描述该块的状态。如果不是OxFF,就说明是坏块。相对应的是,所有正常的块,里面所有数据都是OxFF的。
chunkld:描述该页在一个文件内的索引,所以文件大小被限制在232×2 KB。chunkld为O,说明此页面保存的是文件头。不为O,说明是数据页面。文件内偏移量为0,即放在第一个页面的文件,其chunkId为1,后面的以此类推。
ObjectID:描述对象ID号,用来惟一标示一个文件。所以文件支持的文件总数限制在232个。
nBytes:记录该页面内的有效字节数。
blockSequence:记录着各块被分配出去的先后顺序,每分配出去一块,就加1。在文件建立的时候,块的扫描顺序就是由它决定的,而不是FLASH的物理介质顺序。在垃圾收集的时候也会以此作为参考之一,判断该块是否适合回收。
tagsEcc:Ecc,YAFFS Tags区域的ECC校验数据。
ECC:数据区的ECC校验数据。读/写数据区的数据时,每256 B生成3 B ECC校验和,一页面2 KB数据就会生成24 B的校验数据。

3 系统移植
此次开发采用宿主机+目标系统的开发模式。宿主机为PC+Fedora9,Fedora9安装在PC的虚拟机内。目标系统软硬件组成为目标板(CPU为S3C2440A)+U-Boot+Linux,Linux版本为2.6.29.4。交叉编译工具为arm-linux-gcc-4.3.2。
选用Linux系统是因为它有着技术上先进,健壮、安全;是多任务系统,支持ARM体系结构;源码开放,驱动程序及其他资源非常丰富,良好的可移植性等优点。系统的移植从软件角度可以分为以下四个步骤。如图3所示。


(1)引导加载程序的移植,包括固化在固件(Fireware)中的boot代码和Bootloader两大部分。大多数嵌入式系统中并没有固件,Bootlo-ader是上电后执行的第一个程序。它主要用来初始化处理器及外设,然后调用Linux内核。
(2)嵌入式Linux内核移植。特定于嵌入式处理系统的定制内核以及内核的启动参数。内核的启动参数可以是内核默认的,或是由Bootlo-ader传递给它的。
(3)文件系统制作。包括根文件系统和建立于FLASH内存设备之上的文件系统。里面包含了Linux系统配置文件和运行应用软件所需要的库等。
(4)用户应用程序编写。特定于用户的应用程序,它所的功能通常就是设计该嵌入式系统所要达到的目标,它们也存储在文件系统内。
3.1 Bootloader移植
对于支持ARM架构的Bootloader有U-Boot,Vivi等。U-Boot(Universal Boot Loader)即通用Bootloader,是遵循GPL条款的开放源代码项目。它可以引导Linux,VxWorks,LynxOS等多种操作系统。支持PowerPC,x86,ARM等多种架构的CPU,具有丰富的设备驱动源码,如串口、以太网、SDRAM,FLASH等。系统采用U-Boot的版本为1.1.6,它已支持SMDK2410开发板,在其基础上进行修改。U-Boot 1.1.6中对NAND FLASH的支持有新旧两套代码,新代码在drivers/nand目录下,旧代码在driver/nand_legacy目录下。本次移植选用新代码,它移植自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。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭