USB 设备在称为 USB 描述符的数据结构中提供有关自身的信息。 本部分提供有关设备、配置、接口和终结点描述符以及从 USB 设备检索它们的方法的信息。
映射到设备布局的 USB 描述符
主机软件通过向默认终结点发送各种标准控制请求(获取描述符请求,请参阅 USB 规范第 9.4.3 节)从附加设备获取描述符。 这些请求指定要检索的描述符的类型。 为了响应此类请求,设备发送描述符,其中包括有关设备的信息、其配置、接口和相关终结点。 设备描述符 包含有关整个设备的信息。 配置描述符 包含有关每个设备配置的信息。 字符串描述符 包含 Unicode 文本字符串。
每个 USB 设备都会公开一个设备描述符,该描述符指示设备的类信息、供应商和产品标识符以及配置数。 每个配置都公开了指示接口数和电源特征的配置描述符。 每个接口都公开其每个备用设置的接口描述符,其中包含有关类和终结点数的信息。 每个接口中的每个终结点都会公开终结点描述符,这些描述符指示终结点类型和最大数据包大小。
例如,让我们考虑 OSR FX2 板设备布局(请参阅 USB 设备布局)。 在设备级别上,设备提供一个设备描述符和一个用于默认终结点的终结点描述符。 在配置级别,设备公开 Configuration 0 的配置描述符。 在接口级别,它为备用设置 0 公开一个接口描述符。 在终结点级别,它公开三个终结点描述符。
USB 设备描述符
每个通用串行总线(USB)设备都必须能够提供包含设备相关信息的单个设备描述符。 Windows 使用该信息来派生各种信息集。 例如, idVendor 和 idProduct 字段分别指定供应商和产品标识符。 Windows 使用这些字段值为设备构造硬件 ID。 若要查看特定设备的硬件 ID,请打开设备管理器并查看设备属性。 在“ 详细信息 ”选项卡中, “硬件 ID” 属性值指示由 Windows 生成的硬件 ID(“USB\XXX”。 bcdUSB 字段指示设备符合的 USB 规范的版本。 例如,0x0200指示设备按 USB 2.0 规范设计。 bcdDevice 值指示设备定义的修订号。 USB 驱动程序堆栈使用 bcdDevice 以及 idVendor 和 idProduct 为设备生成硬件和兼容的 ID。 可以在设备管理器中查看这些标识符。 设备描述符还指示设备支持的配置总数。
主机通过控制传输获取设备描述符。 Microsoft提供编程接口来获取描述符。
| 如果您正在编写... | 叫。。。 |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 应用 | UsbDevice.DeviceDescriptor |
| 使用 WinUSB 函数的 Win32 桌面应用 | WinUsb_GetDescriptor |
| 基于 UMDF 的客户端驱动程序 | IWDFUsbTargetDevice::RetrieveDescriptor |
| 基于 KMDF 的客户端驱动程序 | WdfUsbTargetDeviceGetDeviceDescriptor |
| 基于 WDM 的客户端驱动程序 |
UsbBuildGetDescriptorRequest _URB_CONTROL_DESCRIPTOR_REQUEST |
USB 配置描述符
USB 配置包含一系列接口。 每个接口由一个或多个备用设置组成,每个备用设置由一组终结点组成(请参阅 USB 设备布局)。 配置描述符描述整个配置包括其接口、备用设置及其终结点。 每个实体也以描述符格式进行描述。 配置描述符还可以包括设备制造商定义的自定义描述符。
因此,只有配置描述符的初始部分是固定的,即 9 个字节。 其余的变量取决于接口的数量及其备用设置以及设备支持的终结点。 在此文档集中,初始 9 个字节称为配置描述符。 描述符的前两个字节指示总长度。
下表显示了 USB 网络摄像头设备的配置描述符:
| 领域 | 价值 |
|---|---|
| wTotalLength | 0x02CA |
| bNumInterfaces | 0x02 |
| bConfigurationValue | 0x01 |
| iConfiguration | 0x00 |
| bmAttributes | 0x80(总线供电) |
| MaxPower | 0xFA (500 mA) |
bConfigurationValue 字段指示设备固件中定义的配置编号。 USB 配置还指示某些电源特征。 bmAttributes 包含一个位掩码,指示配置是否支持远程唤醒功能,以及设备是总线供电还是自供电。 MaxPower 字段指定设备可在设备为总线供电时从主机中提取的最大功率(以毫秒为单位)。 配置描述符还指示设备支持的接口总数(bNumInterfaces)。
| 如果要编写... | 叫。。。 |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 应用 |
UsbDevice.ConfigurationDescriptor 用于获取固定长度部分。 UsbConfiguration.Descriptors 用于获取整个配置集。 |
| 使用 WinUSB 函数的 Win32 桌面应用 | WinUsb_GetDescriptor |
| 基于 UMDF 的客户端驱动程序 | IWDFUsbTargetDevice::RetrieveDescriptor |
| 基于 KMDF 的客户端驱动程序 | WdfUsbTargetDeviceRetrieveConfigDescriptor |
| 基于 WDM 的客户端驱动程序 |
UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST |
USB 接口描述符
接口描述符包含有关 USB 接口的备用设置的信息。
下列表格显示了网络摄像头设备的接口 0 的备用配置 0 的接口描述符:
| 领域 | 价值 |
|---|---|
| bInterfaceNumber | 0x00 |
| bAlternateSetting | 0x00 |
| bNumEndpoints | 0x01 |
| bInterfaceClass | 0x0E |
| bInterfaceSubClass | 0x02 |
| bInterfaceProtocol | 0x00 |
| iInterface | 0x02 |
| 0x0409 | “Microsoft LifeCam VX-5000” |
| 0x0409 | “Microsoft LifeCam VX-5000” |
在前面的示例中,请注意 bInterfaceNumber 和 bAlternateSetting 字段值。 这些字段包含主机用于激活接口及其备用设置之一的索引值。 对于激活,应用程序或驱动程序在函数调用中指定索引值。 根据这些信息,USB 驱动程序堆栈随后生成标准控制请求(SET INTERFACE),并将其发送到设备。 记下 bInterfaceClass 字段。 接口描述符或其备用设置的描述符指定一个类代码、子类和协议。 0x0E的值指示接口适用于视频设备类。 另请注意 iInterface 字段。 该值指示在接口描述符后面追加了两个字符串描述符。 字符串描述符包含Unicode说明,这些说明在设备枚举期间用于标识功能。
| 如果要编写... | 叫。。。 |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 应用 |
UsbInterfaceSetting.Descriptors 可获取特定备用设置的特定描述符。 UsbInterface.Descriptors 可获取接口的所有设置的描述符。 |
| 使用 WinUSB 函数的 Win32 桌面应用 | WinUsb_GetDescriptor |
| 基于 UMDF 的客户端驱动程序 | IWDFUsbInterface::GetInterfaceDescriptor |
| 基于 KMDF 的客户端驱动程序 | WdfUsbInterfaceGetDescriptor |
| 基于 WDM 的客户端驱动程序 |
UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST 然后分析每个接口描述符。 有关详细信息,请参阅如何选择 USB 设备的配置。 |
USB 终结点描述符
接口中的每个终结点描述设备的单个输入或输出流。 支持不同类型的函数流的设备具有多个接口。 支持多个与函数相关的流的设备可以在单个接口上支持多个终结点。
所有类型的终结点(默认终结点除外)都必须提供终结点描述符,以便主机可以获取有关终结点的信息。 终结点描述符包括其地址、类型、方向以及终结点可以处理的数据量等信息。 传输到终结点的数据基于该信息。
下表显示了网络摄像头设备的终结点描述符:
| 领域 | 价值 |
|---|---|
| bEndpointAddress | 0x82 IN |
| bmAttributes | 0x01 |
| wMaxPacketSize | 0x0080 (128) |
| bInterval | 0x01 |
bEndpointAddress 字段指定包含终结点编号(Bits 3..0)和终结点方向(Bit 7)的唯一终结点地址。 通过读取前面的示例中的这些值,我们可以确定描述符描述其终结点编号为 2 的 IN 终结点。 bmAttributes 属性指示终结点类型是同步的。 wMaxPacketSizefield 指示终结点可以在单个事务中发送和接收的最大字节数。 位 12..11 表示每个微帧可以发送的事务总数。 bInterval 指示终结点可以发送或接收数据的频率。
| 如果要编写... | 叫。。。 |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 应用 | UsbEndpointDescriptor |
| 使用 WinUSB 函数的 Win32 桌面应用 | WinUsb_GetDescriptor |
| 基于 UMDF 的客户端驱动程序 | WDFUsbTargetPipe::GetInformation |
| 基于 KMDF 的客户端驱动程序 | WdfUsbTargetPipeGetInformation |
| 基于 WDM 的客户端驱动程序 |
UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST ,然后分析每个终结点描述符。 有关详细信息,请参阅如何选择 USB 设备的配置。 |