努力成为linux kernel hacker的人李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/05/03/6387626.aspx
Transfer5,Transfer6,Transfer7是获得字符串描述符的传输过程。Transfer5是为了获得0号字符串描述符,Transfer6是为了获得2号字符串描述符,Transfer7是为了获得1号字符串描述符。
Transfer5:
现在来分析Transfer5的SETUP Transaction的DATA包的Data域,80表示传输方向从device到host,06表示请求为GET_DESCRIPTOR,03表示描述符的类型为STRING,由于不知道描述符的长度是多少所以用了长度256字节。Transaction24的DATA包中0x04表示0号描述符的长度为4个字节,0x03表示的是描述符的类型,即STRING,0x0409表示的是Language ID,Transaction25一个状态阶段结束了对0号描述符的获取。
Transfer6:
Transfer6作用是获取2号描述符,80表示传输方向从device到host,06表示请求为GET_DESCRIPTOR,USB spec Table 9-2 Format of Setup Data中,wValue由两部分组成,wValue的高位字节表示描述符的类型,低位字节表示描述符的序号。所以03表示STRING,02表示index为2的字符串描述符。wIndex对应字符串描述符应该设置使用的语言ID,所以这里为0x0409,就是在Transfer5中获得的那个。然后是0xff,因为不知道描述符的长度所以用256字节。Transaction27,28,29,30,31的作用就是device向host发送字符串描述符。如下两张图,0号字符串描述符和其他非0号的字符串描述符的格式是不一样的。0号描述符包括了设备所支持的所有语言的ID。
非0号的字符串描述符的第一个字节和第二个字节分别表示这个描述符的长度和描述符的类型。Transaction27的DATA包的Data域的第一个字节为0x24,十进制36,所以index为2的描述符长度是36个字节,大家可以数一下,从Transaction27~Transaction31中一共有36个字节的。
Transfer7:
同理,Transfer7获得了index为1的字符串描述符。
Transfer8:
Transfer8主要的作用是设置配置,使USB从Address状态进入Configured状态。00表示从host到device,09表示SET_CONFIGURATION,在Address时bConfigurationValue的值为0,所以这里设为大于0,则USB进入Configured状态,如果SET_CONFIGURATION传得参数是0则仍然是Address状态。这里为01。
Transfer9:
Transfer9好像也没干成什么事,这个废物,哈哈。
Transfer10是获得HID描述符。
Transfer11,12是枚举成功后,两次host与device之间传输数据。这里只截了部分图。Host每个bInterval这么多时间就对device查询一下,看有没有数据要传,比如有没有键子被按下。每次都是,host向device发送一个IN令牌包,如果没有数据,device就回一个NAK。
Transfer11:
Transfer12: