USB设备的枚举过程.docx

上传人:b****5 文档编号:4814506 上传时间:2022-12-09 格式:DOCX 页数:11 大小:21.39KB
下载 相关 举报
USB设备的枚举过程.docx_第1页
第1页 / 共11页
USB设备的枚举过程.docx_第2页
第2页 / 共11页
USB设备的枚举过程.docx_第3页
第3页 / 共11页
USB设备的枚举过程.docx_第4页
第4页 / 共11页
USB设备的枚举过程.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

USB设备的枚举过程.docx

《USB设备的枚举过程.docx》由会员分享,可在线阅读,更多相关《USB设备的枚举过程.docx(11页珍藏版)》请在冰豆网上搜索。

USB设备的枚举过程.docx

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描述符等。

使用BUSHOUND以及通过串口返回信息,很容易看到具体的过程。

总之是主机请求什么,你的程序就响应什么。

下面这些数据是使用BUSHOUND抓的,这个是在WIN2000下抓到的,如果在WINXP下,就看不到设置地址之前的数据。

写了注释下面的部分就是主机和设备之间的数据通信,而其它的则是主机跟根集线器之间的通信数据。

Device Phase Data                                               Description       Delta

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

 14.1 DI    02                                                 .                       1.1.0       3.4sc 

 14.0 CTL   a3000000 01000400                           GETSTATUS                   17us 

 14.0 DI    01010100                                        ....                    2.2.0        27us 

 14.0 CTL   23011000 01000000                           CLEARFEATURE           4.1.0       110us 

 14.0 CTL   a3000000 01000400                           GETSTATUS                   56us 

 14.0 DI    01010000                                        ....                    5.2.0        14us 

 14.0 CTL   23030400 01000000                           SETFEATURE             7.1.0       109ms 

 14.1 DI    02                                                 .                       8.1.0        90ms 

 14.0 CTL   a3000000 01000400                           GETSTATUS              9.1.0        23us 

 14.0 DI    03011000                                        ....                    9.2.0        22us 

 14.0 CTL   23011400 01000000                           CLEARFEATURE          10.1.0         8us 

 14.0 CTL   a3000000 01000400                           GETSTATUS             11.1.0        19ms 

 14.0 DI    03010000                                        ....                   11.2.0        34us

/////////////第一次获取设备描述符请求////////////////////// 

 14.0 CTL   80060001 00004000                           GETDESCRIPTOR         12.1.0       239us 

/////////////第一次返回设备描述符//////////////////////////

/////////////由于该端点缓冲只有16字节,因此只读到16字节///////////

 14.0 DI    12011001 00000010 65103621 01000000 ........e.6!

....       12.2.0        67ms 

 14.0 CTL   a3000000 01000400                           GETSTATUS             13.1.0        49us 

 14.0 DI    03010000                                        ....                   13.2.0        27us 

 14.0 CTL   23030400 01000000                           SETFEATURE            14.1.0        24us 

 14.1 DI    02                                                 .                      15.1.0       112ms 

 14.0 CTL   a3000000 01000400                           GETSTATUS             16.1.0        21us 

 14.0 DI    03011000                                        ....                   16.2.0        25us 

 14.0 CTL   23011400 01000000                           CLEARFEATURE          17.1.0         8us

////////////////设置地址,地址为2/////////////////////////////////

 14.0 CTL   00050200 00000000                           SETADDRESS            18.1.0        19ms

///////////第二次获取设备描述符请求////////////////////////////// 

 14.0 CTL   80060001 00001200                           GETDESCRIPTOR         19.1.0        40ms

////////////第二次返回了全部的18字节设备描述符//////////////////

 14.0 DI    12011001 00000010 65103621 01000000 ........e.6!

....       19.2.0        75ms 

              0201                                              ..                     

////////////获取9字节的配置描述符/////////////////////////////            

 14.0 CTL   80060002 00000900                           GETDESCRIPTOR         20.1.0        44us 

////////////返回9字节的配置描述符/////////////////////////////

