U-Boot -- the Universal Boot Loader
u---通用的
1、支持多种架构的CPU:x86、powerPC、ARM、MIPS....
2、支持多种CPU的电子板:mini2440、smdkv210、smdk2410.......
3、支持多种操作系统,如:linux、wince、vxworks......
boot是一个bootloader
1、boot
做CPU级初始化、板级初始化,完成一个硬件平台的启动
2、loader
加载操作系统内容,并启动内核.....,后面与uboot没有任何关系
uboot的官网:
ftp://ftp.denx.de/pub/u-boot/
http://www.denx.de/wiki/U-Boot/WebHome
1、查看uboot支持的命令
GEC210 # ?
GEC210 # help
2、version
GEC210 # version
U-Boot 1.3.4 (Aug 9 2013 - 15:03:53) for GEC210
3、bdinfo(bd)
GEC210 # bdinfo
arch_number = 0x00000998 //uboot针对board的一个ID号,会与kernel对应ID做对比,如果相符,内核就会启动。
env_t = 0x00000000
boot_params = 0x30000100 //uboot在启动kernel的时候,会传递参数给kernel,uboot将参数放在0x30000100地址上
DRAM bank = 0x00000000 //DDR2 ch0
-> start = 0x30000000
-> size = 0x10000000
DRAM bank = 0x00000001 //DDR2 ch1
-> start = 0x40000000
-> size = 0x10000000
ethaddr = 00:40:5C:26:0A:5B //MAC地址
ip_addr = 192.168.1.190 //ip地址
baudrate = 115200 bps //串口的波特率
4、printenv(pri)
GEC210 # printenv
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
netmask=255.255.255.0
bootargs=console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock4 rootfstype=yaffs rw
machid=0x998
ipaddr=192.168.1.190
gatewayip=192.168.1.1
bootdelay=5
bootcmd=nand read 0x30008000 0x600000 0x500000;bootm 0x30008000
serverip=192.168.1.9
stdin=serial
stdout=serial
stderr=serial
1)bootargs ----启动参数 args ---arguments
告诉内核,如何找到rootfs,并且启动linux的第一个进程(init)
(1)console=ttySAC0,115200 //内核使用的控制台是uart0,115200bps
(2)init=/linuxrc 启动的linux第一个进程是/linuxrc ,即启动shell命令环境
lrwxrwxrwx 1 root root 11 Sep 5 2012 linuxrc -> bin/busybox
busybox---->生成shell工具
(3)root=/dev/mtdblock4 //存放的是rootfs(nand的第四个分区),告诉内核去哪里挂载rootfs
[root@YueQian /]# ls /dev/mtdblock4 -l
brw-rw---- 1 root root 31, 4 Jan 1 13:08 /dev/mtdblock4 //nand flash的第四个分区
(4)rootfstype=yaffs rw
挂载的rootfs的格式,并且是可读写的。
#setenv bootargs 'console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock4 rootfstype=yaffs rw'
#saveenv
2)machid=0x998
uboot针对该平台的机器ID
#setenv machid 0x999
3)ipaddr=192.168.1.190 //GEC210平台IP
#setenv ipaddr 192.168.1.110
#saveenv
4)gatewayip=192.168.1.1
#setenv gatewayip 192.168.1.1
#saveenv
5)serverip=192.168.1.9 // linux主机ip
#setenv serverip 192.168.1.9
#saveenv
技巧:
# setenv severip 192.168.1.9
#setenv severip
#saveenv
6)bootdelay=5 //启动操作系统的等待时间
#setenv bootdelay 3
#saveenv
7)bootcmd 启动命令 cmd ---command
告诉uboot去哪里找内核映像(uImage/zImage),并且启动内核映像
(1)read 0x30008000 0x600000 0x500000;
从nand flash的0x600000地址拷贝0x500000大小的内容(linux的内核映像)到DDR2内存的0x30008000地址下
(2)bootm 0x30008000
从0x30008000地址上开始启动内核映像
从nand中启动内核
#setenv bootcmd “nand read 0x30008000 0x600000 0x500000;bootm 0x30008000”
#saveenv
自动下载裸机程序,并启动裸机程序
#setenv bootcmd “tftp 0x30000000 led.bin; go 0x30000000”
#saveenv
从网络启动内核映像
#setenv bootcmd 'tftp 0x30008000 uImage; bootm 0x30008000'
#saveenv
三、如何应用uboot去更新u-boot.bin、zImage、rootfs.img
思路:先使用tftp将要更新的文件下载到DDR2内存中,然后再进行nand的烧写
1、如何更新uboot
#tftp 0x400000000 u-boot.bin
#nand erase 0x0 0x100000
#nand write 0x40000000 0x0 0x100000
2、使用uboot更新自zImage
#tftp 0x40000000 zImage
#nand erase 0x600000 0x500000
#nand write 0x40000000 0x600000 0x500000
3、使用uboot更新rootfs
#tftp 0x40000000 rootfs.img
#nand erase 0xe00000 0xf200000 //242MB
#nand write.yaffs 0x40000000 0xe00000 0xxxxx //0xxxx--->实际的下载大小,tftp的传输后的报告
=========================================================================================================
四、uboot输出
stage1:相当于BL1,这段代码完成CPU级初始化,最关键初始化时钟和内存,该阶段代码是汇编写的。
stage2:相当于BL2,使用C做的,这部分代码都是通用的代码。主要是完成uboot工具和操作系统的启动.....
//1、在ARM汇编,BL1
OK
//2、BL2
U-Boot 1.3.4 (Aug 9 2013 - 15:03:53) for GEC210
CPU: S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz
MPLL = 667MHz, EPLL = 96MHz
HclkDsys = 166MHz, PclkDsys = 83MHz
HclkPsys = 133MHz, PclkPsys = 66MHz
SCLKA2M = 200MHz
Serial = CLKUART
Board: GEC210
DRAM: 512 MB
Flash: 8 MB //nor flash
SD/MMC: 3724MB
NAND: 256 MB
In: serial
Out: serial
Err: serial
backlight_brigness_init
Enter into Normal mode
Hit any key to stop autoboot: 0
//3、去启动设备(nand flash、SD卡),找内核映像(uImage、zImage),拷贝到DDR2内存中
NAND read: device 0 offset 0x600000, size 0x500000
Main area read (40 blocks):
5242880 bytes read: OK
get_format
//4、uboot去分析内核映像文件的头(uImage)
-------- 1 --------
## Booting kernel from Legacy Image at 30008000 ...
Image Name: linux-2.6.35.7
Created: 2013-07-02 7:40:27 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4065428 Bytes = 3.9 MB
Load Address: 30008000 //加载地址
Entry Point: 30008040 //入口地址
Verifying Checksum ... OK
get_format
-------- 1 --------
XIP Kernel Image ... OK
OK
Using machid 0x998 from environment
//5、启动内核
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
//6、调用了kernel
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 2.6.35.7-GEC210 (root@localhost.localdomain) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #183 PREEMPT Tue Jul 2 15:38:19 CST 2013
[ 0.000000] CPU: ARMv7 Processor [412fc082] revision 2 (ARMv7), cr=10c53c7f
[ 0.000000] CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[ 0.000000] Machine: GEC210
uboot 的启动命令和启动参数
一、启动命令
告诉 uboot
去哪里找内 kernel,然后启动
kernel
1、uImage/zImage
在 nand flash
#setenv bootcmd 'nand read 0x30008000 0x600000 0x500000; bootm 0x30008000'
2、uImage/zImage
在 tftp server
#setenv bootcmd 'tftp 0x30008000 uImage; bootm 0x30008000'
二、启动参数
告诉 kernel,rootfs
在哪里,然后在挂载根文件系统
1、rootfs
在 nand
内
#setenv bootargs 'console=ttySAC0,115200 init=/linuxrc root=/dev/mtdblock4 rootfs=yaffs rw'
2、rootfs
在 nfs server
#setenv bootargs 'console=ttySAC0,115200 init=/linuxrc root=/dev/nfs rw nfsroot=192.192.1.2:/nfsboot
ip=192.168.1.3:192.168.1.1::255.255.255.0::eth0:off'