什么是 DFU?
July 29, 2026 · – 访客
如果你曾经把一块嵌入式板卡插入电脑,看到它被识别为一个奇怪的、没有驱动的 USB 设备,那么它很可能处于 DFU 模式——Device Firmware Update(设备固件升级)。
DFU 究竟是什么
DFU 是由 USB Implementers Forum 定义的一种 USB 设备类,最初是为了在不需要任何特定产品工具的情况下更新 USB 外设的固件。支持它的设备会暴露一个小巧、标准化的接口:主机端的工具可以查询它、发送新的固件镜像,并触发重启进入新代码——这一切都通过与其他操作相同的那根 USB 线完成。
在嵌入式板卡上,"DFU 模式"通常意味着引导加载程序本身(例如 U-Boot)正在运行一个最小化的 DFU 协议栈,而不是启动 Linux。板卡在主机上会显示为一个 DFU 类 USB 设备,像 dfu-util 这样的工具可以列出可刷写的目标(分区、内存区域,或者引导加载程序选择暴露的任何东西),并直接向其写入数据。
为什么它很重要
有几点使 DFU 在嵌入式开发和生产中真正有用:
- 不需要额外硬件。 不需要 JTAG 探针,不需要 UART 适配器——只需要板卡本身已有的 USB 接口。
- 可恢复性。 如果一块板卡变砖,或者闪存上没有有效的操作系统,DFU 模式(通常由一个 strap 引脚或 boot ROM 的回退机制触发)往往是让它重新变得可刷写的最后一道防线。
- 标准化。 因为它是一个真正的 USB 类,拥有真正的驱动程序,所以它在不同操作系统上的工作方式相同,不需要厂商特定的内核驱动。
值得把 DFU 与你在同样的板卡上会遇到的相邻机制做个对比:fastboot(Android 的协议,目标相似,传输格式不同),以及 swupdate 或 RAUC 这类完整的系统镜像工具——它们负责在 Linux 已经运行起来之后处理更新的分发与回滚——DFU 通常工作在更低的一层,更靠近引导加载程序。
大致的工作流程
一次典型的 DFU 会话,从主机端来看是这样的:
# see what the board exposes in DFU mode
dfu-util -l
# flash an image to a specific alt-setting/partition
dfu-util -a 0 -D firmware.bin
板卡重置进入引导加载程序的 DFU 处理程序,主机端工具协商传输过程,镜像最终会写入引导加载程序为该 alt-setting 映射的位置——通常是某个特定的 eMMC/NAND 分区,或者一个暂存区域,引导加载程序会在下次启动时将其写入正式位置。
结语
DFU 是那种在正常工作时几乎让人感觉不到存在的基础设施:你插上一根线,运行一条命令,一分钟前还无法启动的板卡就恢复了。真正有趣的工程工作大多在引导加载程序这一侧——暴露什么、如何映射到真实存储、以及当传输在中途被打断时如何安全地失败。
这次是一篇短文——在以后的文章里,我会更深入地探讨具体的实现(以及它们变得棘手的地方)。
延伸阅读
- Universal Serial Bus Device Class Specification for Device Firmware Upgrade, Revision 1.1 — DFU 所基于的官方 USB-IF 规范。
- dfu-util — 上面示例中使用的主机端工具。
- U-Boot: Device Firmware Upgrade (DFU) — 大多数嵌入式 Linux 板卡所使用的引导加载程序中,DFU 是如何实现的。
相关阅读
- 嵌入式 Linux 的启动链 — 引导加载程序如何把控制权交给内核
- 什么是设备树? — 硬件是如何描述给内核的
评论