USB host枚举设备的过程

USB host枚举设备的过程

整理自网络

    USB主机在检测到USB设备插入以后,就会对USB设备进行枚举了。枚举就是从设备中读到一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息加载合适的驱动程序。

     首先说说USB的一种传输方式----控制传输。这种传输方式在USB中非常重要。他要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。控制传输分为三个阶段1,建立阶段;2,数据阶段;3,确认阶段。建立(setup)阶段是由USB主机发起的,它是一个setup包,里面包含一些数据请求的命令以及一些数据。如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。如果在数据阶段,即使不需要传递数据,也要发送一个0长度的数据包。数据阶段过后就是确认阶段。确认阶段刚好和数据阶段相反,如果是输入请求,则他是一个输出数据包,如果是输出请求,则他是一个输入数据包。确认阶段是用来确认数据的正确传输。

*************************************************************

      一个完整的控制传输包括三个过程:1.建立连接    2.数据过程(可选)         3.状态过程

   数据过程的可选型是指设置过程需要指定数据长度,如果指定为0,则没有数据过程。状态过程跟在数据过程之后,状态过程恰好和数据过程的数据传输方向相反,因为此阶段主要是用来确认之前两阶段的所有数据都已经正确传输了。

    建立连接的过程都是有Host发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果是控制输入传输,数据过程则为输入数据,若是控制输出传输,则数据过程是输出数据。

       好了,下面就结合我的这个实例来看看枚举的详细过程:

       当USB主机检测到有USB设备插入之后,会发生下面的事情:

       1.使用默认地址0读取设备描述符。(这一步的主要主用就是确认确实是USB设备插入以及获得0端点的缓存大小)

       USB主机向USB设备,发送第一个Setup包,内容是80 06 00 01 00 00 08 00,其中最后的0008表示得到设备描述符DEVICE_DCESCRIPTOR的前8个字节,因为这个包的主要目的是要获得USB Device中端点0的最大包的大小(第8个字节),所以只需要8个字节就可以了。USB Device返回的设备标识符为12 01 10 01 00 00 00 40。

       2.地址分配(配置一个临时的端点来获得更多的信息,0端点的缓存太小,存不下需要的设备信息)

       接下来USB主机向USB设备发送第二个Setup包,内容是一个含有制定地址的数据包:00 05 02 00 00 00 00 00,02表示主机为设备分配的地址为0x02,,在以后的通信里设备就只对0x02地址的信息做出应答。这一个次的作用是为USB设备分配地址(相当于SD卡中的RCA)。如果USB Device接收并接受了此地址设置包,会返回一个长度为0的数据包。Host接收到长度为0的状态包之后就会返回一个ACK给Device,Device再接收到这个ACK之后,就可以启用新地址了。这样Device就得到了一个唯一的设备地址,作为主机通信的唯一表示。

      3.获取设备描述符集合

  发送第三个Setup包,内容是80 06 00 02 00 00 09 00,这次是为了获取配置描述符集合的大小,此位位于读回数据的第三个字节。U盘返回的数据为09 02 20 00 01 01 00 80 32,即描述符集合总大小为0x20。设备在接受该命令后吗,会返回设备的描述符集合,主机就会知道了设备的输入输出地址等信息。

      这时候我们就可以知道该设备是什么类型的设备,支持什么样的操作了。

上述这两个过程也有的程序就是直接读取0xff个字符大小,当然同样可以达到读回设备描述符集合的目的。

至此,我们已经得到了所需要的设备信息,之后就可以对设备进行配置了。

     4配置地址

  主机得到了各种配置描述符之后.就会对设备进行配置,向设备发送第五个Setup包,数据为00 09 01 00 00 00 00 00,USB Device返回一个长度为0的数据包,表明数据正确接收。

至此,USB的枚举过程就完成了。设备进入工作状态。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值