////////////可以看到配置描述符集合长度为0x20(即32)字节//////

 14.0 DI    09022000 01010080 dd                       ........              20.2.0        50ms 

 14.0 CTL   a3000000 02000400                           GETSTATUS             21.1.0       214ms 

 14.0 DI    00010000                                        ....                   21.2.0        34us

//////////再一次获取设备描述符//////////////////////////////

 17.0 CTL   80060001 00001200                           GETDESCRIPTOR         22.1.0       3.8ms 

/////////返回设备描述符////////////////////////////////

 17.0 DI    12011001 00000010 65103621 01000000 ........e.6!

....       22.2.0        67ms 

              0201                                              ..                     

//////////获取配置描述符///////////////////////             

 17.0 CTL   80060002 00000900                           GETDESCRIPTOR         23.1.0        28us 

///////////返回配置描述符///////////////////////

 17.0 DI    09022000 01010080 dd                       ........              23.2.0        50ms 

/////////获取0x20字节的配置描述符集合,包括配置描述符,接口描述符,端点描述符等/////////

 17.0 CTL   80060002 00002000                           GETDESCRIPTOR         24.1.0        30us

/////////返回了0x20字节的配置描述符集合///////////// 

 17.0 DI    09022000 01010080 dd090400 00020806 ...............       24.2.0        83ms 

              50000705 82024000 00070502 02400000 P.....@......@..       

////////获取字符串描述符的语言ID///////////////           

 17.0 CTL   80060003 00000200                           GETDESCRIPTOR         25.1.0        29us

///////设备返回语言ID,第一字节表示语言ID的长度///////////////

 17.0 DI    0403                                              ..                     25.2.0        45ms 

////////根据长度获取4字节的字符串描述符的语言ID///////////////

 17.0 CTL   80060003 00000400                           GETDESCRIPTOR         26.1.0        17ms

////////设备返回完整的语言ID////////////////

 17.0 DI    04030904                                        ....                   26.2.0        53ms 

/////////获取索引为2的字符串描述符///////////

 17.0 CTL   80060203 09040200                           GETDESCRIPTOR         27.1.0        27us 

//////////设备返回字符串描述符,第一字节为该字符串描述符的长度//////////

 17.0 DI    1203                                              ..                     27.2.0        46ms 

/////////根据长度获取索引为2的字符串描述符///////////

 17.0 CTL   80060203 09041200                           GETDESCRIPTOR         28.1.0        23us 

/////////设备返回完整的0x12字节字符串描述符/////////

 17.0 DI    12033200 30003700 31003000 39003800 ..       28.2.0        70ms 

              3200                                              2.                     

////////////////设置配置///////////////////////////////            

 17.0 CTL   00090100 00000000                           SETCONFIG             29.1.0        28us

////////////////设置接口//////////////////////////////// 

 17.0 CTL   010b0000 00000000                           SETINTERFACE          30.1.0        22ms

//////////////获取最大逻辑单元///////////////////////// 

 17.0 CTL   a1fe0000 00000100                           GETMAXLUN            31.1.0       158us 

 17.0 DI    00                                                 .                      31.2.0        53ms

///////////////USB大容量存储设备的命令块封包(CBW)//////// 

 17.2 DO    55534243 c8582581 24000000 80000612 USBC.X%.$.......       32.1.0       3.0ms 

              00000024 00000000 00000000 000000    ...$...........                     

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

系统启动................................

断开USB连接........................

USBD12芯片初始化

  设置地址.....................

      地址为:

 0

连接USB...............

USB总线复位................................

USB总线挂起................................

USB总线复位................................

USB总线挂起................................

USB总线复位................................

USB标准请求................................

   获取描述符................................

       获取设备描述符................................

USB总线复位................................

USB标准请求................................

  设置地址.....................

      地址为:

 2

USB标准请求................................

   获取描述符................................

       获取设备描述符................................

USB标准请求................................

   获取描述符................................

USB标准请求................................

   获取描述符................................

       获取配置描述符................................

USB标准请求....................

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1