您的位置:首页 > 其它

USB基础了解

2014-12-15 16:59 127 查看

转载自:http://blog.chinaunix.net/uid-103601-id-2961390.html

一 什么是USB

1.1 USB is only bus

认识一下它的全名:USB (Universal Serial Bus,通用串行总线)。
       Bus永远是bus。出生那一刻起就注定他一生的角色就是一条数据通路。我们不能因为现在各式各样的USB设备,被其迷惑就认为USB是一种设备,他不过是寄生于某种功能设备之上的一种串行总线(并没有贬低USB的意思,只是想客观的描述USB的角色)。当做过一段时间的USB设备驱动开发后,也许你就会发现,对USB的这种理解对我们以后的设备驱动开发大有裨益。
       当然bus(总线)的角色是由开发者给的,如果开发者让bus有了更重要的角色,那它就不是简单的bus,不再是简单的数据通路,linux中的bus就有了更复杂的角色,是一位总管全局的精神领袖,已经不是我们这里的bus了,这里我们更应该简单的去理解bus,它就是一条串行总线,一条数据的通路,一条高速路。这更有助于我们快速的了解USB的知识。
USB对传输的数据在内容和结构上没有任何的要求,他没有这个权力,他是一个忠实的信使。从上层应用的层面来看(设备类层),USB就是数据的透明通路(别忘了,他只是个总线---bus)。
邮局只负责把邮件送过去,他会看信里写的内容么?快递公司会偷偷的打开你的邮包看邮包里的东西么?
USB 很简单,也很单纯。各种各样的复杂设备那是上层的事情,USB只是被上层利用。所以我们平时说的USB设备似乎有些不正确,应该说USB接口的设备。当然我们称呼为USB设备并不会产生歧义,我们也就这么叫了,存在的就是合理的。

1.2 物理拓扑结构:7层

       顶层是host 控制器,下面是USB设备。在这些设备中有一个特殊的角色—hub。Hub的存在使USB接备能够一层一层的级联,使得USB的物理拓扑结构能够形成如图所示的层次结构。其中roothub是一个抽象出来的虚拟hub,软件设计者也可以不用考虑roothub,因为我们一贯的思路是一个USB设备只可能插在hub上,所以不知哪位高手就抽象出了一个roothub,结束了群龙无首的局面。
物理拓扑结构就像一个大树一样。Host控制器是树根,Hub是树干、树枝。USB设备 就好比是树叶子。USB协议规定这种层次最多为7层,至于为什么?我想这应该和物理层线路的电气特性有关。Host发出了一个请求,等了好久没回响应,你是认为他超时了,还是真的路途遥远呢?
1.3 逻辑拓扑结构
在USB Host控制器的眼中每个设备都是平等的,不管物理距离上是多远,我们的
心都是一样近的,每个设备都有一个独立的地址,like a child of the host。多么宽广的胸怀,天下皆为臣民。凡成大事者都要有一颗宽广的胸怀。

二 Life of USB device

       有一句话叫做事必躬亲,意思是每件事情都要亲自做。我觉得他也告诉我们另外一件思路:事情只有亲自参与了才能有切身体会。我们做嵌入式开发讲究的更是这个,整天抱着书看、不做试验、没有应用场景验证我们的思路,一是不好理解,二 是即使理解了慢慢也忘了。所以我的思路是学习知识时,要创造该知识的应用场景。应用才是王道,应用的场景推动着我们对知识的理解,所以我们从最熟悉的U盘开始,来引出USB中的几个关键术语。

       也许没有多少人了解USB的工作原理,但是大部分人却都使用着U盘。你知道U盘插入电脑的那一刻起一直到电脑上显示出盘符这短暂的瞬间都发生了什么?其他人可能不会去想,也没有必要想,但是你既然看到了这里,你就应该想一想。这是进入USB的开始。

       电脑对他做了什么?怎么知道他是U盘的?还知道他是那个厂家的?并且在插了2个或更多个U盘时,依然能够正确的向里边拷贝数据,怎么区分他们的?带着疑问,我们能走得更快。

       当U盘插入hub后,供电的瞬间就是设备life开始的时刻!佛祖曾经说过:万物皆有生命。

2.1枚举

       USB设备(U盘)的一生有这么几个阶段:

