分析罗技USB鼠标的枚举过程

Posted zhanghui822

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分析罗技USB鼠标的枚举过程相关的知识,希望对你有一定的参考价值。

为了进一步研究HID类USB设备,我用 wireshark USB来分析一个鼠标从插入到可以使用,这个过程中所有的通信数据。
我的逻辑鼠标插入后就是 1.5.x设备 :1.5.0 or 1.5.1 or 1.5.1
下面是我捕获的数据,我们逐步分析:
 
 
//尝试获取设备描述符(GET DESCRIPTOR Request DEVICE ) 
  1.5.0  CTL    80 06 00 01  00 00 12 00                             GET DESCRIPTOR           1.1.0  
技术图片
技术图片
bRequest:GET_DESCRIPTOR = 0x06 获取描述符
Descriptor Index: 00
Descriptor Type: Device(0x01)
Descriptor Length: 0x0012 = 18 bytes
 
 
//返回设备描述符( GET DESCRIPTOR Response DEVICE )
  14.0  IN     12 01 00 02  00 00 00 08  6d 04 2f c5  00 30 01 02  ........O.&.....          1.2.0        
               00 01                                                ..                        1.2.16   
技术图片
(1)bcdUSB:USB协议版本采用的是BCD编码,此处为0x0200(低字节在前,即2.00).
(2)bDeviceClass, bDeviceSubClass, bDeviceProtocol : 0
(3)bMaxPacketSize0:8 端点0最大包长为8(0x08)字节.
(4)idVendor:Loditech,Inc: 厂商ID为0x046d.
(5)idProduct: 产品ID为0xc52f.
(6)bcdDevice:设备版本号为0x3000,若采用的是BCD编码,即为1.10.
(7)iManufacturer:1 厂商字符串索引,产品字符串索引依次为1,2,无产品序列号索引
(8)bNumConfigurations: 1 ; 该设备可能的配置只有1种配置
 
 
//尝试获取配置描述符( GET DESCRIPTOR Request CONFIGURATION )
  14.0  CTL    80 06 00 02  00 00 09 00                            GET DESCRIPTOR           2.1.0  
技术图片
技术图片
bRequest:GET_DESCRIPTOR = 0x06 获取描述符
Descriptor Index: 00
Descriptor Type: CONFIGURATION (0x02)
Descriptor Length: 0x0009 = 9 bytes
 
//返回9个字节的配置描述符( GET DESCRIPTOR Response CONFIGURATION )
  14.0  IN     09 02 3b 00  02 01 04 a0  31                        ..;.....1                2.2.0  
技术图片
(1)配置描述符的集合总长度为0x003b,即59字节长度,
(2)该配置支持2个接口.
(3)该配置的值为1.
(4)该配置的字符串索引值取0x04.
(5)设备的属性为0xa0,即表示设备是总线供电的,且支持远程唤醒.
(6)设备所需的电流为0x31*2=98mA
 
 
 
//再一次获取完整的描述符集合信息
  14.0  CTL     80 06 00 02  00 00 3b 00                             GET DESCRIPTOR           3.1.0  
//返回全部的配置描述符
  14.0  IN      09 02 3b 00  02 01 04 a0  31 09 04 00  00 01 03 01   ..;.....1.......          3.2.0        
                02 00 09 21  11 01 00 01  22 43 00 07  05 81 03 08 ...!...."6......          3.2.16       
                00 02 09 04  01 00 01 03  00 00 00 09  21 11 01 00  ............!...          3.2.32       
                01 22 4f 00  07 05 82 03  14 00 02                   ."2........               3.2.48       
技术图片
//返回的数据包括: CONFIGURATION DESCRIPTOR(9个字节) + INTERFACE DESCRIPTOR(0.0) (9个字节) + HID DESCRIPTOR(9个字节) + ENDPOINT DESCRIPTOR(7个字节) + INTERFACE DESCRIPTOR(1.0) (9个字节) + HID DESCRIPTOR(9个字节) + ENDPOINT DESCRIPTOR(7个字节)
【0】 CONFIGURATION DESCRIPTOR(9个字节) :09 02 3b 00 02 01 04 a0 31 含义前面已经介绍了。
【1】接口描述符0:
技术图片
(1)当前接口编号为0,接口的备用编号也为0.
(2)该接口使用1个端点.
(3)该接口所使用的类为0x03,子类为0x01,协议为0x02.(鼠标)
(4)该接口没有使用字符串来描述.
 
【2】HID描述符[接口0]:
技术图片
(1)协议的版本号为0x0110,采用的是BCD编码表示1.10.
(2)所适用的国家为0x00?该说你爱国么?咋不填0x21[美国].
(3)下级描述符个数:1个,至少1个.
(4)下级描述符类型为0x22,表示报告描述符.
(5)下级报告描述符长度为0x0043,即67个字节.
 
【3】端点描述符[接口0]:
技术图片
(1)该端点为输入端点,且端点地址为0x01.
(2)该端点采用的是0x03:中断传输.
(3)端点所支持的最大包长度为0x0008,即8字节.
(4)根据官方协议文档,这里的0x02是用来设置数据传输到端点的轮询间隔.
 
【4】接口描述符1:
技术图片
(1)当前接口编号为1,接口的备用编号为0.
(2)该接口使用1个端点.
(3)该接口所使用的类为0x03,子类为0x00,协议为0x00.
(4)该接口没有使用字符串来描述.
 
