DFU
+ -

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

0 篇笔记 写笔记

USB-C/TYPE-C的角色分类及定义
USB总线是一个主从总线,在一条USB总线中,只能有一个USB主机,其余设备都是从机。USB总线中两个设备通过USB总线连接之前,其主从关系是一般是确定的(OGT除外)。如USB的下行端口(DownStreaming Face Port,DFP)一般为主机,而而USB的上行端口(UpStreami......
DFU 术语
缩写英文中文DFUDevice Firmware Upgrade设备固件更新FirmwareExecutable software stored in a write-able, nonvolatile memory on a USB device存储在USB设备上......
DFU 介绍
购买了 USB 设备的用户需要能够在制造商提供的改进版本中升级这些设备的固件。DFU就是完成该任务的机制。任何类型的 USB 设备都可以通过支持本文档中指定的要求来利用此功能。本文档重点介绍为已在现场部署的设备安装产品增强功能和补丁。固件升级功能的其他潜在用途超出了本文档的范围。由于设备同时......
DFU 固件更新过程
完成实现固件升级可以分为4个不同阶段。1.枚举:设备把自身的一些特性告知主机,嵌入在设备正常运行描述符中的一个DFU类接口描述符和相关的函数符能够完成这个目的,并且能够为通过控制管道的类专用的请求提供目标。2.DFU枚举:主机和设备同意开始固件升级,主机向设备发出USB复位,设备发出第二个描述符......
DFU 类特定请求
DFU类特定请求用于完成升级操作。 下表总结了 DFU 类特定的请求。RequestRequest codeRequest descriptionDFU_DETACH0X00请求设备离开DFU模式,进入应用程序DFU_DNLOAD0x01请求Host主机端数据发送......
DFU 运行时接口描述符
因为DFU仅使用控制端点故不存在端点描述符。 这样主机提供了足够的信息来识别设备能够执行固件升级操作。 它还提供了通过默认控制管道启动此类操作的方法。DFU 类接口通常是为每个运行时配置枚举的最后一个接口。但是,并不要求此接口占据任何特定位置。DFU 接口描述符格式偏移字段长度值描......
DFU 运行时功能描述符(Device Firmware Update Functional Descriptor)
运行时DFU功能描述符全称Run-Time DFU Functional Descriptor或 Device Firmware Update Functional Descriptor。描述符对于运行时和 DFU 模式描述符集是相同的运行时DFU 功能描述符格式偏移字段长度值描述......
DFU 模式配置描述符
DFU模式配置描述符与USB规范描述的标准配置描述符相同,但bNumInterfaces字段必须包值01h。偏移量名称大小说明0bLength1描述符长度(9字节)1bDescriptorType1描述符类型(配置描述符为0x02)2wTotalLe......
DFU 运行时
在正常运行时操作期间,设备会公开其正常的描述符集。但是,在每个支持DFU的运行时配置中插入了以下附加描述符:运行时DFU特定类接口描述符运行时功能描述符运行时描述符集公开设备的正常运行时设备描述符和配置描述符。支持DFU的每个配置的配置描述符的bNumInterfaces字段增加1,以适应运行......
UVC彩色摄像头与红外(IR)摄像头相机
常见的UVC摄像头叫彩色相机,是通过摄像头镜头将捕捉的彩色画面进行感光,数据压缩,再通过USB线缆传递给我们的主机,通过我们普通的相机应用软件打开该彩色相机,就可以实时的查看它的彩色画面了。我们经常见到的UVC摄像头基本上全是这类相机。不过,现实中还有一种特殊的相机,它不是捕捉彩色画面的,而是通过......
USB PD3.1进入与退出EPR Mode的程序
从USB PD3.1开始,支持EPR模式,故在进行协商时:第一步:明确PD连接此阶段,Source/Sink会确认双方是否都有宣告支持EPR Mode:Source/Sink,需要先建立Explicit PD Contract。在Source Capabilities与Request Mess......
Android手机USB Accessory Mode模式
一、模式定义与特点==‌USB Accessory Mode‌== 是 Android 系统的一种特殊 USB 通信模式,其核心特性包括:==‌角色分配‌== 外部配件(如读卡器、传感器)作为 ==‌USB Host‌==(主机),......
NCM GetCrcMode
GET_CRC_MODE 请求格式字段值描述bmRequestType10100001B请求类型:• 位7:1 = 设备到主机• 位6-5:00 = 标准请求• 位4:0 = 主机到设备• 位3-0:0001 = 接口bRequestGET_CRC_MODE请求代码......
NCM SetCrcMode
SET_CRC_MODE 请求格式字段值描述bmRequestType00100001B请求类型:• 位7:0 = 主机到设备• 位6-5:00 = 标准请求• 位4:0 = 主机到设备• 位3-0:0001 = 接口bRequestSET_CRC_MODE请求代码......
进入Compliance Mode(合规模式)的三个必要条件
条件内容含义条件1360ms 定时器超时Polling.LFPS 握手阶段耗尽了规定等待时间,没有得到期望的响应条件2不满足转入 Polling.RxEQ 的条件比如没有检测到对方发送的 LFPS 信号,或信号质量不足以进入下一阶段条件3是本次上电复位后的首......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!