版权信息
warning
本文章为博主原创文章。遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
U-Boot(Universal Boot Loader)是嵌入式系统开发中一个非常重要的组件,它负责在操作系统启动之前,进行基本的硬件初始化,并提供一个交互式的命令行接口,以便用户进行系统配置、内核加载等操作。掌握 U-Boot 的常见命令是嵌入式工程师的基本功。
本文将为您介绍一些 U-Boot 中最常用和最关键的命令及其用途。
一、 环境与信息查看命令
这些命令用于查看和管理 U-Boot 的运行环境和系统信息。
| 命令 | 用途 | 示例 | 备注 |
|---|---|---|---|
help 或 ? |
显示所有可用命令的列表或特定命令的帮助信息。 | help / help setenv |
? 是 help 的别名。 |
printenv |
显示所有的环境变量及其值。 | printenv |
环境变量通常保存在非易失性存储介质中。 |
bdinfo |
显示板级信息(Board Info Structure),如内存地址、大小等。 | bdinfo |
|
version |
显示 U-Boot 的版本信息。 | version |
二、 环境变量操作命令
环境变量是 U-Boot 配置系统行为的关键,例如定义启动参数、网络设置等。
| 命令 | 用途 | 示例 | 备注 |
|---|---|---|---|
setenv |
设置或修改一个环境变量的值。 | setenv ipaddr 192.168.1.100 |
更改是临时的,只在当前 U-Boot 会话中生效。 |
saveenv |
将当前内存中的环境变量保存到非易失性存储(如 Flash 或 eMMC)中。 | saveenv |
使环境变量永久生效。 |
run |
执行存储在一个环境变量中的命令序列。 | run bootcmd |
bootcmd 是一个重要的环境变量,定义了自动启动时执行的命令。 |
bootargs |
(特殊变量) 设置传递给 Linux 内核的启动参数。 | setenv bootargs 'root=/dev/mmcblk0p2 console=ttyS0,115200' |
通常在启动前设置。 |
bootcmd |
(特殊变量) 设定 U-Boot 自动启动时执行的命令。 | setenv bootcmd 'tftp 0x42000000 zImage; bootm 0x42000000' |
启动时若不打断,则执行此变量中的命令。 |
三、 内存与存储操作命令
这些命令用于读写内存、从外部存储加载数据、以及操作 Flash 等。
| 命令 | 用途 | 示例 | 备注 |
|---|---|---|---|
mw |
内存写入(Memory Write),向内存地址写入指定值。 | mw.l 0x40000000 0xDEADBEEF 10 |
.b (字节), .w (字), .l (长字) 指定写入单位。10是一个十六进制数。 |
md |
内存显示(Memory Display),查看指定内存地址的内容。 | md.l 0x40000000 10 |
10是一个十六进制数,表示显示 10 个单位。 |
cp |
内存拷贝(Memory Copy),在内存或存储之间复制数据。 | cp.b 0x40000000 0x40100000 0x100 |
可用于从 NAND/SD/eMMC 等到 RAM 的复制。 |
erase |
擦除 Flash 或其他存储区域。 | erase 0x50000000 +0x100000 |
慎用!会清除数据。 |
nand / mmc / spi / sata 等 |
针对不同存储介质的操作命令。 | mmc rescan / nand read 0x40000000 kernel 0x800000 |
具体命令取决于 U-Boot 配置和硬件支持。 |
cmp |
比较两段内存地址的指定单位长度数据是否相等 | cmp.l 80000000 80000100 10 |
.b (字节), .w (字), .l (长字) 指定写入单位。10是一个十六进制数。 |
四、 网络与文件传输命令
在嵌入式开发中,通常通过网络(如 TFTP)从主机下载内核或文件系统镜像。
| 命令 | 用途 | 示例 | 备注 |
|---|---|---|---|
ping |
测试网络连接。 | ping 192.168.1.1 |
需要设置 ipaddr 和 serverip 环境变量。 |
tftp |
使用 TFTP 协议从服务器下载文件到内存。 | tftp 0x42000000 zImage |
0x42000000 是内存地址,zImage 是服务器上的文件名。 |
dhcp |
通过 DHCP 获取板子的 IP 地址等网络参数。 | dhcp |
|
setenv |
(网络相关变量) 设置网络参数。 | setenv ipaddr 192.168.1.10 / setenv serverip 192.168.1.1 |
issue#1:无法ping通
第一,检查环境变量,配置好ipaddr、ethaddr、netmask,确保与主机处于同一网段。
| 环境变量 | 用途 |
|---|---|
| ipaddr | 开发板ip地址 |
| ethaddr | 开发板MAC地址 |
| netmask | 子网掩码 |
| gatewayip | 网关地址 |
| serveip | 服务器 IP 地址,也就是主机 IP 地址,用于调试代码。 |
setenv ipaddr 192.168.137.144
setenv ethaddr yourethaddr
setenv netmask 255.255.255.0
setenv serverip 192.168.137.1
saveenv
第二,检查无误后,使用网线连接主机(电脑),发现无法ping通。
-
原因:windows系统无法识别连接到以太网接口的设备,显示为“未识别的网络”,使用的是公用网络的网络配置文件,而windows公用网络配置文件默认是不允许回应ping的,因此无法ping通。
-
解决方法:在设置——网络与Internet——高级网络设置——Windows防火墙,将公用网络中的防火墙暂时关闭,即可ping通。
五、 系统启动命令
这些命令用于加载并启动操作系统内核。
| 命令 | 用途 | 示例 | 备注 |
|---|---|---|---|
bootm |
启动一个由 mkimage 工具制作的、带有 U-Boot 映像头信息的内核或操作系统映像。 |
bootm 0x42000000 |
地址是内核在 RAM 中的加载地址。 |
bootz |
启动一个 Linux zImage 格式的内核。 | bootz 0x42000000 |
通常用于启动未被 mkimage 打包的 zImage。 |
boot 或 bootd |
执行 bootcmd 环境变量中定义的命令,实现默认启动。 |
boot |
bootd 是 boot 的别名。 |
总结
U-Boot 的命令众多,但上述这些是日常开发和调试中最常用的。通过这些命令,您可以实现:
-
查看和修改配置: 使用
printenv、setenv和saveenv管理启动参数和网络设置。 -
加载映像文件: 使用
tftp、mmc read等将内核、设备树(DTB)和文件系统加载到 RAM 中。 -
启动系统: 使用
bootm或bootz引导操作系统。 -
调试和诊断: 使用
md、mw和ping等进行内存和网络测试。
在实际操作中,您可以通过输入 help 命令来获取当前 U-Boot 版本所支持的完整命令列表。希望这篇文章能帮助您更好地理解和使用 U-Boot!