您的位置 首页 系统

USB入门系列之六 —— USB设备的枚举进程

USB主机在检测到USB设备插入后,就要对设备进行枚举了。为什么要枚举呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通

USB主机在检测到USB设备刺进后,就要对设备进行枚举了。为什么要枚举呢?枚举便是从设备读取一些信息,知道设备是什么样的设备,怎么进行通讯,这样主机就能够依据这些信息来加载适宜的驱动程序。调试USB设备,很重要的一点便是USB的枚举进程,只需枚举成功了,那么就现已成功多半了。
在说枚举之前,先大概说一下USB的一种传输形式——操控传输。这种传输在USB中是非常重要的,它要确保数据的正确性,在设备的枚举进程中都是运用操控传输。操控传输分为三个进程:①树立进程。②可选的数据进程。③状况进程。树立(Setup)进程都是由USB主机建议,它开始于一个Setup令牌包,后边紧跟一个DATA0包。假如是操控输入传输,那么数据进程便是输入数据;假如是操控输出传输,那么数据进程是输出数据。假如在设置进程中,指定了数据长度为0,则没有数据进程。数据进程之后是状况进程。状况进程刚好与数据进程的数据传输方向相反:假如是操控输入传输,则状况进程是一个输出数据包;假如是操控输出传输,则状况进程是一个输入数据包。状况阶段用来承认一切的数据都现已正确传输。
好了,下面咱们来看看枚举的详细进程。
首要,USB主机检测到USB设备刺进后,就会先对设备复位。设备复位后,USB主机就会对地址为0的设备发送获取设备描述符的规范恳求。一切的USB设备在总线复位后其地址都为0,这样主机就能够跟那些刚刚刺进的设备经过地址0通讯。主机在树立阶段宣布获取设备描述符的输入恳求,设备收到该恳求后,在数据进程将设备描述符回来给主机。主机在成功获取到一个数据包的设备描述符后而且承认没有什么过错后(留意:有些USB设备的端点0巨细缺乏18字节(但至少具有8字节),而规范的设备描述有18字节,在这种情况下,USB设备只能暂时按最大包将部分设备描述符回来,而主机在成功获取到前面一部分描述符后,就不会再恳求剩余的设备描述符部分,而是进入设置地址阶段),就会回来一个0长度的状况数据包给设备。
然后主机再对设备复位一下,接下来就会进入到设置地址阶段。这时USB主机宣布一个设置地址的恳求(树立进程,设置地址无数据进程),地址包含在树立包中,详细的地址USB主时机担任办理,它会分配一个仅有的地址给新的设备。USB设备在收到地址后,回来0长度的状况包,主机收到0长度的状况包之后,会回来一个ACK给设备。设备在收到这个ACK之后,就能够启用新的地址了。这样设备就分配到了一个仅有的设备地址,今后主机就经过它来进行拜访该设备。
然后主机再次获取设备描述符,这次跟榜首次或许有点不相同,这次需求获取完悉数的18个字节的设备描述符。当然,假如你的端点0缓冲大于18字节的话,那就跟榜首次的景象相同了。
接下来,主机就会获取装备描述符。装备描述符总共为9字节。主机在获取到装备描述符后,依据里边的装备调集总长度,再获取装备调集。装备调集包含装备描述符,接口描述符,端点描符等等。
假如有字符串描述符的话,还要获取字符串描述符。别的HID设备还有HID描述符等。运用BUS HOUND以及经过串口回来信息,很简单看到详细的进程。总归是主机恳求什么,你的程序就呼应什么。

下面这些数据是运用BUS HOUND抓的,这个是在WIN2000下抓到的,假如在WINXP下,就看不到设置地址之前的数据。
写了注释下面的部分便是主机和设备之间的数据通讯,而其它的则是主机跟根集线器之间的通讯数据。

