Usb的驱动过程

来源:互联网 发布:数据信息安全承诺书 编辑:程序博客网 时间:2024/04/25 06:36
 

usb的系统的组成

usb(Universal Serial Bus)即通用串行总线,他是一种全新的、双向同步传输的、支持热插拔的数据传输总线,由Compap、Inter、Microsft以及NEC等公司开 发的。其目的是为了提供一种兼容低速或是高速的、可扩充并且使用方便的外围设备接口,他哦那是解决计算机接口太多的弊端。 usb是由三个部分组成的

  • USB互连
  • USB主机
  • USB设备
[编辑]

usb互连

usb互连是指usb设备与主机之间进行通讯好的操作,主要包括总线的拓扑结构、数据流模式、USB调度等

  • (1) 总线的拓扑(由一点分出多点的网络形式):即外设和主机连接的模式。
  • (2) 各层之间的关系:即组成 USB 系统的各个部分在完成一个特定的 USB 任务时,各自之间的分工与合作。
  • (3) 数据流动的模式:即 USB 总线的数据传输方式。
  • (4) USB 的“分时复用”:因为 USB 提供的是一种共享连接方式,因而为了进行资料的同步传输,致使 USB 对资料的传输和处理必须采用分时处理的机。

USB 的总线拓扑如图1-1所示,在 USB 的树形拓扑中,USB 集线器(HUB)处于节点(Node)的中心位置。而每一个功能部件都和 USB 主机形成唯一的点对点连接,USB 的 HUB 为 USB 的功能部件连接到主机提供了扩展的接口。利用这种树形拓扑,USB 总线支持最多 127 个 USB 外设同时连接到主计算机系统。

1-1(usb总线拓扑结构图)
Enlarge
1-1(usb总线拓扑结构图)
[编辑]

usb主机

一个 USB 系统仅可以有一个主机,而为 USB 器件连接主机系统提供主机接口的部件被称为 USB 主机控制器。 USB 主机控制器是一个由硬件、软件和固件( Firmware )组成的复合体。一块具有 USB 接口的主板通常集成了一个称为 ROOT HUB (根集线器)的部件,它为主机提供一到多个可以连接其它 USB 外设的 USB 扩展接口,我们通常在主板上见到的 USB 接口都是由ROOT HUB提供的。

[编辑]

usb设备

USB设备可以分为两种:

  • USB HUB
  • USB功能器件(Function Device)

(1)USB HUB特性

作为USB总线的扩展部件,USB HUB必须满足以下特征:
  • 1) 为自己和其它外设的连接提供可扩展的下行和上行(Downstream and Upstream)埠。
  • 2) 支持 USB 总线的电源管理机制。
  • 3) 支持总线传输失败的检测和恢复。
  • 4) 可以自动检测下行埠外设的连接和摘除,并向主机报告。
  • 5) 支持低速外设和高速外设的同时连接。

从以上要求出发,

USB HUB 在硬件上由两部分组成:
  • HUB 应答器( HUB Repeater )
HUB 应答器响应主机对 USB 外设的设置,以及对连接到它下行端口的 USB 功能部件的连接和摘除( Attached :and Detached )的检测、分类,并将其端口信息传送给主机,它也负责如“总线传输失败检测”这样的错误处理;
  • HUB控制器( HUB Controller )。
而 HUB 控制器则提供主机到 HUB 之间数据传输的物理机制。如同我们所熟知的大多数计算机外设一样, USB :HUB 也有一个用来向主机表明自己身份的“BIOS”系统。这块位于 USB HUB 上的 ROM,通过USB 特征字使主机:可以配置这个 USB HUB,并监控它的每一个埠。
USB功能器件即可以为主机系统提供某种功能的 USB 器件,如一个 USB ISDN 的调制解调器、或是一只 USB :接口的数字摄像机、 USB 的键盘或鼠标等。

(2)USB功能器件(Function Device)
USB 的功能器件作为 USB 外设(USB Function),它必须保持和 USB 协议的完全兼容,并可以响应标准的 USB 操作。同样,用于表明自己身份的“BIOS”系统对于 USB 外设也是必不可少的,这在 USB 外设上被称为协议层。在物理机制上,一个 USB 外设可以由四部分构成(见图1-2):

  • 1) 用于实现和USB协议兼容的SIE部分。
  • 2) 用于内存件特征字、存储实现外设特殊功能程序及厂家信息的协议层( ROM )。
  • 3) 用于实现外设功能的传感器及对资料进行简单处理的 DSP 部分。
  • 4) 将外设连接到主机或 USB HUB 的接口部分。
