分析罗技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 如何使用 罗技无线键盘/鼠标(采用优联技术)