一、命令详解
1、autoscr
- run script from memory
运行memory的脚本
命令说明:
在u-boot中可以用autoscr命令运行脚本。
使用方法:
首先创建文本,输入要执行的命令,然后用tools/mkimage封装,然后下载到开发板
中,在u-boot命令行,用autoscr执行下载的脚本镜像文件即可。
- 编辑如下的脚本nand-ubifs-write.script,也可参见附件
tftp 0x90800000 uramdisk.img;nand erase ramdisk;nand write ${fileaddr} ramdisk;nand erase system;ubi part system;ubi create system;tftp 0x90800000 system.img;ubi write ${fileaddr} system ${filesize};nand erase userdata;ubi part userdata;ubi create userdata;tftp 0x90800000 userdata.img;ubi write ${fileaddr} userdata ${filesize};nand erase cache;ubi part cache;ubi create cache;reset
- 用tools/mkimage对脚本进行封装
mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "autoscr nand-ubifs-write script" -d nand-ubifs-write.script /tftpboot/nand-ubifs-write.img
- 在u-boot中加载并执行脚本
set servrerip 10.10.66.145 10.10.66.145为tftp服务器
tftp 0x90800000 nand-ubifs-write.img
autoscr 0x90800000
2、base
- print or set address offset
打印或设置地址偏移量
用法:
base ;打印
base 地址; 设置(重启后消失)
3、bdinfo
- print Board Info structure
打印板子信息结构体
ath> bdinfo
boot_params = 0x87F7BFB0
memstart = 0x80000000
memsize = 0x08000000
flashstart = 0x9F000000
flashsize = 0x01000000
flashoffset = 0x00028B98
ethaddr = 00:AA:BB:CC:DD:EE
ip_addr = 192.168.1.1
baudrate = 115200 bps
4、boot & bootd
- boot default, i.e., run 'bootcmd'
进入内核,等效于run bootcmd 命令
bootcmd由用户定义,例如
bootcmd=bootm 0x9fe80000
5、bootelf
- Boot from an ELF image in memory
启动ELF格式的内核
6、bootm
- boot application image from memory
从内存指定位置启动内核
7、bootp
- boot image via network using BootP/TFTP protocol
通过网络使用bootp或者tftp协议启动内核
BOOTP(Bootstrap Protocol,引导程序协议)是一种引导协议,基于IP/UDP协议,也称自举协议,是DHCP协议的前身。BOOTP用于无盘工作站的局域网中,可以让无盘工作站从一个中心服务器上获得IP地址。通过BOOTP协议可以为局域网中的无盘工作站分配动态IP地址,这样就不需要管理员去为每个用户去设置静态IP地址。
8、bootvx
- Boot vxWorks from an ELF image
从ELF 内核中启动vxWorks
VxWorks 是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。Tornado 是WRS 公司推出的一套实时操作系统开发环境,类似MicrosoftVisual C,但是提供了更丰富的调试、仿真环境和工具。
9、cmp
- memory compare
内存比较
格式:
cmp addr1 addr2 count,第一个参数是内存地址一,第二个参数是内存地址二,第三个是比较长度(单位是字节数除以4,以WORDS为单位)
10、coninfo
- print console devices and information
打印串口设备和信息
11、cp
- memory copy
在内存中进行数据拷贝
格式:
cp source target count,第一个参数是源地址,第二个参数是目的地址,第三个参数是复制数目
12、crc32
- checksum calculation
计算校验值
格式:
crc32 address count [addr],第一个参数是需校验的起始地址,第二个参数是校验的数据字节数,第三个参 数是保存校验值的地址。
13、dhcp
- invoke DHCP client to obtain IP/boot params
使用DHCP协议获取IP地址(功能与bootp相同)
14、echo
- echo args to console
打印参数到串口;例如
ath> echo hello
hello
15、erase
- erase FLASH memory
擦除flash
格式:
erase addr1 count,第一个参数是OFFSET,第二个参数是擦除字节数。其中OFFSET是相对于Download地址。
16、ethreg
- Switch/PHY Reg rd/wr utility
17、exit
- exit script
退出脚本
18、flinfo
- print FLASH memory information
打印flash信息
19、go
go addr [arg ...]
- start application at address 'addr'
passing 'arg' as arguments
go命令可以执行应用程序。
第1个参数是要执行程序的入口地址。
第2个可选参数是传递给程序的参数,可以不用。
20、help
- print online help
打印帮助信息
21、iminfo
iminfo addr [addr ...]
- print header information for application image starting at
address 'addr' in memory; this includes verification of the
image contents (magic number, header and payload checksums)
iminfo可以打印程序映像的开头信息,包含了映像内容的校验(序列号、头和校验和)。
第1个参数指定映像的起始地址。可选的参数是指定更多的映像地址。
例如:
ath> iminfo 0x9fe80000
## Checking Image at 9fe80000 ...
Image Name: MIPS OpenWrt Linux-3.3.8
Created: 2019-10-17 2:50:57 UTC
Image Type: MIPS Linux Multi-File Image (lzma compressed)
Data Size: 1113558 Bytes = 1.1 MB
Load Address: 80060000
Entry Point: 80060000
Contents:
Image 0: 1113550 Bytes = 1.1 MB
Verifying Checksum ... OK
ath>
22、itest
- return true/false on integer compare
23、loop
- infinite loop on address range
地址范围无限循环
24、mct
- simple RAM test
简单的ram测试
25、md
- memory display
显示内存区的内容
格式:
md [.b, .w, .l] address [# of objects]
b:8位
w:16位
l:32位(默认值)
例如:
ath> md.b 0x10000000 1
10000000: 00 .
ath>
上述0x10000000是要显示内存的那个地址,后面的数字是输出的个数,注意是16进制的。
26、mii
- MII utility commands
调试、操作PHY的命令主要有MDIO 和MII。这两个命令的区别是:MII可以访问不同MII总线上设备的Reg,MDIO命令只能访问当前MII总线的PHY Reg。
27、mm
- memory modify (auto-incrementing)
修改内存,地址自动增加
格式:
mm [.b, .w, .l] address
28、mtest
- simple RAM test
类似mct,使用读写方式检验ram是否正常
29、mw
- memory write (fill)
用指定的数据填充内存
格式:
mw [.b, .w, .l] address value [count]
30、nfs
- boot image via network using NFS protocol
使用nfs协议启动内核
用法:
nfs [loadAddress] [host ip addr:bootfilename]
nfs命令可以使用NFS网络协议通过网络启动映像。
例如:
nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。
31、nm
- memory modify (constant address)
格式:
nm [.b, .w, .l] address
nm命令可以修改内存,可以按照字节、字、长字操作。
参数address是要读出并且修改的内存地址。
32、pci
- list and access PCI Configuration Space
列表和访问PCI配置空间
33、ping
- send ICMP ECHO_REQUEST to network host
想指定主机发送ICMP ECHO_REQUEST报文
34、pll
pll cpu-pll dither ddr-pll dither - Set to change CPU & DDR speed
pll erase
pll get
35、printenv & print
- print environment variables
打印环境变量
36、progmac & progmac2
- Set ethernet MAC addresses
设置以太网mac地址
37、protect
- enable or disable FLASH write protection
打开或者关闭FLASH写保护
用法:
protect on start end
- protect Flash from addr 'start' to addr 'end'
protect on N:SF[-SL]
- protect sectors SF-SL in Flash bank # N
protect on bank N
- protect Flash bank # N
protect on all
- protect all Flash banks
protect off start end
- make Flash from addr 'start' to addr 'end' writable
protect off N:SF[-SL]
- make sectors SF-SL writable in Flash bank # N
protect off bank N
- make Flash bank # N writable
protect off all
- make all Flash banks writable
protect命令是对Flash写保护的操作,可以使能和解除写保护。
第1个参数on代表使能写保护;off代表解除写保护。
第2、3参数是指定Flash写保护操作范围,跟擦除的方式相同。
用法:
protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)
protect off 1:0-3取消写保护
protect off bank 1 解除/使能 第 N 块FLASH的写保护
37、rarpboot
- boot image via network using RARP/TFTP protocol
使用RARP/TFTP协议启动内核
用法:
rarpboot [loadAddress] [bootfilename]
rarboot命令可以使用TFTP协议通过网络启动映像。也就是把指定的文件下载到指定地址,然后执行。
第1个参数是映像文件下载到的内存地址。
第2个参数是要下载执行的映像文件。
38、reset
- Perform RESET of the CPU
重启
39、run
- run commands in an environment variable
执行环境变量中的某条命令
40、saveenv & save
- save environment variables to persistent storage
保存环境变量
41、setenv & set
- set environment variables
设置环境变量
42、sleep
- delay execution for some time
延时执行,以秒为单位
43、tftpboot
- boot image via network using TFTP protocol
使用TFTP协议启动内核
用法:
tftpboot [loadAddress] [bootfilename]
tftpboot命令可以使用TFTP协议通过网络下载文件。按照二进制文件格式下载。另外使用这个命令,必须配置好相关的环境变量。例如serverip和ipaddr。
第1个参数loadAddress是下载到的内存地址。
第2个参数是要下载的文件名称,必须放在TFTP服务器相应的目录下。
44、version
- print monitor version
打印版本号
二、常用的环境变量
如果内核分区是直接写在内核文件里面的,u-boot的分区信息就不重要。
如果内核的分区信息没有指定,而是通过下面的命令行来指定的,那么分区信息就很重要。因为它完全依赖于命令行(当然极力推荐这种做法,因为用户修改分区信息,不需要去重新编译内核,也没必要重新编译u-boot,仅仅是修改命令行,一举两得)
环境变量
bootdelay
执行自动启动的等候秒数
baudrate
串口控制台的波特率
netmask
以太网接口的掩码
ethaddr
以太网卡的网卡物理地址
bootfile
缺省的下载文件
bootargs
传递给内核的启动参数
请注意,板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,在你执行了saveenv之后,环境变量会第一次保存到flash中,之后你对环境变量的修改,保存都是基于保存在flash中的环境变量的操作。
U-boot的环境变量值得注意的有两个: bootcmd 和bootargs。
bootargs是环境变量中的重中之重,甚至可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多,我们平常只是使用了几种而已,感兴趣的可以看看这篇文章说的很全:http://blog.chinaunix.net/u2/79570/showart_1675071.html。
bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs,而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置),正是这些原因导致了bootargs使用上的困难。
下面介绍一下bootargs常用参数,bootargs的种类非常的多,而且随着kernel的发展会出现一些新的参数,使得设置会更加灵活多样。
1、root
用来指定rootfs的位置,常见的情况有:
root=/dev/ram rw
root=/dev/ram0 rw
请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。
root=/dev/mtdx rw
root=/dev/mtdblockx rw
root=/dev/mtdblock/x rw
root=31:0x
上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。
2、rootfstype
这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.
3、console
console=tty<n> 使用虚拟串口终端设备 <n>.
console=ttyS<n>[,options] 使用特定的串口<n>,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶校验位,n是指的bits。
console=ttySAC<n>[,options] 同上面。
看你当前的环境,有时用ttyS<n>,有时用ttySAC<n>,网上有人说,这是跟内核的版本有关,2.4用ttyS<n>,2.6用ttySAC<n>,但实际情况是官方文档中也是使用ttyS<n>,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。
4、mem
mem=xxM
指定内存的大小,不是必须的
5、ramdisk_size
ramdisk=xxxxx 不推荐
ramdisk_size=xxxxx 推荐
上面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。
6、initrd & noinitrd
当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。
7、init
init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。
8、mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上
Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
mtdparts的格式如下:
mtdparts=<mtddef>[;<mtddef]
<mtddef> := <mtd-id>:<partdef>[,<partdef>]
<partdef> := <size>[@offset][<name>][ro]
<mtd-id> := unique id used in mapping driver/device
<size> := standard linux memsize OR "-" to denote all remaining space
<name> := (NAME)
因此你在使用的时候需要按照下面的格式来设置:
mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)
这里面有几个必须要注意的:
a. mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
b. size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。
举例:
假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:
mtdparts=sa1100:- → 只有一个分区
mtdparts=sa1100:256k(ARMboot)ro,-(root) → 有两个分区
可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。
9、ip
指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。设置ip有两种方法:
ip = ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
10、组合
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
4). 假设文件系统是基于nfs的,bootargs的设置应该如下
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
或者
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。
bootcmd
自动启动时执行的命令
serverip
服务器端的ip地址
ipaddr
本地ip 地址
stdin
标准输入设备
stdout
标准输出设备
stderr
标准出错设备