微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(五)

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(五)

时间:11-20 来源:互联网 点击:
一、移植环境

  • 机:VMWare--Fedora 9
  • 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4
  • 编译器:arm123.com.cn/linux/arm-linux-gcc-4.3.2.tgz" target="_blank">arm-linux-gcc-4.3.2.tgz
  • u-boot:u-boot-2009.08.tar.bz2

二、移植步骤

9)实现u-boot对yaffs/yaffs2文件系统下载的支持。

注意:此篇对Nand的操作是基于MTD架构方式,在“u-boot-2009.08在2440上的移植详解(三)”中讲到过。

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

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

Yaffs页结构说明
==============================================
字节 用途
==============================================
0 - 511 存储数据(分为两个半部)
512 - 515 系统信息
516 数据状态字
517 块状态字
518 - 519 系统信息
520 - 522 后半部256字节的ECC
523 - 524 系统信息
525 - 527 前半部256字节的ECC
==============================================

好了,在了解Nand Flash组成和Yaffs/yaffs2文件系统结构后,我们再回到u-boot中。目前,在u-boot中已经有对Cramfs、Jffs2等文件系统的读写支持,但与带有数据校验等功能的OOB区的Yaffs/Yaffs2文件系统相比,他们是将所有文件数据简单的以线性表形式组织的。所以,我们只要在此基础上通过修改u-boot的Nand Flash读写命令,增加处理00B区域数据的功能,即可以实现对Yaffs/Yaffs2文件系统的读写支持。


实现对Yaffs或者Yaffs2文件系统的读写支持步骤如下:

①、在include/configs/my2440.h头文件中定义一个管理对Yaffs2支持的宏和开启u-boot中对Nand Flash默认分区的宏,如下:

#gedit include/configs/my2440.h//添加到文件末尾即可

#define CONFIG_MTD_NAND_YAFFS21//定义一个管理对Yaffs2支持的宏

//开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致
#define MTDIDS_DEFAULT"nand0=nandflash0"
#define MTDPARTS_DEFAULT"mtdparts=nandflash0:192k(bootloader),"\
"64k(params),"\
"2m(kernel),"\
"-(root)"

②、在原来对Nand操作的命令集列表中添加Yaffs2对Nand的写命令,如下:

#gedit common/cmd_nand.c//在U_BOOT_CMD中添加

U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand,
"NAND sub-system",
"info - show available NAND devices\n"
"nand device [dev] - show or set current device\n"
"nand read - addr off|partition size\n"
"nand write - addr off|partition size\n"
" read/write size bytes starting at offset off\n"
" to/from memory address addr, skipping bad blocks.\n"

//注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
#if defined(CONFIG_MTD_NAND_YAFFS2)
"nand write[.yaffs2] - addr off|partition size - write `size byte yaffs image\n"
"starting at offset off from memory address addr (.yaffs2 for 512+16 NAND)\n"
#endif

"nand erase [clean] [off size] - erase size bytes from\n"
" offset off (entire device if not specified)\n"
"nand bad - show bad blocks\n"
"nand dump[.oob] off - dump page\n"
"nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n"
"nand markbad off [...] - mark bad block(s) at offset (UNSAFE)\n"
"nand biterr off - make a bit error at offset (UNSAFE)"
#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
"\n"
"nand lock [tight] [status]\n"
" bring nand to lock state or display locked pages\n"
"nand unlock [offset] [size] - unlock section"
#endif
);


接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下:

if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0)
{
int read;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top