Attach态,Power态,default状态,寻址态,配置态、挂起态。

       首先将设备连接到Hub的端口上,这时就处于Attach态;端口然后给设备提供电源,这时处于Power态,这样才有了能量,总得吃了饭才能干活阿。供电态之后,设备还没有接受过host的任何指示,处于的状态为Default态,在Default 状态下设备默认地址为0。目前它还没有得到主机的认可。这里强调一下,默认地址0是很重要的,是公共财产,谁也别想单独拥有,否则后果很严重。Host检测到USB设备的插入后,会重新给该设备分配一个地址,使设备进入寻址态;然后host会与设备通讯获取设备的信息,USB设备告诉host自己都能干什么,然后host就选择设备的一种功能进行配置,从此USB设备就知道自己工作在哪种功能下了,找到了人生目标啊!从此步入了配置态,就开始正常的工作了,如果是U盘就开始传输文件了,当然正式工作还有很多东西要讲,我们先考虑枚举这段过程。当host没有什么任务、工作需要USB设备完成时,为了节能、低碳会将设备挂起,从此设备进入挂起状态。

       刚到一个班级时,老师会为每一个学生分配一个学号,来标识一个学生,这就类似于这里的设备地址。老师提问时如果叫到9527,所有的人都会听到,然后判断是不是叫自己,如果不是不予理会;如果叫到的是自己,就需要起来回答问题。从1.3的逻辑拓扑结构来看,host会将数据或者命令广播出去,所有的设备都要判断是否给予响应,决定其是否响应的就是地址,host的呼叫的地址是不是自己。

2.2 枚举阶段的细节

       上面我们简单的说了一下USB设备枚举的过程,那么枚举的每个过程都发生了什么?怎么发生的呢?Attach态和Power态没什么讲头,我们主要介绍的是default态,寻址态,配置态。

       default态:当USB设备上电并正常工作后,就进入了default态,这个默认的意思是说地址处于默认状态,每一个USB设备都有一个默认地址,总得给host一个找到你的方式吧。此时host会通过默认地址0来和USB设备通讯。如果有两个设备都是地址0怎么办?我只能说不应该也不能出现这种情况,我们必须一个设备一个设备的供电、进入default态,如果有两个叫做9527的怎么办,乱套了?在default态时,host并不知道这个USB设备是个什么主儿,所以host首先会发送一个命令来试探一下,USB设备会对这个命令进行回应。专业术语叫做获取设备描述符。就这么一个简单的过程将引出多个USB的知识点。

       1  USB的所有通讯都是host主动,USB设备被动接受、响应,绝对不能主动请战。

       2  命令是什么样的?USB中将命令叫做令牌。枚举过程中使用的令牌为setup令牌

       3  命令的参数是什么?setup令牌的内容我们通常叫做setup包。他是1个8字节的数

据包,包含了各种信息:数据方向、长度、索引,主要的一项是要干什么。

4  什么是设备描述符?如果我问你:你叫什么名字,从哪来。我觉得应该可以答上来。一样的道理,USB设备各式各样,他必须在设备内部有记录,自己是什么设备,都有什么资源等等,这就是设备描述符,关于设备描述符我们后面一看就知道了。

5  这个命令传给USB设备后,USB设备采用的什么机制收到的数据。我先告诉你是端点。

注意:这里我一直称呼为USB设备,上面说过应该是USB接口的功能性设备,这个设备内部应该是一个USB device 控制器,USB通讯所涉及到的就是两个控制器:host和device之间的恩恩怨怨。

通过default我们就知道了,我们需要了解以下几点:令牌、setup包、描述符、端点

寻址态:刚才host通过地址0与设备通讯,咱也不能一直这样过,USB是博爱的,必

须做到人人有其居,host会为其分配一个地址,从此USB设备就名正言顺的占着这个地址了。这个过程也是发送了一个setup命令。

配置态:USB设备到底能干什么,host还是不清楚的,所以会进一步获取信息,这

个过程会获取配置描述符和接口描述符,这两个描述里清晰的描述了该设备都能干什么。Host会根据自己的需要通知USB设备具体干什么。举个例子:你到一家公司面试时面试官会问你都能做什么:我能做nandflash,还能做linux驱动。如果面试通过,会通知你,你做linux驱动吧,这就是进行了配置。当然这里其实还复杂一些,我们先说的简单点,在这个过程中引出的知识点是:配置、接口

       当USB设备插入hub的瞬间就执行了这么一个复杂的过程,在每一个环节引出了我们需要进一步掌握的知识点,静下心来,脑子里捋一下这个过程都发生了什么?瞬间又多长,取决于你对上面的理解。

       通过life of USB device这一部分主要是为了对USB设备的工作过程首先有一个感性的认识,同时引出相关的基础知识点,我们依然需要带着梦想上路。



