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 打印第一行信息时,我就开始连续按空格键。这样基本不会错过窗口期。如果你用的是 SecureCRT 或 Putty,记得先点一下串口窗口让它获得焦点,否则按键无效。

如果你没来得及按键,系统已经启动了内核,怎么办?别急,可以复位板子重来。或者,如果你在 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 删除光标前一个字符 最常用的,不用多说
方向键 ↑/↓ 浏览历史命令 重复执行类似命令时非常方便
注意: 有些串口终端软件(比如某些版本的 Putty)可能对 Ctrl 组合键支持不完美。如果你发现快捷键没反应,先检查终端设置,或者改用方向键和历史命令。我曾经在某个工控板上遇到过 Ctrl+C 失效的情况,最后只能硬复位。

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 补全看不到文件名,那多半是没烧成功。

小技巧: 如果你不确定某个命令的拼写,只记得前几个字母,按两下 Tab 键,它会显示所有匹配的命令。比如输入 f<Tab><Tab>,就能看到所有以 f 开头的命令,包括 fatload、fatls、fdt 等。

2.6 本章知识体系

为了让你更直观地理解这一章的内容结构,我画了一张流程图:

U-Boot 命令行基础 · 知识体系 进入命令行 提示符与基本操作 printenv / setenv 常用快捷键 Ctrl+C / Ctrl+U / ↑↓ 帮助系统 help / ? 自动补全 Tab 键 提示符 => printenv 查看环境变量 setenv 修改变量 saveenv 保存 行编辑快捷键 Ctrl+A/E 行首/行尾 Ctrl+U 删除整行 ↑/↓ 历史命令 帮助系统用法 help 列出所有命令 help 命令名 查详情 ? 是 help 的别名 Tab 补全 命令补全 文件名补全 变量补全 目标:熟练操作 U-Boot 命令行 核心思路:先能进去,再会查帮助,最后用快捷键和补全提升效率

这张图把这一章的内容串起来了。从进入命令行开始,到掌握四个核心模块,最终目标是能熟练操作。你可以在脑子里过一遍:如果现在给你一块板子,你能在 3 秒内进入命令行吗?能快速查到某个命令的用法吗?能用 Tab 补全提高效率吗?