3、fastboot工具:协议原理、常用命令与U-Boot烧录实战

说到fastboot,我得先坦白一件事——我入行头两年,一直把它和adb搞混。后来被一个老前辈点醒:adb是系统跑起来之后用的,fastboot是在bootloader阶段用的。说白了,fastboot就是你在U-Boot里跟硬件对话的那把钥匙。

今天咱们就把fastboot的协议原理、常用命令,以及怎么用它烧录U-Boot,一次性讲透。

3.1 fastboot协议原理——它到底怎么工作的?

fastboot协议其实不复杂。它基于USB的bulk传输,走的是简单的命令-响应模式。

我画了一张图,帮你快速理解它的核心逻辑:

fastboot协议通信流程 PC主机(fastboot客户端) 发送命令:flash / boot / reboot 目标设备(U-Boot) 解析命令 → 执行操作 → 返回状态 命令(download/flash等) 响应(OKAY / FAIL) 数据发送(download命令) 将镜像数据通过USB bulk传输 数据接收与校验 写入内存缓冲区 flash命令 指定分区名称 写入Flash存储器 擦除→写入→校验 最终响应:OKAY(成功)或 FAIL(失败+原因)

你看,整个流程就是:PC发命令 → 设备执行 → 返回结果。简单粗暴,但非常可靠。

核心要点:fastboot协议基于USB bulk传输,采用命令-响应模型。所有操作都是同步的——发一条命令,等一个响应,再发下一条。这种设计虽然简单,但在烧录场景下反而更稳定。

我记得有一次调试一块新板子,U-Boot死活进不了fastboot模式。查了半天,发现是USB驱动初始化时少配了一个端点描述符。嗯,这种坑踩过一次就记住了。

3.2 fastboot常用命令——你真正需要掌握的

fastboot命令不少,但日常烧录U-Boot,你真正需要记住的就三个:flash、boot、reboot。其他的命令,用到再查也不迟。

命令 格式 说明 我的经验
flash fastboot flash <分区名> <镜像文件> 将镜像烧录到指定分区 分区名别写错,我吃过亏
boot fastboot boot <镜像文件> 从内存启动镜像,不烧录 调试时特别好用,省得反复擦写
reboot fastboot reboot 重启设备 烧完U-Boot记得reboot一下

3.2.1 flash命令——烧录的核心

flash命令的完整流程是:先download把镜像传到设备内存,再flash写入分区。但fastboot工具帮你封装好了,一条命令搞定。

# 烧录U-Boot到bootloader分区
fastboot flash bootloader u-boot.bin

# 烧录内核到boot分区
fastboot flash boot boot.img

# 烧录文件系统到rootfs分区
fastboot flash rootfs rootfs.img

我的小技巧:烧录前先用 fastboot getvar partition-size:bootloader 查看分区大小,确保镜像不会超出分区边界。我曾经因为镜像大了几个KB,把隔壁分区数据给覆盖了……那次教训挺深刻的。

3.2.2 boot命令——调试利器

boot命令是我个人最喜欢的调试方式。它把镜像加载到内存直接启动,不碰Flash。你想想看,调试U-Boot时如果每次都要擦写Flash,那得多慢?

# 从内存启动U-Boot,不烧录
fastboot boot u-boot.bin

# 启动内核,同样不烧录
fastboot boot boot.img

为什么会这样?因为boot命令只把镜像放到内存的特定地址,然后跳转执行。如果启动失败,重启设备就回到原来的状态,完全不影响Flash里的内容。

3.2.3 reboot命令——收尾动作

烧录完成后,记得fastboot reboot一下。不过要注意,有些设备在烧录U-Boot后需要断电重启,光reboot可能不够。

# 正常重启
fastboot reboot

# 重启到bootloader(有些设备支持)
fastboot reboot-bootloader

注意:烧录U-Boot后如果设备无法启动,先别慌。检查一下:1)分区名是否正确;2)镜像是否针对该板子编译;3)有没有烧错位置。我曾经把U-Boot烧到了kernel分区,结果板子变砖,还好有JTAG救回来。

3.3 fastboot烧录U-Boot实战——手把手教你做

好了,理论讲完了,咱们直接上手。下面是我在实际项目中的标准操作流程。

3.3.1 准备工作

  1. 编译好的U-Boot镜像:u-boot.bin 或 u-boot.imx(取决于平台)
  2. fastboot工具(Android SDK自带,或单独编译)
  3. USB线(质量要好,我遇到过劣质线导致传输中断)
  4. 目标板子,进入fastboot模式

3.3.2 让设备进入fastboot模式

不同平台进入方式不同,但原理一样——在U-Boot启动时中断,然后执行fastboot命令。

# 在U-Boot命令行中
U-Boot> fastboot usb 0
# 或者
U-Boot> fastboot 0

然后PC上检查设备是否识别:

$ fastboot devices
1234567890abcdef    fastboot

如果看不到设备,先检查驱动。Windows上需要装驱动,Linux一般免驱。我习惯用Linux做烧录,省心很多。

3.3.3 烧录U-Boot

# 第一步:擦除原有U-Boot(有些设备需要)
fastboot erase bootloader

# 第二步:烧录新U-Boot
fastboot flash bootloader u-boot.bin

# 第三步:校验(可选,但我建议做)
fastboot getvar partition-type:bootloader
# 返回类似:bootloader: raw

# 第四步:重启
fastboot reboot

实战经验:我建议烧录前先备份原厂U-Boot。用 fastboot boot 先测试新U-Boot能否正常启动,确认没问题再 flash 写入。这个习惯帮我避免了好几次变砖事故。

3.3.4 验证烧录结果

重启后,在U-Boot启动日志里查看版本信息:

U-Boot 2024.01 (Jan 15 2024 - 14:30:00 +0800)

CPU:   i.MX8M Plus Rev1.1
DRAM:  2 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 2
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet@30be0000
Fastboot: ready

看到 Fastboot: ready 就说明U-Boot已经正常启动,fastboot功能也开启了。

3.4 常见问题与避坑指南

做嵌入式这么多年,fastboot烧录踩过的坑不少。我挑几个典型的说说:

  • 设备无法识别:先检查USB线,再检查驱动。Linux下用 lsusb 看有没有设备,Windows下看设备管理器。
  • 烧录到一半卡住:大概率是USB传输问题。换根短线试试,或者降低USB速率。
  • 烧完启动不了:先确认分区名对不对。我见过有人把U-Boot烧到 boot 分区而不是 bootloader 分区。
  • 提示 FAILED (remote: 'unknown command'):说明U-Boot里没开启fastboot功能。检查配置:CONFIG_CMD_FASTBOOT=y。

我的建议:如果你刚开始接触fastboot,先在开发板上练手。用 fastboot boot 测试,别急着 flash。等熟悉了流程,再上正式板子。这样即使出问题,重启一下就能恢复。

好了,fastboot这块就讲这么多。记住三个命令:flash烧录、boot调试、reboot收尾。配合我上面说的流程,烧录U-Boot基本不会出大问题。

可可精品资料库