《圈圈教你玩 USB》学习笔记-枚举

枚举过程的详细介绍

1、USB 主机检测到 USB 设备插入后,就会先对设备复位。USB 设备在总线复位后其地址为 0 ,这样主机就可以通过地址 0 和那些刚刚插入的设备通信。

2、USB 主机往地址为 0 的设备的端点 0 发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。设备收到该请求后,会按照主机请求的参数,在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述符并且确认没有错误后,就会返回一个 0 长度的确认数据包(状态过程)给设备。(注意:第一次主机只会读取一个数据包的设备描述符。标准的设备描述有 18 字节,有些 USB 设备的端点 0 大小不足 18 字节,但至少具有 8 字节。在这种情况下,USB 主机也是只发送一次数据输入请求,多于的数据将不会再次请求。因此,当设备端点 0 大小不足 18 字节时,在第一次获取设备描述符时,只需要返回一次数据即可,不要再等主机继续获取剩余数据(如果还有),当主机成功获取到设备描述符的前 8 个字节之后,它就知道端点 0 的最大包长度了,因为端点 0 最大包长度刚好在设备描述符的第八字节处)

3、主机对设备又一次复位。

4、接下来进入地址设置阶段。USB 主机往地址为 0 的设备的端点 0 发出一个设置地址的请求,新的地址包含在建立过程的数据包中。具体的地址由 USB 主机负责管理,主机会分配一个唯一的地址给刚接入的设备。USB 设备在收到这个建立过程之后,就直接进入到状态阶段,因为这个控制传输没有数据过程。设备等待主机请求状态返回,收到输入令牌包后,设备就返回 0 长度的状态数据包。如果主机确认该状态包已经正确收到,就会发送应答包 ACK 给设备,设备在收到这个 ACK 之后,就要启动新的设备地址了。这样设备就分配到了一个唯一的设备地址,以后主机就通过它来访问该设备。

5、主机再次获取设备描述符。这次主机是真心实意的获取了,首先主机不再使用地址 0 来访问设备,而是新的设备地址,另外,这次需要获取全部的 18 字节的设备描述符。如果你的端点 0 最大包长小于 18 字节,那么就会由多次请求数据输入

6、主机获取配置描述符。配置描述符总共为 9 字节。

7、主机在获取到配置描述符后,根据配置描述符中所描述符的配置集合总长度,获取配置集合。获取配置描述符和获取配置描述符集合的请求是差不多的,只是指定的长度不一样。有些主机干脆不单独获取配置描述符,而是直接使用最大长度来获取配置描述符集合,因为设备实际返回的数据可以少于指定的字节数。配置集合包括:配置描述符,接口描述符,类特殊描述符(如果有),端点描述符等。接口描述符,类特殊描述符,端点描述符是不能单独获取的,必须跟随配置描述符以一个集合的方式一并返回。

8、如果有字符串描述符,还要获取字符串描述符。

9、另外,像 HID 设备还有报告描述符等,它们是单独获取的。

以上内容来自 《圈圈教你玩 USB》 的学习笔记

发布了124 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/103969046