Linux USB子系统 (1)

来源:互联网 发布:淘宝app界面分析 编辑:程序博客网 时间:2024/04/28 23:35

USB 简介

The Universal Serial Bus

  1994年Compaq, Intel, Microsoft和NEC 4家公司联合开始制定USB. 开始制定这个总线的目的是:

(1)连接PC和电话

(2)容易使用

(3)端口扩展

1996年一月发布第一版(version 1.0),最新的官方版本1.1在1998年九月发布,并且该文档还在继续开发,在1999年发布2.0版本.USB被主机控制,并且有严格的等级划分.主机采用主/从协议和附属的USB设备通信.这就意味着每种连接都是由主机进行初始化并且设备不能建立到其他设备的任何连接.这样看起来和其他总线相比是个退步,但实际上不是,因为USB设计上是性能和效率的折衷实现.主/从协议解决了隐藏的问题,如避免冲突或者发布总线仲裁.当前最多允许127个USB设备同时连接并且总带宽限制在12Mbit/s.在理想的环境下即使使用低速设备,管理USB中断和其他的开销意味着实际上的吞吐量不能超过8.5Mbit/s,一般情况下会在2Mbit/s.

主机控制器

大部分现代主板芯片提供USB主机控制器,其他没有装备主机控制器的,可以通过一个带有主机控制器的PCI设备来升级.

USB主机控制器使用Open Host Controller Interface (OHCI, by Compaq) 或者 Universal Host Controller Interface (UHCI, by Intel)标准.他们有同样的能力并且USB设备都能和这两种类型控制器一起工作.基本上是UHCI比较简单,所以也便宜,但是需要更复杂的设备驱动,因此会引起消耗稍微多一点的CPU负载.

USB设备和传输特性

各种各样的USB设备用于实现各种各样的目的,也就意味着实现细节的多样化.

一个设备可以自供电,总线供电或者两种模式同时存在.USB能够为设备最大提供500mA的电量.如果仅仅存在总线供电设备,就可能会超过最大电量损耗,因此有了自供电设备的存在.他们需要自己供电.支持两种供电的设备当有外部供电时,可以切换到自供电模式.

对于特殊的设备最大传输速度可能各不相同.USB的规格分为低速(low speed)和高速(full speed)设备.低速设备(如:鼠标,键盘,游戏手柄等)以1.5MBit/s进行通信并且仅仅拥有有限的能力.高速设备(如:音频,视频系统)能够使用12MBit/s的最高到90%,也就是大约10MBit/s,这包括协议开销部分.


Figure 1. USB拓扑

Hubs

在机箱的尾部面板上,物理上存在一,二或四个USB端口.端口可以用来连接一个普通设备或者一个hub.hub是一个USB设备,可以用来扩展连接USB设备的端口数量.最大连接USB设备数量是减去连在总线上的hub数量(如果有50个hub,那么最多77(=127-50)个设备能够连接),剩下的就是能够连接USB设备的数量.Hub总是高速的.如果一个hub是自供电的,那么任何设备都能够附着到上面.但是如果hub是总线供电的,那么仅仅低供电(最大100mA)设备能够附着到上面.一个总线供电的hub不应该连接到另一个总线供电的hub-你应该在总线供电和自供电间交替.

通常情况下主机控制器的物理端口由一个虚拟的root hub脸管理.这个hub是有主机控制器(host controller)的设备驱动虚拟的,用来统一管理总线拓扑.因此USB子系统的驱动能够用同样的方法管理每个端口.

数据流类型(Data Flow Types)

在USB上的传输分为两个方向和4种不同的传输类型.数据方向从主机到一个USB设备叫做下行(downstream)或者向外(OUT)传输.反方向叫做上行(upstream)或者向内(IN)传输.根据设备类型的不同使用传输方法:

*Control transfers:用来请求发送短小可靠的数据包.它常用来配置设备并且大家都要求支持最小传输控制命令集合.标准的命令是:

GET_STATUS

CLEAR_FEATURE

SET_FEATURE

SET_ADDRESS

GET_DESCRIPTOR

SET_DESCRIPTOR

GET_CONFIGURATION

SET_CONFIGURATION

GET_INTERFACE

SET_INTERFACE

SYNCH_FRAME

此外控制命令能够用来传输供货商指定的数据.

*Bulk transfers:用来请求或发送最大可达总线带宽的可靠的数据包.如扫描器或scsi适配器使用这种传输方式.

*Interrupt transfers:像bulk transfers一样是周期性被调用的.如果一个interrupt transfer提交给了主机控制器驱动(host controller driver)将会在一个指定的间隔时间(1ms-127ms)自动重复这个请求.

*Isochronous transfers:使用有保证的总线带宽,实时的发送或接收数据流,但是没有数据可靠性.一般这个传输类型用来音频和视频设备.

原创粉丝点击