一.什么是USB
USB的全称是Universal Serial Bus,通用串行总线。它的出现主要是为了简化个人计算机与外围设备的连接,增加易用性。USB支持热插拔,并且是即插即用的,另外,它还具有很强的可扩展性,传输速度也很快,这些特性使支持USB接口的电子设备更易用、更大众化。
二.USB传输基础知识介绍
1.USB金字塔型拓扑结构
塔顶为USB主控制器和根集线器(Root Hub),下面接USB集线器(Hub),集线器将一个USB口扩展为多个USB口,USB2.0规定集线器的层数最多为6层,理论上一个USB主控制器最多可接127个设备,因为协议规定USB设备具有一个7 bit的地址(取值范围为0~127,而地址0是保留给未初始化的设备使用的)。
2.NRZI编码
USB采用差分信号传输,使用的是如上图所示的NRZI编码方式:数据为0时,电平翻转;数据为1时,电平不翻转。如果出现6个连续的数据1,则插入一个数据0,强制电平翻转,以便时钟同步。上面的一条线表示的是原始数据序列,下面的一条线表示的是经过NRZI编码后的数据序列。
3.USB是如何检测到设备插入的?
要从USB集线器接收端的接口说起,在USB集线器的每个下游端口的D+和D-上,分别接了一个15千欧的下拉电阻到地,这样,当集线器的端口悬空(即没有设备插入)时,输入端就被这两个下拉电阻拉到了低电平,而在USB设备端,在D+和D-上接了一个1.5千欧的上拉电阻到3.3V的电源,1.5千欧的上拉电阻是接在D+和D-哪个,由设备的速度来决定,对于全速设备和高速设备,上拉电阻是接在D+上的,而低速设备的上拉电阻则是接在D-上。可以记做,速度快的,上拉电阻接正的,速度慢的上拉电阻接负的。
当设备插入到集线器时,接了上拉电阻的那条数据线的电压,由1.5千欧的上拉电阻和12千欧的下拉电阻分压决定,结果大概在3V左右,这对集线器的接收端来说是一个高电平信号,集线器检测到这个状态后,他就报告给USB主控制器,(或者通过它上一层的集线器报告给USB主控制器),这样就检测到设备插入了,集线器根据检测到的被拉高的数据线是D+还是D-来判断是什么速度类型的设备,USB高速设备先是被识别为全速设备,然后通过集线器和设备两者的确认,再切换到高速模式下,在高速模式下,是电流传输模式,这时要将D+上的上拉电阻断开。
4.USB的描述符及其之间的关系
USB只是一个总线,只提供一个数据通路而已。USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为。具体一个设备实现什么功能,要由设备自己来决定。那么USB主机是如何知道一个设备的功能以及行为呢,这就要通过描述符来实现了。描述符中记录了设备的类型 厂商ID 产品ID,(通常依靠他们来加载对应的驱动),端点情况,版本号等众多信息。
一个USB设备只有一个设备描述符,设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符,而在每个配置描述符里又定义了该配置有多少个接口,每个接口都有一个接口描述符,在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符,端点描述符还定义了端点的大小,类型等。如果有类特殊描述符,它跟在相应接口描述符之后,游戏可以看出,USB描述符之间的关系是一层一层的,最上层是设备描述符,接下来是配置描述符,再下来是接口描述符,最下面是端点描述符。
在主机获取描述符时,首先获取设备描述符,接着在获取配置描述符,然后根据配置描述符中的配置集合的总长度,一次将配置描述符,接口描述符,类特殊描述符(若有),端点描述符一次读回。对于字符串描述符,是单独获取的。主机通过发送获取字符串描述符的请求以及描述符的索引号,语言ID来获取对应的字符串描述符。
设备描述符主要记录有:设备所使用的USB协议版本号,设备类型,端点0的最大包大小,厂商ID(VID)和产品ID(PID),设备版本号,厂商字符串索引,产品字符串索引,设备序列号索引,可能的配置数等。
配置描述符主要记录信息有:配置所包含的接口数,配置的编号,供电方式,是否支持远程唤醒,电流需求量等。
接口描述符主要记录的信息有:接口编号,接口的端点数,接口所使用的类,子类,协议。
端点描述符主要记录的信息有:端点号及方向,端点的传输类型,最大包长度,查询时间间隔等。
字符串描述符主要是提供一些方便人们阅读的信息,它不是必须的。
设备,配置,接口,端点等总是比较绕,很容易搞混,或者有时候似乎懂了,再想想,又觉得没懂。所说的设备,就是实实在在的USB设备,比如一个USB鼠标,设备有一个设备地址,USB主机依靠这个设备地址来访问设备,而在设备内部会分的很细,会分出端点来。就是说,如果USB主机要和USB设备通信,光有设备地址是不够的还需要一个端点地址。有了端点地址设备地址,就能准确的对断电发送和读取数据了。别8号教学楼的808教室。而配置和接口,是为了方便的管理端点而抽象出来的概念,一个设备可以有多个配置,但是同一时刻只能有一个配置有效,每个配置下又可以有多个接口,当我们需要不同的功能时,只需要选择不同的配置即可,比如分成两个配置,上课用和期末考试用,考试用时,全部的教室都用来做考场(即该配置下有两个接口,每个接口下有很多端点--教室);而平时上课用时,分成两类(即该配置下有两个接口,接楼下有一些端点--教室);老师休息室和上课的教室,老师休息室和教室是不能共用的。(在USB里也是如此,同一个端点号不能出现在同一个配置下的两个或多个不同接口中)但是平时用来做教室或者休息室的教室,考试时候可以用来做考场(在USB中也是,同一个端点号可以用在不同的配置中)。具有多个接口并由借楼来实现功能的设备,把它叫做USB复合设备,比如一个USB音频设备,它具有一个音频控制接口,另外还可能具有一到多个音频流和MIDI流接口,在主机端会把USB复合设备的每个接口当作一个功能设备来看待,像常见的USB鼠标,U盘。通常是单一设备,就是一个设备下只有一个配置描述符,一个接口描述符。
总结:有端点构成一个接口(接口是端点的集合)由接口有构成一个配置(配置是接口的集合)再由配置构成一个设备(设备是配置的集合)。
5.USB设备的枚举过程
USB主机在检测到USB设备插入后,就要对设备进行枚举了,为什么要枚举呢?就是从设备读取各种描述符的信息,这样主机就可以根据这些信息加载合适的驱动程序,从而指导设备是什么样的设备,如何进行通信。USB有一种传输模式---控制传输,他要要保证数据的正确性,在设备的枚举过程中都是使用控制传输,控制传输分为三个过程,建立过程,可选的数据过程及状态过程。
建立过程(setup)都是由USB主机发起,开始于