u-boot中所有操作都是通过其命令行通过输入命令完成。本节叙述u-boot的命令行接口,请注意,由于u-boot的可配置性,因此,当前配置并不一定支持所有的命令。用户可以使用help命令查看当前配置支持的所有命令。
u-boot中所有命令的数字都是以十六进制格式输入。有些命令的处理结果依赖于u-boot的配置以及一些环境变量的设置。
在u-boot中输入命令并不一定需要输入全名,而是可以省略后面的一些字符,如“help”命令等同于“h”、“he”和“hel”。
下面介绍一些常用的u-boot命令:
1) 信息查看命令
▼ bdinfo:打印目标板配置信息
SMDK2410# bdinfo
arch_number= 0x000000C1
env_t = 0x00000000
boot_params= 0x30000100
DRAMbank = 0x00000000
->start = 0x30000000
->size = 0x04000000
ethaddr = 00:00:00:00:00:00
ip_addr = 10.0.0.110
baudrate = 115200 bps
SMDK2410#
▼ flinfo:获取可用的flash的信息
SMDK2410# flinfo
Bank# 1: INTEL 28F128J3A
Size: 32 MB in 128 Sectors
Sector Start Addresses:
00000000 (RO) 00040000 (RO) 00080000 000C0000 00100000
00140000 00180000 001C0000 00200000 00240000
00280000 002C0000 00300000 00340000 00380000
003C0000 00400000 00440000 00480000 004C0000
00500000 00540000 00580000 005C0000 00600000
00640000 00680000 006C0000 00700000 00740000
00780000 007C0000 00800000 00840000 00880000
008C0000 00900000 00940000 00980000 009C0000
00A00000 00A40000 00A80000 00AC0000 00B00000
00B40000 00B80000 00BC0000 00C00000 00C40000
00C80000 00CC0000 00D00000 00D40000 00D80000
00DC0000 00E00000 00E40000 00E80000 00EC0000
00F00000 00F40000 00F80000 00FC0000 01000000
01040000 01080000 010C0000 01100000 01140000
01180000 011C0000 01200000 01240000 01280000
012C0000 01300000 01340000 01380000 013C0000
01400000 01440000 01480000 014C0000 01500000
01540000 01580000 015C0000 01600000 01640000
01680000 016C0000 01700000 01740000 01780000
017C0000 01800000 01840000 01880000 018C0000
01900000 01940000 01980000 019C0000 01A00000
01A40000 01A80000 01AC0000 01B00000 01B40000
01B80000 01BC0000 01C00000 01C40000 01C80000
01CC0000 01D00000 01D40000 01D80000 01DC0000
01E00000 01E40000 01E80000 01EC0000 01F00000
01F40000 01F80000 01FC0000
SMDK2410 #其输出包含flash型号(28F128J3A)、大小(32MB)、扇区数(128)、每一扇区的起始地址及其属性,上面的输出中,第一个扇区的起始地址为0x0,第一个扇区的起始地址为0x0,且其属性为只读(标记“RO”)。
▼ help:打印帮助信息
如果不带任何参数将打印当前支持的所有命令,如果将某一命令名字作为其参数,将得到该命令的更加详细的信息。
如:
SMDK2410#help
SMDK2410#help flinfo
2) 存储器操作命令
▼ base:打印或设置地址偏移
SMDK2410# base
BaseAddress: 0x00000000
SMDK2410# md 0 c
00000000:feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x
00000010:3cfb3b78 3b000000 7c0002e439000000 <.;x;...|...9...
00000020:7d1043a63d000400 7918c3a6 3d00c000 }.C.=...y...=...
SMDK2410# base 40000000
BaseAddress: 0x40000000
SMDK2410# md 0 c
40000000:27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.
40000010:3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
40000020:2031393a 35353a30 34290000 0000000019:55:04)......
SMDK2410#
使用该命令打印或设置存储器操作命令所使用的“基地址”,缺省值是0。当需要反复访问一个地址区域时,可以设置该区域的起始地址为基地址,其余的存储器命令参数都相对于该地址进行操作。如上面所示,设置0x40000000地址为基地址以后,md操作就相对于该基地址进行。
▼ crc32:校验和计算
该命令能够用于计算某一段存储器区域的CRC32校验和。
SMDK2410# crc 100004 3FC
CRC32for 00100004 ... 001003ff ==> d433b05b
SMDK2410#
当使用3个参数时,该命令保存计算的校验和到指定的地址,如:
SMDK2410# crc 100004 3FC 100000
CRC32for 00100004 ... 001003ff ==> d433b05b
SMDK2410# md 100000 4
00100000:d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8'.<.....<.
SMDK2410#
可以看到,CRC32校验和不仅仅被打印出来,而且被存储在地址0x100000。
▼ cmp:存储区比较
使用cmp命令,用户可以测试两个存储器区域是否相同。该命令或者测试由第三个参数指定的整个区域,或者在第一个存在差异的地方停下来
SMDK2410# cmp 100000 40000000 400
wordat 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
Totalof 1 word were the same
SMDK2410# md 100000 C
00100000:27051956 50ff4342 6f6f7420 312e312e '..VP.CBoot 1.1.
00100010:3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020:2031393a 35353a30 34290000 0000000019:55:04)......
SMDK2410# md 40000000 C
40000000:27051956 50504342 6f6f7420 312e312e '..VPPCBoot 1.1.
40000010:3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
40000020:2031393a 35353a30 34290000 0000000019:55:04)......
SMDK2410#
cmp命令可以以不同的宽度访问存储器:32位、16位或者8位。如果使用“cmp”或“cmp.l”则使用缺省宽度(32位),如果使用“cmp.w”则使用16位宽度,“cmp.b”使用8位宽度。
请注意第三个参数表示的是比较数据的长度,其单位为“数据宽度”,视所使用的命令不同而不同,如:采用32位宽度时单位为32位数据,即4个字节。
SMDK2410# cmp.l 100000 40000000 400
wordat 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
Totalof 1 word were the same
SMDK2410# cmp.w 100000 40000000 800
halfwordat 0x00100004 (0x50ff) != halfword at 0x40000004 (0x5050)
Totalof 2 halfwords were the same
SMDK2410# cmp.b 100000 40000000 1000
byteat 0x00100005 (0xff) != byte at 0x40000005 (0x50)
Totalof 5 bytes were the same
SMDK2410#
▼ cp:存储区拷贝
该命令用于存储区拷贝,和cmp命令一样,该命令支持.l、.w和.b扩展命令。
SMDK2410# cp 40000000 100000 10000
SMDK2410#
▼ md:存储区显示
该命令以十六进制和ASCII码方式显示存储区,该命令支持.l、.w和.b扩展命令。
▼ mm:存储区修改
该命令提供一种交互式地修改存储器内容的方式。它将显示地址和当前内容,然后提示用户输入,如果用户输入一个合法的十六进制值,该值将被写到当前地址。然后将提示下一个地址。如果用户没有输入任何值,而只是输入“ENTER”,当前地址内容将不作改变。该命令直到输入一个非十六进制值(如“.”)结束。该命令支持.l、.w和.b扩展命令。
SMDK2410# mm 100000
00100000:27051956 ? 0
00100004:50504342 ? AABBCCDD
00100008:6f6f7420 ? 01234567
0010000c: 312e312e ? .
SMDK2410# md 100000 10
00100000:00000000 aabbccdd 01234567 312e312e .........#Eg1.1.
00100010:3520284d 61722032 31203230 3032202d 5 (Mar 21 2002 -
00100020:2031393a 35353a30 34290000 0000000019:55:04)......
00100030:00000000 00000000 00000000 00000000 ................
SMDK2410#
▼ mtest:简单的存储区测试
该命令提供一个简单的内存测试方法。它测试存储区的写操作是否成功,如果对于ROM或flash等存储器将测试失败。该命令在测试一些u-boot必须的区域时,可能引起系统崩溃,这些区域包括:异常向量代码、u-boot内部程序代码、栈、堆等。
SMDK2410# mtest 100000 200000
Testing00100000 ... 00200000:
Pattern0000000F Writing... Reading...
SMDK2410#
▼ mw:内存填充
该命令提供一种存储区初始化的方法。当不使用count参数时,value值被写入指定的地址,当使用count时,整个的存储区将被写入value值。该命令支持.l、.w和.b扩展命令。
SMDK2410# md 100000 10
00100000:0000000f 00000010 0000001100000012 ................
00100010:00000013 00000014 00000015 00000016 ................
00100020:00000017 00000018 00000019 0000001a................
00100030:0000001b 0000001c0000001d 0000001e ................
SMDK2410#
▼ mw:存储区修改
该命令能够被用于交互式地写若干次不同的数据到同一地址,与mm不同的是它的地址总是同一地址,而mm将进行累加。该命令支持.l、.w和.b扩展命令。
SMDK2410# nm.b 100000
00100000:00 ? 48
00100000:48 ? 61
00100000:61 ? 6c
00100000:6c ? 6c
00100000:6c ? 6f
00100000:6f ? .
SMDK2410# md 100000 8
00100000:6f000000 115511ff ffffffffffff1155 o....U.........U
00100010:00000000 00000000 00000015 00000016 ................
SMDK2410#
3) flash存储器操作命令
▼ cp:存储区拷贝
cp命令可以自动识别flash区域并当目标区域再flash中时自动调用flash编程程序。
SMDK2410# cp 30000000 00000000 10000
Copyto Flash... done
SMDK2410#
当目标区域没有被擦除或者被写保护时,写到该区域将可能导致失败。
SMDK2410# cp 30000000 00000000 10000
Copyto Flash... Can't write to protected Flash sectors
SMDK2410#
请注意第三个参数count的单位为数据宽度,如果你希望使用字节长度。
▼ flinfo:获取可用的flash的信息
该命令在“1) 信息查看命令”中已经说明。
▼ erase:擦除flash存储器
在u-boot中,一个bank就是连接到CPU的同一片选信号的一个或者多个flash芯片组成的flash存储器区域。扇区是一次擦除操作的最小区域,擦除操作都是以扇区为单位的。在u-boot中,bank的编号从1开始,而扇区编号从0开始。
该命令用于擦除一个或多个扇区。它的使用比较复杂,最常用的用法就是传递待擦除区域的开始和结束地址到命令中,而且这两个地址必须是扇区的开始地址和起始地址:
SMDK2410# era 40040000 402FFFFF
EraseFlash from 0x40040000 to 0x402fffff
..............done
Erased22 sectors
SMDK2410#
另外一个方法是选择flash扇区和bank作为参数。
SMDK2410# era 1:6-8
EraseFlash Sectors 6-8 in Bank # 1
..done
SMDK2410#
还有一种方法可以擦除整个bank,如下所示,注意其中有一个警告信息提示有写保护扇区存在并且这些扇区没有被擦除。
SMDK2410# erase all
EraseFlash Bank # 1 - Warning: 5 protected sectors will not be erased!
...................done
EraseFlash Bank # 2
.........................done
SMDK2410#
▼ protect:使能或者禁止flash保护功能
该命令也是一个比较复杂的命令。它用于设置flash存储器的特定区域为只读模式,或取消只读属性。flash设置为只读模式后,不能被拷贝(cp命令)或者擦除(erase命令)。
Flash保护的级别依赖于所使用的flash芯片和flash设备驱动的实现方法。在大多数u-boot的实现中仅仅提供简单的软件保护,它可以阻止以外的擦除或者重写重要区域(如:u-boot代码以及u-boot环境变量等),且仅仅对于u-boot有效,任何操作系统并不识别该保护。
4) 执行控制命令
▼ bootm:从存储器启动应用程序映像
SMDK2410# help bootm
bootm[addr [arg ...]]
−boot application image stored in memory
passingarguments 'arg ...'; when booting a Linux kernel,
'arg'can be the address of an initrd image
SMDK2410#
该命令用于启动操作系统映像。从映像头获取操作系统类型,所使用文件压缩方法,加载和入口点地址等信息。该命令将加载映像到指定的存储器地址,如果需要将解压缩。该命令也可以传递要求的启动参数并在其入口点启动操作系统。
bootm的第一个参数是待加载映像的存储地址(RAM、ROM或者flash存储器等),在它之后可以添加操作系统所需要的参数。
对于Linux操作系统,可以传递一个可选参数。该参数作为initrd ramdisk映像的起始地址(在RAM、ROM或者flash存储器等)。在这种情况下,bootm命令由三个步骤组成:首先Linux内核映像被解压缩并拷贝到RAM,然后ramdisk映像被加载到RAM,最后,控制权交给Linux内核,并传递ramdisk映像的位置和大小信息。
为了启动一个initrd ramdisk映像的Linux内核,可以使用下面的命令:
SMDK2410# bootm $(kernel_addr)
如果使用ramdisk,可以使用如下命令:
SMDK2410# bootm $(kernel_addr) $(ramdisk_addr)
请注意,当待加载的映像已经被加载到RAM(如私用TFTP下载)时,必须避免压缩映像的位置与需要加载解压缩后内核的位置重叠。例如,如果加载一个ramdisk映像在一个低端内存,它可能被加载的Linux内核所覆盖,这将导致未定义的系统崩溃。
▼ go:开始某地址处的应用程序
SMDK2410# help go
goaddr [arg ...]
−start application at address 'addr'
passing'arg' as arguments
SMDK2410#
u-boot支持独立的应用程序。这些程序不要求操作系统运行时的复杂的运行环境,而只需要它们能够被加载并且被u-boot调用执行。该命令用于启动这些独立的应用程序。可选的参数被毫无须改地传递到应用程序。
5) 下载命令
▼ loadb:经由串口线加载二进制文件(kermit模式)
SMDK2410# help loadb
loadb[ off ] [ baud ]
−load binary file over serial line with offset 'off' and baudrate 'baud'
SMDK2410#
用户使用kermit程序下载二进制数据。此处我们以下载uImage为例说明loadb的用法。请参考附录正确设置kermit程序。
SMDK2410# loadb 100000
##Ready for binary (kermit) download ...
Ctrl.\c
(Backat denx.denx.de)
....................................................
C.Kermit7.0.197, 8 Feb 2000, for Linux
Copyright(C) 1985, 2000,
Trusteesof Columbia University in the City of New York.
Type? or HELP for help.
Kermit>send /bin /tftpboot/pImage
...
Kermit>connect
Connectingto /dev/ttyS0, speed 115200.
Theescape character is Ctrl.\ (ASCII 28, FS)
Typethe escape character followed by C to get back,
orfollowed by ? to see other options.
....................................................
=550260 Bytes
##Start Addr = 0x00100000
SMDK2410# iminfo 100000
##Checking Image at 00100000 ...
ImageName: Linux.2.4.4
Created:2002.07.02 22:10:11 UTC
ImageType: PowerPC Linux Kernel Image (gzip compressed)
DataSize: 550196 Bytes = 537 kB = 0 MB
LoadAddress: 00000000
EntryPoint: 00000000
VerifyingChecksum ... OK
▼ tftpboot:使用TFTP协议经由网络加载映像文件
SMDK2410# help tftp
tftpboot[loadAddress] [bootfilename]
SMDK2410#
6) 环境变量操作命令
▼ printenv:打印环境变量
SMDK2410# help printenv
printenv
−print values of all environment variables
printenvname ...
−print value of environment variable 'name'
SMDK2410#
该命令打印一个、几个或者所有的u-boot环境变量。下面的命令将打印三个环境变量:ipaddr、hostname和netmask。
SMDK2410# printenv ipaddr hostname netmask
ipaddr=10.0.0.99
hostname=tqm
netmask=255.0.0.0
SMDK2410#
如下命令将打印所有的环境变量和它们的值,再加上一些统计数据,如:存储环境变量的大小。
SMDK2410#printenv
▼ saveenv:保存环境变量到非易失性存储介质
SMDK2410# help saveenv
saveenv− No help available.
SMDK2410#
对于u-boot的改变仅仅再RAM中有效,一旦系统重新启动,这些改变将丢失。如果想这些改变永久保存,用户必须使用saveenv命令将环境变量的设置保存到非易失性介质中,u-boot在启动时将自动从非易失性介质中加载。
SMDK2410# saveenv
SavingEnviroment to Flash...
Un−Protected1 sectors
ErasingFlash...
.done
Erased1 sectors
Writingto Flash... done
Protected1 sectors
SMDK2410#
▼ setenv:设置环境变量
SMDK2410# help setenv
setenvname value ...
−set environment variable 'name' to 'value ...'
setenvname
−delete environment variable 'name'
SMDK2410#
为了修改u-boot环境变量,用户必须使用setenv命令。当只使用一个参数时,将输出名字为该参数的u-boot环境变量。如下所示:
SMDK2410# printenv foo
foo=Thisis an example value.
SMDK2410# setenv foo
SMDK2410# printenv foo
##Error: "foo" not defined
SMDK2410#
当使用多个参数调用时,第一个参数表示环境变量的名称,所有的后面的参数组成该环境变量的值。改变量将自动创建新的环境并将覆盖已经存在的同名环境变量。
SMDK2410# printenv bar
##Error: "bar" not defined
SMDK2410# setenv bar This is a new example.
SMDK2410# printenv bar
bar=Thisis a new example.
SMDK2410#
请注意当一个变量包含对命令行解析器有特殊意义的字符(如:“$”字符用于变量替换或者分割命令的分号)时,使用反斜线符号(“\”)以避开这些特殊字符,如:
SMDK2410# setenv cons_opts console=tty0 console=ttyS0,\$(baudrate)
SMDK2410# printenv cons_opts
cons_opts=console=tty0console=ttyS0,$(baudrate)
SMDK2410#
除非命令行解析器强加(如反斜线符号用于引用,空格和tab字符用于分割参数,分号或者换行用于分割命令等),否则环境变量名字没有任何限制。“=−/|()+=”也似一个合法的变量名。
▼ run:运行一个环境变量中的命令
SMDK2410# help run
runvar [...]
−run the commands in the environment variable(s) 'var'
SMDK2410#
用户可以使用u-boot环境变量存储命令甚至命令序列。为了执行一个命令,使用run命令:
SMDK2410# setenv test echo This is a test\;printenv ipaddr\;echo Done.
SMDK2410# printenv test
test=echoThis is a test;printenv ipaddr;echo Done.
SMDK2410# run test
Thisis a test
ipaddr=10.0.0.99
Done.
SMDK2410#
可以使用多个参数调用run命令,在这种情况下,将依次执行命令序列:
SMDK2410# setenv test2 echo This is another Test\;printenv serial#\;echo Done.
SMDK2410# printenv test test2
test=echoThis is a test;printenv ipaddr;echo Done.
test2=echoThis is another Test;printenv serial#;echo Done.
SMDK2410# run test test2
Thisis a test
ipaddr=10.0.0.99
Done.
Thisis another Test
serial#=TQM860LDDBA3−P50.20310226122 4
Done.
SMDK2410#