Chinaunix首页 | 论坛 | 博客
  • 博客访问: 338186
  • 博文数量: 88
  • 博客积分: 907
  • 博客等级: 准尉
  • 技术积分: 1230
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-26 13:27
文章分类

全部博文(88)

文章存档

2017年(1)

2014年(3)

2013年(29)

2012年(21)

2011年(26)

2010年(8)

分类: LINUX

2011-04-22 22:25:12

前面列出了usb枚举过程的大体流程,现在来看一下usb枚举过程的详细分析

 

首先列出枚举过程中抓的数据包

 

 

/***************************************************************************/

Bus Hound 5.00 capture. Complements of

 

  Device - Device ID (followed by the endpoint for USB devices)

            (6) USB Root Hub

            (9) USB Root Hub

            (12) USB Root Hub

            (14) USB Root Hub

            (16) USB Root Hub

            (18) USB Root Hub

            (20) USB Root Hub

            (24) USB Composite Device

            (25) USB Mass Storage Device

            (26) USB 人体学输入设备

            (27) HID Keyboard Device

            (28) USB 人体学输入设备

            (29) HID Keyboard Device

  Phase  - Phase Type

            CTL   USB control transfer      

            DI    Data in                   

            LEN   Data length                

  Data   - Hex dump of the data transferred

  Descr  - Description of the phase

  Cmd... - Position in the captured data

 

 

Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)

------  -----  --------------------------------------------------  ----------------  ------------------

 

  12.0  CTL    23 01 14 00  02 00 00 00          CLEAR FEATURE           31.1.0       

  12.0  CTL    80 06 00 03  00 00 ff 00           GET DESCRIPTOR          32.1.0       

  12.0  LEN    04 00 00 00                     4                           32.2.0       

  12.0  DI     04 03 09 04                      ....                         32.3.0       

  12.0  CTL    80 06 03 03  09 04 ff 00           GET DESCRIPTOR          33.1.0       

  12.0  LEN    1a 00 00 00                      26                        33.2.0       

  12.0  DI     1a 03 30 00  30 00 30 00  31 00 41 00  30 00 30 00  ..0.0.0.1.A.0.0.        33.3.0       

               30 00 30 00  30 00 30 00  30 00                     0.0.0.0.0.              33.3.16      

  12.0  CTL    80 06 00 02  00 00 ff 00                            GET DESCRIPTOR          34.1.0       

  12.0  LEN    22 00 00 00                                         34                      34.2.0       

  12.0  DI     09 02 22 00  01 01 00 80  32 09 04 00  00 01 03 00  ..".....2.......        34.3.0       

               00 04 09 21  00 01 00 01  22 2d 00 07  05 81 03 04  ...!...."-......        34.3.16      

               00 20                                               .                       34.3.32      

  12.0  CTL    80 06 00 06  00 00 0a 00                            GET DESCRIPTOR          35.1.0       

  12.0  CTL    a3 00 00 00  03 00 04 00                            GET STATUS              36.1.0       

  12.0  LEN    04 00 00 00                                         4                       36.2.0       

  12.0  DI     03 01 00 00                                         ....                    36.3.0        

  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS              37.1.0       

  14.0  LEN    04 00 00 00                                         4                       37.2.0       

  14.0  DI     00 05 00 00                                         ....                    37.3.0       

  14.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              38.1.0       

  14.0  LEN    04 00 00 00                                         4                       38.2.0       

  14.0  DI     00 05 00 00                                         ....                    38.3.0       

  14.0  CTL    a3 00 00 00  03 00 04 00                            GET STATUS              39.1.0       

  14.0  LEN    04 00 00 00                                         4                       39.2.0       

  14.0  DI     00 05 00 00                                         ....                    39.3.0       

  14.0  CTL    a3 00 00 00  04 00 04 00                            GET STATUS              40.1.0       

  14.0  LEN    04 00 00 00                                         4                       40.2.0       

  14.0  DI     00 05 00 00                                         ....                    40.3.0       

  14.0  CTL    a3 00 00 00  05 00 04 00                            GET STATUS              41.1.0       

  14.0  LEN    04 00 00 00                                         4                       41.2.0       

  14.0  DI     00 85 00 00                                         ....                    41.3.0       

  14.0  CTL    a3 00 00 00  06 00 04 00                            GET STATUS              42.1.0       

  14.0  LEN    04 00 00 00                                         4                       42.2.0       

  14.0  DI     00 85 00 00                                         ....                    42.3.0       

  28.0  CTL    80 06 00 01  00 00 12 00                            GET DESCRIPTOR          43.1.0       

  28.0  LEN    12 00 00 00                                         18                      43.2.0       

  28.0  DI     12 01 00 02  00 00 00 08  51 c2 01 20  00 01 01 02  ........Q.. ....        43.3.0       

               03 01                                               ..                      43.3.16      

  28.0  CTL    80 06 00 02  00 00 09 00                            GET DESCRIPTOR          44.1.0       

  28.0  LEN    09 00 00 00                                         9                       44.2.0       

  28.0  DI     09 02 22 00  01 01 00 80  32                        ..".....2               44.3.0       

  28.0  CTL    80 06 00 02  00 00 22 00                            GET DESCRIPTOR          45.1.0       

  28.0  LEN    22 00 00 00                                         34                      45.2.0       

  28.0  DI     09 02 22 00  01 01 00 80  32 09 04 00  00 01 03 00  ..".....2.......        45.3.0       

               00 04 09 21  00 01 00 01  22 2d 00 07  05 81 03 04  ...!...."-......        45.3.16       

               00 20                                               .                       45.3.32      

  28.0  CTL    00 09 01 00  00 00 00 00                            SET CONFIG              46.1.0       

  28.0  CTL    21 0a 00 00  00 00 00 00                            SET IDLE                47.1.0       

  28.0  CTL    81 06 00 22  00 00 6d 00                            GET DESCRIPTOR          48.1.0       

  28.0  LEN    2d 00 00 00                                         45                      48.2.0       

  28.0  DI     05 01 09 06  a1 01 05 07  19 e0 29 e7  15 00 25 01  ..........)...%.        48.3.0       

               75 01 95 08  81 02 95 01  75 08 81 01  95 06 75 08  u.......u.....u.        48.3.16      

               15 00 25 65  05 07 19 00  29 65 81 00  c0           ..%e....)e...           48.3.32      

  28.1  LEN    08 00 00 00                                         8                       49.1.0       

  28.1  DI     00 00 04 00  00 00 04 00                            ........                49.2.0       

 

