每当一个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号端点是个特殊端点,通常称作控制端点
,用户设备的初始化
我们来看一下下面这个图,描述了设备描述符、配置、接口以及端点个层次包含关系。
USB各描述符层次关系
我们可以看到,最顶层的设备描述符
包含一个USB
设备的所有信息,也就是说可以通过设备描述符
依次获取到整个USB
设备的信息.
枚举的整个过程大概就是这样:
- 获取设备描述: 获取设备基本信息,并获取配置描述符。
- 获取配置信息: 根据配置描述获取到接口描述
- 获取接口描述: 根据接口描述,得到端点描述符
- 获取端点描述: 得到端点描述符
以上只是个基本过程,大体上要识别一个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),主机告诉设备数据正确接收完成
获取设备描述符
HOST端主机软件就是通过以上SETUP
过程,一步一步完成整个枚举过程。
-
USB主机
+关注
关注
0文章
22浏览量
9346 -
集线器
+关注
关注
0文章
387浏览量
39479 -
ACK
+关注
关注
0文章
28浏览量
11144 -
无线控制
+关注
关注
0文章
96浏览量
19972
发布评论请先 登录
相关推荐
评论