鼠标( HID 类)设备描述符解析——借助 WCH_USB2.0Monitor 解码功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

在USB协议中,描述符(Descriptor)是用来定义USB设备的特性和能力的数据结构。不同的类设备可以类特定的描述符。
描述符通过标准的USB请求获取,主机通过解析这些描述符来了解设备的配置、接口、端点等信息。
这篇文章记录一下鼠标设备的枚举过程中的描述符信息。


一、HID 类描述符结构

HID 类描述符结构

  • USB 设备功能按接口来分类,一个接口代表一种功能,接口下的端点用于实现该接口下的数据通讯功能
  • Report 描述符用于描述 HID 设备的功能和设备上报的数据信息格式,Physical 描述符集(可选),它携带如人体的哪个部位操作此设备的信息。
  • HID 描述符中定义了Report 描述符的个数和长度,Report描述符的获取通过向接口发送标准请求实现(81 06 00 22 xx xx xx xx)

二、描述符

1.设备描述符

struct _DEVICE_DESCRIPTOR_STRUCT {     
    BYTE bLength;           //设备描述符的字节数大小,为0x12     
    BYTE bDescriptorType;   //描述符类型编号,为0x01     
    WORD bcdUSB;           	//USB版本号     
    BYTE bDeviceClass;   	//USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型
    						//0x00不是在设备描述符中定义的,如HID      
    BYTE bDeviceSubClass;   //usb分配的子类代码,同上,值由USB规定和分配的      
    BYTE bDeviceProtocol;     //USB分配的设备协议代码,同上      
    BYTE bMaxPacketSize0;   //端点0的最大包的大小      
    WORD idVendor;           //厂商编号      
    WORD idProduct;         //产品编号      
    WORD bcdDevice;         //设备出厂编号      
    BYTE iManufacturer;     //描述厂商字符串的索引      
    BYTE iProduct;           //描述产品字符串的索引      
    BYTE iSerialNumber;     //描述设备序列号字符串的索引      
    BYTE bNumConfiguration; //可能的配置数量 
}
		===>> Device Desc		<<===
bLength:						0x12    //设备描述符的字节数大小,为0x12
bDescriptorType:					0x01	//描述符类型编号,为0x01     
bcdUSB:							0x02 00	// USB 版本号
bDeviceClass:						0x00 	// 这个字节为0,则设备信息在interface
bDeviceSubClass:					0x00
bDeviceProtocol:					0x00
bMaxPacketSize0:					0x08	// 端点0 的最大包长
idVendor:						0x41 3C	// 厂商编号   
idProduct:						0x30 1A	// 产品编号
bcdDevice:						0x01 00	// 设备出厂编号
iManufacturer:						0x01	// 描述厂商字符串的索引
iProduct					    0x02	// 描述产品字符串的索引    
iSerialNumber					    0x00	// 描述设备序列号字符串的索引
bNumConfiguration  	  			    0x01	// 可能的配置数量 

2. 配置描述符集合

主机发送获取配置描述符请求时,USB 设备会返回整个配置描述符的集合。
一个配置描述符集合通常包含以下几个部分:

  1. 配置描述符(Configuration Descriptor):
    • 描述该配置的整体信息,包括所需的总功率、配置编号,以及该配置中包含的接口数量。
  2. 接口描述符(Interface Descriptor):
    • 描述每个接口的属性,包括接口编号、类、子类、协议,以及接口中包含的端点数量。
  3. 端点描述符(Endpoint Descriptor):
    • 描述接口中的每个端点的属性,如端点地址、传输类型(控制、同步、中断或批量传输)、最大数据包大小和轮询间隔等。
  4. 可选描述符:
    • 某些配置还可能包含额外的描述符,如接口关联描述符(IAD,Interface Association Descriptor)、类特定描述符(Class-Specific Descriptors)等。
      一下是 USBMonitor 在解析Get Configuration Descriptor 传输时时解码试图中显示的内容。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述其中的 HID Descriptor 即HID 类设备特定的描述符,除此之外,HID 类还定义了报告描述符(Report Descriptor)和物理描述符(Physical Descriptor)。

3. HID 报告描述符

报告描述符使用单独的请求获取。
报表描述符的获取
报告描述符定义HID设备的所有输入、输出和特征报告的结构和格式。它是HID设备最重要的部分之一,描述了设备如何与主机通信。只有看懂报表描述符才能知道接下来 HID 报告携带的信息。

HID 报告描述符
这是接口0的报告描述符。
HID描述符和报告描述符的主要作用是告诉主机如何与设备交互。主机使用这些描述符解析输入设备的行为,比如读取鼠标的X、Y坐标以及按钮状态。


总结

以上记录了鼠标设备在枚举过程中的描述符信息,包括HID类描述符及其相关的报告描述符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值