1、一般情况下,U-Boot 启动后、Linux 内核启动倒计时结束前,通过按下任何按键即可中断 Linux 内核的启动,并进入 U-Boot 的命令模式。我们可以通过输入一些命令对 U-Boot 执行一些操作。
在 U-Boot 命令模式下,我们可以通过输入 help 或者 ? 查看 U-Boot 支持的所有命令以及这些命令的主要功能:
=> help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
bmode - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4 [noreset]
bmp - manipulate BMP image data
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
bootz - boot Linux zImage image from memory
clocks - display clocks
clrlogo - fill the boot logo area with black
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
echo - echo args to console
editenv - edit environment variable
env - environment handling commands
erase - erase FLASH memory
exit - exit script
ext2load- load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load- load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size- determine a file's size
ext4write- create a file in the root directory
false - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatsize - determine a file's size
fdt - flattened device tree utility commands
flinfo - print FLASH memory information
forlinx - forlinx params menu
fstype - Look up a filesystem type
fuse - Fuse sub-system
go - start application at address 'addr'
gpio - query and control gpio pins
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
iminfo - print header information for application image
imxtract- extract a part of a multi-image
itest - return true/false on integer compare
load - load binary file from a filesystem
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
ls - list files in a directory (default /)
md - memory display
mdio - MDIO utility commands
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtest - simple RAM read/write test
mw - memory write (fill)
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
ping - send ICMP ECHO_REQUEST to network host
pmic - PMIC
printenv- print environment variables
protect - enable or disable FLASH write protection
reset - Perform RESET of the CPU
run - run commands in an environment variable
save - save file to a filesystem
saveenv - save environment variables to persistent storage
setenv - set environment variables
setexpr - set environment variable as the result of eval expression
sf - SPI flash sub-system
showvar - print local hushshell variables
size - determine a file's size
sleep - delay execution for some time
source - run script from memory
test - minimal test like /bin/sh
tftpboot- boot image via network using TFTP protocol
true - do nothing, successfully
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version
2、查询命令
-
2.1、输入 bdinfo 查看开发板信息:
-
2.2、输入 printenv 查看 U-Boot 环境变量:
-
2.3、输入 version 查看 U-Boot 版本
3、环境变量操作命令
环境变量的操作涉及到两个命令:setenv
和 saveenv
,命令 setenv 用于设置或者修改环境变量的值,命令 saveenv 用于保存修改后的环境变量。一般环境变量是存放在外部 Flash 中的,U-Boot 启动时会将环境变量从 Flash 读取到 DRAM 中。使用命令 setenv 修改的是 DRAM 中的环境变量值,修改后要使用 saveenv 命令将修改后的环境变量保存到 Flash 中,否则 U-Boot 下一次重启会继续使用以前的环境变量值。
-
3.1、以修改 Linux 内核启动倒计时为例:
# 修改倒计时为 5 秒 setenv bootdelay 5 saveenv
-
3.2、新建环境变量
# 新建一个 author 环境变量 setenv author alpha saveenv
查看新建的环境变量:
-
3.3、删除环境变量
# 只要将环境变量设为空即可 setenv author saveenv
查看 author 环境变量已删除:
4、内存操作命令
-
4.1、内存查看命令 md
-
4.1.1、md 使用方法:
=> ? md md - memory display Usage: md [.b, .w, .l] address [# of objects]
-
4.1.2、命令中的 [.b .w .l] 对应 byte、word 和 long,[# of objects] 表示要查看的数据类型的长度,用十六进制表示。比如查看内存地址 0x80000000 起始的连续 16 个 byte 的内容:
md.b 80000000 10
-
4.1.3、每次敲下回车可以继续查看下一个 16 个 byte:
-
4.1.4、查看内存地址 0x80000000 起始的连续 16 个 word 的内容:
-
-
4.2、内存修改命令 nm
- 4.2.1、nm 使用方法:
=> ? nm nm - memory modify (constant address) Usage: nm [.b, .w, .l] address
- 4.2.2、如修改 0x90000000 地址的 long 型数据:
其中:00000000 表示地址 0x90000000 当前的数据,?提示输入要修改的数据 0x12345678,输入完成后按下回车,再输入 q 退出:nm.l 90000000
- 4.2.1、nm 使用方法:
-
4.3、内存修改命令 mm
-
4.3.1、mm 支持连续修改内存,内存地址自增:
=> ? mm mm - memory modify (auto-incrementing address) Usage: mm [.b, .w, .l] address
-
4.3.2、如修改从 0x90000000 地址开始的连续 3 个 long 数据,将内容都修改为 0x12345678:
mm.l 90000000
输入 3 次 12345678,最后一次输入 q:
查看内存:
-
-
4.4、内存填充命令 mw
- 4.4.1、mw 可以以一个指定的数据填充一段内存:
=> ? mw mw - memory write (fill) Usage: mw [.b, .w, .l] address value [count]
- 4.4.2、如将从 0x90000000 地址开始的 16 个 long 填充为 0xa0a0a0a0:
查看内存:mw.l 90000000 a0a0a0a0 10
- 4.4.1、mw 可以以一个指定的数据填充一段内存:
-
4.5、内存拷贝命令 cp
- 4.5.1、cp 用于将一段内存的数据拷贝到另一段内存中:
=> ? cp cp - memory copy Usage: cp [.b, .w, .l] source target count
- 4.5.2、如将 0x90000000 地址处的数据拷贝到 0x90000100 处,长度为 16 个 long:
查看内存:cp.l 90000000 90000100 10
- 4.5.1、cp 用于将一段内存的数据拷贝到另一段内存中:
-
4.6、内存对比命令 cmp
- 4.6.1、cmp 用于比较两段内存的数据是否一致:
=> ? cmp cmp - memory compare Usage: cmp [.b, .w, .l] addr1 addr2 count
- 4.6.2、如比较 0x90000000 和 0x90000100 这两个地址数据是否相等,比较长度为 16 个 long 的数据:
再比较 0x90000000 和 0x80000300 这两个地址数据是否相等,比较长度为 16 个 long 的数据:cmp.l 90000000 90000100 10
- 4.6.1、cmp 用于比较两段内存的数据是否一致:
5、网络操作命令
进行网络操作之前,我们需要先配置一下 U-Boot 网络相关的环境变量,包括开发板的 IP 地址、MAC 地址、网关地址、子网掩码、服务器 IP 地址,并要保证开发板的 IP 地址和服务器 IP 地址在同一网段内:
setenv ipaddr 192.168.8.111 # U-Boor IP 地址
setenv ethaddr 00:aa:bb:cc:dd:ef # MAC 地址
setenv gatewayip 192.168.8.1 # 网关地址
setenv netmask 255.255.255.0 # 子网掩码
setenv serverip 192.168.8.110 # 服务器IP地址(当tftp/nfs命令没有指定服务器ip时,则会使用此ip作为服务器ip)
saveenv # 保存环境变量
-
5.1、ping 命令
通过 ping 命令可以验证开发板的网络能否使用,是否可以和服务器进行通信:=> ? ping ping - send ICMP ECHO_REQUEST to network host Usage: ping pingAddress
ping 服务器 IP 地址:
-
5.2、 dhcp 命令
dhcp 用于开发板自动获取 IP 地址:
不仅如此,dhcp 命令还可以用来获取镜像文件:dhcp 0x92000000 192.168.8.110:Image
-
5.3、nfs 命令
nfs(Network File System),即网络文件系统,通过 nfs 可以在计算机之间通过网络来分享文件资源,nfs 的用法:=> ? nfs nfs - boot image via network using NFS protocol Usage: nfs [loadAddress] [[hostIPaddr:]bootfilename]
U-Boot 中 nfs 一般用来通过服务器下载 Linux 镜像文件,如 zImage,在使用 nfs 之前,服务器要开启 NFS 服务并保证开发板能够 ping 通服务器 IP 地址,zImage 存放在服务器 /home/alpha/nfs-work/ 目录下:
使用 nfs 命令将 zImage 下载到开发板的 0x92000000 地址处:nfs 0x92000000 192.168.8.110:/home/alpha/nfs-work/zImage
-
5.4、tftp 命令
tftp 和 nfs 一样也可以从服务器下载文件,只不过使用的是 TFTP 协议:=> ? tftp tftpboot - boot image via network using TFTP protocol Usage: tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
同样在使用 tftp 之前服务器要开启 TFTP 服务,并保证开发板能够 ping 通服务器 IP 地址,使用 tftp 命令下载 zImage 到开发板的 0x92000000 地址处:
tftp 0x92000000 zImage
6、MMC 命令
-
6.1、输入
? mmc
即可查看与 mmc 有关的命令:
-
6.2、U-Boot 支持的 MMC 命令总结如下:
命令 描述 mmc info 查看 MMC 设备的相关信息 mmc read 读取 MMC 中的数据到 RAM 中 mmc wirte 将 RAM 中的数据写入 MMC 设备 mmc erase 擦除 MMC 设备数据 mmc rescan 扫描 MMC 设备 mmc part 查看 MMC 设备的分区 mmc dev 切换 MMC 设备 mmc list 查看当前所有 MMC 设备 mmc hwpartition 设置 MMC 设备的分区 mmc bootbus…… 设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值 mmc bootpart…… 设置指定 MMC 设备的 boot 和 RPMB 分区的大小 mmc partconf…… 设置指定 MMC 设备的 PARTITION_CONFG 域的值 mmc rst 复位 MMC 设备 mmc setdsr 设置 DSR 寄存器的值 -
6.3、查看 MMC 设备
-
6.3.1、mmc list 命令用于查看当前一共多少 MMC 设备:
-
6.3.2、mmc info 命令用于查看当前 MMC 设备的信息:
-
6.3.3、mmc part 命令用于查看当前 MMC 设备的分区:
注:我使用的板子分区表被损坏,就无法识别到。
-
-
6.4、切换 MMC 设备
mmc dev
命令用于切换当前 MMC 设备:mmc dev [dev] [part] - show or set current mmc device [partition] # [dev] 是要切换到的 MMC 设备号,[part] 是分区号,默认为分区 0
如执行命令切换到 SD 卡:
mmc dev 1
-
6.5、MMC 读命令
mmc read
命令用于读取 mmc 设备的数据到 RAM 中:mmc read addr blk# cnt # addr 是数据读取到 RAM 中的地址 # blk 是要读取的块(扇区)的起始地址(十六进制),一个块是 512 字节 # cnt 是要读取的块(扇区)的数量(十六进制)
- 如读取 eMMC 某处数据,执行命令如下:
# 从 eMMC 的第0x2000个块开始,读取0x4000个块的数据到RAM的0x92000000地址处 mmc read 0x92000000 0x2000 0x4000
- 通过 md.b 命令查看 0x92000000 处的数据:
-
6.6、MMC 写命令
mmc wirte
命令用于将 RAM 中的数据写入到 MMC 设备中:mmc write addr blk# cnt # addr 是要写入 MMC 中的数据在 RAM 中的起始地址 # blk 是要写入 MMC 的块的起始地址(十六进制) # cnt 是要写入的块的数量(十六进制),一个块为 512 字节
-
6.7、MMC 擦除命令
mmc erase
命令用于擦除 MMC 设备数据,慎用!mmc erase blk# cnt # blk 为要擦除的起始块 # cnt 是要擦除的块的数量
7、MTD 命令
mtd
命令用于对flash进行操作。
- 7.1、输入
? mtd
即可查看与 mtd 有关的命令: - 7.2、查看 MTD 设备
mtd list
命令用于查看当前一共多少 MTD 设备及其信息:
- 7.3、MTD 读命令
mtd read
命令用于读取 mtd 设备的数据到 RAM 中:mtd read name addr off size # name 是flash的设备名 # addr 是数据读取到 RAM 中的地址 # off 是数据在flash中的地址 # size 是要读取的数据个数(byte为单位)
- 如读取 nor0 某处数据,执行命令如下:
# 从 nor0 的0x400000地址处开始,读取0x800000个byte的数据到RAM的0x92000000地址处 mtd read nor0 0x92000000 0x400000 0x800000
- 7.4、MTD 查看命令
-
mtd dump
命令用于查看flash中指定位置的数据mtd dump name off size # name 是flash的设备名 # off 是数据在flash中的地址 # size 是要读取的数据个数(byte为单位)
-
如查看 nor0 某处数据,执行命令如下:
# 查看nor0的0x400000地址处的0x800000个byte的数据 mtd dump nor0 0x400000 0x200
显示如下:
-
- 7.5、MTD 写命令
mtd write
命令用于将RAM中的数据写入flash中:mtd write name addr off size # name 是flash的设备名 # addr 是数据读取到 RAM 中的地址 # off 是数据在flash中的地址 # size 是要写入的数据个数(byte为单位)
- 如将RAM中的数据写入nor0 中,执行命令如下:
# 将RAM的0x92000000处的数据,写入到 nor0 的0x400000地址处,写入0x800000个byte的数据 mtd write nor0 0x92000000 0x400000 0x800000
- 7.6、MTD 擦除命令
mtd erase
命令用于擦除flash中指定地址的数据:mtd erase name off size # name 是flash的设备名 # off 是数据在flash中的地址(需要和flash的块对齐) # size 是要擦除的数据个数(byte为单位)
- 如擦除入nor0 中指定位置的数据,执行命令如下:
# 从nor0的0x400000地址处开始,擦除0x800000个byte的数据 mtd erase nor0 0x400000 0x800000
8、启动linux内核命令
-
8.1、
bootm
命令- bootm 用于启动 uImage 镜像文件
bootm [addr [initrd[:size]] [fdt]] # addr是内核镜像文件在RAM中的地址 # [initrd[:size]]是initrd文件在RAM中的地址,如果不使用initrd的话使用 ‘-’ 代替即可 # fdt就是设备树文件在RAM中的地址
- 示例:
# 从0x92000000处启动内核,无initrd,设备树在0x90000000处 bootm 0x92000000 - 0x90000000
- bootm 用于启动 uImage 镜像文件
-
8.2、
bootz
命令- bootz 命令用于启动 zImage 镜像文件,用法和bootm一样
bootz [addr [initrd[:size]] [fdt]] # addr是内核镜像文件在RAM中的地址 # [initrd[:size]]是initrd文件在RAM中的地址,如果不使用initrd的话使用 ‘-’ 代替即可 # fdt就是设备树文件在RAM中的地址
- 示例:
# 从0x92000000处启动内核,无initrd,设备树在0x90000000处 bootz 0x92000000 - 0x90000000
- bootz 命令用于启动 zImage 镜像文件,用法和bootm一样
-
8.3、
boot
命令boot
命令会读取环境变量bootcmd
来启动 Linux 系统,具体的引导命令内容是可以修改的。boot命令会执行bootcmd的内容。bootcmd
示例:setenv bootcmd 'mmc dev 1;mmc read 0x92000000 0x2000 0x4000;bootm 0x92000000'