2、U-Boot 命令行基础:进入 U-Boot 命令行、常用快捷键、命令帮助系统(help/?)、命令自动补全
好,我们正式开始接触 U-Boot 的交互界面——命令行。很多刚接触嵌入式 Linux 的工程师,总觉得 U-Boot 是个黑盒子,按个键就进去了,然后一脸懵。其实没那么玄乎。说白了,U-Boot 的命令行就是一个精简版的 Shell,专门用来初始化硬件、加载内核、传递启动参数。
我个人习惯把这一章叫做“生存技能”。因为不管你是调试新板子,还是排查启动故障,第一件事就是得能在命令行里站住脚。连命令都不会敲,后面的调试根本无从谈起。
2.1 如何进入 U-Boot 命令行
板子上电后,U-Boot 启动时会在串口输出一段倒计时提示,类似这样:
U-Boot 2023.04 (Jan 15 2024 - 10:30:00 +0800)
CPU: i.MX8M Plus Quad A53 at 1.6GHz
DRAM: 2 GiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Net: eth0: ethernet@30be0000
Hit any key to stop autoboot: 3
看到 Hit any key to stop autoboot 这行字了吗?在倒计时归零之前,随便按一个键(比如空格或回车),就能进入命令行。我见过不少新手使劲按着键盘不放,结果倒计时结束了还没松开——嗯,那就直接启动内核了。
如果你没来得及按键,系统已经启动了内核,怎么办?别急,可以复位板子重来。或者,如果你在 U-Boot 里设置了 bootdelay=0,那它根本不会等你——我曾经在一块量产板上吃过这个亏,后来只好在硬件上拉低某个 GPIO 来强制进入命令行。
2.2 命令行提示符与基本操作
进入命令行后,你会看到这样的提示符:
=>
就两个字符,一个 = 和一个 >。别小看它,这是 U-Boot 的“地盘标志”。看到它,说明你已经成功接管了控制权。
在提示符后面,你可以输入各种命令。比如先试试:
=> printenv
baudrate=115200
bootargs=console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait
bootcmd=mmc dev 0; fatload mmc 0:1 0x42000000 Image; booti 0x42000000 - 0x43000000
...
这个命令会打印出所有的环境变量。我每次拿到一块新板子,第一件事就是跑 printenv,看看默认配置是不是合理。有一次我发现某款开发板的 bootargs 里居然没配 console 参数,导致内核启动后串口没输出——这种坑,早发现早解决。
2.3 常用快捷键:让操作更高效
U-Boot 的命令行支持一些基本的行编辑快捷键。虽然不如 bash 那么强大,但足够日常使用了。我把最常用的整理成了一张表:
| 快捷键 | 功能说明 | 我的使用场景 |
|---|---|---|
| Ctrl + C | 中断当前命令或进程 | 当某个命令卡死时,按这个强制退出 |
| Ctrl + U | 删除当前行所有字符 | 输错了一长串命令,一键清空重来 |
| Ctrl + A | 光标移到行首 | 想在命令前面加个前缀时用 |
| Ctrl + E | 光标移到行尾 | 修改命令末尾的参数 |
| Backspace | 删除光标前一个字符 | 最常用的,不用多说 |
| 方向键 ↑/↓ | 浏览历史命令 | 重复执行类似命令时非常方便 |
2.4 命令帮助系统:help 和 ?
U-Boot 的命令很多,没人能全记住。好在它自带帮助系统。输入 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'
booti - boot arm64 Linux Image
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
...
如果你想看某个命令的详细用法,就在 help 后面加上命令名:
=> help booti
booti - boot arm64 Linux Image
Usage:
booti [addr [initrd[:size]] [fdt]]
- boot arm64 Linux Image from memory
- 'addr' is the address of the Image file
- 'initrd' is the address of the initrd image, optional
- 'fdt' is the address of the device tree, optional
你看,help booti 直接告诉你这个命令的参数格式和含义。我调试的时候,经常一边敲 help 一边查,尤其是那些不常用的命令,比如 fdt 相关的操作。
help 和 ? 这两个入口就够了。需要什么功能,先 help 看看有没有对应的命令,再用 help 命令名 查具体用法。这才是高效的做法。
2.5 命令自动补全:Tab 键的妙用
U-Boot 支持 Tab 键自动补全。这个功能太实用了。比如你输入 boot,然后按 Tab 键,它会列出所有以 boot 开头的命令:
=> boot<Tab>
boot bootd booti bootm bootp
=> boot
如果你输入 booti 再按 Tab,它会把命令补全完整。如果只有一个匹配项,直接补全;如果有多个,就列出所有选项。
自动补全不仅对命令有效,对文件名、内存地址、环境变量名也有效。比如:
=> fatload mmc 0:1 0x42000000 <Tab>
Image imx8mp-evk.dtb initramfs.cpio.gz
=> fatload mmc 0:1 0x42000000 I
它会列出当前分区下的文件,方便你选择。我在项目中经常用这个功能来确认文件是否真的烧录进去了——如果 Tab 补全看不到文件名,那多半是没烧成功。
f<Tab><Tab>,就能看到所有以 f 开头的命令,包括 fatload、fatls、fdt 等。
2.6 本章知识体系
为了让你更直观地理解这一章的内容结构,我画了一张流程图:
这张图把这一章的内容串起来了。从进入命令行开始,到掌握四个核心模块,最终目标是能熟练操作。你可以在脑子里过一遍:如果现在给你一块板子,你能在 3 秒内进入命令行吗?能快速查到某个命令的用法吗?能用 Tab 补全提高效率吗?