DFU
+ -

DFU运行时设备示例

2026-10-22 本文链接为:http://www.usbzh.com/article/detail-1814.html ,欢迎转载,转载请附上本文链接。

DFU运行时(RUNTIME)的测试示例来源于tinyusb

使用示例,创建的描述符如下:

        ---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x01 (Interface 1)
bAlternateSetting        : 0x00
bNumEndpoints            : 0x00 (Default Control Pipe only)
bInterfaceClass          : 0xFE (Application Specific)
bInterfaceSubClass       : 0x01 (Device Firmware Upgrade)
bInterfaceProtocol       : 0x01 (Runtime)
iInterface               : 0x04 (String Descriptor 4)
 Language 0x0409         : "USBZH DFU"

        ----- Device Firmware Update Functional Descriptor ----
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x21 (DFU Functional Descriptor)
bmAttributes             : 0x0D
 Bit 7..4: reserved      : 0x00
 Bit 3: WillDetach       : 0x01
 Bit 2: ManifestTolerant : 0x01
 Bit 1: CanUpload        : 0x00
 Bit 0: CanDownload      : 0x01
wDetachTimeOut           : 0x03E8 (1000 ms)
wTransferSize            : 0x1000 (max 4096 bytes)
bcdDFUVersion            : 0x0101 (Version 1.1)

可以看到,其并没有其它端点描述符。所以从这里也可以看到,DFU使用的是USB控制类请求。

USB类主请求主要包括可详见:https://www.usbzh.com/article/detail-794.html

其实这些USB类请求也只是USB控件端点通过不同的类请求实现传输固件信息到固件的过程。
在tinyusb中定义的回调主要有2个

  switch (request->bRequest)
  {
    case DFU_REQUEST_DETACH:
    {
      TU_LOG_DRV("  DFU RT Request: DETACH\r\n");
      tud_control_status(rhport, request);
      tud_dfu_runtime_reboot_to_dfu_cb();
    }
    break;

    case DFU_REQUEST_GETSTATUS:
    {
      TU_LOG_DRV("  DFU RT Request: GETSTATUS\r\n");
      dfu_status_response_t resp;
      // Status = OK, Poll timeout is ignored during RT, State = APP_IDLE, IString = 0
      TU_VERIFY(tu_memset_s(&resp, sizeof(resp), 0x00, sizeof(resp))==0);
      tud_control_xfer(rhport, request, &resp, sizeof(dfu_status_response_t));
    }
    break;

    default:
    {
      TU_LOG_DRV("  DFU RT Unexpected Request: %d\r\n", request->bRequest);
      return false; // stall unsupported request
    }
  }
  • DFU_REQUEST_DETACH ->tud_dfu_runtime_reboot_to_dfu_cb
  • DFU_REQUEST_GETSTATUS
    // DFU Status Request Payload
    typedef struct TU_ATTR_PACKED
    {
    uint8_t bStatus;
    uint8_t bwPollTimeout[3];
    uint8_t bState;
    uint8_t iString;
    } dfu_status_response_t;
    

DFU RUNTIME也定义了一些其它的回调请求,不过这些都是根据USB设备的状态来进行回调的

回调 触发时机
tud_mount_cb() 主机发 SET_CONFIGURATION(配置号非 0),设备成功解析配置并打开所有接口驱动后
tud_umount_cb() ① SET_CONFIGURATION(0);② 设备被拔出(DCD_EVENT_UNPLUGGED)
tud_suspend_cb(remote_wakeup_en) 总线空闲 3ms 触发挂起事件(DCD_EVENT_SUSPEND),且设备已连接
tud_resume_cb() 总线恢复活动(DCD_EVENT_RESUME),且设备已连接
tud_dfu_runtime_reboot_to_dfu_cb() 收到 DFU 类请求 DFU_REQUEST_DETACH(0x00)时
  • DFU 无数据端点 :靠 Endpoint 0 的控制传输(SETUP/DATA/STATUS)完成所有通讯,所以描述符里没有 endpoint 描述符。
  • 回调时机 :mount /umount /suspend /resume 是设备通用回调,由枚举/总线事件触发;tud_dfu_runtime_reboot_to_dfu_cb 是 DFU Runtime 专属,只在收到 DETACH 时触发。
  • led_blinking_task 是应用自己的后台轮询任务 ,回调只负责改blink_interval_ms 变量来间接控制 LED。
  • 完整链路 :tusb_init 初始化 → 枚举(GET_DESCRIPTOR → SET_ADDRESS → SET_CONFIGURATION →tud_mount_cb )→ 通讯(SET_INTERFACE → DETACH 触发回调 → GETSTATUS 回状态),全程由tud_task() 在后台驱动。

windows下的DFU

DFU在Windows下没有对应的驱动,所以应该配成WINUSB设备,可以选择基于MSOS-V1.0或基于MSOS-V2.0,然后再自己写应用通讯。
当然,这里我将其与一个HID UPS设备复合,故使用zadig强行安装winusb驱动,最终效果如下
170247790526

本文链接为:http://www.usbzh.com/article/detail-1814.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,以适应运行......
5.5 MMIO空间-运行时寄存器
5.5 Host Controller 运行时寄存器在能力寄存器的0x18地址处记录着运行时空间寄存器的偏移位置相对运行时寄存器偏移地址都有以下几个寄存器偏移缩写寄存器名称0000hMFINDEX微帧索引寄存器0004h - 001FhRsvdZ保留(写零)......
DFU运行时设备示例
DFU运行时(RUNTIME)的测试示例来源于tinyusb使用示例,创建的描述符如下: ---------------- Interface Descriptor -----------------bLength : 0x09 (9 bytes......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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