(1)修改机器码
要保证uboot与linux内核的机器码一致,这样才能启动内核。
在之前board/sunzl/sunzl2440/sunzl2440.c中我们定义了
#if defined(CONFIG_S3C2440)
/* arch number of S3C2440-Board*/
gd->bd->bi_arch_number= MACH_TYPE_S3C2440 ;
#endif
即我们的uboot移植是以uboot自带的S3C2440开发板为模板的,所以我们还是按照S3C2440的机器码来移植,MACH_TYPE_S3C2440的具体数值在include/asm/mach-types.h文件中已有定义:
#define MACH_TYPE_S3C2440 362
这个机器码应该和在内核中的arch/arm/tools/mach-types文件下的机器码一致。
s3c2440 MACH_S3C2440 S3C2440 362
本次移植机器码是一致的,所以不用修改。
(2) 修改bootcmd和bootargs参数
其中bootcmd是为了引导内核,而bootargs是为了在加载根文件系统时,给根文件系统传递必要的参数。可以有两种方法来设置这两个参数:
第一种方法是在uboot的提示符下直接设置bootcmd和bootargs这两个参数:
sunzl2440 # setenv bootcmd ' nand read 31000000 100000 400000; bootm 31000000 '
sunzl2440 # setenv bootargs ' root=/dev/mtdblock3 rw noinitrd init=/linuxrc console=ttySAC0, 115200 rootfstype=cramfs mem=64M'
sunzl2440 # saveenv
如果要挂载jffs2或者yaffs2文件系统,将 rootfstype=cramfs改为rootfstype=jffs2或者yaffs2
在这里bootcmd的含义是从nandflash中读取kernel,内核分区100000 到500000,此时的100000为起始地址,400000为偏移地址,然后利用命令bootm启动。
bootargs的含义详细如下:
mtdblock3代表第4个flash分区,用来存放根文件系统rootfs;
rw代表文件系统可读可写;
console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上,波特率为115200;
mem=64M表示内存是64M,如果是32则设为32M
rootfstype=cramfs代表文件系统的格式为cramfs。如果没有这句,系统启动时即使分区挂载正确了,但是文件系统的类型有可能出错。在这里定义过,就不会出错了。这里的选项也和根文件系统的配置有关。(我先使用cramfs做根文件系统,以后再换JFFS2或是YAFFS)
最后还要应用saveenv命令来保存这两个变量。这时,如果你在提示符下敲入printenv命令,则会看到uboot的环境参数多了两项,如:
bootargs=root=/dev/mtdblock3 rw noinitrd init=/linuxrc console=ttySAC0,115200 rootfstype=cramfs mem=64M
bootcmd=nand read 31000000 100000 400000; bootm 31000000
第二种方法是在include/configs/sunzl2440.h内修改CONFIG_BOOTARGS和CONFIG_BOOTCOMMAND这两个宏定义:
#defineCONFIG_BOOTDELAY 3
//#defineCONFIG_BOOTARGS "console=ttySAC0root=/dev/nfs " \
"nfsroot=192.168.0.1:/friendly-arm/rootfs_netserv" \
"ip=192.168.0.69:192.168.0.1:192.168.0.1:255.255.255.0:debian:eth0:off"
#defineCONFIG_BOOTARGS " root=/dev/mtdblock3 rw noinitrd init=/linuxrc console=ttySAC0 ,115200 rootfstype=cramfs mem=64M"
/*特别注意console=ttySAC0 ,115200这一命令中,ttySAC0,115200之间不要有空格,否则文件系统挂载后波特率不匹配会打印乱码,切记!!!!!!!!*/
#defineCONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.0.69
#defineCONFIG_SERVERIP 192.168.0.1
/*#defineCONFIG_BOOTFILE "elinos-lart" */
//#defineCONFIG_BOOTCOMMAND "dhcp;bootm"
#define CONFIG_BOOTCOMMAND " nand read 31000000 100000 400000 ; bootm 31000000"
#ifdefined(CONFIG_CMD_KGDB)
#defineCONFIG_KGDB_BAUDRATE 115200 /* speed to run kgdb serial port */
(3)重新编译并测试
make distclean
make sunzl2440_config
Configuring for sunzl2440board...
make
编译完成后烧到板子上,重启出现如下界面:
U-Boot 2009.11 (Oct 07 2015 - 15:09:27)
sunzl
Love Linuxforever!!
DRAM: 64 MB
Flash: 2 MB
NAND: 256 MiB
*** Warning - bad CRC or NAND, using defaultenvironment
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
[ u-boot@sunzl ]#