三 家族的血统

       USB家族的成功,绝非偶然。正如一个人的成功一样,除了机会还需要自身条件的过硬,需要平时对自己个人能力的积累。下面就介绍USB协议中的几个知识点,正因为有了他们,才成就了USB这座大厦,他们是每一个USB设备所具有的,正如家族的印记一样刻在了每一个USB设备的骨子里。

3.1 端点

简单理解就是数据传输的终点,Endpoint。每一个设备都会有若干个端点,来负责不同类型的传输,USB数据传输有4种:控制传输、批量传输、中断传输和同步传输。就像一个公司有不同的部门,人事部、技术部、财务部各有各的职责。从某种角度来说,一个USB设备是若干端点的集合。当host和USB设备通讯时,是直接和端点打交道的,端点是才是外交的门户。既然端点是用来传输数据,那么他就有方向,有能够接受的最大数据长度。所以记住3点:1 端点有类型(控制、批量、中断及同步),2 端点有方向(in和out), 3端点有大小(MaxPacketSize)。任何一个设备都有一个用于通讯的默认端点0。
每个端点的信息都将在端点描述符中一一找到。

3.2 管道(pipe)

数据传输需要两个实体的参与,所以引入了管道的概念,管道必然涉及到两端。当面我们提到的Endpoint就是管道的一端,那另一端呢?另一端是什么并不确定,因为不同的控制器设计的方式是不一样的,如果是host EHCI作为数据的另一端的话,那么管道的另一端就只能认为是host控制器了。如果host端是mentor的otg host,那么管道的另一端同样是一个端点。其实管道这个概念我们在实际设计中基本涉及不到,更多的是为了描述数据在两个实体间流动的场景,是一种抽象的东西。数据从这一端流淌到另一端,就像流水一样总得有个管道吧,你关心过水龙头,关心过水管么?
抽象的东西,需要在以后的工作中去慢慢领会。

3.3 描述符

简单的说,USB的描述符是一个特定格式的数据结构,描述了USB 设备的各种属性还有相关信息等,我们可以通过向设备发送setup命令请求获得描述符的内容来了解这个USB设备。主要有四种USB 描述符:设备描述符、配置描述符、接口描述符和端点描述符,协议里规定一个USB 设备是必须支持这四大描述符的,这四大描述符是一个都不能少的,设备工作所必须的,共性之外依然有各自的特性,如hub有自己的hub描述符,每一种特殊的设备都会有自己的描述符。设备大多有字符串描述符,不过即使没有也不会影响设备工作,字符串描述符并不是一无是处,他记录了厂家的信息,产品id等。
这些描述符放哪儿?当然是在USB设备里,等着host来取,描述符是USB设备提供给host了解自己的窗口。
好,抽象和具体必须结合才能产生不错的效果。我们对4个重要的描述符一一介绍一下。
 
a)设备描述符
设备描述符给出了USB设备的一般信息,一个USB设备只能有一个设备描述符。所有的USB设备都有缺省控制通道。在设备描述符中指出了端点0的最大包长度、厂商信息和产品信息等。bNumberConfigurations是该设备支持的配置数。
 
 
Offset
Field
Size
Value
Description