【5】HID描述符[接口1]:
技术图片
(1)协议的版本号为0x0111, 即1.11.
(2)所适用的国家为0x00.
(3)下级描述符1个.
(4)下级描述符类型为0x22,表示报告描述符.
(5)下级报告描述符长度为0x004f,即79个字节.
 
 
【6】端点描述符[接口1]:
技术图片
(1)该端点为输入端点,且端点地址为0x02.
(2)该端点采用的是0x03:中断传输.
(3)端点所支持的最大包长度为0x0014,即20字节.
(4)根据官方协议文档,这里的0x02是用来设置数据传输到端点的轮询间隔.
 
 
 
 
//设置配置请求( SET CONFIGURATION Request )
  14.0  CTL    00 09 01 00  00 00 00 00                     SET CONFIG       4.1.0
技术图片
01 00 :0x0001,设置配置值为1,激活第一个种配置
 
 
 
//获取字符串描述请求 ( GET DESCRIPTOR Request STRING )
  14.0  CTL    80 06 02 03  09 04 04 00                            GET DESCRIPTOR           5.1.0(2)     
技术图片
按语言ID [09 04],即0x0409[美式英语],来获取字符串索引0x02处[产品字符串]的内容,尝试获取以后,获悉总长度为0x0004,即4字节.
Descriptor Index:字符串的索引号是0x02
bDescriptorType:0x03,对应的是 string
技术图片
 
//返回4个字节的字符串描述
  14.0  IN     1a 03 55 00                                         ..U.                     5.2.0        
技术图片
该字符串的长度是0x1a = 26 byte,
bDescriptorType:0x03,对应的是 string
bString:U
 
 
//再次获取完整的产品字符串信息,由于采用的是Unicode编码,因此该处获得的产品字符串内容为USB Receiver。
  14.0  CTL    80 06 02 03  09 04 1a 00                             GET DESCRIPTOR           6.1.0(2)     
  14.0  IN     1a 03 55 00  53 00 42 00  20 00 52 00  65 00 63 00  ..U.S.B. .R.e.c.          6.2.0        
               65 00 69 00  76 00 65 00  72 00                      e.i.v.e.r.                6.2.16  
//又获取一次设备描述符、配置描述符,我插入的是罗技的鼠标设备,是USB输入设备。
 
//再次获取字符串描述符(和上面一样)
  17.0  CTL    80 06 02 03  09 04 04 00                             GET DESCRIPTOR           9.1.0
  17.0  IN      1a 03 55 00                                          ..U.                      9.2.0   
  17.0  CTL    80 06 02 03  09 04 1a 00                             GET DESCRIPTOR           10.1.0
  17.0  IN     1a 03 55 00  53 00 42 00  20 00 52 00  65 00 63 00   ..U.S.B. .R.e.c.          10.2.0        
               65 00 69 00  76 00 65 00  72 00                      e.i.v.e.r.               10.2.16  
 
//设置设备静默
  17.0  CTL    21 0a 00 00  00 00 00 00                             USBHID SET_IDLE Request           9.1.0
  17.0  CTL                                 USBHID SET_IDLE Request           9.1.0
技术图片
Set_Idle请求使管道中关于中断的特定报告静默,直到发生新事件或指定时间间隔。
技术图片
bmRequestType : 0x21
bRequest: SET_IDLE (0x0a)
wValue:
ReportID: 0 如果wValue的下字节为0,则空闲率适用于设备生成的所有输入报告。当wValue的下字节为非零时,则空闲率仅适用于由下字节的值指定的报告ID。
Duration:0 当为0(0)时,持续时间是不确定的。端点将永远禁止报告,只在报告数据中检测到更改时才报告。
wIndex: 0
wLength: 0
 
 
 
//获取HID Report 描述符( GET DESCRIPTOR Request HID Report & GET DESCRIPTOR Response HID Report )
  17.0  CTL    81 06 00 22   00 00 83 00                             USBHID GET DESCRIPTOR Request HID Report          9.1.0
  17.0  CTL    05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 10     USBHID GET DESCRIPTOR Response HID Report            9.1.0
15 00 25 01 95 10 75 01 81 02 05 01 16 01 80 26     USBHID GET DESCRIPTOR Response HID Report           9.1.0
FF 7F 75 10 95 02 09 30 09 31 81 06 15 81 25 7f     USBHID GET DESCRIPTOR Response HID Report           9.1.0
75 08 95 01 09 38 81 06 05 0c 0a 38 02 95 01 81    USBHID GET DESCRIPTOR Response HID Report           9.1.0
06 c0 c0     USBHID GET DESCRIPTOR Response HID Report           9.1.0
技术图片
技术图片
bRequest: GET_REPORT(0x06)
Report ID: 0x00 表示 没有用到
Report Type: 0x22(HID Report)
wIdex:interface : 00
wLength: 报告长度是131 byte。
 
HID report 如下:
技术图片
Report 分为3大类:
Global item(Usage)
Local item(Usage)
Main item(Collection)
 
Global item(Usage): 05 01
技术图片
 
Local item(Usage): 09 02
技术图片
Main item(Collection)又分为: Header、Collection type、Local item(Usage)、Main item(Usage)、Main item(Collection)、Main item(End collection)
技术图片
这是属于HID 报告描述的内容,正在研究中。


以上是关于分析罗技USB鼠标的枚举过程的主要内容,如果未能解决你的问题,请参考以下文章

Deepin 15 如何使用 罗技无线键盘/鼠标(采用优联技术)

罗技统一接收器协议?

USB鼠标实现——HID 报告的返回

鼠标滚轮自己有时会自动滚的啊

转:罗技Usb Receiver在Win2008 64位系统中驱动安装方法

罗技g502宏设置步骤