您的位置:首页 > 其它

一次简短的系统移植之旅

2011-05-04 12:31 190 查看
一次简短的系统移植之旅
此次移植其实不是很难,过程是自己参考网上资料,一个人不断地试验。如果旁边有熟悉流程的人指点的话,可能不会花那么多的时间,其实这种项目交给有类似经验的人来做的话,一个人进度会快很多,如果确实需要交给从没有类似经验的人来做,有人在旁边指点方向的话也不会走那么多的弯路。
参考文章:
http://blogold.chinaunix.net/u3/101649/showart_2276917.html 黄刚
http://blog.csdn.net/woshixingaaa/archive/2011/02/24/6205353.aspx 李万鹏
http://blog.csdn.net/itismine/archive/2009/11/11/4799770.aspx 刘浩
http://www.linuxidc.com/Linux/2011-02/32772p5.htm bscbem

下面是目前自己的理解,有很多地方还是不懂,待以后继续加强理解。
一、 uboot的编译
由于uboot已经在nor中能够跑起来了,我这边就不需要改动太多。S3C2416相关的配置文件:board/samsung/smdk2416/smdk2416.c和include/configs/smdk2416.h。Makefile中smdk2416_config:这部分如有需要也可修改。还有记得修改交叉编译器,根目录下Makefile中找到CROSS_COMPILE ?= 修改为CROSS_COMPILE = arm-linux-;
s3c2416_uboot# make smdk2416_config
s3c2416_uboot# make
将根目录下生成的的u-boot.bin通过JTAG接口可以烧到nor flash中。

二、 uboot中支持yaffs2文件系统的烧写
由于uboot中自带write针对的是bootload或kernel的烧写,对yaffs文件系统的烧写单write不支持,故需要在common/cmd_nand.c中的do_nand函数增加对yaffs的支持。
参考http://blogold.chinaunix.net/u3/101649/showart.php?id=2134240黄刚
我的nand flash是大页的(2k+64),即每page有2k的数据再加64byte的OOB。整个flash大小=(2k + 64bytes)×64 Pages × 1024 Blocks = 128MB,当时以为这里跟小页的(512+16)的不一样,在这里怀疑了一段时间,其实是一样的。大页和小页我们需要做改动的是在mkyaffs2image.c中。

三、 yaffs2文件系统镜像的制作
参考http://www.linuxidc.com/Linux/2011-02/32772p5.htm bscbem

abusybox生成文件系统
官网下载busybox-1.18.4.tar.bz2并解压,进入busybox-1.18.4根目录修改Makefile文件164行CROSS_COMPILE ?=arm-linux-指定交叉编译器
busybox-1.18.4# make menuconfig
busybox-1.18.4# make install
make menuconfig各选项默认,会在_install中生成bin、sbin、usr、linuxrc等文件系统。

b、创建文件系统的目录和文件
可以先建一个创建各目录的脚本mkrootfs.sh(网上找的),将刚才生成的bin、sbin、usr、linuxrc拷贝到rootfs中。

c、添加一些需要的动态库到lib
有些库是必需的,例如bin/busybox所使用的库包括有libm.so.6和libc.so.6等,命令/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-readelf -d bin/busybox可以查知busybox所使用的库。到目前为止我往lib里面加了下面库(还需改)
[lanux@vmware:rootfs]-17:22$ ls lib
ld-2.6.1.so libcrypt.so libm.a libmenu.so.5
ld-linux.so libcrypt.so.1 libmcheck.a libmenu.so.5.6
ld-linux.so.3 libc.so libmemusage.so libmenu.so.5.bk
libcrypt-2.6.1.so libc.so.6 libmenu.a libm.so
libcrypt.a libm-2.6.1.so libmenu.so libm.so.6

d、添加一些启动所需的文件
[lanux@vmware:rootfs]-17:40$ ls etc
eth0-setting hosts ld.so.cache nsswitch.conf rc.d shadow
fstab inetd.conf ld.so.conf passwd resolv.conf sysconfig
group init.d mdev.conf profile rpc
hostname inittab networks protocols services
[lanux@vmware:rootfs]-17:40$

e、制作根文件系统映像文件
需要yaffs源码里面提供的工具。下载最新的yaffs源码包,解压至yaffs2_other,进入yaffs2_other/utils目录,对mkyaffs2image.c进行修改。主要是对write_chunk函数中进行修改,可参考
http://blog.csdn.net/itismine/archive/2009/11/11/4799770.aspx 刘浩
http://topic.csdn.net/u/20100225/09/dd14d827-e92a-46ed-b4ad-c5a9f4b90a65.html

[lanux@vmware:s3c2416_uboot]-10:06$ sudo ./mkyaffs2image /home/lanux/rootfs/ rootfs_v0503.img
rootfs_v0503.img通过uboot烧进nand中,在uboot中,从服务器上下载镜像到RAM中,烧写到nand:
J2534_DEBUG# tftp 30000000 192.168.0.241:rootfs_v0503.img
J2534_DEBUG# nand erase 500000 2000000
J2534_DEBUG# nand write.yaffs 30000000 500000 12bcdc0

设置bootargs参数:
J2534_DEBUG# printenv
J2534_DEBUG# setenv bootargs 'root=/dev/mtdblock2 rw init=/linuxrc console=ttySAC0,115200 rootfstype=yaffs2'
J2534_DEBUG# saveenv
J2534_DEBUG# reset

需要注意的是烧写地址应该和kernel对nand的分区需要一致,我的分区信息如下(分区定义在kernel源码linux-2.6.36/arch/arm/mach-s3c2416/mach-smdk2416.c中的变量定义static struct mtd_partition smdk2416_nand_part[]):
[ 0.765000] 0x000000000000-0x000000100000 : "u-boot"
[ 0.770000] 0x000000100000-0x000000500000 : "kernel"
[ 0.775000] 0x000000500000-0x000002500000 : "rootfs"
[ 0.780000] 0x000002500000-0x000008000000 : "work"

四、 内核2.6.36的编译

内核版本:linux-2.6.36,交叉编译器:arm-linux-gcc 4.2.2。下载最新的yaffs2源码,给内核打补丁,加上对yaffs的支持。
配置内核,linux-2.6.36# make menuconfig
在Kernel Features--->中选上[*] Use the ARM EABI to compile the kernel
在File systems--->[*] Miscellaneous filesystems--->中
[ ] Use older-style on-NAND data format with pageStatus byte
[*] Lets Yaffs do its own ECC
[ ] Use the same ecc byte order as Steven Hill's nand_ecc.c
-*- 2048 byte (or larger) / page devices
[*] Autoselect yaffs2 format
在Device Drivers---><*> Memory Technology Device (MTD) support---><*> NAND Device Support--->中
[ ]Samsung S3C NAND Hardware ECC这个disable掉。
另外drivers/mtd/nand/s3c2410.c中840行chip->ecc.mode = NAND_ECC_SOFT;改为chip->ecc.mode = NAND_ECC_NONE;

注意这里的内核入口地址和载入地址:
linux-2.6.36# mkimage zImage
linux-2.6.36# mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "linux-2.6.36" -d ./arch/arm/boot/zImage uImage

将uImage烧入nand中:
J2534_DEBUG# tftp 30000000 192.168.0.241:uImage
J2534_DEBUG# nand erase 100000 300000
J2534_DEBUG# nand write 30000000 100000 300000
参考:http://blogold.chinaunix.net/u3/101649/showart.php?id=2073912 黄刚

附:硬件环境
ARM:S3C2416
NOR FLASH: SST39VF6401B(64 Mbit (x16))
NAND FLASH: HY27UF081G2A(128M X 8b)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: