dfu-util 通过 USB DFU 烧录固件。对于没有接调试探针的被测设备,或者本身提供 DFU 引导程序的设备,这就是烧录途径。
需要 Box 软件 0.33.0 或更高版本,并且 Box 上已安装 dfu-util。
句柄
name()。
方法
类型
DfuOptions
Default 会选中总线上唯一的那台 DFU 设备。接了不止一台时,dfu-util 会因为无法确定而报错,而不是靠猜,所以请指名一台。
DfuDevice
mode 是 "DFU";对于正在运行应用、同时声明具备 DFU 能力的设备,则是 "Runtime"。
DfuOutput
方法参考
list() -> Result<Vec<DfuDevice>>
枚举支持 DFU 的设备,由 dfu-util -l 的输出解析成带类型的记录。
download(firmware: &[u8], opts: &DfuOptions) -> Result<DfuOutput>
把固件上传到 Box 并烧录。这些字节以 base64 编码放进请求,因此不需要先在 Box 的文件系统上准备任何东西。
STM32 的系统引导程序需要
dfuse_address。没有它,dfu-util 就没有可写入的基地址,下载会失败。detach(opts: &DfuOptions) -> Result<DfuOutput>
让设备脱离 DFU 模式,从而离开引导程序并运行应用。
示例
给没有调试探针的被测设备烧录
通过给集线器端口断电重启来进入 DFU
说明
- 运行失败一定是
Err,不会是exit_code非零的Ok。dfu-util以非零码退出时,Box 返回 HTTP 502,也就是Error::Box,所以一个?就是全部检查。从 Box 0.57.0 起,错误消息会引用两个输出流的末尾,各自带标签。更早的 Box 只引用 stderr 的最后 3 行。 - 两个输出流都要看,不要只看 stderr。
dfu-util报告设备故障(例如DFU state(10) = dfuERROR, status(3) = Device is unable to write memory)时,原始下载写在 stdout 上,DfuSe 写在 stderr 上。进度写到 stdout,DFU 后缀警告写到 stderr。 - 没装
dfu-util的 Box 会用Error::Box和 HTTP 500 回应,并携带dfu-util is not installed on this box. Install it with 'lager box-config apt add dfu-util'。这里有意不是UnsupportedByBox—— 路由是存在的,只是工具没装。 - 早于 0.33.0 的 Box 根本不提供这条路由,那种情况才是
Error::UnsupportedByBox。 - 客户端给下载留了 180 秒,高于 Box 自己给
dfu-util的 120 秒预算,以便为上传和排队留出余量。

