USB多功能HID设备报告描述符的区分枚举

在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。

当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使用接口关联描述符来整合。

现在我们言归正转。对于HID设备,其接口描述符下有一个HID描述符,HID描述符中含有其报告描述符的相关信息,如报告描述符的类型和长度。

但是这里有一个问题,假如我有一个USB设备,其是一个多功能设备,含有2个接口,其一个接口编号为0,一个编号为1,且2个接口都是HID设备类型,其对应的HID描述符中对应的报告描述符的类型和长度也一样。那么在枚举过程中,是怎么区分到底到获的是那个报告描述符的呢?

这其实是通过参数wIndex来实现区分的。
在这里插入图片描述
详见:http://www.usbzh.com/相关章节

通过统读REACTOS源代码,其获取报告描述符是通过Hid_GetDescriptor函数来实现的。
其函数定义如下:

NTSTATUS
Hid_GetDescriptor(
    IN PDEVICE_OBJECT DeviceObject,
    IN USHORT UrbFunction,
    IN USHORT UrbLength,
    IN OUT PVOID *UrbBuffer,
    IN OUT PULONG UrbBufferLength,
    IN UCHAR DescriptorType,
    IN UCHAR Index,
    IN USHORT LanguageIndex)

其获取报告描述符的调用代码如下:

   BufferLength = HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength;
    Status = Hid_GetDescriptor(DeviceObject,
                               URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE,
                               sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                               &Report,
                               &BufferLength,
                               HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType,
                               0,
                               HidDeviceExtension->InterfaceInfo->InterfaceNumber);

可以看到:

LanguageIndex = HidDeviceExtension->InterfaceInfo->InterfaceNumber
Index = 0
DescriptorType = HidDeviceExtension->HidDescriptor->DescriptorList[0].bReportType,
UrbBufferLength = &HidDeviceExtension->HidDescriptor->DescriptorList[0].wReportLength;
urb = &_URB_CONTROL_DESCRIPTOR_REQUEST
UrbFunction = URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE

本人手中有一个超级无比复杂的设备,其对应的抓包内容为:

16.0            CTL    81 06 00 22  02 00 f0 02                            GET DESCRIPTOR    382us        30.1.0   
53.0            CTL    81 06 00 22  05 00 cd 00                            GET DESCRIPTOR     13us        41.1.0   
64.0            CTL    81 06 00 22  06 00 7f 00                            GET DESCRIPTOR    394us        63.1.0  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

站长漫谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值