经过两天的努力,在参考无数网络文章后,终于在tiny210开发板上用uboot+nfs的方式让Android系统跑了起来。
目前实现的功能包含但不限于以下内容:
1. 制作SD启动卡
2. uboot支持DM9000
3. uboot支持usb dnw功能
4. uboot为2011.12版本
5. linux支持512M内存
6. 可以从NFS上加载rootfs
7. tiny210+uboot+nfs成功启动android.
一、制作SD启动卡
两条命令即可:
$dd iflag=dsync oflag=dsync if=out/spl/tiny210-spl.bin of=/dev/sdc seek=1
$dd iflag=dsync oflag=dsync if=out/u-boot.bin of=/dev/sdc seek=49
其中tiny210-spl.bin是由如下命令生成的(uboot编译过程中抓取)
/work/tiny210/u-boot-2011.12-tiny210/board/samsung/tiny210/tools/mktiny210spl.exe \
/work/tiny210/u-boot-2011.12-tiny210/out/spl/u-boot-spl.bin /work/tiny210/u-boot-2011.12-tiny210/out/spl/tiny210-spl.bin
而mktiny210spl.exe是由mkv210_image.c编译而来
而seek=49,这个数字49是由mkv210_image.c的IMG_SIZE有关系。
二、支持512M内存
这部分修改仅涉及linux, 在arch\arm\mach-s5pv210\include\mach\memory.h文件中
将
#define SECTION_SIZE_BITS28
#define NODE_MEM_SIZE_BITS 28
改为
#define SECTION_SIZE_BITS29
#define NODE_MEM_SIZE_BITS 29
再重新编译linux即可,否则uboot加载linux后,跳至linux却无法启动。
三、添加usb dnw功能
这个功能的代码主要沿用了s3c64xx的usbd-otg-hs.c/.h文件,改动不多,可在最初调试过程中,却花了很长的时间
最后发现是usb clk的问题,如下方法解决
在s3c_usbctl_init()函数内加入OTHERS_REG |= (1<<16);
int s3c_usbctl_init(void)
{
OTHERS_REG |= (1<<16);//这是210与6410最大的区别
...
}
再增加一个cmd_dnw.c文件,并添加U_BOOT_CMD。
四、让linux支持NFS
我最初没加这个功能,一直用NFS启动不了。 后来才发现是内核不支持NFS。
只要在linux配置中加入NFS ROOT相关即可。
我打开了如下功能:
# CONFIG_UFS_FS is not set
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
# CONFIG_NFS_V4 is not set
CONFIG_ROOT_NFS=y
# CONFIG_NFSD is not set
五、设置uboot启动参数与命令
1. PC上执行 $/mkimage -n "Kernel 2.6.35" -A arm -O linux -T kernel -C none -a 20A07fc0 -e 20A08000 -d zImage uzImage 用来制作uimage
2. 开发板上执行
$setenv bootargs root=/dev/nfs console=ttySAC0,115200 init=/linuxrc nfsroot=172.16.101.132:/work/tiny210/android-2.3.1-tiny210/rootfs_dir ip=192.168.170.40:172.16.101.132:192.168.170.200:255.255.255.0:tiny210:eth0:off fbcon=rotate:1
$setenv bootcmd 'dnw 0x20A07fc0;bootm 0x20a07fc0'
$saveenv
最后执行boot, 根据提示在PC上执行$dnw uzImage, 内核将被下载到开发板的内存中(0x20A07fc0), 系统再自动执行bootm指令,启动linux,
linux内核在完成初始化之后,将以172.16.101.132:/work/tiny210/android-2.3.1-tiny210/rootfs_dir 为root fs启动android系统。