电子说
每当一个USB
外设接入主机后,系统会提示用户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
过程, 整个过程分为三个阶段:
数据方向:HOST->DEVICE单方向,这就是为什么USB所有的动作都必须是由HOST发起的原因
HOST发出的都是固定的8字节,每个字节代表不同含义。
每个字节含义解释
数据方向双方向:HOST<->DEVICE。数据传输方向由CMD命令决定。
数据阶段是可有可无的,具体根据命令字的类型,比如:设置地址命令,是没有数据阶段,Device端接收命令成功,后设置地址,如果地址设置成功则返回ACK信号,失败则是NAK信号。
数据双方向:HOST<->DEVICE。比如设置地址的命令,DEVICE端设置完成之后需要给HOST回复ACK/NAK信号.
SETUP
实例下图是USB协议分析仪解析出的获取描述符的过程(这里主要关注软件部分,图例中设置数字标号的部分):
1
: 命令阶段,主机发送获取描述符指令,请求获取设备描述符.2
: 数据阶段(Device->Host),设备回送设备描述信息.3
: 数据阶段(Device->Host),在USB1.1设备中,0
号端点的BUFFER都比较小,单次不能把数据发送完成,需要多次4
: ACK
阶段(Host->Device),主机告诉设备数据正确接收完成获取设备描述符
HOST端主机软件就是通过以上SETUP
过程,一步一步完成整个枚举过程。
全部0条评论
快来发表一下你的评论吧 !