1-2(典型的 USB 功能器件结构框图)
Enlarge
1-2(典型的 USB 功能器件结构框图)
[编辑]

usb的电器特性

[编辑]

usb的电缆结构

USB总线通过一根四线电缆传送信号和电源,如图2-1,中D+和D-的两根是用来发送信号

2-1(usbSB电缆)
Enlarge
2-1(usbSB电缆)
[编辑]

USB的传输速率

  • 高速信号传送的比特率定为480Mbits/s;(USB2.0标准)
  • 全速信号传送的比特率定为12Mbits/s ;(USB1.1标准)
  • 低速信号传送的比特率定为1.5Mbits/s;(USB1.0标准)
[编辑]

usb带宽共享

所有这些 USB 外设必须同时分享 USB 协议所规定的 USB 带宽(这个带宽在USB 1.0协议中为12Mbps ),虽然 USB 的分时处理机制可以使有限的 USB 带宽在各设备之间动态地分配,但如果两台以上的高速外设同时使用这样的连接方法,就会使它们都无法享用到最高的 USB 带宽,从而降低了性能。这也正是 Intel 这样的巨头为什幺要推出 USB 2.0 协议的原因(在 USB 2.0协议中 USB 的总线带宽一下子被提高到了 480Mbps)。

[编辑]

usb的设备识别方法

于实现外设到主机或 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Ω。

2-2( USB 高速线缆和电阻的连接图)
Enlarge
2-2( USB 高速线缆和电阻的连接图)
2-3( USB 低速线缆和电阻的连接图)
Enlarge
2-3( USB 低速线缆和电阻的连接图)
[编辑]

usb的电源管理

  • 电源分配

每个USB单元通过电缆只能提供有限的能源。主机对直接相连的USB设备提供电源供其使用,并且每个USB设备都可能有自己的电源。那些完全依赖于电缆供电的设备称为“总线供电”,如U盘等,相反那些可以选择能源来源的设备称之为“自动电"设备。

  • 电源管理

作为一种先进的总线方式,USB 提供了基于主机的电源管理系统。USB 系统会在一台外设长时间(这个时间一般在3.0ms以上)处于非使用状态时自动将该设备挂起( Suspend ),当一台 USB 外设处于挂起状态时, USB 总线通过 USB 线缆为该设备仅仅提供 500μA 以下的电流,并把该外设所占用的 USB 带宽分配给其它的 USB 外设。 USB 的电源管理机制使它支持如远程唤醒这样的高级特性。当一台外设处于挂起状态( Suspended Mode )时,必须先通过主机使该设备“唤醒”( Resume ),然后才可以执行 USB 操作。 USB的这种智能电源管理机制,使得它特别适合如笔记本计算机之类的设备的应用。

[编辑]

usb的数据单元

[编辑]

端点(Endpoint)

端点是usb设备的逻辑设备,一个usb设备可以有一个或是多个端点。而对于主机而言,他们对应的是一个活是多个的逻辑设备,设备连接上主机时,主机分配 给每个逻辑设备一个唯一的地址,而设备中的各个端点在设备内部有一个唯一的端点号,是由设计时确定的(这个是不能更改的),这样,主机和设备之间就可以根 据端点来建立唯一的通道。
在所有的usb设备中要有一个0端点,usb系统使用这个默认的端点设置设备。对于低速的设备,除了0端点以外,只能有2个额外的可选端点,而全速设备和高速设备则可以有最多有15个额外输入端点和15个输出端点。
[编辑]

通道(Pipe)

设备上的端点和主机上的逻辑地址构成了一个usb通道,主机和设备的信息交互就是通过通道进行的。 根据数据的格式不同,可以分为两种格式:

  • 流(stream)

指不同具有usb定义的格式的数据流

  • 消息(message)

指根据某种usb定义格式的数据流

[编辑]

字段(Field)

usb的传输都是包为单位,每一个包是由不同的字段组成

  • 同步字段(SYNC)

所有的包都是同步字段开始,输入电路根据同步字段以本地的时钟对齐输入数据。同步字段的最后的2位是字段结束标记,同时标志包表示字段(PID)的 开始。同步字段固定的值是00000001,下面(4-1)是一个在usb的设备请求的一个包,可以看到,这个包是以Sync的同步字段开始。

