主机:UBUNTU10.04LTS,交叉工具链为:arm-linux-gcc 2.95,安装目录:/usr/local/arm/2.95.3/bin
目标板:Edukit-III,S3c2410子板
问题描述:由于英蓓特公司的Edukit-III实验箱自带的LINUX为2.4版本,鉴于现在LINUX2.6的内核比较流行,因此想在Edukit-III上面移植LINUX2.6.18,在移植LINUX内核之前,首先应该移植VIVI,移植后的VIVI支持在NAND FLASH中启动LINUX,下面把移植过程简单记录一下。
【1.获得VIVI源码】
由于MIZI公司被WIND RIVER收购,因此网上以前提供的VIVI源码下载链接已经无效,FTP下载站点也找不到了VIVI的源码,所以这次就利用了Edukit-III实验箱上提供的VIVI源码来做移植。
【2.NAND FLASH分区划分】
一般情况下,NAND FLASH分为4个区,分别烧写vivi,param,kernel,root,其中vivi为编译好的vivi二进制文件;param为传递到linux kernel的参数,kernel为Linux内核,root为根文件系统,一般情况下这种文件系统为只读的cramfs文件系统,由于该系统不能写,因此这样的文件系统不太方便往开发板下载应用程序,所以希望在NAND FLASH分区中增加一个jffs2文件系统(该分区名字user),这样就可以往jffs2文件系统中写入自己开发的应用程序了。最终NAND FLASH被分为了5个区,分别为:vivi,param,kernel,root,user,这5个区在NAND FLASH中的起始地址和大小如下表所示
Name |
offset |
size |
size |
vivi |
0 |
0x00020000 |
128k |
param |
0x00020000 |
0x00010000 |
64k |
kernel |
0x00030000 |
0x002d0000 |
2M+832K |
root |
0x00300000 |
0x00300000 |
3M |
user |
0x00600000 |
0x00a00000 |
10M |
注意,Edukit-III使用的NAND FLASH类型为K9F5608U0,使用Edukit-III提供的Embest Onlie Flash Programmer,打开NAND FLASH烧写时的vivi配置文档(S3C2410&NandFLash_vivi.cfg),可以看到,该NAND FLASH一共有1025个sector,每个sector大小为16K,因此在规划NAND FLASH分区大小的时候,分区尺寸应该为16K的整数倍。按照这样的分区规划,如果制作出来的linux kernel或者文件系统比这个分区的尺寸要大,那么就要对该分区做出调整,重新编译vivi,或者对linux kernel、文件系统进行调整,使得能够适合分区大小。
每个分区的大小是这样考虑的,vivi编译出来一般70K大小,所以第一个vivi分区设置为128K,足够放得下vivi了,param为向LINUX内核传递参数,这个分区64K大小应该够用,kernel分区为存放linux2.6.18内核,该内核编译出来一般2M左右,所以用2M+832K的大小,足够放得下LINUX2.6.18内核,root存放cramfS文件系统,cramfs文件系统为高压缩文件系统,制作出来后一般为2M左右,剩下的分区就全部给user的jffs2文件系统。
【3.VIVI移植过程】
root@VMUBUNTU:/usr/src# tar xjvf vivi-20030929.tar.bz2 |
进入到vivi源码目录
root@VMUBUNTU:/usr/src# cd vivi root@VMUBUNTU:/usr/src/vivi# |
(1)修改该目录下的Makefile文件,
第17行改为:LINUX_INCLUDE_DIR= /usr/local/arm/2.95.3/include,该路径为交叉编译工具链的Include目录
第25行改为:CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-,该路径为交叉编译工具链的路径
第88行改为:ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3,该路径为交叉编译工具链的库所在的目录.保存退出
(2)修改arch/s3c2410/smdk.c,设置NAND FLASH的分区信息,依照上表对NAND FLASH的分区规划,修改如下:
#ifdef CONFIG_S3C2410_NAND_BOOT mtd_partition_t default_mtd_partitions[] = { { name: "vivi", offset: 0, size: 0x00020000, flag: 0 }, { name: "param", offset: 0x00020000, size: 0x00010000, flag: 0 }, { name: "kernel", offset: 0x00030000, size: 0x002d0000, flag: 0 }, { name: "root", offset: 0x00300000, size: 0x00300000, flag: MF_BONFS },{ name: "user", offset: 0x00600000, size: 0x00a00000, flag: MF_JFFS2 } }; |
其中这里的flash表示分区的标志,这个标志表示了这个分区的用途。通过source insight可以看到,这些标志定义在vivi/include/Priv_data.h
#define MF_LOCKED 0x00000001 #define MF_MUSTERASE 0x00000002 #define MF_BONFS 0x00000004 #define MF_JFFS2 0x00000008 #define MF_ISRAM 0x00000010 |
【4.配置编译运行vivi】
移植完成后,在vivi目录下执行配置编译vivi命令,会在vivi目录下生成vivi二进制文件
root@VMUBUNTU:/usr/src/vivi#make distclean root@VMUBUNTU:/usr/src/vivi#make menuconfig root@VMUBUNTU:/usr/src/vivi#make |
会在vivi目录下生成vivi二进制文件,通过ls命令查看
root@VMUBUNTU:/usr/src/vivi# ls arch COPYING CVS Documentation drivers include init lib Makefile Rules.make scripts test util vivi vivi-elf vivi.map |
打开Euukit-III配套的FLASH烧写程序Embest Online Flash Programmer,先载入烧写VIVI的FLASH配置文档(S3C2410&NandFLash_vivi.cfg),把vivi烧写到NAND FLASH中。注意,烧写之前,一定要把s3c2410子板的SW104跳线短接。烧写完成,重新启动开发板,可以在Windows的超级终端中看到VIVI的如下启动信息
VIVI version 0.1.4 (root@VMUBUNTU) (gcc version 2.95.3 20010315 (release)) #0.1. 4 Sat Oct 23 15:33:59 CST 2010 MMU table base address = 0x33DFC000 Succeed memory mapping. NAND device: Manufacture ID: 0xec, Chip ID: 0x75 (Samsung KM29U256T) Could not found stored vivi parameters. Use default vivi parameters. Press Return to start the LINUX now, any other key for vivi type "help" for help. |
在vivi提示符下,输入part show命令,可以看到Flash的分区信息如下
vivi> part show mtdpart info. (5 partitions) name offset size flag ------------------------------------------------ vivi : 0x00000000 0x00020000 0 128k param : 0x00020000 0x00010000 0 64k kernel : 0x00030000 0x002d0000 0 2M+832k root : 0x00300000 0x00300000 4 3M user : 0x00600000 0x00a00000 8 10M vivi> |
表示VIVI移植成功,下一步就要做LINUX2.6.18内核移植了。