0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在U-Boot中实现对Yaffs镜像的设计?

电子设计 作者:电子设计 2018-08-29 05:02 次阅读

0 引 言

U-Boot是目前广泛使用的嵌入式操作系统通用引导程序,具有功能丰富强大,支持多种操作系统和CPU体系,易于功能扩展和移植,源码开放等多种优点。U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS.Yaffs文件系统是专门针对NAND FLASH设计的可读写型文件系统,在NAND FLASH上性能稳定优异。U-Boot自身没有实现对Yaffs文件系统镜像读写的直接支持。由于Yaffs文件系统的特殊结构,需要对nand命令做一定的修改,从而实现其在NANDFLASH上对Yaffs镜像的读写。

1 相关工作简介

1.1 Yaffs文件系统结构简述

目前,嵌入式系统中常用的FLASH文件系统有Cramfs,Jffs 2,Yaffs,exfat等。Cramfs是一种压缩型只读型文件系统,其在系统启动时解压至内存中运行。Jffs 2,Yaffs,Exfat等是可读写型文件系统,Jffs 2一般应用于NOR型FLASH;Exfat不是开源的文件系统实现,一般应用于Windows CE操作系统中。

通常一个NAND FLASH存储设备由若干块组成;1个块由若干页组成。一般128 MB以下容量的NAND FLASH芯片,一页大小为528 B,依次分为2个256 B的主数据区和16 B的额外空间;128 MB以上容量的NAND FLASH芯片,一页大小通常为2 KB.由于NAND FLASH出现位反转的概率较大,一般在读写时需要使用ECC进行错误检验和恢复。

Yaffs(Yet Another Flash File System)文件系统是专门针对NAND闪存设计的嵌入式文件系统,目前有YAFFS和YAFFS2两个版本,两个版本的主要区别之一在于YAFFS2能够更好的支持大容量的NAND FLASH芯片。

Yaffs文件系统有些类似于JFFS/JFFS2文件系统,与之不同的是JFFS1/2文件系统最初是针对NOR FLASH的应用场合设计的,而NOR FLASH和NAND FLASH本质上有较大的区别,所以尽管JFFS1/2 文件系统也能应用于NAND FLASH,但由于它在内存占用和启动时间方面针对NOR的特性做了一些取舍,所以对NAND来说通常并不是最优的方案。

Yaffs文件系统的设计充分考虑到NAND FLASH以页为存取单位等的特点,将文件组织成固定大小的段(Chunk)。以528 B的页为例,Yaffs文件系统使用前512 B存储数据、16 B的额外空间,用以存放数据的ECC和文件系统的组织信息等(称为OOB数据)。通过OOB数据,不但能实现错误检测和坏块处理;同时可以避免加载时对整个存储介质的扫描,加快了文件系统的加载速度。一个页面的具体结构如表1所示。

如何在U-Boot中实现对Yaffs镜像的设计?

由此可知,与其他文件系统相比,在生成Yaffs镜像时就包含了OOB数据,所以在烧写Yaffs镜像时,不需要计算ECC,仅依次写入512 B的数据和16 B的OOB数据即可。同时,Yaffs镜像要使用分区上的第一个块来存储一个名为Yaffs_ObjectHeader的结构体。该结构体记录了该分区中的文件、路径以及相关的链接,所以在烧写时还需要跳过第一个可用的块。Yaffs文件系统目前常用的版本为Yaffs 2,性能在许多方面都有了很大的提高。

1.2 U-Boot对常见文件系统的支持

U-Boot可支持的主要功能列表 系统引导;支持NFS挂载、RAMDISK(压缩或非压缩)形式的根文件系统;支持NFS挂载、从FLASH中引导压缩或非压缩系统内核;基本辅助功能 强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲; 在实际开发过程中,一般使用引导程序,比如U-Boot,完成文件向FLASH中的烧写和启动引导等工作。U-Boot能够支持Cramfs,Jffs 2文件系统的烧写。这些文件系统是针对NOR型FLASH设计的,所有文件数据就是简单的线性表组织形式。对于目前大量使用的NAND型FLASH,由于带有用于数据校验等功能的OOB区,所以Yaffs文件系统的数据组织形式不再是线性表的形式。

U-Boot没有提供对Yaffs文件系统的读写支持。但由于该文件系统的读写过程与其他文件系统的读写类似,因此可以通过修改U-Boot的FLASH读写命令,增加处理00B区域数据的功能,即可以实现对Yaffs文件系统的读写支持。

2 具体实现

在此,采用U-Boot 1.1.6版,NAND FLASH使用三星公司的K9F1208UOM.该NAND FLASH每页为512 B,外加16 B额外空间,整个芯片容量为64 MB.在此之前,已经正确配置了相关的宏定义,并移植了相关NAND FLASH的驱动程序,使U-Boot能够正确操作该芯片。

2.1 为U-Boot添加新的命令

