USB HID键盘设备树及设备枚举过程分析

欢迎加入官方QQ群:952873936或联系站长进行技术交流。

今天在本站USB中文网微信技术交流群有一个同学在问关于HID设备的报表描述符的东东。但是在问的过程中发现一个很严重的问题,那就是它的它设备是一个复合设备,导致设备树比较复杂,关于报表描述符与接口描述符等之间的相关对应关系不是很清楚。为此,本人手中刚好有一个本人认为USB HID设备中相对比较复杂的设备,USB HID键盘(并不是HID键盘设备类),而是该设备复杂。

其实关于USB HID设备的相关内容本站相对比较少,一是本人确实用的少,而且本人在使用的时候也都是比较简单的设备,第二就是大家问的也少,我也没空与一些文章,本想着以前写的一些USB HID报表描述符的分析文章就够了。说来惭愧,没想到还是不够,HID这个东西本站上的内容对各位来说还是太少了。

现进入主题,我们来分析本人手中的USB HID键盘。

该设备接入PC机后,在WINDOWS设备管理器中的设备树如下:
HID键盘设备设备树
通过上图可以看到,该设备是一个USB复合设备,使用了windows系统自带的USBCCGP.SYS来驱动,该驱动在其枚举过程中又通过接口描述符的数量分别枚举出了两上USB 输入设备。
第一个USB 输入设备对应的接口描述符中的报表描述符解析出来就只是一个键盘功能。
第二个USB 输入设备对应的报表描述符是一个具有两个应用集合的描述符,所以USB HID输入设备根据应用集合的数量又分别枚举出了两上子设备。这两个子设备分别为符合HID标准的系统控制器符合HID标准的用户控制设备

我们通过usbtreeview来看一下该设备的相关信息(这里只显示主要信息):

Device Description       : USB Composite Device
Device Path              : \\?\USB#VID_1A2C&PID_2124#6&10e710bc&1&3#{a5dcbf10-6530-11d2-901f-00c04fb951ed} (GUID_DEVINTERFACE_USB_DEVICE)
Driver                   : \SystemRoot\System32\drivers\usbccgp.sys (Version: 10.0.18362.1110  Date: 2020-10-17)
Service                  : usbccgp
 Child Device 1          : USB 输入设备
  Device ID              : USB\VID_1A2C&PID_2124&MI_01\7&26B7489&0&0001
  Service                : HidUsb
   Child Device 1        : 符合 HID 标准的用户控制设备
    Device ID            : HID\VID_1A2C&PID_2124&MI_01&COL01\8&2DA4D5F6&0&0000
   Child Device 2        : 符合 HID 标准的系统控制器
    Device ID            : HID\VID_1A2C&PID_2124&MI_01&COL02\8&2DA4D5F6&0&0001
 Child Device 2          : USB 输入设备
  Device ID              : USB\VID_1A2C&PID_2124&MI_00\7&26B7489&0&0000

通过BUSHOUND可以查看设备ID:
BUSHOUND
通过BUSHOUND可以看根设备为20,两个子设备的ID分别为21和22,其各自下有其对应的子设备23(键盘)和24,25。

再通过BUSHOUND分析枚举过程,这里只显示主要信息,其它不重要的信息略去:
根设备分别获取设备描述符和配置描述符,并选择配置

CTL    80 06 00 01  00 00 12 00                                                                                
IN     12 01 10 01  00 00 00 08  2c 1a 24 21  10 01 01 02  00 01                                               
CTL    80 06 00 02  00 00 09 00                                                                                
IN     09 02 3b 00  02 01 00 a0  31                                                                            
CTL    80 06 00 02  00 00 3b 00                                                                                
IN     09 02 3b 00  02 01 00 a0  31 09 04 00  00 01 03 01  01 00 09 21  10 01 00 01  22 36 00 07  05 81 03 08  
       00 0a 09 04  01 00 01 03  00 00 00 09  21 10 01 00  01 22 32 00  07 05 82 03  08 00 0a                  
CTL    00 09 01 00  00 00 00 00

子设备21键盘的枚举,对应的是接口0:

//设备描述符
CTL    80 06 00 01  00 00 12 00                                                                               
IN     12 01 10 01  00 00 00 08  2c 1a 24 21  10 01 01 02  00 01                                     
//配置描述符
CTL    80 06 00 02  00 00 09 00                                                                               
IN     09 02 22 00  01 01 00 a0  31                                                                           
CTL    80 06 00 02  00 00 22 00                                                                               
IN     09 02 22 00  01 01 00 a0  31 09 04 00  00 01 03 01  01 00 09 21  10 01 00 01  22 36 00 07  05 81 03 08 
       00 0a                                                                                                  
CTL    00 09 01 00  00 00 00 00                                                                               
CTL    21 0a 00 00  00 00 00 00                                                                     

//获取键盘的报表描述符,注意这里的接口ID=0
CTL    81 06 00 22  00 00 76 00                                                                               
IN     05 01 09 06  a1 01 05 08  19 01 29 03  15 00 25 01  75 01 95 03  91 02 95 05  91 01 05 07  19 e0 29 e7 
       95 08 81 02  75 08 95 01  81 01 19 00  29 91 26 ff  00 95 06 81  00 c0                                 
