Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3168055
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2014-09-19 15:04:34

原文地址:http://routeadd-net202.114.6.yulei.blog.chinaunix.net/uid-26744661-id-3812999.html

继上次解决了nfs启动后,今天接着搞yaffs2,在网络上查了许多资料。

从着手开始做,到启动成功,有以下工作。

1,使内核支持yaffs(对内核打yaffs2补丁,内核的nand移植)
2,制作yaffs2文件系统(mfyaffs2image工具)
3,烧录
4,启动

1. 克隆 yaffs2 源代码

点击(此处)折叠或打开

  1. [ZhShiH@localhost yaffs2]$ git clone git://
  2. 正克隆到 'yaffs2'...
  3. remote: Counting objects: 7598, done.
  4. remote: Compressing objects: 100% (4696/4696), done.
  5. remote: Total 7598 (delta 6008), reused 3624 (delta 2818)
  6. 接收对象中: 100% (7598/7598), 3.57 MiB | 83 KiB/s, done.
  7. 处理 delta 中: 100% (6008/6008), done.

2. 内核补丁

注意内核需要添加nand支持(同样,见的博客:http://blog.csdn.net/acanoe/article/details/7516341)。
给内核打上补丁,下载的yaffs2目录中,有一个patch-ker.sh脚本。

点击(此处)折叠或打开

  1. [ZhShiH@localhost yaffs2]$ cd yaffs2/
  2. [ZhShiH@localhost yaffs2]$ ./patch-ker.sh c m ../../kernel/linux-3.6.6/
  3. Updating ../../kernel/linux-3.6.6//fs/Kconfig
  4. Updating ../../kernel/linux-3.6.6//fs/Makefile

打完补丁后,kernel的fs目录中,多了3个文件:
yaffs2目录
Kconfig.pre.yaffs
Makefile.pre.yaffs

点击(此处)折叠或打开

  1. [ZhShiH@localhost fs]$ ls yaffs2/
  2. Kconfig yaffs_bitmap.h yaffs_guts.h yaffs_nand.h yaffs_tagscompat.c yaffs_vfs.c
  3. Makefile yaffs_checkptrw.c yaffs_linux.h yaffs_packedtags1.c yaffs_tagscompat.h yaffs_yaffs1.c
  4. yaffs_allocator.c yaffs_checkptrw.h yaffs_mtdif.c yaffs_packedtags1.h yaffs_tagsmarshall.c yaffs_yaffs1.h
  5. yaffs_allocator.h yaffs_ecc.c yaffs_mtdif.h yaffs_packedtags2.c yaffs_tagsmarshall.h yaffs_yaffs2.c
  6. yaffs_attribs.c yaffs_ecc.h yaffs_nameval.c yaffs_packedtags2.h yaffs_trace.h yaffs_yaffs2.h
  7. yaffs_attribs.h yaffs_getblockinfo.h yaffs_nameval.h yaffs_summary.c yaffs_verify.c yportenv.h
  8. yaffs_bitmap.c yaffs_guts.c yaffs_nand.c yaffs_summary.h yaffs_verify.h

  9. [ZhShiH@localhost fs]$ diff Kconfig Kconfig.pre.yaffs
  10. 206d205
  11. < source "fs/yaffs2/Kconfig"
  12. [ZhShiH@localhost fs]$ diff Makefile Makefile.pre.yaffs
  13. 128d127
  14. < obj-$(CONFIG_YAFFS_FS) += yaffs2/
  15. [ZhShiH@localhost fs]$
对内核进行“make menuconfig”,添加yaffs支持。

  1. File systems --->
  2. [*] Miscellaneous filesystems --->
  3. │ │ <*> yaffs2 file system support │ │
  4. │ │ -*- 512 byte / page devices │ │
  5. │ │ [ ] Use older-style on-NAND data format with pageStatus byte │ │
  6. │ │ [ ] Lets yaffs do its own ECC │ │
  7. │ │ -*- 2048 byte (or larger) / page devices │ │
  8. │ │ [*] Autoselect yaffs2 format │ │
  9. │ │ [ ] Disable yaffs from doing ECC on tags by default

然后make,内核ok。

3. 制作文件系统

(这里的前提是我已经完成了busybox制作系统:rootfs/)
在yaffs2的源码中,进入utils,执行make编译,mkyaffs2image和mkyaffsimage。用于制作yaffs文件系统。
如果出现“yaffs_guts.h:138:2: 错误:未知的类型名‘u8’” 之类的错误,那么下载一个稍早些的yaffs版本,这个版本里直接对u8、u16、u32进行了typedef,这份源码可以只用来编译出mkyaffs2image和mkyaffsimage,比较快捷吧。
为了以后方便使用,可以“cp mkyaffs2image mkyaffsimage /usr/bin”。


使用命令:
  1. mkyaffs2image rootfs/ rootfs.img
制作image。

4. 烧录:

用两种方式:

1)在uboot中烧录:(uboot1.1.6可以使用nand write.yaffs烧)

