usb的旅途之枚举

 

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

 USB命令与设备描述符之开发详解

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

 

 

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

Bus Hound 5.00 capture. Complements of www.perisoft.net

 

 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完成。

 

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

2:当主机确定slave端的reset完成后,则开始发送第一个Setup包,每个Setup包都是8个字节,第一个setup包Get 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情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值