4-1(usb控制的setup包)
Enlarge
4-1(usb控制的setup包)

波形图见(4-2)

4-2(usb的同步字段波形)
Enlarge
4-2(usb的同步字段波形)
我们看图二中的波形变成二进制应该是01010100,而不是我们在图一中看到的0000001的值,这是为什么呢?
这是在usb传输的时候进行了NRNI的编码方式,图二是把图一中的00000001的编码转变成01010100的编码。
知识点
NRNI的编码方式
NRNI的编码方式叫做是差分不规零的编码方式。编码的原则是逢1保持,逢0跳转。
  • 包标识字段(PID)

包标识字段是紧跟在同步字段之后,包标识字段是由4bits的包类型字段以及其后的4bits校验字段组成,如4-3,而校验字段是包标志字段的反码。

4-3(PID字段的位标志)
Enlarge
4-3(PID字段的位标志)
PID类型(表一)

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,原来如此。。。。。!

  • 地址字段(Address)

地址字段指明外设地址,如图4-4所示,ADDR<6:0>共128个地址,每一个地址对应的一个外设。设备在复位及加电时,地址为0,具体值由主机在枚举时指定,外设为0的地址为默认地址,不可被用于其他用途。

4-4(地址字段的位格式)
Enlarge
4-4(地址字段的位格式)

当外设有多个端点的时候,有四个端点用来寻址,如4-5,对于低速设备,每个外设最大提供3个通道,而全速设备和高速设备可以支持16个任意类型通道

4-5(通道字段的位格式)
Enlarge
4-5(通道字段的位格式)

可以根据图4-6中的ADRR中可以看到地址字段的值为2,Endpoint的值为0

4-6(usb枚举的setup包)
Enlarge
4-6(usb枚举的setup包)
  • 帧号字段(Frame Number)

帧号字段是一个由11bits长的字段组成,主机每一次通过一帧就将就将其内容加一,达到最大的7FFH(2^11-1)时归零。

  • 数据字段(Date)

数据字段的长度可以在0~1023字节间变动,但必须是整数字节。Data的数据可以如图4-7

4-7(usb枚举的数据包)
Enlarge
4-7(usb枚举的数据包)
  • CRC校验字段

校验字段用来校验所有的非PID字段。其中,标记字段使用5bits的CRC字段(4-1),数据字段使用是16bits字段(4-7)。

[编辑]

数据包(Packet)

usb系统中是以包为单位进行传输数据和控制信息,包有4种,令牌包、数据包、握手包、SOF包

  • 令牌包(Token Packets)

令牌包由 PID 、ADDR 、ENDP 和 CRC5 四个字段组成(4-8)。它因为 PID 字段的不同而分为输入类型( IN )、输出类型( OUT )和设置类型( SETUP )三种。信令包处于每一次 USB 传输的 DATA 资料包前面,以指明这次 USB 操作的类型(PID字段标记)、操作的对象(在 ADDR 和 ENDP 字段中指明)等信息。 5bit 的 CRC 校验位用来确保标记资料包的正确性。

4-8(usb令牌包格式)
Enlarge
4-8(usb令牌包格式)
  • 数据包(Date Packets)

用于传输真正资料的 DATA 资料包(4-9),因为 PID 的不同可以分为 DATA0 和 DATA1 两种。 DATA0 为偶数据包,DATA1 为奇数据包。DATA 资料包的奇偶性分类易于资料的双流水处理,而用于控制传输的 DATA 资料包总是以 DATA0 来传送资料。

4-9(usb数据报格式)
Enlarge
4-9(usb数据报格式)
  • 握手包(Handshake Packets)

握手资料包仅仅包含一个 PID 字段(4-10), ACK 形式的 PID 表明此次 USB 传输没有发生错误,资料已经成功的传输;而 NAK 形式的握手资料包则向主机表明此次 USB 传输因为 CRC 校验错误或别的原因而失败了,从而使得主机可以进行资料的重新传输; STALL 形式的响应向主机报告外设此刻正处于挂起状态而无法完成资料的传输

4-10(usb握手包格式)
Enlarge
4-10(usb握手包格式)
  • SOF包(Start Of Frame)

