设备固件更新 对于不使用共同安装程序的 USB 设备

重要

从适用于 Windows 11 版本 22H2 的 WDK 开始,不再支持 WDF 可再发行组件共同安装程序。 若要了解如何解决此更改,请参阅 WDF 可再发行组件共同安装程序在 WDK 已知问题文章中不起作用

USB 设备供应商使用共同安装程序为使用收件箱 USB 设备驱动程序的设备更新设备固件。 但是,新的“通用 INF”标准不支持共同安装程序,这是 Windows 10 上的要求。 这给现有的 USB 设备固件更新过程带来了挑战。 本文概述了在没有共同安装程序的情况下更新 USB 设备固件的建议方法。

要求

USB 设备固件更新过程的主要要求包括:

  1. 无缝固件更新,无需用户交互

  2. 可靠的恢复机制(例如,没有设备的砖块)

  3. 适用于 Windows 7 及更高版本

概述

UVC 相机等 USB 设备随现场可更新固件一起发布。 目前没有更新固件的标准方法。 所有现有更新机制通用的一项是,某些自定义软件套件在客户端上运行,并将固件下载到设备。 通常,作为设备安装过程的一部分,将安装固件更新软件套件。 共同安装程序启动固件更新过程。 Windows 10 上没有共同安装程序会阻止设备供应商在现场更新这些设备上的固件。

为避免 USB 设备固件更新方案缺少共同安装程序的建议方法是使用较低筛选器驱动程序来启动固件更新过程的 USB 设备。 在 AddDevice 调用期间,筛选器驱动程序会检查设备固件版本,并在必要时更新固件。

固件更新概述

将 USB 设备插入系统后,将为设备安装通用收件箱驱动程序。 安装通用驱动程序后,OS 会查询Windows 更新服务器以获取任何供应商特定的驱动程序包可用性,并下载并安装驱动程序。 已安装的驱动程序包执行固件更新。

可通过两种方式更新固件:

  1. 固件更新筛选器驱动程序

    1. 供应商提供了执行固件更新的较低筛选器驱动程序。
  2. 固件更新设备驱动程序

    1. 供应商提供了较低的筛选器驱动程序,使设备处于固件更新模式。

    2. 设备枚举为固件更新设备。

    3. 供应商提供的固件更新驱动程序针对此设备加载并更新固件。

方法 1:固件更新筛选器驱动程序

在此方法中,USB 设备驱动程序的较低筛选器驱动程序作为驱动程序更新过程的一部分进行安装。 此筛选器驱动程序执行固件更新。

Windows 更新服务器上的驱动程序更新包包含:

  • 固件更新 WDF 较低筛选器驱动程序

  • 用于安装固件更新 WDF 较低筛选器驱动程序的扩展 INF

  • “firmware.bin”文件

固件更新 UMDF 较低筛选器驱动程序方法。

安装驱动程序更新包时,将调用固件更新 WDF 筛选器驱动程序的 AddDevice 例程。 在此例程中,WDF 筛选器驱动程序从设备 HW 注册表项获取设备固件版本。 设备固件应使用 MSOS 描述符将固件版本放置在设备 HW 注册表项上。

  1. 如果设备固件版本和筛选器驱动程序预期的固件版本不同,或者

  2. 设备 HW 注册表项中不提供固件版本

    1. 然后,筛选器驱动程序通过将成功 返回到 AddDevice 回调,将自身插入到设备堆栈中。
  3. 否则,筛选器驱动程序不会将自身插入到设备堆栈中

    1. 由于无需更新固件,因为设备具有预期的固件。

稍后调用 WDF 筛选器驱动程序的EVT_WDF_DEVICE_D0_ENTRY回调时,筛选器驱动程序必须使用 CM_Register_Notification 或 IoRegisterPlugPlayNotification(UMDF 或 KMDF)注册设备接口更改通知,以便侦听 USB 设备将注册到的设备接口类。 Ror 示例,RGB 相机的固件更新筛选器驱动程序将注册KSCATEGORY_VIDEO_CAMERA。 收到通知时,筛选器驱动程序应发布将执行固件更新的工作项。

基于 UMDF 的固件更新驱动程序可以使用特定于设备的 API 或直接发出控制传输来访问 USB 设备以执行固件更新。 例如,相机的基于 UMDF 的筛选器驱动程序将使用相机 API 来执行固件更新。

基于 KMDF 的固件更新驱动程序可以发送供应商特定的命令来执行固件更新。

完成固件闪烁后,设备必须断开连接并重新连接到总线。 使用新固件重新枚举设备。

对于具有足够资源的设备,建议使用“固件更新筛选器驱动程序”的方法在设备内存中保存两个完整的固件映像(更新映像和备份映像)。 原因是下载更新的固件期间出现故障,设备可以放弃更新并启动到其原始固件中。 因此,不要砖头设备。

方法 2:固件更新设备驱动程序

在此方法中,在驱动程序更新过程中安装了 USB 设备的较低筛选器驱动程序。 此筛选器驱动程序将命令发送到设备以在固件更新模式下重启,其中设备公开固件更新接口。 固件更新接口的驱动程序加载并执行固件更新。

设备的 Windows 更新 服务器上的驱动程序更新包包含:

  1. 将设备置于固件更新模式的 WDF 较低筛选器驱动程序

  2. 用于安装 WDF 较低筛选器驱动程序的扩展 INF

除了驱动程序更新包,Windows 更新上还存在单独的固件更新设备驱动程序包,其中包含:

  1. WDF 固件更新设备驱动程序及其 INF,以及

  2. “firmware.bin”文件。