下载image,
  1. SMDK6410 # tftp c0008000 rootfs.img
  2. dm9000 i/o: 0x18000000, id: 0x90000a46
  3. MAC: 00:40:5c:26:0a:5b
  4. operating at 100M full duplex mode
  5. TFTP from server 192.168.1.108; our IP address is 192.168.1.109
  6. Filename 'rootfs.img'.
  7. Load address: 0xc0008000
  8. Loading: #####..............#####
  9. done
  10. Bytes transferred = 10169280 (9b2bc0 hex)

我们注意到,这个rootfs.img的大小为9b2bc0

同时,内核在添加了nand支持后,有打印以下信息:
  1. 0x000000000000-0x000000100000 : "Bootloader" (对应mtdblock0)
  2. 0x000000100000-0x000000600000 : "Kernel" (对应mtdblock1)
  3. 0x000000600000-0x000007e00000 : "User" (对应mtdblock2)
  4. 0x000007e00000-0x000010000000 : "File System" (对应mtdblock3)
注意到"User"的起始位置是0x000000600000

烧录:
  1. nand write.yaffs c0008000 600000 9b2bc0
我们将文件系统烧录到mtdblock2,所以:
nand write.yaffs命令中,起始位置是600000,是对应nand的mtdblock2分区的起始位置。

nand write.yaffs命令中,offset是9b2bc0,是对应了rootfs.img的大小,这里需要注意,这个offset必须是nand pagesize的整数倍,即(512+16或者2048+64)的整数倍所以,在烧录的时候,我们可以直接根据tftp下载的rootfs.img的大小,来设置这个offset。
否则会出现错误,如:
  1. NAND write: device 0 offset 0x400000, size 0x50000000
  2. Input block length is not page aligned
  3. Data did not fit into device, due to bad blocks
  4. 1342177280 bytes written: ERROR

2) 在系统中“烧录”:

我们通过nfs启动到系统(nfs系统中,包含一个系统包):
  1. [ZhShiH@localhost zhangsh]$ ls rootfs
  2. bin boot dev etc home lib linuxrc mnt proc root rootfs_yaffs2.tar.gz sbin sys tmp usr var
  3. [ZhShiH@localhost zhangsh]$

rootfs_yaffs2.tar.gz其实就是一个busybox制作的系统。

在nfs起的系统中:
  1. mount -t yaffs2 /dev/mtdblock2 /tmp
  2. (如果dev下没有这些设备文件,请检查在内核是否添加了nand的支持,是否移植了nand)
  3. tar xf /rootfs_yaffs2.tar.gz -C /tmp
即可。

bootargs root=/dev/mtdblock2 rootfstype=yaffs2 console=ttySAC0,115200

这样,通过在nand上启动yaffs2文件系统。

阅读(3953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~