bLength
1
描述符长度
此描述符的字节数
1
bDecriptorType
1
常量
设备描述符的标识
2
bcdUSB
2
BCD码
USB设备说明版本号(BCD 码)
4
bDeviceClass
1
设备类
类码
如果该值为0表示有每个配置下每个接口指出它自己的类,并个接口各自独立工作。
如果值处于1~FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。
如果此域设为FFH,则此设备的类由厂商定义。
5
bDeviceSubClass
1
设备子类
子类码
这些码值的具体含义根据bDeviceClass 域来看。
如bDeviceClass 域为零,此域也须为零。
如bDeviceClass 域为FFH,此域的所有值保留。
6
bDevicePortocol
1
协议
协议码
这些码的值视bDeviceClass 和
bDeviceSubClass 的值而定。
如果设备支持设备基础上的类相关的协议,此码标志了设备类说明上的值。
如果此域的值为零,则此设备不在设备基础上支持设备类相关的协议。然而,它可能在接口基础上支持设备类相关的协议。
如果此域的值为FFH,此设备使用厂商定义的协议。
7
bMaxPacketSize0
1
长度
端点0的最大包大小(仅8,16,32,64为合法值)
8
idVendor
1
ID
厂商标志(由USB标准付值)
10
idProduct
1
ID
产品标志(由厂商付值)
12
bcdDevice
2
BCD码
设备发行号(BCD 码)
14
iManufacturer
1
索引
描述厂商信息的字串的索引
15
iProduct
1
索引
描述产品信息的字串的索引。
16
iSerialNumber
1
索引
描述设备序列号信息的字串的索引。
17
bNumConfigurations
1
数字
可能的设置数
 
 
 
 
b)配置描述符
 
一个USB设备有一个或多个配置,每个配置做着不同的事情。每个配置有一个或多个接口。而每个接口又有1个或多个端点。在一个配置下,一个端点不能被几个接口使用,除非该端点被该接口的可选设置使用。在不同的配置中端点没有限制。对USB设备选完配置后,设备可支持对配置的有限调整,如果一个接口有备选设置,在配置好后可选择不同设置。
 
 
Offset
Field
Size
Value
Description

bLength
1
描述符长度
此描述符的字节数
1
bDecriptorType
1
常量
配置描述符的标识
2
WTotalLength
2
数目
此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述表)
4
bNumInterfaces
1
数目
该配置所支持的接口个数
5
bCongfigurationValue
1
数目
在SetConfiguration()请求中用作参数来选定此配置。
6
iConfiguration
1
索引
描述此配置的字串描述表索引
7
bmAttributes
1
位图
配置特性:
D7: 保留(设为一)
D6: 自给电源
D5: 远程唤醒
D4..0:保留(设为一)
一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。并设置D6 为1 。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到
8
MaxPower
1
mA
在此配置下的总线电源耗费量。以 2mA为一个单位。
 
 
c)接口描述符
接口描述符不能单独获取,只能在获取配置描述符时获得。如果一个配置支持不止一个接口,端节的描述符会跟在接口描述符后被返回,接口描述符跟在配置描述符的后面返回。接口描述不可直接用Set Description ( )和Get Descriptor ( )操作。
有时某个接口有可选设置,设备在进行了配置的情况下可以更改为接口的可选设置。SetInterface ( )与GetInterface ( )用来选择与返回选择了的接口设置。
如果一个设备的配置为一个接口,该接口有两个可选设置,当获取配置描述符时,返回配置描述符以后会紧跟着返回bInterfaceNumber与bAlternateSetting域皆为0的第一个设置的接口描述表及相关的端点描述符,然后是另一个设置接口描述符与端点描述符。第二个接口描述符的bInterfaceNumber域也应为0,但bAlternateSetting域应为1。因为是同一接口的不同设置,所以bInterfaceNumber是一样的。
每个接口代表着一种功能。你的手机是做U盘,还是做摄像头。这就是配置。当作为U盘时可能一个接口就够了。摄像头时可能需要几个接口,有音频还得有视频,而设置呢,比如音量可大可小,这应该就是设置吧。
接口描述符中的端点个数不包括端点0。
 
Offset
Field
Size
Value
Description

bLength
1
描述符长度
此描述符的字节数
1
bDecriptorType
1
常量
接口描述符的标识
2
bInterfaceNumber
1
数目
当前配置支持的接口数组索引,0开始。
3
bAlternateSetting
1
数目
可选设置的索引值
4
bNumEndpoints
1
数目
接口使用的端点数目。0代表只使用控制传输
5
bInterfaceClass
1
索引
类值零值为将来的标准保留。如果此域的值设为FFH,则此接口类由厂商说明。所有其它的值由USB 说明保留
6
bInterfaceSubClass
1
子类
子类码
这些值的定义视bInterfaceClass 域而
定。如果bInterfaceClass域的值为零则
此域的值必须为零。bInterfaceClass域
不为FFH则所有值由USB 所保留
7
bInterfaceProtocol
1
协议
协议码: bInterfaceClass 和
bInterfaceSubClass 域的值而定.如果
一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议
8
iInterface
1
索引
描述此接口的字符串描述表的索引值
 
 
d)端点描述符
       每个接口有若干个端点。端点描述符信息中包含端点号、方向、端点类型等。
 
