U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot是从PPCBOOT逐步发展演化而来,其源码目录、编译形式与Linux内核很相似。U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD。VxWorks、QNX、RTEMS、ARTOS、LynxOS嵌入式操作系统。其目前要支持的目标操作系统包括OPenBSD 、NetBSD、FreeBSD、4 4BSD 、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、VxWorks、LynxOS、pSOS、QNX、RTEMS和ARTOS。这是U-Boot中Universal的一层含义。另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM 、Nios、XScale等诸多常用系列的处理器。除了硬件初始化之外,U-Boot的大部分功能的代码是可以跨硬件平台使用的。只需要对U-Boot的硬件部分代码做一些修改,就可以运行在不同的平台上。
U-Boot支持系统引导、上电自检功能、设备驱动等功能,它的主要特性如下:
- 支持NFS挂载、RAMDISK 系统引导(压缩或非压缩)形式的根文件系统
- 支持NFS挂载,从Flash中引导压缩或非压缩系统内核
- 强大的操作系统接口功能,可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布
- 支持目标板环境参数的多种存储方式,如Flash、NVRAM、EEPROM
- CRC32校验,可校验Flash中内核、RAMDISK镜像文件是否完好
- 串口、SDRAM、Flash、以太网、LCD、NVRAM、EEPROM、键盘、USB、PCMCIA、PCI、RTC等驱动支持
- SDRAM、Flash大小自动检测;SDRAM 故障检测;CPU型号
- XIP内核引导
可从U-Boot的官方网站http://sourceforge.net/projects/U-Boot上获得发布的最新版本U-Boot源码。以下是U-Boot最重要的目录:
目录名 | 说明 |
Board | 目标板相关文件,主要包含SDRAM、Flash驱动; |
Common | 独立于处理器体系结构的通用代码,如内存大小探测与故障检测; |
Cpu | 与处理器相关的文件,如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件; |
Driver | 通用设备驱动,如CFI Flash驱动 |
Examples | 可在U-Boot下运行的示例程序; |
Lib-XXX | 处理器体系相关的文件,如lib-PPC,lib-arm 目录分别包含与PowerPC、ARM体系结构相关的文件; |
Net | 与网络功能相关的文件目录,如bootp、nfs、tftp; |
Post | 上电自检文件目录 |
Rtc | RTC驱动程序 |
Tools | 用于创建BIN镜像文件等的工具 |
表1 U-Boot重要的目录
为了使U-Boot支持新的开发板,必须对代码进行修改。最简便的做法是在U-Boot已经支持的开发板中选择一种和目标板接近的,并在其基础上进行修改。例如如果处理器是S3C2410,可以参照board目录下的smdk2410目录。U-Boot上电启动后,敲任意键可以退出自动启动状态,进入命令行:
U-Boot 1.1.4 (Nov 12 2007 - 21:58:00) U-Boot code: 33F80000 -> 33F9C2FC BSS: -> 33FA045C RAM Configuration: Bank #0: 30000000 64 MB Flash: 2 MB NAND: 64 MB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial YL2410 # |
在命令行提示符下,可以输入U-Boot的命令并执行。U-Boot可以支持几十个常用命令,通过这些命令,可以对开发板进行调试,可以引导Linux内核,还可以擦写Flash完成系统部署等功能。掌握这些命令的使用,才能够顺利地进行嵌入式系统的开发。输入help命令,可以得到当前U-Boot的所有命令列表。每一条命令后面是简单的命令说明。
YL2410 # help ? - alias for 'help' autoscr - run script from memory base - print or set address offset bdinfo - print Board Info structure boot - boot default, i.e., run 'bootcmd' bootd - boot default, i.e., run 'bootcmd' bootelf - Boot from an ELF image in memory bootm - boot application image from memory bootp - boot image via network using BootP/TFTP protocol bootvx - Boot vxWorks from an ELF image cmp - memory compare coninfo - print console devices and information cp - memory copy crc32 - checksum calculation date - get/set/reset date & time dcache - enable or disable data cache echo - echo args to console erase - erase FLASH memory flinfo - print FLASH memory information go - start application at address 'addr' help - print online help icache - enable or disable instruction cache iminfo - print header information for application image imls - list all images found in flash itest- return true/false on integer compare loadb - load binary file over serial line (kermit mode) loads - load S-Record file over serial line loop - infinite loop on address range md - memory display mm - memory modify (auto-incrementing) mtest - simple RAM test mw - memory write (fill) nand - NAND sub-system nboot - boot from NAND device nfs - boot image via network using NFS protocol nm - memory modify (constant address) ping- send ICMP ECHO_REQUEST to network host printenv- print environment variables protect - enable or disable FLASH write protection rarpboot- boot image via network using RARP/TFTP protocol reset - Perform RESET of the CPU run - run commands in an environment variable saveenv - save environment variables to persistent storage setenv - set environment variables sleep - delay execution for some time tftpboot- boot image via network using TFTP protocol version - print monitor version |
下面介绍各条命令的具体用法:
1)bdinfo – 显示开发板信息
bdinfo命令在终端显示诸如内存地址和大小、时钟频率、MAC地址等板级信息。这些信息在传递给Linux内核一些参数时会用到。
2)coninfo – 显示控制台设备和信息
coninfo命令可以显示可用的控制I/O设备信息。
serial 80000003 SIO stdin stdout stderr |
这个输出结果意为串口设备是一个系统设备(标志‘S’),它提供输入(标志‘I’)和输出(标志‘O’)功能,而且当前已经指派给3个标准I/O流:tdin,stdout 和stderr。
3)flinfo – 显示Flash存储信息
flinfo命令用于获取可用的flash存储信息。
4)iminfo – 显示映像文件头部信息
iminfo (简写为imi) 用于显示像Linux内核或者ramdisk之类的映像文件的头部信息。它显示映像名、类型、大小以及CRC32校验和以验证文件没问题。
5)base – 显示或者设置地址偏移
可以使用base命令来显示或者设置一个基地址作为所有存储类命令的地址偏移值。默认的基址是0,这时输入的所有地址都是实地址。当需要重复访问某一特定存储区域时,如果设置此区域的开始地址作为基址,命令地址只需使用偏移地址,这会带来许多方便。
YL2410 # base Base Address: 0x00000000 YL2410 # md 0 c 00000000: feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x 00000010: 3cfb3b78 3b000000 7c0002e4 39000000 <.;x;...|...9... 00000020: 7d1043a6 3d000400 7918c3a6 3d00c000 }.C.=...y...=... YL2410 # base 40000000 Base Address: 0x40000000 YL2410 # md 0 c 40000000: 27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1. 40000010: 3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 - 40000020: 2031393a 35353a30 34290000 00000000 19:55:04)...... |
6)crc32 – 校验和计算
crc32(简写为crc)用来计算在某一范围内存储区域的CRC32校验和。
YL2410 # crc 100004 3FC CRC32 for 00100004 ... 001003ff ==> d433b05b YL2410 # 当后面加了3个参数时,此命令会把计算结果保存在给定存储地址内。 YL2410 # crc 100004 3FC 100000 CRC32 for 00100004 ... 001003ff ==> d433b05b YL2410 # md 100000 4 00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8'.<.....<. YL2410 # |
可以看到,CRC32的校验和不仅显示出来了,还存储在地址为0x10000000的存储单元里。
7) cmp – 存储单元比较
使用cmp命令可以比较两个存储区域的内容是否一致。这个命令不仅可以测试由第3个参数确定的整个区域,还可以在第一个不同的地方停下来。
YL2410 # cmp 100000 40000000 400 word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342) Total of 1 word were the same |
8)cp – 存储器拷贝
cp用来复制存储单元。cp 可以使用类型标识符.l , .w和.b。.b以字节为单位;.w以字为单位;.l以长字为单位。
YL2410 # cp.b 40000000 100000 10000 |
9) md – 显示存储单元内容
md采用十六进制和ASCII码两种形式来显示存储单元的内容。
YL2410 # md 0x10000000 10000000: d123d123 ad75ad75 a535a535 f800f800 #.#.u.u.5.5..... 10000010: 00000000 00000000 e164e164 582c582c ........d.d.,X,X 10000020: ce79ce79 07e007e0 bdf7bdf7 001f001f y.y............. 这条命令同样可以采用类型标识符.l, .w和.b : YL2410 # md.b 0x10000000 10000000: f7 bd d7 d9 b7 b5 96 32 76 ad 55 58 e0 a5 b3 e0 .......2v.UX.... 10000010: e0 f8 94 00 00 00 70 00 00 58 68 58 2c 00 00 58 ......p..XhX,..X 10000020: 18 e1 1f be 1f 9c 94 bd b6 b5 64 ad 75 9c a4 a5 ..........d.u... 10000030: b3 e0 1f 07 00 e1 00 00 00 00 94 00 00 58 64 58 .............XdX |
10)mtest – 简单的RAM测试
mtest提供一个简单的存储器测试。mtest会向存储器写入数据,如果测试的存储范围包括中断向量表、内核映像、堆栈或者堆存放的单元等区域,可能导致系统崩溃,所以使用时要格外小心。
YL2410 # help mtest mtest [start [end [pattern]]] - simple RAM read/write test YL2410 # mtest 100000 200000 Testing 00100000 ... 00200000: Pattern 0000000F Writing... Reading... YL2410 # |
11) mw – 写存储器
mw是一种向存储器写数据的方法。mw也可以带.l, .w和.b等标识符表示写入的单位。Mw的主要参数包括写入地址,写入内容,写入大小。
YL2410 #mw.w 100004 1155 6 YL2410 # md 100000 10 00100000: 00000000 11551155 11551155 11551155 .....U.U.U.U.U.U 00100010: 00000000 00000000 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ YL2410 #mw.b 100007 ff 7 YL2410 #md 100000 10 00100000: 00000000 115511ff ffffffff ffff1155 .....U.........U 00100010: 00000000 00000000 00000015 00000016 ................ 00100020: 00000017 00000018 00000019 0000001a ................ 00100030: 0000001b 0000001c 0000001d 0000001e ................ YL2410 # |
12)bootm – 启动存储器中的映像
bootm可以启动flash或SDRAM中的内核映像。使用方法是bootm [addr [arg ...]]。addr是映像地址,arg是可选的内核参数。
YL2410 # bootm 0x10000000 |
13)erase – 擦除FLASH
erase的用法有以下几种:
erase start end:擦除从start地址开始到end地址结束的区域。
erase bank N:擦除第N块Flash。
erase N:SF [ -SL ]:擦除第N块Flash的从扇区SF到SL扇区的区域。
erase all:擦除所有Flash的内容。
Flash的擦除操作必须以块为最小单位,因此地址start必须为某块的起始地址,end地址则必须为某块的结束地址,如Flash的基地址为0x34000000,块大小为0x20000,则操作erase 0x34000000 0x3401FFFF为可操作的。而erase 0x34000003 0x3401FFFF或者erase 0x340000000x3401FF00均不可操作。
14)setenv –设置环境变量
u-boot环境变量是一些参数,这些参数有些是系统默认的,也可以是自定义的。系统默认的环境变量包括:
环境变量 | 说明 | 实例 |
ipaddr | 设置系统IP地址 | setenv ipaddr 192.168.0.100 |
bootdelay | 启动延迟 | setenv bootdelay 6 |
bootargs | Linux内核参数 | setenv bootargs root=1f02 console=ttyS0,115200 |
netmask | 子网掩码 | setenv netmask 255.255.255.0 |
serverip | TFTP服务器IP | setenv serverip 192.168.0.101 |
ethaddr | MAC地址 | setenv ethaddr 06:01:3f:21:1b:44 |
bootcmd | u-boot启动命令 | setenv bootcmd bootm 0x10000000 |
表2 u-boot环境变量
使用printenv命名可以打印u-boot中所有的环境变量。
15)saveenv –保存环境变量
YL2410 # saveenv |
16)tftp – 通过tftp协议下载数据
tftp [loadAddress] [bootfilename] |
loadAddress为下载地址,bootfilename为tftp服务器下的文件。