USB鼠标枚举过程深入解析(中)

努力成为linux kernel hacker的人李万鹏原创作品,转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/03/6387488.aspx

Transfer3:

USB鼠标枚举过程深入解析(中)_第1张图片

USB鼠标枚举过程深入解析(中)_第2张图片

Transfer3是获得配置描述符。Transaction12SETUP Transaction,要记住令牌包指明当前Transaction的类型,所以第一个Packet328包指明当前TransactionSETUP事务。Packet329的数据域80表示数据是需要从device发向host的,06指明bRequestGET_DESCRIPTOR02表示的是CONFIGURATION,然后device回复了一个ACK握手包。Transaction13是一个INTransaction,令牌包Packet331指明该TransactionIN类。下面分析一下Packet332Data域,参照下图:

USB鼠标枚举过程深入解析(中)_第3张图片

0x09表示配置描述符的长度为9个字节,0x02是描述符的类型,0x22是使用GET_DESCRIPTION请求时,返回的数据长度。也就是说对包括配置描述符,接口描述符,端点描述符,class-vendor-specific描述符在内的所有描述符进行统计。0x01bNumInterfaces表示接口的数目,0x01bConfigurationValue,对拥有多个配置的USB设备来说,可以用SET_CONFIGURATION改变正在被使用的USB配置,bConfigurationValue指明了将要激活那个配置。iConfiguration为描述配置信息的字符串描述符的索引值,bmAttributes这个字段表示了配置的一些特点。Transaction14DATA包的数据域就一个字节为0x32MaxPower,表示设备正常运转时,从总线那里分得的最大电流值。Transaction15首先hostdevice发送了一个OUT包,表示这个Transaction是一个OUT类型,然后hostdevice发送了一个为0字节的包,device返回了一个ACK握手包。

Transfer4:

USB鼠标枚举过程深入解析(中)_第4张图片

USB鼠标枚举过程深入解析(中)_第5张图片

USB鼠标枚举过程深入解析(中)_第6张图片

Transfer4获得了4个描述符。Transaction16是一个SETUP TransactionPacket342的数据域80表示数据是需要从device发向host的,06指明bRequestGET_DESCRIPTOR02表示的是CONFIGURATION,然后device回复了一个ACK握手包。Transaction17获得的是配置描述符,最后一个MaxPowerTransaction18Packet349Data域中的第一个字节,注意这些数据是小端存放的。现在分析剩下的7个字节,0x09bLength,是指描述符的长度;0x04bDescriptorType,是指描述符的类型;0x00bInterfaceNumber,是指接口号。0x00bAlternateSetting,是指接口使用的是哪个可选设置;0x01bNumEndpoints,接口拥有的端点数量;0x03bInterfaceClass0x01bInterfaceSubClass0x02bInterfaceProtocol0x00iInterface,是接口描述符对应的字符串描述符的索引值。

USB鼠标枚举过程深入解析(中)_第7张图片

HIDHuman interface device)是人机接口设备,主要是指一些人与计算机进行交互的设备,如键盘,鼠标,游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID设备级定义规范要求的都可以认为是HID设备。HID设备有以下主要优点:

1) 交换的数据存储在报告的结构内,设备必须支持HID报告格式。

2) 每笔事务可以携带小量或中量的数据。低速设备每笔最大为8字节,全速设备每笔最大为64字节,高速设备每笔最大为1024字节。

3) 有最大速度限制

4) 没有传输速度的保证

如下图,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符。USB的四种传输方式,HID只支持控制和中断传输方式。

USB鼠标枚举过程深入解析(中)_第8张图片

USB鼠标枚举过程深入解析(中)_第9张图片

现在分析Transaction20DATA包的Data域,参照下图。0x07bLength,表示描述符的长度;0x05bDescriptorType,表示描述符的类型;0x81bEndpointAddress,表示这个端点的方向,端点的地址,端点的端点号。0x03bmAttributes,表示属性信息;0x0005wMaxPacketSize,表示端点一次能够处理的最大字节数;0x0AbInterval,表示希望主机轮询自己的间隔时间。

USB鼠标枚举过程深入解析(中)_第10张图片

你可能感兴趣的:(数据结构,游戏,.net,linux,Blog)