u-boot-2009.11移植(适用于TQ2440和MINI2440)第七篇:引导内核启动

时间:2021-09-22 16:36:35

(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 ]#