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

说明

  • 运行失败一定是 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 秒预算,以便为上传和排队留出余量。