一次简短的系统移植之旅

一次简短的系统移植之旅

此次移植其实不是很难,过程是自己参考网上资料,一个人不断地试验。如果旁边有熟悉流程的人指点的话,可能不会花那么多的时间,其实这种项目交给有类似经验的人来做的话,一个人进度会快很多,如果确实需要交给从没有类似经验的人来做,有人在旁边指点方向的话也不会走那么多的弯路。

参考文章:

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.cinclude/configs/smdk2416.hMakefilesmdk2416_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针对的是bootloadkernel的烧写,对yaffs文件系统的烧写单write不支持,故需要在common/cmd_nand.c中的do_nand函数增加对yaffs的支持。

参考http://blogold.chinaunix.net/u3/101649/showart.php?id=2134240黄刚

我的nand flash是大页的(2k+64),即每page2k的数据再加64byteOOB。整个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文件164CROSS_COMPILE ?=arm-linux-指定交叉编译器

busybox-1.18.4# make menuconfig

busybox-1.18.4# make install

make menuconfig各选项默认,会在_install中生成binsbinusrlinuxrc等文件系统。

 

b、创建文件系统的目录和文件

可以先建一个创建各目录的脚本mkrootfs.sh(网上找的),将刚才生成的binsbinusrlinuxrc拷贝到rootfs中。

 

c、添加一些需要的动态库到lib

有些库是必需的,例如bin/busybox所使用的库包括有libm.so.6libc.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

 

需要注意的是烧写地址应该和kernelnand的分区需要一致,我的分区信息如下(分区定义在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)

 

你可能感兴趣的:(vmware,Flash,byte,makefile,编译器,protocols)