标准 USB 描述符
USB 设备在名为 USB 描述符的数据结构中提供有关自身的信息。 本部分提供有关设备、配置、接口和终结点描述符的信息,以及从 USB 设备检索它们的方法。
映射到设备布局的 USB 描述符
主机软件通过将各种标准控制请求发送到默认终结点 (获取描述符请求,从附加设备获取描述符,请参阅 USB 规范第 9.4.3 节) 。 这些请求指定要检索的描述符的类型。 为了响应此类请求,设备发送描述符,其中包含有关设备、其配置、接口和相关终结点的信息。 设备描述符 包含有关整个设备的信息。 配置描述符 包含有关每个设备配置的信息。 字符串描述符 包含 Unicode 文本字符串。
每个 USB 设备都会公开一个设备描述符,该描述符指示设备的类信息、供应商和产品标识符以及配置数。 每个配置都会公开其配置描述符,用于指示接口数和电源特征。 每个接口都为其每个备用设置公开一个接口描述符,其中包含有关 类和终结点数的信息。 每个接口中的每个终结点都会公开终结点描述符,这些描述符指示终结点类型和最大数据包大小。
例如,让我们考虑 OSR FX2 板设备布局 (请参阅 USB 设备布局) 。 在设备级别,设备公开默认终结点的设备描述符和终结点描述符。 在配置级别,设备公开配置 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.描述符。 |
使用 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 字段指定包含终结点编号 (位 3.0) 的唯一终结点地址,以及终结点方向 (位 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 设备的配置。 |