usb(Universal Serial Bus)即通用串行总线,他是一种全新的、双向同步传输的、支持热插拔的数据传输总线,由Compap、Inter、Microsft以及NEC等公司开 发的。其目的是为了提供一种兼容低速或是高速的、可扩充并且使用方便的外围设备接口,他哦那是解决计算机接口太多的弊端。 usb是由三个部分组成的
usb互连是指usb设备与主机之间进行通讯好的操作,主要包括总线的拓扑结构、数据流模式、USB调度等
USB 的总线拓扑如图1-1所示,在 USB 的树形拓扑中,USB 集线器(HUB)处于节点(Node)的中心位置。而每一个功能部件都和 USB 主机形成唯一的点对点连接,USB 的 HUB 为 USB 的功能部件连接到主机提供了扩展的接口。利用这种树形拓扑,USB 总线支持最多 127 个 USB 外设同时连接到主计算机系统。
一个 USB 系统仅可以有一个主机,而为 USB 器件连接主机系统提供主机接口的部件被称为 USB 主机控制器。 USB 主机控制器是一个由硬件、软件和固件( Firmware )组成的复合体。一块具有 USB 接口的主板通常集成了一个称为 ROOT HUB (根集线器)的部件,它为主机提供一到多个可以连接其它 USB 外设的 USB 扩展接口,我们通常在主板上见到的 USB 接口都是由ROOT HUB提供的。
USB设备可以分为两种:
(1)USB HUB特性
从以上要求出发,
(2)USB功能器件(Function Device)
USB 的功能器件作为 USB 外设(USB Function),它必须保持和 USB 协议的完全兼容,并可以响应标准的 USB 操作。同样,用于表明自己身份的“BIOS”系统对于 USB 外设也是必不可少的,这在 USB 外设上被称为协议层。在物理机制上,一个 USB 外设可以由四部分构成(见图1-2):
USB总线通过一根四线电缆传送信号和电源,如图2-1,中D+和D-的两根是用来发送信号
所有这些 USB 外设必须同时分享 USB 协议所规定的 USB 带宽(这个带宽在USB 1.0协议中为12Mbps ),虽然 USB 的分时处理机制可以使有限的 USB 带宽在各设备之间动态地分配,但如果两台以上的高速外设同时使用这样的连接方法,就会使它们都无法享用到最高的 USB 带宽,从而降低了性能。这也正是 Intel 这样的巨头为什幺要推出 USB 2.0 协议的原因(在 USB 2.0协议中 USB 的总线带宽一下子被提高到了 480Mbps)。
于实现外设到主机或 USB HUB 连接的是USB线缆( 图2-1)。从严格意义上讲, USB 线缆应属于 USB 器件的接口部分。USB 线缆由四根线组成,其中一根是电源线 VBus,一根是地线 GND,其余两根是用于差动信号传输的资料线( D+,D- )。将数据流驱动成为差动信号来传输的方法可以有效提高信号的抗干扰能力( EMI )。在资料线末端设置结束电阻的思路是非常巧妙的,以至对于 HUB 来判别所连接的外设是高速外设或是低速外设,仅仅只需要检测在外设被初次连接时, D+ 或 D- 上的信号是高或是低即可。因为对于 USB 协议来讲,要求低速外设在其 D-端并联一个1.5kΩ的接地电阻,而高速外设则在 D+ 端接同样的电阻。在加电时,根据低速外设的 D- 线和高速外设的 D+ 线所处的状态, HUB 就很容易判别器件的种类,从而为器件配置不同的信息。图2-2表明了一个典型的高速外设的连接状况。2-3是一个典型的低速外设连接状况图。为提高数据传 输的可靠性、系统的兼容性及标准化程度, USB 协议对用于 USB 的线缆提出了较为严格的要求。如用于高速传输的 USB 线缆,其最大长度不应超过 5 米,而用于低速传输的线缆则最大长度为 2 米,每根资料线的电阻应为标准的 90Ω。
每个USB单元通过电缆只能提供有限的能源。主机对直接相连的USB设备提供电源供其使用,并且每个USB设备都可能有自己的电源。那些完全依赖于电缆供电的设备称为“总线供电”,如U盘等,相反那些可以选择能源来源的设备称之为“自动电"设备。
作为一种先进的总线方式,USB 提供了基于主机的电源管理系统。USB 系统会在一台外设长时间(这个时间一般在3.0ms以上)处于非使用状态时自动将该设备挂起( Suspend ),当一台 USB 外设处于挂起状态时, USB 总线通过 USB 线缆为该设备仅仅提供 500μA 以下的电流,并把该外设所占用的 USB 带宽分配给其它的 USB 外设。 USB 的电源管理机制使它支持如远程唤醒这样的高级特性。当一台外设处于挂起状态( Suspended Mode )时,必须先通过主机使该设备“唤醒”( Resume ),然后才可以执行 USB 操作。 USB的这种智能电源管理机制,使得它特别适合如笔记本计算机之类的设备的应用。
设备上的端点和主机上的逻辑地址构成了一个usb通道,主机和设备的信息交互就是通过通道进行的。 根据数据的格式不同,可以分为两种格式:
指不同具有usb定义的格式的数据流
指根据某种usb定义格式的数据流
usb的传输都是包为单位,每一个包是由不同的字段组成
所有的包都是同步字段开始,输入电路根据同步字段以本地的时钟对齐输入数据。同步字段的最后的2位是字段结束标记,同时标志包表示字段(PID)的 开始。同步字段固定的值是00000001,下面(4-1)是一个在usb的设备请求的一个包,可以看到,这个包是以Sync的同步字段开始。
波形图见(4-2)
我们看图二中的波形变成二进制应该是01010100,而不是我们在图一中看到的0000001的值,这是为什么呢?
这是在usb传输的时候进行了NRNI的编码方式,图二是把图一中的00000001的编码转变成01010100的编码。
NRNI的编码方式
NRNI的编码方式叫做是差分不规零的编码方式。编码的原则是逢1保持,逢0跳转。
包标识字段是紧跟在同步字段之后,包标识字段是由4bits的包类型字段以及其后的4bits校验字段组成,如4-3,而校验字段是包标志字段的反码。
PID类型 |
PID名称 |
PID[3:0] |
说明 |
令 牌 (Token) |
OUT |
0001B |
输出地址+端点号 |
IN |
1001B |
输入地址+端点号 |
|
SOF |
0101B |
帧开始标记与帧号 |
|
SETUP |
1101B |
控制管道建立地址+端点号 |
|
数 据 (Data) |
DATA0 |
0011B |
偶数据包 |
DATA1 |
1011B |
奇数据包 |
|
DATA2 |
0111B |
微帧数据包(高速设备) |
|
MDATA |
1111B |
一般数据包(高速设备) |
|
握 手 (Handshake) |
ACK |
0010B |
接收器接收到无误数据包 |
NAK |
1010B |
接受设备不能收到数据活发送设备不能发送设备 |
|
STALL |
1110B |
端点挂起 |
|
NYET |
0110B |
设备收到无误数据包,但还没准备好下一个 |
|
专 有 (Special) |
PRE |
1100B |
主机发出低速设备通信前导信号 |
ERR |
1100B |
报告分割传输时的错误(高速设备) |
|
SPLIT |
1000B |
分割传输令牌包PID(高速设备) |
|
PING |
0100B |
流量控制检测(高速设备) |
图一中可以看到在Sync后面紧跟的一个PID的数据字段为setup,根据表中的格式应该是11010010B,十六进制为0xD2,怎么和图一 的0xB4不一样,想了好久,突然看到PID的表中有一个字段为PID[3:0],哦,是不是位数的顺心不对呢,转变成为10110100B,十六进制正 好为0xB4,原来如此。。。。。!
地址字段指明外设地址,如图4-4所示,ADDR<6:0>共128个地址,每一个地址对应的一个外设。设备在复位及加电时,地址为0,具体值由主机在枚举时指定,外设为0的地址为默认地址,不可被用于其他用途。
当外设有多个端点的时候,有四个端点用来寻址,如4-5,对于低速设备,每个外设最大提供3个通道,而全速设备和高速设备可以支持16个任意类型通道
可以根据图4-6中的ADRR中可以看到地址字段的值为2,Endpoint的值为0
帧号字段是一个由11bits长的字段组成,主机每一次通过一帧就将就将其内容加一,达到最大的7FFH(2^11-1)时归零。
数据字段的长度可以在0~1023字节间变动,但必须是整数字节。Data的数据可以如图4-7
校验字段用来校验所有的非PID字段。其中,标记字段使用5bits的CRC字段(4-1),数据字段使用是16bits字段(4-7)。
usb系统中是以包为单位进行传输数据和控制信息,包有4种,令牌包、数据包、握手包、SOF包
令牌包由 PID 、ADDR 、ENDP 和 CRC5 四个字段组成(4-8)。它因为 PID 字段的不同而分为输入类型( IN )、输出类型( OUT )和设置类型( SETUP )三种。信令包处于每一次 USB 传输的 DATA 资料包前面,以指明这次 USB 操作的类型(PID字段标记)、操作的对象(在 ADDR 和 ENDP 字段中指明)等信息。 5bit 的 CRC 校验位用来确保标记资料包的正确性。
用于传输真正资料的 DATA 资料包(4-9),因为 PID 的不同可以分为 DATA0 和 DATA1 两种。 DATA0 为偶数据包,DATA1 为奇数据包。DATA 资料包的奇偶性分类易于资料的双流水处理,而用于控制传输的 DATA 资料包总是以 DATA0 来传送资料。
握手资料包仅仅包含一个 PID 字段(4-10), ACK 形式的 PID 表明此次 USB 传输没有发生错误,资料已经成功的传输;而 NAK 形式的握手资料包则向主机表明此次 USB 传输因为 CRC 校验错误或别的原因而失败了,从而使得主机可以进行资料的重新传输; STALL 形式的响应向主机报告外设此刻正处于挂起状态而无法完成资料的传输
我们已经指出, USB 主机会每隔 1ms 在 USB 总线上产生一个 SOF 的 USB 帧同步信号, SOF 资料包包含了这个脉冲序列的实际内容(图4-11),它由 SOF 格式的 PID 字段、帧数量字段和 5bit 的 CRC 校验码组成。主机利用 SOF 资料包来同步资料的传送和接收。在低速或是全速设备中主机以1.00ms向设备发出同步包,而在高速设备上,主机以125us的速度向设备发出同步包。
任何一个usb设备都包含一个设备描述符表,用于说明设备属性, 一般固化在设备内部,当主机检测到总线上有设备插入时,他哦难过控制传输从默认管道上(0)将描述符读出。 usb设备描述符有三种:
其中设备描述符分为四种:
usb的字符描述符的编码
各个描述符的关系图(4-12)
usb设备是通过某些属性要由主机通过默认控制通道进行设置或是读取。这些操作是通过主机向设备发送SETUP包来完成的。 每个SETUP包含有8个字节,分为5个区域,如下表中定义的结构。
bRequest设备格式 偏移量 |
域 |
大小 |
描述 |
0 |
bmRequestType |
1 |
请求特征: D7:传输方向 0=主机至设备; 1=设备至主机 D6~5:种类 0=标准; 1=类; 2=厂商; 3=保留 D4~0:接受者 0=接口; 2=端点; 3=其他 4~31=保留 |
1 |
bRequest |
1 |
具体请求(参见表2-2) |
2 |
wValue |
2 |
字长域,根据不同的请求含义不同 |
4 |
wIndex |
2 |
字长域、根据不同的请求含义不同.典型用于传送索引或偏移 |
6 |
wLength |
2 |
如有数据传送阶段,此为数据Byte数 |
bmRequestType |
bRequest |
wValue |
wIndex |
wLength |
Data |
000000001 OOOOOOO1B 00000010B |
CLEAR_FEATURE |
特性选择符 |
0 接口号 端点号 |
0 |
无 |
10000000B |
GET_CONFIGURATION |
0 |
0 |
1 |
配置值 |
10000000B |
GET_DESCRIPTOR |
描述表种类和索引 |
0或语言标志 |
描述表长 |
描述表 |
10000001B |
GET_INTERFACE |
0 |
接口号 |
1 |
可选设置 |
1OOOOOOOB 10000001B 10000010B |
GET_STATUS |
0 |
0 接口号 端点号 |
2 |
设备,接口或端点状态 |
00000000B |
SET_ADDRESS |
设备地址 |
0 |
0 |
无 |
00000000B |
SET_CONFIGURATION |
配置值 |
0 |
0 |
无 |
00000000B |
SET_DESCRIPTOR |
描述表种类和索引 |
0或语言标志 |
描述表长 |
描述表 |
OOOOOOOOB 00000001B 00000010B |
SET_FEATURE |
特性选择符 |
0 接口号 端点号 |
0 |
无 |
OOO0OOO1B |
SET_INTERFACE |
可选设置 |
接口号 |
0 |
无 |
10000010B |
SYNCH_FRAME |
0 |
端点号 |
2 |
帧号 |
分析使用方法:
usb_control_msg:
request: 0x6, requesttype: 0x80 value 0x100 index 0x0 length 0x8
INFO:
submit_control_msg
INFO:
Root-Hub: adr: 0 cmd(8): 00000680 0100 0000 0008
分析: request 0x6 表示取设备的、配置和描述符
requesttype 0x80 二进制 1000_0000
表示设备给主机,请求命令,接受放为设备
value 0x100 传送的值00 01 描述符类型1,是设备描述符
index 0x00 规定为0 length 0x8 描述符长度8bytes adr:0,用的是设备的0号端点 cmd(8): 00000680 0100 0000 0008(不知道)
当还没有将设备插入USB总线时,USB总线的信号线D+和D-为低电平。在设备上有一个偏置电阻接连在Vcc与D+或D-之间。当USB电缆插入 时,偏置电阻使D+或D-升高。这个电压差的改变被集线器识别,我们就会发现有一个电缆插入了。根据约定,如果设备的偏置电阻器是连接到D+的,这就是向 集线器说明设备是全速的(12Mbps),如果设备的偏置电阻器连接到D-,则表示设备是低速的(1.5Mbps)。
通过这种阶梯式星形的连接方式,最多可以同时连接127个设备。PC主机通过以下方式对所有连接到主机端的外围设备加以区分并寻址: 首先,PC一接上电源时,所有连接上USB的设备与集线器都会预设为地址0。此时,所有的下游的连接器都处于禁用且为失效的状态。然后,PC主机就会向整 个 USB总线查询。若发现第一个设备,就将地址1分配给该设备。然后再往下寻找第二个地址,且目前仍为0的设备或集线器。若发现新设备,则将地址2分配给该 设备,若为集线器,则激活其所扩充的第一个下游的连接器。而后再沿此连接器一直往下寻找第三个地址,且仍为0的设备或集线器。这样重复地寻找与分配地址, 直到适于航行的外围设备都赋予了新的地址,或已达到127个外围设备的极限为止。
I/O设备现进入加电状态。在发现新的设备以后集线器会更新STATUS_CHANGE寄存器,并且在等待被告知要执行什么。
PC主机控制着枚举过程,并且在这个阶段把请求发送到两个设备。确认有新的连接的设备的集线器会收到许多动作的请求,而最新连接的I/O设 备也会收到这些请求。PC主机会有规则地轮询所有的接入的寻求工作的集线器,在大多情况下集线器会以NAK响应,如果集线器以STATUS_CHANGE 数据回答,则表示端口有了变化,这样基本PC主机的枚举过程就开始了。以下是枚举步骤(ToHub表示编址的设备是集线器,ToIO表示到新的I/O设 备):
资料1:usb的知识问答
http://bbs.weikeng.com.cn/topic.asp?topic_id=367&forum_id=131&cat_id=55
资料2:usb的枚举过程
http://jerryxie.zhmy.com/archives/2006/33755.shtml
资料3:usb的枚举过程的图解
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=508641&bbs_page_no=1&bbs_id=1029
http://www.daxia.com/list_1725.shtml
资料4:USB Descriptors
http://www.beyondlogic.org/usbnutshell/usb5.htm
资料5:linux下的设备驱动
http://www-128.ibm.com/developerworks/cn/linux/l-usb/index1.html
http://www-128.ibm.com/developerworks/cn/linux/l-usb/index2.html