这里只简单介绍一些过程(经过实地验证,可以保证在tiny210开发板上运行), 并不介绍过多的理论。
总结起来是: 首先用mkimage制做uimage, 然后在开发板上设置bootargs和bootcmd环境变量并保存,再重启开发板并根据提示在下载代码,最后系统自动运行系统。
一、修改uboot & linux代码,以保证支持tiny210开发板
1. 修改uboot的代码, include\config\tiny210.h文件,保证 #define MACH_TYPE_TINY210 3466, 保证机器码与内核的设置一致。
2. 修改arch/arm/mach-s5pv210/include/mach/memory.h, 将
#define SECTION_SIZE_BITS 28
#define NODE_MEM_SIZE_BITS 28
修改为
#define SECTION_SIZE_BITS 29
#define NODE_MEM_SIZE_BITS 29
以支持512M内存。
完成上述修改,分别编译uboot和kernel.
二、 制作u image (以下命令在PC上执行)
1. 从linux工程中拷贝来 zImage和ramdiskimg
2. 编译u-boot,在out\tools目录下找到mkimage这个工具软件。该软件用来生成uImage。
3. 用mkimage制作uzimage和uramdiskimg。方法如下:
$./mkimage -n "Kernel 2.6.35" -A arm -O linux -T kernel -C none -a 20a07fc0 -e 20a08000 -d zImage uzImage
$mkimage -n "RAMFS" -A arm -O linux -T ramdisk -C none -a 21A00000 -e 21A00040 -d ramdisk.img uramdiskimg
注: 20a07fc0表示uzImage下载到内存中的地址。
三、设置 uboot环境变量,供开机自动运行(以下命令在开发板上执行,通过串口终端等)
在uboot启动后,通过 setenv来设置环境变量,并用saveenv来保存(保存到boot media中)
setenv bootargs root=0x20A00040 console=ttySAC0,115200 init=/linuxrc androidboot.console=s3c2410_serial0
setenv bootcmd 'dnw 0x20a07fc0; dnw 0x21a00000; bootm 0x20a07fc0'
save env
注: bootargs 表示启动参数
bootcmd包含了三个过程, 下载uzImage, 下载uramdiskimg, 最后执行bootm 0x20a07fc0
四、重启开发板(保持开发板用USB线与PC连接)
uboot会让用户有3秒钟(可定制)的时间来退出自动boot,否则自动执行bootcmd
根据提示,在pc上执行$dnw uzImage
再根据提示,在pc上执行$dnw uramdiskimg
接下来系统将自动执行bootm
linux开始启动.....
注: 本文介绍的是用USB来下载镜像,不同于tftp。 这只是个传输手段不同而已,要想让u-boot支持usb dnw, 需要在u-boot中移植usb dnw相关代码。
同时在pc上需要一个dnw工具,笔者是在linux系统下运行,所以需要编译linux下的dnw工具。