分类: 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完成。
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情况。