3、fastboot工具:协议原理、常用命令与U-Boot烧录实战
说到fastboot,我得先坦白一件事——我入行头两年,一直把它和adb搞混。后来被一个老前辈点醒:adb是系统跑起来之后用的,fastboot是在bootloader阶段用的。说白了,fastboot就是你在U-Boot里跟硬件对话的那把钥匙。
今天咱们就把fastboot的协议原理、常用命令,以及怎么用它烧录U-Boot,一次性讲透。
3.1 fastboot协议原理——它到底怎么工作的?
fastboot协议其实不复杂。它基于USB的bulk传输,走的是简单的命令-响应模式。
我画了一张图,帮你快速理解它的核心逻辑:
你看,整个流程就是: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 准备工作
- 编译好的U-Boot镜像:
u-boot.bin或u-boot.imx(取决于平台) - fastboot工具(Android SDK自带,或单独编译)
- USB线(质量要好,我遇到过劣质线导致传输中断)
- 目标板子,进入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基本不会出大问题。
可可精品资料库