我们已经指出, USB 主机会每隔 1ms 在 USB 总线上产生一个 SOF 的 USB 帧同步信号, SOF 资料包包含了这个脉冲序列的实际内容(图4-11),它由 SOF 格式的 PID 字段、帧数量字段和 5bit 的 CRC 校验码组成。主机利用 SOF 资料包来同步资料的传送和接收。在低速或是全速设备中主机以1.00ms向设备发出同步包,而在高速设备上,主机以125us的速度向设备发出同步包。

4-11(usb同步包)
Enlarge
4-11(usb同步包)
[编辑]

描述符(Decriptors)

任何一个usb设备都包含一个设备描述符表,用于说明设备属性, 一般固化在设备内部,当主机检测到总线上有设备插入时,他哦难过控制传输从默认管道上(0)将描述符读出。 usb设备描述符有三种:

  • 设备描述符(Device Descriptors)
  • 设备类描述符(Clas Descriptors)
  • 用户自定义描述符(User Specific Descriptors)

其中设备描述符分为四种:

  • 配置描述符(Configuration Descriptors)
  • 接口描述符(Interface Descriptors)
  • 端口描述符(Endpoint Descriptors)
  • 字符描述符(String Descriptors)

usb的字符描述符的编码

  • 1——设备描述符
  • 2——配置描述符
  • 3——字符描述符
  • 4——接口描述符
  • 5——端点描述符

各个描述符的关系图(4-12)

4-12(usb各种描述符的关系图)
Enlarge
4-12(usb各种描述符的关系图)
[编辑]

usb的通讯方式

[编辑]

usb的设备请求

usb设备是通过某些属性要由主机通过默认控制通道进行设置或是读取。这些操作是通过主机向设备发送SETUP包来完成的。 每个SETUP包含有8个字节,分为5个区域,如下表中定义的结构。

bRequest设备格式

偏移量

大小

描述

0

bmRequestType

1

请求特征:

D7:传输方向

0=主机至设备;

1=设备至主机

D65:种类

0=标准;

1=类;

2=厂商;

3=保留

D40:接受者

0=接口;

2=端点;

3=其他

431=保留

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总线时,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)ToHub:Get_Port_Status:主机发现最新接入的设备。
  • (2)ToHub:Clear_Port_Feature:清除STATUS_CHANGE寄存器中的标志,起动这个过程。
  • (3)ToHub:Set_Port_Featur:集线器的响应是发送一个reset到I/O设备。集线器维持这个reset至少 10ms。然后更新 PORT_CHANGE寄存器中的RESET_CHANGE位,并且置位PORT_STATUS寄存器中的PORT_ENABLE位允许端口进行USB通 信。PORT_CHANGE寄存器的更新会使STATUS_CHANGE寄存器更新。PC主机就会在下一个预定的轮询时注意到这一点。
  • (4)ToHub:Get_Port_Status:PC主机会发现复位已完成。
  • (5)ToHub:Clear_Port_Feature:清除STATUS_CHANGE寄存器中的标志。这时I/O设备已经加电和复 位,因此,它处于缺省状态。设备现在会以设备地址0回答PC主机请求。如果有另外一个设备在同一时刻被加入,PC主机软件会推迟服务直到在当前的I/O设 备上的序列完成为止。即任何时间只有一个设备响应为设备地址0。
  • (6)ToIO:Get_Device_Desciptor:PC主机首次使用这个请求,查询接入的是什么样的设备。设备用一个设备描述符回答。它的数据结构详见USB规范。
  • (7)ToIO:Set_Address:PC主机分配一个设备地址给新接入的I/O设备,所有随后的请求都将会发送到这个新的设备地址。设备现在处于已编址状态。
  • (8)ToIO:Get_Device_Descriptor:PC主机再次使用这个请求,寻求新的地址。它应该得到同样的响应。如果得到的是不同的响应,或一个设备超时,则表明这是一个PC主机软件必须处理的错误状态。
  • (9)ToIO:Get_Configuration_Descriptor:设备驱动程序开始收集关于设备的信息,它的接口和端点。对于一个功能复杂的I/O设备,配置可能相当庞大。如果设备有多个配置,驱动程序通常也要全部读出它们。
  • (10)选择设备驱动程序:在PC主机这方面,它需要决定用哪个设备驱动程序去支持新连接的I/O设备。如果选定的设备驱动程序不在内存中,就要立即加载它。
  • (11)ToIO:Set_Configuration:现在设备已经被配置好了并且可以运行。因此它进入了已配置状态。
[编辑]

usb的设备驱动设计

[编辑]

参考资料

资料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

原创粉丝点击