/*****************************************************************************/

 

上面的数据可能看起来有点乱,复制到txt文档里面就可很好的看清楚了。

注意:在上面的数据包里面是看不见枚举设置地址前的数据包的,必须要等到set addr后才可以看见枚举的数据包。枚举阶段的数据包都是通过ep0完成。

 

1host会给slave端发送reset命令,slave端接收到该中断,进入usbreset程序

2:当主机确定slave端的reset完成后,则开始发送第一个Setup包,每个Setup包都是8个字节,第一个setupGet Descriptor的内容为:80 06 00 01 00 00 40 00 ,数据为16进制表示。其中的40表示返回的数据最大长度为40H字节。则slave会回发设备描述符。本来设备描述符有18个字节,但是第一次就只会16个。另外两个就是不发。

 

3:成功发送了16个字节的设备描述符后,就开始地址分配,这是第二个setup包,内容为00 05 02 00 00 00 00 00 ,其中的02就表示主机为设备分配的地址为0x02,在以后的通信里设备就只对0x02地址的信息作出应答,但是这个02是随机的,并不一定是02,可以是其它的数据。

4:主机收到设备发来的空的应答数据包后,说明新地址就配置好了,设置好新地址后,主机开始从新获取设备描述符,但是这次slave端,就必须全部交出她的所有数据,第三个Setup包,这个Setup包的内容一般是:80 06 00 01 00 00 12 00,在这里和我上面的有点不同,我的上面就先获取了字符串描述,我也没想明白,但是协议上是按照这个顺序说的。12变为10进制就是16,所以标准的设备描述符就是18个字节。请看下面数据。

  28.0  CTL    80 06 00 01  00 00 12 00                            GET DESCRIPTOR          43.1.0       

  28.0  LEN    12 00 00 00                                         18                      43.2.0       

  28.0  DI     12 01 00 02  00 00 00 08  51 c2 01 20  00 01 01 02  ........Q.. ....        43.3.0       

               03 01 

 

5:在获取了设备描述后,主机就开始获取配置描述符,第四个Setup包,要求得到设备的配置描述符。这个Setup包的数据为:80 06 00 02 00 00 09 00 。其中的09指定设备返回9字节数据,这正是配置描述符的长度。

  28.0  CTL    80 06 00 02  00 00 09 00                            GET DESCRIPTOR          44.1.0       

  28.0  LEN    09 00 00 00                                         9                       44.2.0       

  28.0  DI     09 02 22 00  01 01 00 80  32                        ..".....2               44.3.0

 

6:在获取了配置描述符后,就会读取描述符集合,第五个Setup包,要求得到设备的配置描述符、接口描述符、端点描述符的集合。这次Setup包的内容是:80 06 00 02 00 00 FF 00 。由于不知道描述符集合的真实长度,因此它要求得到256字节。之所以会是255是因为主机不知道我们的描述符集合有多大,所以她就发一个很大的数据过来,但是我们要根据我们自己的实际情况回复数据。

  12.0  CTL    80 06 00 02  00 00 ff 00                            GET DESCRIPTOR          34.1.0       

  12.0  LEN    22 00 00 00                                         34                      34.2.0       

  12.0  DI     09 02 22 00  01 01 00 80  32 09 04 00  00 01 03 00  ..".....2.......        34.3.0       

               00 04 09 21  00 01 00 01  22 2d 00 07  05 81 03 04  ...!...."-......        34.3.16      

               00 20                                               .                       34.3.32

 

7:在正确获取了描述符集以后,主机发送第六个Setup包,其数据为:00 09 01 00 00 00 00 00 。程序中需要调用Set Configuration()函数处理此事件,允许所有端点进入工作状态,最后slave端必须要给主机回复一下空数据包。

  28.0  CTL    00 09 01 00  00 00 00 00                            SET CONFIG              46.1.0

 

好了,所有usb枚举的全过程都是这样的,现在就可以开始不同的usb情况。

阅读(1773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~