1. 初识U-Boot命令行:进入U-Boot命令行、命令行基础操作(Tab补全、历史命令)、help命令详解
大家好,我是你们的嵌入式系统讲师。今天咱们正式开始《U-Boot命令行操作精讲》的第一章。
说实话,我见过不少工程师,写应用层代码溜得很,一到了Bootloader阶段就发怵。其实U-Boot命令行没那么神秘,它就像是一个微型操作系统,专门用来初始化硬件、加载内核。你想想看,没有它,你的Linux系统怎么跑起来?
1.1 如何进入U-Boot命令行
板子上电后,你会在串口终端看到一串启动日志。这时候眼睛要盯紧了——当出现 Hit any key to stop autoboot 的提示时,赶紧按任意键(我习惯按空格键,手感好)。
关键时机: 从Flash/NAND/eMMC加载内核之前,U-Boot会给你一个短暂的倒计时窗口(通常是1-3秒)。错过了?没关系,按复位键再来一次。
进入后的界面长这样:
U-Boot 2023.04 (Jan 15 2024 - 14:30:00 +0800)
CPU: i.MX6ULL
Board: MY-IMX6ULL
DRAM: 512 MiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Net: FEC0
Hit any key to stop autoboot: 0
=>
看到那个 => 提示符了吗?这就是U-Boot的命令行入口。我曾经遇到过新手问:“为什么我的板子直接进系统了,看不到这个提示符?”嗯,多半是串口波特率没配对,或者终端软件没设置好。检查一下你的串口参数:115200-8-N-1,这是最常见的配置。
1.2 命令行基础操作
进入命令行后,你会发现U-Boot的Shell跟Linux的Bash有点像,但功能精简得多。我总结了三个最常用的操作技巧,掌握了它们,你的操作效率能提升一倍。
1.2.1 Tab补全——懒人必备
U-Boot支持命令和文件路径的Tab补全。比如你想输入 fatload,只需要敲 fa 然后按Tab键,系统会自动补全。如果匹配到多个命令,再按一次Tab会列出所有候选。
我的习惯: 每次只敲命令的前2-3个字母,然后按Tab。既省时间,又避免拼写错误。特别是那些长命令如 mmc partconf,手敲太容易出错了。
1.2.2 历史命令——重复操作不再烦
U-Boot会记住你之前输入的命令。按 上箭头 或 Ctrl+P 可以调出上一条命令,按 下箭头 或 Ctrl+N 回到下一条。这个功能在调试时特别有用——你经常需要反复执行同一组命令来测试不同的内核参数。
我记得有一次调试NAND Flash驱动,需要在 nand read 和 bootm 之间来回切换。如果没有历史命令,每次都要重新敲一遍,那真是要疯掉。
1.2.3 编辑快捷键
除了补全和历史,U-Boot还支持一些行编辑快捷键:
| 快捷键 | 功能 | 我的备注 |
|---|---|---|
| Ctrl+A | 光标移到行首 | 改错命令时很管用 |
| Ctrl+E | 光标移到行尾 | 追加参数时常用 |
| Ctrl+U | 删除整行 | 输错了?一键清空 |
| Ctrl+K | 删除光标到行尾 | 只删后半段,保留前半段 |
| Ctrl+W | 删除前一个单词 | 路径写错了?删掉重来 |
注意: 不是所有U-Boot版本都支持完整的行编辑功能。如果你发现快捷键没反应,先检查一下 CONFIG_CMDLINE_EDITING 是否使能。我曾经在一个老版本上折腾了半天,最后发现是配置没开。
1.3 help命令详解——你的随身手册
U-Boot的命令很多,没人能全部记住。所以 help 命令是你最好的朋友。我个人建议,遇到不熟悉的命令,先敲 help 看看。
1.3.1 基本用法
直接输入 help 或 ?,会列出所有可用的命令:
=> help
? - alias for 'help'
base - print or set address offset
bdinfo - print Board Info structure
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
...
=>
输出结果按字母顺序排列,每个命令后面有一行简短说明。但说实话,这个列表太长了,你很难快速找到想要的命令。所以我更推荐第二种用法。
1.3.2 查看特定命令的帮助
在 help 后面加上命令名,就能看到该命令的详细用法:
=> 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
- When booting a Linux kernel which requires a flat device-tree
a third argument is required which is the address of the
device-tree blob. To boot that kernel without an initrd image,
use a '-' for the second argument. If you do not pass a third
argument, the bootm command will use the environment variable
fdtaddr for the address of the device-tree blob.
你看,这个输出比刚才详细多了。它告诉你命令的语法、参数含义,甚至还有使用示例。我个人建议,在正式使用一个命令之前,先用 help 命令名 看一下文档,能避免很多低级错误。
1.3.3 命令分类查看
有些U-Boot版本支持按类别查看命令。比如 help network 可以只看网络相关的命令:
=> help network
bootp - boot image via network using BOOTP/TFTP protocol
dhcp - invoke DHCP client to obtain IP/boot params
nfs - boot image via network using NFS protocol
ping - send ICMP ECHO_REQUEST to network host
tftpboot- boot image via network using TFTP protocol
=>
这个功能在调试特定子系统时特别方便。比如你在调网络驱动,就不用在一大堆命令里翻来翻去了。
1.4 本章知识体系
为了让你更直观地理解本章内容,我画了一张流程图:
1.5 实战小贴士
最后,分享几个我在项目中积累的经验:
- 别怕敲错命令: U-Boot不会因为一条错误命令就变砖。最多就是报个错,重新输入就好。我刚开始学的时候,几乎把每个命令都敲错过一遍。
- 善用环境变量: 虽然本章没讲,但提前告诉你——
printenv可以查看所有环境变量,setenv可以设置。这些变量控制着启动流程,后面我们会详细讲。 - 记录你的操作: 调试时把敲过的命令记下来。我曾经因为忘记之前改了什么参数,花了整整一个下午重新排查。从那以后,我养成了用
history命令(如果支持的话)或者手动记录的习惯。
一句话总结: U-Boot命令行就是你的硬件调试利器。学会进入、学会操作、学会查帮助,你就已经迈出了嵌入式底层开发的第一步。