Offset
Field
Size
Value
Description

bLength
1
描述符长度
此描述符的字节数
1
bDecriptorType
1
常量
端点描述符的标识
2

bEndpointAddress

1

端点

此描述表所描述的端点的地址。此地址的编码如下:
Bit 3..0 :端点号.Bit 6..4 :保留,为零
Bit 7:方向,如果控制端点则略。(0:出端点1:入端点)

3

bmAttributes

1

位图

此域的值描述的是在bConfigurationValue域所指的配置下端点的特性。
Bit 1..0 :传送类型(00=控制传送 01=同步传送10=批传送 11=中断传送)所有其它的位都保留

4

wMaxPacketSize

2

数字

当前配置下此端点能够接收或发送的最大数据包的大小。对与同步传送此值用于为每幀的数据净负荷预留时间。而通道可能在实际运行时不需要预留的带宽。实际带宽可由设备通过一种非USB定义的机制汇报给主机.对于中断传送,批传送,控制传送.端点可能发送较小的数据包。并且在结束传送后既有可能间隙时间来重启,也有可能不需要这段时间

6

bInterval

1

数字

轮寻数据传送端点的时间间隙。此域的值对于批传送的端点及控制传送的端点忽略。对于同步传送的端点此域必需为1。对于中断传送的端点此域值的范围为1到255

 

四 精彩人生的资本

       当我们遇到机会时,才会感到自己能力的匮乏,后悔自己平时没有足够的积累。USB协议经过上面的准备,有能力进行各种情况下的数据传输了。他为我们准备了四种数据传输方式,分别应用在不同的环境下,技术的本质是服务,如果服务不好,迟早要被淘汰。所以做技术要考虑客户的感受。USB的四种传输基本上是够用的:控制传输(control)、批量传输(bulk)、中断传输(interrupt)、同步传输(iso)。
四种传输是usb立足江湖不可或缺的,不同的应用场合,设备可以使用不同的传输方式,也因此诞生了各式各样、丰富多彩的USB设备。

4.1 控制传输

控制就是命令,数据量短小精悍、目标明确。
控制传输只能在消息管道进行,因此传输的数据流必须依附于USB数据结构上。
1)数据格式
Setup包命令集
具有USB定义的格式
保证主机和设备之间正常通信
允许一些销售商对设备命令进行扩展
2)传输方向——双向(一般为端点0)
3)最大的包长度为64字节
 

4.2 批量传输

数据量大,还要求准确。打印机、U盘。
1)数据格式——无要求
2)传输方向——单向
3)包长度限制
低速设备不支持批量传输
全速设备:64字节
高速设备:512字节
4)支持错误检测和恢复
 

4.3 中断传输

              鼠标、键盘,数据量不是很大,周期性的会有新数据。
            1)用于定时查询设备是否有中断数据要传送
            2)根据设备的要求进行周期性调度
全速设备最快每1ms、最慢每255ms发生一次
低速设备最快每10ms、最慢每255ms发生一次
高速设备最快每125us、最慢每4096ms发生一次
3)数据格式——无要求
4)传输方向——单向
5)包长度限制
低速设备:8字节
全速设备:64字节
高速设备:1024字节
6)支持错误检测和恢复
 

4.4 同步传输

          数据的实时性,而非正确性,带宽要求很高啊。典型应用摄像头!
            1)速率恒定,容错的传输
因错误使传输失败,不再重新发送数据
全速设备最大带宽的90%、高速设备最大带宽的80%可以分配给周期性传输(同步传输和中断传输)
            2)数据格式——无要求(流管道)
            3)传输方向——单向
            4)服务周期——在相连的帧时隙中被定期调度
            5)包长度限制
低速设备不支持同步传输
全速情况下,最大包值为1023字节
高速情况下,最大包值为1024字节
            6)不支持错误检测和恢复
 
       到此,我们对USB家族成员的看家本领有了初步的认识,在后面的使用过程中,会对他们进一步的了解,直到将这些东西了然于胸,不用特意感受他的存在。掌握知识点的最好方式是在使用过程中,所以有时我更喜欢“好读书不求甚解”这句话,因为在后面的使用过程中,以前没理解的可能会突然间就理解了。前前后后的知识点,互相照应,形成网状。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息