DFU Mode
2026-10-23
本文链接为:http://www.usbzh.com/article/detail-1817.html ,欢迎转载,转载请附上本文链接。
DFU Mode 是 TinyUSB DFU 的核心,实现了完整的 DFU 1.1 状态机。相比 Runtime 的”极简”(无状态、只处理 2 个请求),DFU Mode 要处理全部 7 个类请求,并驱动 11 个状态的流转。
| 请求 | 处理要点 |
|---|---|
| SET_INTERFACE | 切换 alt(分区),并 reset_state() 重置状态机 |
| GET_INTERFACE | 返回当前 alt |
| DETACH | SETUP 应答,ACK 阶段调 tud_dfu_detach_cb() |
| CLRSTATUS | reset_state() 清除错误状态 |
| GETSTATE | 返回 1 字节当前状态 |
| ABORT | 重置状态机,ACK 阶段调 tud_dfu_abort_cb(alt) |
| UPLOAD | 调 tud_dfu_upload_cb 填充数据,回传数据给主机,方向位是 IN(设备→主机) |
| DNLOAD | OUT(主机→设备) |
| GETSTATUS | 见下节 |
类请求
| 请求 | 请求码 | 功能 | 对应回调 | 触发阶段 |
|---|---|---|---|---|
| DFU_REQUEST_DETACH | 0x00 | 主机要求设备脱离(准备复位) | tud_dfu_detach_cb() | ACK |
| DFU_REQUEST_DNLOAD | 0x01 | 下发固件数据块 | (无直接回调,为 download_cb 做准备) | SETUP |
| DFU_REQUEST_UPLOAD | 0x02 | 读回固件数据 | tud_dfu_upload_cb() | SETUP |
| DFU_REQUEST_GETSTATUS | 0x03 | 查询状态 + 推进状态机 | tud_dfu_get_timeout_cb() / tud_dfu_download_cb() / tud_dfu_manifest_cb() | SETUP + ACK |
| DFU_REQUEST_CLRSTATUS | 0x04 | 清除错误状态 | (无) | SETUP |
| DFU_REQUEST_GETSTATE | 0x05 | 返回当前状态 | (无) | SETUP |
| DFU_REQUEST_ABORT | 0x06 | 中止传输 | tud_dfu_abort_cb() | ACK |
┌────────────┐
DETACH/复位 │ APP_IDLE │ (Runtime)
┌──────────▶│ (0) │
│ └────────────┘
│ │ 重连/进入DFU Mode
▼ ▼
┌─────────┐ ┌──────────────┐
│APP_DETACH│ │ DFU_IDLE │ (2)
│ (1) │ └──────┬───────┘
└─────────┘ │ DNLOAD(wLength>0)
▼
┌────────────────┐
│ DFU_DNLOAD_SYNC│ (3)
│ (3) │◀─────────────┐
└───────┬────────┘ │
│ GETSTATUS(ACK) │ finish_flashing(OK)
▼ │
┌────────────────┐ │
│ DFU_DNBUSY │ (4)──────────┘
│ (4) │ download_cb 烧写
└────────────────┘
│ DNLOAD(wLength=0)
▼
┌────────────────┐
│DFU_MANIFEST_SYNC│ (6)
│ (6) │
└───────┬────────┘
│ GETSTATUS(ACK)
▼
┌────────────────┐
│ DFU_MANIFEST │ (7)
│ (7) │ manifest_cb 校验
└───────┬────────┘
│ finish_flashing(OK)
┌──────────┴──────────┐
▼ ▼
┌────────────────┐ ┌───────────────────┐
│DFU_MANIFEST_SYNC│ │DFU_MANIFEST_WAIT_ │ (宽容 / 严格)
│ (宽容) │ │ RESET (8) │
└────────────────┘ └───────────────────┘
│ 复位
┌─────────▼─────────┐
│ 任何阶段失败 → │
│ DFU_ERROR (10) │
└───────────────────┘
固件下载为例时序图:
主机 设备(DFU Mode驱动) 应用
│ │ │
│ DNLOAD(wValue=0, 数据0) │ │
│─────────────────────────────▶│ 收数据→transfer_buf, state=DNLOAD_SYNC│
│ │ │
│ GETSTATUS │ │
│─────────────────────────────▶│ SETUP: get_timeout_cb(alt,DNBUSY)│──▶ 返回超时
│ │ 预告 DNBUSY + timeout │
│ ◀─────────── 6字节状态 ──────│ DATA │
│────────────── ACK ──────────▶│ ACK: download_cb(alt,0,数据,len) │──▶ 开始写Flash(异步)
│ │ state=DNBUSY │
│ (等待 bwPollTimeout) │ │
│ │ 应用烧写完成 │
│ │◀───────── finish_flashing(OK)─────│
│ │ state=DNLOAD_IDLE │
│ GETSTATUS │ │
│─────────────────────────────▶│ SETUP: 报告 DNLOAD_IDLE, timeout=0│
│ ◀───────────────────────────│ │
│ DNLOAD(wValue=0, 数据1) │ (下一块,循环...) │
│ ... │ │
│ DNLOAD(wLength=0) │ 下载结束, state=MANIFEST_SYNC │
│─────────────────────────────▶│ │
│ GETSTATUS │ │
│─────────────────────────────▶│ SETUP: get_timeout_cb(alt,MANIFEST)│──▶ 返回超时
│ ◀───────────────────────────│ │
│────────────── ACK ──────────▶│ ACK: manifest_cb(alt) │──▶ 校验/落盘
│ │ state=MANIFEST │
│ │◀───────── finish_flashing(OK)─────│
│ │ state=MANIFEST_WAIT_RESET │
│ │ (等待复位) │
本文链接为:http://www.usbzh.com/article/detail-1817.html ,欢迎转载,转载请附上本文链接。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936 USB技术交流3:1031974172
DFU





