Skip to main content
用 Box 上的 dfu-util 通过 USB DFU 烧录固件。对于没有接调试探针的被测设备,或者本身提供 DFU 引导程序的设备,这就是烧录途径。 需要 Box 软件 0.33.0 或更高版本,并且 Box 上已安装 dfu-util

句柄

DFU 是 Box 级能力,不是一个 Net。它没有 Net 名称,也没有 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

说明

  • dfu-util 把进度写到 stderr,而不是 stdout。一次成功的下载同样会填满 DfuOutput::stderr;请检查 exit_code,而不是看 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 秒预算,以便为上传和排队留出余量。