固件更新 WDF 驱动程序方法。

安装驱动程序更新包时,将调用 WDF 较低的筛选器驱动程序的 AddDevice 例程。 在此例程中,筛选器驱动程序从设备 HW 注册表项查询设备固件版本。 设备固件应已使用 MSOS 描述符或 USB 设备的扩展 INF 将“固件版本”放置在设备 HW 注册表项上。

  1. 如果设备固件版本和筛选器驱动程序预期的固件版本不同或

  2. 设备 HW 注册表项中不提供固件版本

  3. 然后,WDF 筛选器驱动程序将自身插入到设备堆栈中。

  4. 否则,WDF 筛选器驱动程序不会将自身插入到设备堆栈中

当稍后调用 WDF 筛选器驱动程序的EVT_WDF_DEVICE_D0_ENTRY回调时,筛选器驱动程序会向设备发出特定于供应商的命令,该命令将其置于固件更新模式。 设备将断开连接并重新连接,并公开固件更新接口。

系统枚举固件更新设备接口。 供应商提供的自定义固件更新 WDF 驱动程序将在固件更新包中加载此固件更新接口。 此驱动程序更新固件。

在稍后调用 WDF 固件更新驱动程序的EVT_WDF_DEVICE_D0_ENTRY回调时,驱动程序必须发布将执行固件更新的工作项。

完成固件闪烁后,设备必须断开连接并重新连接到总线。 使用新固件重新枚举设备。

对于由于设备上的内存不足而无法保存更新和原始固件映像的设备,建议使用此方法。 原因是下载更新固件期间出现故障,设备可以放弃更新,并再次启动设备固件更新模式,并重试固件更新。 因此,不要砖头设备。

恢复

固件更新过程可能会因各种原因而失败。 如果发生这种情况,当再次枚举设备时,固件更新驱动程序可能会再次尝试更新固件,并且可能会再次失败,并且此更新过程最终可能会循环。 固件更新驱动程序必须对可以执行的重试次数施加上限。 当固件更新重试超过阈值(例如,三次重试),则筛选器驱动程序不应尝试再次更新固件,直到从 WU 下载新版本的驱动程序。 固件更新驱动程序可以使用注册表来保留重试状态。

在设备固件更新结束时,我们建议设备重置自身并重新枚举。

固件更新的这两种方法都必须停止设备功能,然后才能执行固件更新。 这可确保设备没有打开的句柄,并避免任何 OS 重启要求。

示例 INF

;==============================================================================
; Microsoft Extension INF for USB Camera Firmware Update UMDF Filter Driver
; Copyright (C) Microsoft Corporation.  All rights reserved.
;==============================================================================

[Version]
Signature="$WINDOWS NT$"
Class=Extension
ClassGUID={e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider=%CONTOSO%
ExtensionId={BC6EE554-271C-48C8-B713-8078833962BD} ; replace with your own GUID
CatalogFile.NT=SampleExtension.cat
DriverVer=08/28/2017,10.0.1700.000
PnpLockdown=1

[SourceDisksFiles]
ContosoFirmwareUpdateFilterDriver.dll=1
ContosoFirmware.bin=1

[SourceDisksNames]
1 = %MediaDescription%

[DestinationDirs]
UMDriverCopy=13
ContosoFirmwareCopy=13
DefaultDestDir = 13

[UMDriverCopy]
ContosoFirmwareUpdateFilterDriver.dll

[ContosoFirmwareCopy]
ContosoFirmware.bin

[Manufacturer]
%CONTOSO% = ContosoFirmwareUpdateFilterDriver,NTamd64.10.0...22000

[ContosoFirmwareUpdateFilterDriver.NTamd64.10.0...22000]
; replace with your camera device VID PID
%ContosoCamera.DeviceDesc% = ContosoFirmwareUpdateFilterDriver_Win11Install, USB\VID_1234&PID_1234&REV_1234

[ContosoFirmwareUpdateFilterDriver_Win11Install]
Include=wudfrd.inf
Needs=wudfrd.NT
CopyFiles=UMDriverCopy, ContosoFirmwareCopy

[ContosoFirmwareUpdateFilterDriver_Win11Install.HW]
Include=wudfrd.inf
Needs=wudfrd.NT.HW

[ContosoFirmwareUpdateFilterDriver.AddReg]
; Load the redirector as an lower filter on this specific device.
; 0x00010008 - FLG_ADDREG_TYPE_MULTI_SZ | FLG_ADDREG_APPEND
HKR,,"LowerFilters",0x00010008,"WUDFRd"

[ContosoFirmwareUpdateFilterDriver_Win11Install.Services]
Include=wudfrd.inf
Needs=WUDFRD.NT.Services

[ContosoFirmwareUpdateFilterDriver_Win11Install.Wdf]
UmdfService=ContosoFirmwareUpdateFilterDriver, ContosoFirmwareUpdateFilterDriver.UmdfFilter
UmdfServiceOrder=ContosoFirmwareUpdateFilterDriver

[ContosoFirmwareUpdateFilterDriver.UmdfFilter]
UmdfLibraryVersion=2.0.0
ServiceBinary= "%13%\ContosoFirmwareUpdateFilterDriver.dll"

[Strings]
CONTOSO = "Contoso Inc."
ContosoCamera.DeviceDesc = "Contoso Camera Extension"
MediaDescription="Contoso Camera Firmware Update Filter Driver Installation Media"
WudfRdDisplayName = "WDF Reflector Driver"