使用 USB 设备

本主题介绍从版本 2 开始的内核模式驱动程序框架 (KMDF) 或用户模式驱动程序框架 (UMDF) 驱动程序可以使用 Windows 驱动程序框架 (WDF) 提供的 USB 设备对象方法执行的操作。

它包含以下部分:

有关编写基于 KMDF 的简单 USB 客户端驱动程序的分步说明,请参阅如何编写第一个 USB 客户端驱动程序(KMDF)。

创建 USB 设备对象

若要使用框架的 USB I/O 目标对象(WDFUSBDEVICE、WDFUSBINTERFACE 和 WDFUSBPIPE),客户端驱动程序必须首先调用 WdfUsbTargetDeviceCreateWithParameters 来创建 USB 设备对象。 通常,驱动程序从其 EvtDevicePrepareHardware 回调函数调用 WdfUsbTargetDeviceCreateWithParameters

当驱动程序调用 WdfUsbTargetDeviceCreateWithParameters 时,框架将创建一个 WDFUSBDEVICE 对象并将其与表示 USB 设备的 FDO 相关联。 该方法向新的框架 USB 设备对象返回句柄,然后 USB 客户端驱动程序可以使用该句柄与物理设备通信。

调用 WdfUsbTargetDeviceCreateWithParameters 后,驱动程序可以调用 WdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceRetrieveConfigDescriptor 从设备获取 USB 描述符。 这些描述符包含有关设备的第一个配置、其接口设置及其定义的终结点的信息。 (USB 描述符是在官方 USB 规范中定义的。

配置 USB 设备

WdfUsbTargetDeviceCreateWithParameters 方法还会为设备第一个配置包含的每个 USB 接口创建框架 USB 接口对象。

调用 WdfUsbTargetDeviceCreateWithParameters 后,客户端驱动程序必须调用 WdfUsbTargetDeviceSelectConfig 以选择配置。 此方法为所选配置中接口的每个备用设置创建框架接口对象。

该方法还创建管道对象,这些对象表示所选配置的每个接口的每个备用设置中定义的终结点。

选择配置后,可以根据需要更改配置的接口 的备用设置

还可以调用 WdfUsbTargetDeviceSelectConfig 来取消配置设备。

有关相关信息,请参阅:

获取设备信息

配置设备后,客户端驱动程序可以调用以下方法来获取有关 USB 设备的信息:

WdfUsbTargetDeviceQueryUsbCapability
确定主机控制器和 USB 驱动程序堆栈是否支持特定功能。 在调用 WdfUsbTargetDeviceQueryUsbCapability 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters

WdfUsbTargetDeviceGetIoTarget
返回与 USB 设备关联的 I/O 目标对象的句柄。 驱动程序可以将此句柄传递给 WdfRequestSendWdfIoTargetStop

WdfUsbTargetDeviceRetrieveInformation
检索与 USB 设备关联的版本和功能信息。

WdfUsbTargetDeviceIsConnectedSynchronous(仅 KMDF)
确定设备是否已连接。

WdfUsbTargetDeviceRetrieveCurrentFrameNumber(仅 KMDF)
检索当前的 USB 帧编号。

获取 USB 描述符

若要获取 USB 设备描述符中包含的 Unicode 字符串,驱动程序可以调用以下任一方法:

WdfUsbTargetDeviceGetDeviceDescriptor
获取设备的 USB 设备描述符

WdfUsbTargetDeviceRetrieveConfigDescriptor
获取设备的 USB 配置描述符、接口描述符和终结点描述符。

WdfUsbTargetDeviceQueryString
将 Unicode 字符串复制到驱动程序提供的缓冲区。

WdfUsbTargetDeviceAllocAndQueryString
将 Unicode 字符串复制到框架提供的缓冲区。

WdfUsbTargetDeviceFormatRequestForString
格式化 Unicode 字符串请求。 驱动程序可以调用 WdfRequestSend 以同步或异步发送请求。

发送控制传输

驱动程序可以调用以下方法来发送 I/O 请求,该请求描述标准、设备类特定或特定于供应商的 USB 控制传输。

WdfUsbTargetDeviceSendControlTransferSynchronously
同步发送 USB 控制传输请求。

WdfUsbTargetDeviceFormatRequestForControlTransfer
设置 USB 控制传输请求的格式。 驱动程序可以调用 WdfRequestSend 以同步或异步发送请求。

有关相关信息,请参阅 如何发送 USB 控制传输

重置和电源循环设备的端口

您的驱动程序可以调用以下方法来重置或重启设备连接到的 USB 端口:

WdfUsbTargetDeviceResetPortSynchronously
同步地发送请求以重置设备的 USB 端口。

WdfUsbTargetDeviceCyclePortSynchronously(仅 KMDF)
同步发送设备 USB 端口电源循环的请求。

WdfUsbTargetDeviceFormatRequestForCyclePort(仅 KMDF)
格式化设备 USB 端口的电源循环请求。 驱动程序必须调用 WdfRequestSend 以同步或异步发送请求。

有关相关信息,请参阅 如何从 USB 管道错误中恢复

将 URB 发送到设备

如果 KMDF 驱动程序通过发送包含 URB 的 I/O 请求来与其 USB 设备通信,驱动程序可以调用以下方法:

WdfUsbTargetDeviceCreateUrb(仅限 KMDF)
分配一个 USB 请求块 (URB)。 在调用 WdfUsbTargetDeviceCreateUrb 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters

WdfUsbTargetDeviceCreateIsochUrb(仅限 KMDF)
分配一个等时 USB 请求块 (URB)。 在调用 WdfUsbTargetDeviceCreateIsochUrb 之前,驱动程序必须调用 WdfUsbTargetDeviceCreateWithParameters

WdfUsbTargetDeviceSendUrbSynchronously(仅 KMDF)
同步发送包含 URB 的 I/O 请求。

WdfUsbTargetDeviceFormatRequestForUrb(仅 KMDF)
设置包含 URB 的 I/O 请求的格式。 驱动程序必须调用 WdfRequestSend 以同步或异步发送请求。

WdfUsbTargetDeviceWdmGetConfigurationHandle(仅 KMDF)
返回设备的 USBD 配置句柄。 某些 URB 需要使用此句柄。

有关 URB 的常规概念背景,请参阅 分配和生成 URB