Chinaunix首页 | 论坛 | 博客
  • 博客访问: 80089
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 227
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-17 12:31
文章分类

全部博文(27)

文章存档

2014年(27)

我的朋友

分类: 嵌入式

2014-04-26 19:58:49

u-boot命令行接口
   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
  DRAM bank   = 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
  Base Address: 0x00000000
  SMDK2410 # md 0 c
  00000000: feffffff 00000000 7cbd2b78 7cdc3378 ........|.+x|.3x
  00000010: 3cfb3b78 3b000000 7c0002e4 39000000 <.;x;...|...9...
  00000020: 7d1043a6 3d000400 7918c3a6 3d00c000 }.C.=...y...=...
  SMDK2410 # base 40000000
  Base Address: 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 00000000 19:55:04)......
  SMDK2410 #
   使用该命令打印或设置存储器操作命令所使用的“基地址”,缺省值是0。当需要反复访问一个地址区域时,可以设置该区域的起始地址为基地址,其余的存储器命令参数都相对于该地址进行操作。如上面所示,设置0x40000000地址为基地址以后,md操作就相对于该基地址进行。
   ▼ crc32:校验和计算
   该命令能够用于计算某一段存储器区域的CRC32校验和。
  SMDK2410 # crc 100004 3FC
  CRC32 for 00100004 ... 001003ff ==> d433b05b
  SMDK2410 #
   当使用3个参数时,该命令保存计算的校验和到指定的地址,如:
  SMDK2410 # crc 100004 3FC 100000
  CRC32 for 00100004 ... 001003ff ==> d433b05b
  SMDK2410 # md 100000 4
  00100000: d433b05b ec3827e4 3cb0bacf 00093cf5 .3.[.8'.<.....<.
  SMDK2410 #
   可以看到,CRC32校验和不仅仅被打印出来,而且被存储在地址0x100000。
   ▼ cmp:存储区比较
   使用cmp命令,用户可以测试两个存储器区域是否相同。该命令或者测试由第三个参数指定的整个区域,或者在第一个存在差异的地方停下来
  SMDK2410 # cmp 100000 40000000 400
  word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
  Total of 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 00000000 19: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 00000000 19: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
  word at 0x00100004 (0x50ff4342) != word at 0x40000004 (0x50504342)
  Total of 1 word were the same
  SMDK2410 # cmp.w 100000 40000000 800
  halfword at 0x00100004 (0x50ff) != halfword at 0x40000004 (0x5050)
  Total of 2 halfwords were the same
  SMDK2410 # cmp.b 100000 40000000 1000
  byte at 0x00100005 (0xff) != byte at 0x40000005 (0x50)
  Total of 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 00000000 19:55:04)......
  00100030: 00000000 00000000 00000000 00000000 ................
  SMDK2410 #
   ▼ mtest:简单的存储区测试
   该命令提供一个简单的内存测试方法。它测试存储区的写操作是否成功,如果对于ROM或flash等存储器将测试失败。该命令在测试一些u-boot必须的区域时,可能引起系统崩溃,这些区域包括:异常向量代码、u-boot内部程序代码、栈、堆等。
  SMDK2410 # mtest 100000 200000
  Testing 00100000 ... 00200000:
  Pattern 0000000F Writing... Reading...
  SMDK2410 #
   ▼ mw:内存填充
   该命令提供一种存储区初始化的方法。当不使用count参数时,value值被写入指定的地址,当使用count时,整个的存储区将被写入value值。该命令支持.l、.w和.b扩展命令。
  SMDK2410 # md 100000 10
  00100000: 0000000f 00000010 00000011 00000012 ................
  00100010: 00000013 00000014 00000015 00000016 ................
  00100020: 00000017 00000018 00000019 0000001a ................
  00100030: 0000001b 0000001c 0000001d 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 ffffffff ffff1155 o....U.........U
  00100010: 00000000 00000000 00000015 00000016 ................
  SMDK2410 #
   3) flash存储器操作命令
   ▼ cp:存储区拷贝
   cp命令可以自动识别flash区域并当目标区域再flash中时自动调用flash编程程序。
  SMDK2410 # cp 30000000 00000000 10000
  Copy to Flash... done
  SMDK2410 #
   当目标区域没有被擦除或者被写保护时,写到该区域将可能导致失败。
  SMDK2410 # cp 30000000 00000000 10000
  Copy to 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
  Erase Flash from 0x40040000 to 0x402fffff
  .............. done
  Erased 22 sectors
  SMDK2410 #
   另外一个方法是选择flash扇区和bank作为参数。
  SMDK2410 # era 1:6-8
  Erase Flash Sectors 6-8 in Bank # 1
  .. done
  SMDK2410 #
   还有一种方法可以擦除整个bank,如下所示,注意其中有一个警告信息提示有写保护扇区存在并且这些扇区没有被擦除。
  SMDK2410 # erase all
  Erase Flash Bank # 1 - Warning: 5 protected sectors will not be erased!
  ................... done
  Erase Flash 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
  passing arguments '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
  go addr [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
  (Back at denx.denx.de)
  ....................................................
  C.Kermit 7.0.197, 8 Feb 2000, for Linux
  Copyright (C) 1985, 2000,
  Trustees of Columbia University in the City of New York.
  Type ? or HELP for help.
  Kermit> send /bin /tftpboot/pImage
  ...
  Kermit> connect
  Connecting to /dev/ttyS0, speed 115200.
  The escape character is Ctrl.\ (ASCII 28, FS)
  Type the escape character followed by C to get back,
  or followed by ? to see other options.
  ....................................................
  = 550260 Bytes
  ## Start Addr = 0x00100000
  SMDK2410 # iminfo 100000
  ## Checking Image at 00100000 ...
  Image Name: Linux.2.4.4
  Created: 2002.07.02 22:10:11 UTC
  Image Type: PowerPC Linux Kernel Image (gzip compressed)
  Data Size: 550196 Bytes = 537 kB = 0 MB
  Load Address: 00000000
  Entry Point: 00000000
  Verifying Checksum ... OK
   ▼ tftpboot:使用TFTP协议经由网络加载映像文件
  SMDK2410 # help tftp
  tftpboot [loadAddress] [bootfilename]
  SMDK2410 #
   6) 环境变量操作命令
   ▼ printenv:打印环境变量
  SMDK2410 # help printenv
  printenv
  ? print values of all environment variables
  printenv name ...
  ? 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
  Saving Enviroment to Flash...
  Un?Protected 1 sectors
  Erasing Flash...
  . done
  Erased 1 sectors
  Writing to Flash... done
  Protected 1 sectors
  SMDK2410 #
   ▼ setenv:设置环境变量
  SMDK2410 # help setenv
  setenv name value ...
  ? set environment variable 'name' to 'value ...'
  setenv name
  ? delete environment variable 'name'
  SMDK2410 #
   为了修改u-boot环境变量,用户必须使用setenv命令。当只使用一个参数时,将输出名字为该参数的u-boot环境变量。如下所示:
  SMDK2410 # printenv foo
  foo=This is 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=This is a new example.
  SMDK2410 #
   请注意当一个变量包含对命令行解析器有特殊意义的字符(如:“$”字符用于变量替换或者分割命令的分号)时,使用反斜线符号(“\”)以避开这些特殊字符,如:
  SMDK2410 # setenv cons_opts console=tty0 console=ttyS0,\$(baudrate)
  SMDK2410 # printenv cons_opts
  cons_opts=console=tty0 console=ttyS0,$(baudrate)
  SMDK2410 #
   除非命令行解析器强加(如反斜线符号用于引用,空格和tab字符用于分割参数,分号或者换行用于分割命令等),否则环境变量名字没有任何限制。“=?/|()+=”也似一个合法的变量名。    ▼ run:运行一个环境变量中的命令
  SMDK2410 # help run
  run var [...]
  ? 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=echo This is a test;printenv ipaddr;echo Done.
  SMDK2410 # run test
  This is 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=echo This is a test;printenv ipaddr;echo Done.
  test2=echo This is another Test;printenv serial#;echo Done.
  SMDK2410 # run test test2   This is a test   ipaddr=10.0.0.99   Done.
  This is another Test
  serial#=TQM860LDDBA3?P50.203 10226122 4
  Done.
  SMDK2410 #

阅读(1023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~