`

子设备22的枚举,其对应的接口为1:

CTL    80 06 00 01  00 00 12 00                                                                               
IN     12 01 10 01  00 00 00 08  2c 1a 24 21  10 01 01 02  00 01                                              
CTL    80 06 00 02  00 00 09 00                                                                               
IN     09 02 22 00  01 01 00 a0  31                                                                           
CTL    80 06 00 02  00 00 22 00                                                                               
IN     09 02 22 00  01 01 00 a0  31 09 04 01  00 01 03 00  00 00 09 21  10 01 00 01  22 32 00 07  05 82 03 08 00 0a                                                                                                  
CTL    00 09 01 00  00 00 00 00                                                                               
CTL    21 0a 00 00  01 00 00 00                                                                     

//报表描述符,其对应的接口为0x01
CTL    81 06 00 22  01 00 72 00                                                                               
IN     05 0c 09 01  a1 01 85 01  19 00 2a 3c  02 15 00 26  3c 02 95 01  75 10 81 00  c0 05 01 09  80 a1 01 85 02 19 81 29  83 25 01 75  01 95 03 81  02 95 05 81  01 c0

这里我们对子设备22的报表描述符进行分析如下:

05 0c  // Global Generic Reserved
09 01 
a1 01 // Main app collection
85 01 // REPORT_ID  1
19 00 // Local Usage Min
2a 3c  02 // Local Usage Max
15 00 // Global Logical Min
26  3c 02 //Global Logical Max
95 01  // Global ReportCount1
75 10 // Global ReportSize
81 00 //INPUT (DATA,ARY,ABS)
c0 

05 01 // Global Generic Desktop
09  80 
a1 01  // Global Generic Desktop
85 02 // REPORT_ID 2
19 81  // Local Usage Min
29  83  // Local Usage Max
25 01 // Global Logical Max 
75  01 // Global ReportSize
95 03  // Global ReportCount3
81 02 // Main Input(Data,Var,Abs)
95 05  // Global ReportCount5
81 01   // MAIN INPUT(CNST,ARY,ABS)
c0

可以看到,确实有2个应用设备。

0 篇笔记 写笔记

HID 枚举系统中所有HID设备信息代码示例
枚举系统中所有HID设备信息代码示例#include#include #include #include #include #i......
HID 设置协议SetProtocol
SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须对;对于非引导设备,是可选的。详见:USB请求bmRequestType(1):0x21bRequest(1): SetProtocol,值为0bwValue(2):数据为0表示引导协议,为1表示报告协议。wIndex(......
HID 设置报告请求SetReport
SetReport请求用于主机向设备发送报告请求。详见:USB请求bmRequestType(1):0x21bRequest(1): SET_REPORT,值为09.wValue(2):高字节报告类型,低字节为报告ID.01:表示输入报告02: 表示输出报告03: 表示特定报告wIndex(2):接......
HID 触摸屏的报表描述符
0x05, 0x0d, // USAGE_PAGE (Digitizers) 0 0x09, 0x04, // USAGE (Touch Screen) ......
HID 简介
 HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。  Wndows操作系......
HID 体系结构
Windows 中的 HID 驱动程序堆栈的体系结构基于名为 hidclass.sys 的类驱动程序。 客户端和传输微型驱动程序从用户模式或内核模式下访问的类驱动程序。HID类驱动程序在系统提供的 HID 类驱动程序是 WDM 功能驱动程序和总线驱动程序 HID 设备安装程序类 (HIDClass)......
HID 报表描述符数字显示实例
USAGE_PAGE (Alphnumeric Display) 05 14USAGE (Alphanumeric Display) 09 01LOGICAL_MINIMUM (0) 15 00 CO......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的U......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。HID设备的描述符HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:USB标准描述符:设备描述符、配置描述符、接口......
HID HID描述符
HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。偏移量字段字节数数值类型说明0bLength1Numeric描述符字节数1bDescriptorType1Constant0x21 = HID描述符2bcdHID2NumericHID规范版本号(BCD)4bCou......
HID 报表描述符远程控制实例
USAGE_PAGE (Consumer Devices) 05 0CUSAGE (Consumer Control) 09 01COLLECTION (Application) A1 01 ......
USB键盘报告描述符数据格式分析
USB键盘HID报表描述符的内容参见下表。数据的输入端点为中断方式,当有键盘敲击事件时,会上报数据长度为8字节的数据报告。0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard 0xA1,0x01,// Main app col......
HID 报表描述符键盘实例
通过下面的报告描述符的定义,我们根据上面的注释可知,包含一个中断输入报表描述符和一个中断输出报告描述符。其中断输入报告描述符用于USB HID键盘中断输入端点,输出报表描述符用于USB HID键盘中断输出端点。USB HID键盘的中断输入报告对于中断输入端点,数据格式定义如下:-BYTE0:该字节......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!