实际上,U-Boot中已经实现了所需的nand命令,只要编写好正确的NAND FLASH驱动程序,并定义相应的宏,就可实现对NAND FLASH的基本读写操作。欲添加对Yaffs镜像的支持,只要实现一个新的参数即可。为了给下述工作一个清晰的步骤,在此先简述如何向U-Boot中添加一个新命令。以下所述的路径均在U-Boot源码目录下。

(1)在include/cmd_confdefs.h文件中定义相应命令的宏,不能与已有的宏值重复。

(2)在common/cmd_name.c中实现命令操作的具体代码,文件名中的name即为相应命令的名称。在这个文件中,首先要编写命令的实现函数;此外还要使用一个U_BOOT_CMD()的宏函数来填写该命令的cmd_tbl_t结构体。该结构体的原型是在include\command.h 中定义的,包含相应命令的名称、参数个数、实现函数、用法说明、帮助等信息。

(3)在相应的开发板头文件(位于include/con-figs/下)中的CONFIG_COMMANDS宏中添加(1)所定义的宏即可使用该命令。

在实现以上步骤时,参照已有命令的相应代码作适当修改即可。

2.2 为nand命令添加新参数

根据以上分析,下面给nand命令添加write.yaffs参数,从而实现对Yaffs镜像的支持。按照第2.1节中的步骤,由于nand命令已经实现,仅需要修改com-mon/cmd_nand.c文件即可。

(1)在common/cmd_nand.c文件的U_BOOT_CMD()宏函数中仿照其他参数,添加该参数的使用说明

定义读写操作的结构体原型中一部分参数没有使用,这些参数与选择ECC的方式有关,由于Yaffs文件系统已包含了OOB数据,故不使用这些参数。另外, opts.skipfirstblk是向nand_write_options_t结构体中新添加的变量,因此需要修改该结构体。在 include/nand.h中,向struct nand_write_options结构体添加如下变量定义:

如何在U-Boot中实现对Yaffs镜像的设计?

int skipfirstblk;

此外,需要再修改nand_write_opts函数,以增加对此变量的支持。

2.3 修改nand_write_opts函数

在drivers/nand/nand_util.c中,根据其代码,在while(blockstart!=(mtdoffset&(~erasesize_blockalign+1)))循环体之后添加如下代码:

如何在U-Boot中实现对Yaffs镜像的设计?

通过以上步骤,U-Boot已经可以支持Yaffs文件系统镜像的读写。一般地,在进行NAND FLASH写操作时,可以先通过串口或网络等接口将数据下载到内存中,进而按照命令格式将其烧写到NAND FLASH中。例如:

如何在U-Boot中实现对Yaffs镜像的设计?

在U-Boot中使用以上三条命令,将名为test.yaffs的Yaffs文件系统镜像下载到内存中,然后擦除一块FLASH空间,最后用Nand Write.yaffs命令将其写入NAND FLASH.烧写完毕后会提示:

Writing data at 0xd67200-100%complete.

3663264 bytes written:OK

另外,由于没有使用ECC,烧写过程中会有大量如下提示:

Writing data without ECC to NAND_FLASH is not recom-mended

事实上,ECC数据在生成Yaffs镜像时已经包含在镜像里,因此这里的提示并没有关系。在drivers/nand/nand_basec.c文件中,将nand_write_page函数中case NAND_ECC_NONE:语句分支中的printk函数注释掉即可消除此提示。

如何在U-Boot中实现对Yaffs镜像的设计?

3 Yaffs文件系统的性能

在实际使用中,一般CPU的运行速度远大于FLASH的读写速度,所以yaffs文件系统的读写速度主要由具体FLASH芯片的读写时间延迟来决定。

对于常使用的Yaffs 2,写操作的速度为1.5~4.5 MB/S,读操作的速度为7.6~16.7 MB/S,删除操作为7.8~62.5 MB/s,垃圾回收为2.1~7.7 MB/s.由于一般嵌入式系统数据交换量不大,所以该文件系统完全能够满足一般实时性操作的要求。

此外,作为日志型文件系统,Yaffs文件系统能够有效地保护数据完整性,避免系统掉电等情况对数据产生的破坏。同时,与其他FLASH文件系统相比,Yaffs文件系统的实现给NAND型FLASH带来了很多优化,在速度、内存占用以及能耗等方面都有更好的表现。

4 结 语

这里在分析Yaffs文件系统基本结构的基础上,通过为U-Boot已有命令添加新的参数,实现了U- Boot读写Yaffs文件系统镜像的支持。最后通过一个简单试验进行了验证。结果表明,烧写入FLASH中的文件系统镜像可以被嵌入式Linux等操作系统的内核挂载使用。方便了嵌入式系统的Yaffs根文件系统镜像的创建和调试。YAFFS是专门为NAND闪存设计的,它的出现使得价格低廉的NAND闪存芯片具有了高效性和健壮性。YAFFS文件系统性能优越且易于移植,已经成功应用于Linux、mClinux和Windows CE等嵌入式操作系统上。现在,每页大小为2Kb的新型超大容量NAND闪存已经出现,针对这种Flash的文件系统YAFFS2正处于研究和应用当中。可以预见,基于NAND闪存的文件系统YAFFS/ YAFFS2将会应用于更多的嵌入式系统



:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    456

    文章

    50936

    浏览量

    424671
  • 嵌入式
    +关注

    关注

    5086

    文章

    19143

    浏览量

    306093
  • NAND
    +关注

    关注

    16

    文章

    1685

    浏览量

    136227
收藏 人收藏

    评论

    相关推荐

    U-boot的基本介绍

    从本文开始,将陆续推送“手把手教你移植U-boot”系列文章,目标是由浅入深地讲解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默认硬件开发平台为ARM,操作系统为Linux。
    发表于 07-14 16:52 2967次阅读
    <b class='flag-5'>U-boot</b>的基本介绍

    U-boot的执行流程

    本文主要讲述了U-boot的执行流程。
    发表于 07-14 16:58 719次阅读
    <b class='flag-5'>U-boot</b>的执行流程

    U-Boot的启动及移植分析

    bootloader 开发是嵌入式系统必不可少而且十分重要的部分,U-Boot 为功能强大的bootloader 开发软件。本文详细分析了U-Boot 的启动流程,并结合其源码,阐述了U-Boot 在S3C2410 目标板上的
    发表于 09-01 16:34 27次下载

    Porting U-Boot to the Control

    In this paper, the way of porting U-Boot to Control Computer Based MPC8349 will beintroduced
    发表于 01-25 15:45 13次下载

    一种在U-BOOT嵌入千兆网络功能的方法

    一种在U-BOOT嵌入千兆网络功能的方法摘 要:U-BOOT是一种开放源码的、用于多种嵌入式微处理器的引导加载程序,目前U-BOOT仅支持10M/100M网络功能。本文介绍了一种让
    发表于 02-05 17:38 17次下载

    u-boot的Makefile分析

    u-boot的Makefile分析 U-BOOT是一个LINUX下的工程,在编译之前必须已经安装对应体系结构的交叉编译环境,这里只针对ARM,编译器系列软件为arm-linux-*。 U-BOOT的下载
    发表于 05-17 09:16 2074次阅读

    基于S3C2440的U-Boot开机logo的设计

    在对U-Boot进行深入分析的基础上,同时对S3C2440的LCD控制器原理以及INNOLUX 7寸LCD的成像原理进行分析,最后结合系统软硬件特性实现基于U-Boot的开机logo。通过实验验证表明,在
    发表于 12-06 15:14 96次下载
    基于S3C2440的<b class='flag-5'>U-Boot</b>开机logo的设计

    u-boot简介

    演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释能体现这一点
    发表于 10-14 11:17 3578次阅读

    fireflyAIO-3399J主板U-Boot使用介绍

    RK U-Boot 基于开源的 U-Boot 进行开发,工作模式有启动加载模式和下载模式。
    的头像 发表于 12-24 10:00 1667次阅读
    fireflyAIO-3399J主板<b class='flag-5'>U-Boot</b>使用介绍

    深度解析U-Boot网络实现

    对于U-Boot而言,并没有完整的实现上述模型,u-boot需要控制固件的尺寸,所以根据需要做了一些简化,其拓扑框架如下图所示:
    发表于 02-07 11:53 2次下载
    深度解析<b class='flag-5'>U-Boot</b>网络<b class='flag-5'>实现</b>

    U-Boot架构浅析

    导读:嵌入式Linux系统搭建,bootloader是必不可少的一环,而U-Boot已成嵌入式Linux事实标准。所以较为深入的分析U-Boot的设计,对于更...
    发表于 02-07 11:56 7次下载
    <b class='flag-5'>U-Boot</b>架构浅析

    u-boot中使用ethernet的方法

    KV260 petalinux BSP在u-boot device treedisable了GEM3,也就是说ethernet在u-boot不建议使用ethernet。
    的头像 发表于 07-21 10:25 3964次阅读

    在Vitis调试ARM可信固件和U-boot

    在本篇博文中,我们将探讨如何在 Vitis 调试 Zynq UltraScale 器件启动镜像。这些启动镜像包括 ARM 可信固件 (ATF) 和
    的头像 发表于 08-02 10:14 3691次阅读
    在Vitis<b class='flag-5'>中</b>调试ARM可信固件和<b class='flag-5'>U-boot</b>

    Linux U-Boot开发指南

    介绍 U-Boot 的编译打包、基本配置、常用命令的使用、基本调试方法等, 为 U-BOOT 的移植及应用开发提供了基础。
    的头像 发表于 03-06 10:28 1342次阅读
    Linux <b class='flag-5'>U-Boot</b>开发指南

    u-boot armv8链接脚本

    armv8u-boot使用arch/arm/cpu/armv8/u-boot.lds进行链接。 u-boot-spl和u-boot-tp
    的头像 发表于 12-07 11:19 719次阅读