什么是 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 在嵌入式开发和生产中真正有用:

值得把 DFU 与你在同样的板卡上会遇到的相邻机制做个对比:fastboot(Android 的协议,目标相似,传输格式不同),以及 swupdateRAUC 这类完整的系统镜像工具——它们负责在 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 是那种在正常工作时几乎让人感觉不到存在的基础设施:你插上一根线,运行一条命令,一分钟前还无法启动的板卡就恢复了。真正有趣的工程工作大多在引导加载程序这一侧——暴露什么、如何映射到真实存储、以及当传输在中途被打断时如何安全地失败。

这次是一篇短文——在以后的文章里,我会更深入地探讨具体的实现(以及它们变得棘手的地方)。

延伸阅读

相关阅读

评论