Device Phase Data Description Cmd.Phase.Ofs(rep) Delta
—— —– ————————————————– —————- —————— —–
14.1 DI 02 . 1.1.0 3.4sc
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 2.1.0(2) 17us
14.0 DI 01 01 01 00 …. 2.2.0 27us
14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 4.1.0 110us
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 5.1.0(2) 56us
14.0 DI 01 01 00 00 …. 5.2.0 14us
14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 7.1.0 109ms
14.1 DI 02 . 8.1.0 90ms
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.1.0 23us
14.0 DI 03 01 10 00 …. 9.2.0 22us
14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 10.1.0 8us
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 11.1.0 19ms
14.0 DI 03 01 00 00 …. 11.2.0 34us
/////////////榜首次获取设备描述符恳求//////////////////////
14.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 12.1.0 239us
/////////////榜首次回来设备描述符//////////////////////////
/////////////因为该端点缓冲只要16字节,因而只读到16字节///////////
14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 00 ……..e.6!…. 12.2.0 67ms
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 13.1.0 49us
14.0 DI 03 01 00 00 …. 13.2.0 27us
14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 14.1.0 24us
14.1 DI 02 . 15.1.0 112ms
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 16.1.0 21us
14.0 DI 03 01 10 00 …. 16.2.0 25us
14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 17.1.0 8us
////////////////设置地址,地址为2/////////////////////////////////
14.0 CTL 00 05 02 00 00 00 00 00 SET ADDRESS 18.1.0 19ms
///////////第2次获取设备描述符恳求//////////////////////////////
14.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 19.1.0 40ms
////////////第2次回来了悉数的18字节设备描述符//////////////////
14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 00 ……..e.6!…. 19.2.0 75ms
02 01 .. 19.2.16
////////////获取9字节的装备描述符/////////////////////////////
14.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 20.1.0 44us
////////////回来9字节的装备描述符/////////////////////////////
////////////能够看到装备描述符调集长度为0x20(即32)字节//////
14.0 DI 09 02 20 00 01 01 00 80 dd .. …… 20.2.0 50ms
14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 21.1.0 214ms
14.0 DI 00 01 00 00 …. 21.2.0 34us
//////////再一次获取设备描述符//////////////////////////////
17.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 22.1.0 3.8ms
/////////回来设备描述符////////////////////////////////
17.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 00 ……..e.6!…. 22.2.0 67ms
02 01 .. 22.2.16
//////////获取装备描述符///////////////////////
17.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 23.1.0 28us
///////////回来装备描述符///////////////////////
17.0 DI 09 02 20 00 01 01 00 80 dd .. …… 23.2.0 50ms
/////////获取0x20字节的装备描述符调集,包含装备描述符,接口描述符,端点描述符等/////////
17.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIPTOR 24.1.0 30us
/////////回来了0x20字节的装备描述符调集/////////////
17.0 DI 09 02 20 00 01 01 00 80 dd 09 04 00 00 02 08 06 .. …………. 24.2.0 83ms
50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00 P…..@……@.. 24.2.16
////////获取字符串描述符的言语ID///////////////
17.0 CTL 80 06 00 03 00 00 02 00 GET DESCRIPTOR 25.1.0 29us
///////设备回来言语ID,榜首字节表明言语ID的长度///////////////
17.0 DI 04 03 .. 25.2.0 45ms
////////依据长度获取4字节的字符串描述符的言语ID///////////////
17.0 CTL 80 06 00 03 00 00 04 00 GET DESCRIPTOR 26.1.0 17ms
////////设备回来完好的言语ID////////////////
17.0 DI 04 03 09 04 …. 26.2.0 53ms
/////////获取索引为2的字符串描述符///////////
17.0 CTL 80 06 02 03 09 04 02 00 GET DESCRIPTOR 27.1.0 27us
//////////设备回来字符串描述符,榜首字节为该字符串描述符的长度//////////
17.0 DI 12 03 .. 27.2.0 46ms
/////////依据长度获取索引为2的字符串描述符///////////
17.0 CTL 80 06 02 03 09 04 12 00 GET DESCRIPTOR 28.1.0 23us
/////////设备回来完好的0x12字节字符串描述符/////////
17.0 DI 12 03 32 00 30 00 37 00 31 00 30 00 39 00 38 00 ..2.0.7.1.0.9.8. 28.2.0 70ms
32 00 2. 28.2.16
////////////////设置装备///////////////////////////////
17.0 CTL 00 09 01 00 00 00 00 00 SET CONFIG 29.1.0 28us
////////////////设置接口////////////////////////////////
17.0 CTL 01 0b 00 00 00 00 00 00 SET INTERFACE 30.1.0 22ms
//////////////获取最大逻辑单元/////////////////////////
17.0 CTL a1 fe 00 00 00 00 01 00 GET MAX LUN 31.1.0 158us
17.0 DI 00 . 31.2.0 53ms
///////////////USB大容量存储设备的指令块封包(CBW)////////
17.2 DO 55 53 42 43 c8 58 25 81 24 00 00 00 80 00 06 12 USBC.X%.$……. 32.1.0 3.0ms
00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 …$……….. 32.1.16

以下是我在做USB键盘时,经过串口发回的调试信息,从这也能够看到枚举的进程。

系统启动…………………………..
断开USB衔接……………………
USBD12芯片初始化
设置地址…………………
地址为: 0
衔接USB……………
USB总线复位…………………………..
USB总线挂起…………………………..
USB总线复位…………………………..
USB总线挂起…………………………..
USB总线复位…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取设备描述符…………………………..
USB总线复位…………………………..
USB规范恳求…………………………..
设置地址…………………
地址为: 2
USB规范恳求…………………………..
获取描述符…………………………..
获取设备描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取装备描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取字符串描述符…………………………..
获取言语ID…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取字符串描述符…………………………..
获取设备序列号…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取装备描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取字符串描述符…………………………..
获取言语ID…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取字符串描述符…………………………..
获取产品字符串…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取字符串描述符…………………………..
获取言语ID…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取字符串描述符…………………………..
获取产品字符串…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取设备描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取装备描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
获取装备描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
获取描述符…………………………..
USB规范恳求…………………………..
设置装备…………………………..
USB类恳求…………………………..
设置闲暇…………………………..
USB规范恳求…………………………..
获取描述符(从接口)…………………………
获取陈述描述符…………………………..
USB规范恳求…………………………..
获取描述符(从接口)…………………………
USB规范恳求…………………………..
获取描述符(从接口)…………………………
USB规范恳求…………………………..
获取描述符(从接口)…………………………
USB规范恳求…………………………..
获取描述符(从接口)…………………………
USB规范恳求…………………………..
获取描述符(从接口)…………………………
USB规范恳求…………………………..
获取描述符(从接口)…………………………
USB规范恳求…………………………..
获取描述符(从接口)…………………………

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/234113.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部