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 本章知识体系

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

U-Boot命令行入门知识体系 U-Boot命令行 进入命令行 基础操作 help命令详解 上电 → 按任意键停止自动启动 串口参数:115200-8-N-1 Tab补全:敲2-3字母 + Tab 历史命令:上/下箭头 编辑快捷键:Ctrl+A/E/U/K/W help / ? 列出所有命令 help 命令名 查看详细用法 help 类别 按分类查看 核心思路:先进入 → 再操作 → 遇到不懂的用help 记住这三个步骤,U-Boot命令行就不再神秘

1.5 实战小贴士

最后,分享几个我在项目中积累的经验:

  • 别怕敲错命令: U-Boot不会因为一条错误命令就变砖。最多就是报个错,重新输入就好。我刚开始学的时候,几乎把每个命令都敲错过一遍。
  • 善用环境变量: 虽然本章没讲,但提前告诉你——printenv 可以查看所有环境变量,setenv 可以设置。这些变量控制着启动流程,后面我们会详细讲。
  • 记录你的操作: 调试时把敲过的命令记下来。我曾经因为忘记之前改了什么参数,花了整整一个下午重新排查。从那以后,我养成了用 history 命令(如果支持的话)或者手动记录的习惯。

一句话总结: U-Boot命令行就是你的硬件调试利器。学会进入、学会操作、学会查帮助,你就已经迈出了嵌入式底层开发的第一步。