usb鼠标枚举过程深度解析(中)

来源:互联网 发布:苏州华科电子知乎 编辑:程序博客网 时间:2024/05/22 01:27

转载自:

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

Transfer3:

 

 

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

 

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

Transfer4:

 

 

 

Transfer4获得了4个描述符。Transaction16是一个SETUP Transaction。Packet342的数据域80表示数据是需要从device发向host的,06指明bRequest为GET_DESCRIPTOR,02表示的是CONFIGURATION,然后device回复了一个ACK握手包。Transaction17获得的是配置描述符,最后一个MaxPower在Transaction18的Packet349的Data域中的第一个字节,注意这些数据是小端存放的。现在分析剩下的7个字节,0x09为bLength,是指描述符的长度;0x04为bDescriptorType,是指描述符的类型;0x00为bInterfaceNumber,是指接口号。0x00为bAlternateSetting,是指接口使用的是哪个可选设置;0x01为bNumEndpoints,接口拥有的端点数量;0x03为bInterfaceClass,0x01为bInterfaceSubClass,0x02为bInterfaceProtocol,0x00为iInterface,是接口描述符对应的字符串描述符的索引值。

 

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

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

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

3)  有最大速度限制

4)  没有传输速度的保证

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

 

 

现在分析Transaction20的DATA包的Data域,参照下图。0x07为bLength,表示描述符的长度;0x05为bDescriptorType,表示描述符的类型;0x81为bEndpointAddress,表示这个端点的方向,端点的地址,端点的端点号。0x03为bmAttributes,表示属性信息;0x0005为wMaxPacketSize,表示端点一次能够处理的最大字节数;0x0A为bInterval,表示希望主机轮询自己的间隔时间。