USB Specification 一个鼠标的工作过程

  一个鼠标的加电配置和工作过程
非常建议去这个卖USB分析仪器的厂家看看,对于理解USB的transfer/transaction/packet有好处:
http://www.usbmadesimple.co.uk/ums_5.htm

1. 加电和设置总线地址
这个厂家的检测设备知道这个是一个low speed设备,因为鼠标通过一个pull up 电阻将D-电位拉高.之后的SUSPEND状态表示仪器没有看到任何数据
,3ms.之后OS通过hub将鼠标reset,31ms. 之后OS通过控制传输来获取设备的描述符,以得到control end point的最大数据传输长度.然后再次复位,
最后通过重置传输将设备的总线地址设置为1.

2. 获取鼠标配置信息

先是获取设备描述符, 对于鼠标,其格式和数据为:

然后获取设备的配置信息,先读入9个byte,得到头部,头部内有配置信息的总长,34byte,之后再次获取完整的配置信息.对于鼠标,其数据如下:
这些配置信息是顺序排放的:




后面的两个transfer是获取字符串描述,String Descriptor 0是支持的语言列表, 而string descriptor 2是设备描述字符串.
3. 配置鼠标
这个个序列和上边的有重复(这个不对应linux的实现). 重新获取了描述字符串,设备描述符,设备配置信息,最重要的是后面三个:
a) set configuration 1
指示鼠标工作于配置1,当然这只鼠标只有一个配置. 之后鼠标处于工作状态.
b)set idle (HID class)
指示鼠标只在有事件发生时响应interrupt IN. (如果没有事件应该是响应NAK, fix me)
c)Get HID Report Description
获取 interrupt IN endpoint 的描述符格式,这里报告的是4byte的数据格式.

下面就是Get HID report Descriptor的内容, 以及他所描述的数据结构.

4. 鼠标正常上报事件
在2秒到5秒内鼠标没有移动, 这个时段内有许多的中断查询报文, 鼠标以NACK 作为回应.

还是这只鼠标, 看看一个配置传输的过程
下图是USB2.0标准定义的控制传输阶段.

我们看看对于鼠标的get device descriptor来看看这个transfer的具体构成.

这里显示这个传输的三个阶段: setup transacton/ data stage transaction / status transaction(最后一个反方向的传输).  这个图中最后的ack他称
作status, 这个容易混淆,其实是transaction的handshake. 再进一步展开,我们可以看到一个tansaction的几个报文:

我们所讨论的UHCI中, 最小可操作单位是transacton, 就是上图的黄色标记部分, 并且用一个TD来表示(TD是UHCI的transaction 描述符).


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/79526/showart_1358437.html

你可能感兴趣的:(USB Specification 一个鼠标的工作过程)