USB的枚举过程

电子说

1.3w人已加入

描述

每当一个USB外设接入主机后,系统会提示用户USB设备接入了,并不停的查找对应的驱动文件,如果找到驱动文件,则加载对应驱动;如果没有找到,则提示用户没有对应的驱动,需要用户主动去配置驱动。

那么主机是如何判断设备类型以及找到对应的设备驱动?在解决这问题之前,先来了解几个概念:

  • 设备描述符 :描述设备的通用信息,如厂商IDD、产品ID和修订ID,支持的设备类、设备子类、适用的协议以及默认端点的最大包大小等。
  • 配置描述符 :描述当前配置中的接口数、支持的挂起和恢复能力以及功率要求。单个物理的USB设备,可以包含一个或者多个配置,不同的配置描述表现出不同的设备功能。
  • 接口描述符 :接口类、子类和适用的协议,接口备用配置的数目和端点数目。USB协议根据功能将不同的接口划分成不同的类,如下:

1:音频类,2:CDC控制类,3:人机接口类(HID),5:物理类,6:图像类,7:打印机类,8:大数据存储类,9:集线器类,10:CDC数据类,11:智能卡类,13:安全类,220:诊断设备类,224:无线控制类,254:特定应用类,255厂商定义的设备。

  • 端点描述符 :描述端点地址、方向和类型、支持的最大包大小。主机只能通过端点和设备通信。主机通过USB地址+端点号来寻址,确定数据最终是发到那个端点。

0号端点是个特殊端点,通常称作控制端点,用户设备的初始化

我们来看一下下面这个图,描述了设备描述符、配置、接口以及端点个层次包含关系。

ACK

USB各描述符层次关系

我们可以看到,最顶层的设备描述符包含一个USB设备的所有信息,也就是说可以通过设备描述符依次获取到整个USB设备的信息.

枚举的整个过程大概就是这样:

  1. 获取设备描述: 获取设备基本信息,并获取配置描述符。
  2. 获取配置信息: 根据配置描述获取到接口描述
  3. 获取接口描述: 根据接口描述,得到端点描述符
  4. 获取端点描述: 得到端点描述符

以上只是个基本过程,大体上要识别一个USB设备,这几步骤是必须的。

那么这几步骤具体是怎么完成的的?说到这就得说说SETUP过程,枚举过程中每次HOST和Device的交互,都是通过SETUP来完成的。下来详细说说这SETUP过程, 整个过程分为三个阶段:

1. CMD阶段(SETUP阶段)

数据方向:HOST->DEVICE单方向,这就是为什么USB所有的动作都必须是由HOST发起的原因

HOST发出的都是固定的8字节,每个字节代表不同含义。

每个字节含义解释

2. DATA阶段

数据方向双方向:HOST<->DEVICE。数据传输方向由CMD命令决定。

数据阶段是可有可无的,具体根据命令字的类型,比如:设置地址命令,是没有数据阶段,Device端接收命令成功,后设置地址,如果地址设置成功则返回ACK信号,失败则是NAK信号。

3. ACK阶段

数据双方向:HOST<->DEVICE。比如设置地址的命令,DEVICE端设置完成之后需要给HOST回复ACK/NAK信号.

4. SETUP实例

下图是USB协议分析仪解析出的获取描述符的过程(这里主要关注软件部分,图例中设置数字标号的部分):

  • 图中标号1: 命令阶段,主机发送获取描述符指令,请求获取设备描述符.
  • 图中标号2: 数据阶段(Device->Host),设备回送设备描述信息.
  • 图中标号3: 数据阶段(Device->Host),在USB1.1设备中,0号端点的BUFFER都比较小,单次不能把数据发送完成,需要多次
  • 图中标号4: ACK阶段(Host->Device),主机告诉设备数据正确接收完成

ACK

获取设备描述符

HOST端主机软件就是通过以上SETUP过程,一步一步完成整个枚举过程。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分