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

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

http://blog.****.net/woshixingaaa/archive/2011/05/03/6387626.aspx

Transfer5Transfer6Transfer7是获得字符串描述符的传输过程。Transfer5是为了获得0号字符串描述符,Transfer6是为了获得2号字符串描述符,Transfer7是为了获得1号字符串描述符。

Transfer5:

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

现在来分析Transfer5SETUP TransactionDATA包的Data域,80表示传输方向从devicehost06表示请求为GET_DESCRIPTOR03表示描述符的类型为STRING,由于不知道描述符的长度是多少所以用了长度256字节。Transaction24DATA包中0x04表示0号描述符的长度为4个字节,0x03表示的是描述符的类型,即STRING0x0409表示的是Language IDTransaction25一个状态阶段结束了对0号描述符的获取。

Transfer6:

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

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

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

Transfer6作用是获取2号描述符,80表示传输方向从devicehost06表示请求为GET_DESCRIPTORUSB spec Table 9-2 Format of Setup Data中,wValue由两部分组成,wValue的高位字节表示描述符的类型,低位字节表示描述符的序号。所以03表示STRING02表示index2的字符串描述符。wIndex对应字符串描述符应该设置使用的语言ID,所以这里为0x0409,就是在Transfer5中获得的那个。然后是0xff,因为不知道描述符的长度所以用256字节。Transaction2728293031的作用就是devicehost发送字符串描述符。如下两张图,0号字符串描述符和其他非0号的字符串描述符的格式是不一样的。0号描述符包括了设备所支持的所有语言的ID

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

0号的字符串描述符的第一个字节和第二个字节分别表示这个描述符的长度和描述符的类型。Transaction27DATA包的Data域的第一个字节为0x24,十进制36,所以index2的描述符长度是36个字节,大家可以数一下,从Transaction27Transaction31中一共有36个字节的。

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

Transfer7:

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

同理,Transfer7获得了index1的字符串描述符。

Transfer8:

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

Transfer8主要的作用是设置配置,使USBAddress状态进入Configured状态。00表示从hostdevice09表示SET_CONFIGURATION,在AddressbConfigurationValue的值为0,所以这里设为大于0,则USB进入Configured状态,如果SET_CONFIGURATION传得参数是0则仍然是Address状态。这里为01

Transfer9:

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

Transfer9好像也没干成什么事,这个废物,哈哈。

Transfer10是获得HID描述符。

Transfer11,12是枚举成功后,两次hostdevice之间传输数据。这里只截了部分图。Host每个bInterval这么多时间就对device查询一下,看有没有数据要传,比如有没有键子被按下。每次都是,hostdevice发送一个IN令牌包,如果没有数据,device就回一个NAK

Transfer11:

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

Transfer12:

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