【专业技术】USB体系结构

近来基于MSC类协议做了一个模拟U盘实现USB读写功能的项目,看到一个对USB框架讲得不错的文章,这里转载过来,方便需要的人看看。当然USB协议是一个很庞大的工程,这篇只是一个提纲契领的作用,如要深入研究还是需要认真学习相关协议。

USB总线接口层:物理连接、电气信号环境、信息包传输机制;主机一方由USB主控制器和根集线器组成,而USB方则由设备中的USB接口组成。

USB设备层:由主机方的USB系统软件和设备方的USB设备逻辑视图组成。

USB功能层:代表客户软件和一个给定的设备功能接口之间的关系。

USB系统软件执行很多关键的功能,包括:

设备的连接/断开检测;设备配置;带宽分配;管理客户程序和设备之间的控制流;管理客户程序和设备之间的数据流;收集状态和事务处理的统计信息;事务处理的安排;控制电气接口。

一套USB系统软件存在于系统中,用于管理所有和USB总线相连的所有USB设备的访问。USB系统软件是由于以下部分组成的:

USB驱动程序(USBD)---为客户软件驱动程序提供接口和服务,分配总线带宽,并管理配置过程;

USB主控制器驱动程序(HCD)---控制对主控制器的操作,安排事务处理,并监视事务处理的完成状态。

当一个事务处理被主机系统初始化以后,所有的传输设备和所有的集线器将看到这一务处理。每个事务处理包含一个地址字段,它标识目标设备或集线器,低速设备只能看见低速事务处理,它总是跟在一个高带的前导事务处理之后

USB信号环境

USB采用了NRZI(反相非归零)编码和差分信号。NRZI编码方式既能够确保数据发送的完整性,双不需要独立的时钟信号和数据一起发送。数据流中的电平跳变代表0,而没有跳变则代表1。为保持同步,在连续传输6个1的情况下,强制在NRZI编码的数据流中加入跳变。这就确保接收器至少可以在每7个位的时间间隔内从数据流中会检测到一次跳动变。

一个USB的集线器通过监视差分数据线来检测设备是否已连接到自己的一个端口上。当没有设备连接到USB端口时,和D+和D-线相连的下拉电阻(15K)保证数据线接地,USB设备必须至少在D+和D-线的任意一条上有一个上拉电阻(1.5K)。全速设备D+上拉,低速设备D-上拉。保持时间2.5us。

USB传输

中断传输---用于在传统PC产品中被称为中断驱动设备的器件。由于USB不支持硬件中断,所以中断驱动的USB设备必须要被周期性地查询,以确定设备是否有数据要传输。

块传输---用于传输大块的没有周期和传输速率要求的数据。

同步传输---要求有一个恒定的发送速率。保证发送方和接收方之间能够实现传输率的匹配。

控制传输---用来把特定的请求传送给USB设备,它经常在设备配置中被使用。

USB事务处理

在USB上的每次传输广播都由一些信息包组成。这些信息包组合起来定义某个事务处理而某个事务处理又是作为一个大的传输的一部分执行的。事务处理由主机进行初始化,用于把数据发送到USB设备和从USB设备把数据发送出去。

事务处理般由三个阶段(令牌包阶段、数据包阶段、握手包阶段)组成,或者说由信息包组成。

令牌包阶段:每一个事务处理类型都从一个令牌阶段开始,它定义了事务处理的类型。有的令牌包跟随一个到两个附加的信息包;

数据包阶段:传输相关的数据。在一个事务处理中可以传输的最大数据包是1023字节。

握手阶段:对数据发送方提供了一个反馈信号,通知发送方数据是否已经被正确接收。

信息包有用来执行所有的USB事务处理的机制。

同步序列

包ID(标识符)

包特定信息

CRC

包结束标志

信息包

同步序列由8个位(00000001)组成,由于0用差分数据上的电平跳变来编码,所以这7个0在每一位开始的时候都建立一个电平跳变。这就提供了一个时钟,用来同步。同步性序列还通知USB接收器马上要有一个信息包被发送,这个信息包紧跟在这8位同步序列之后。

信息包的标识符定义了信息包的目标和内容,它分为令牌包、数据包、握手包、专用包(前导包)。

信息包的ID:由四位标识符字段组成,后接四位包ID的反码。

信息包的特定信息:这些信息可以组成一个USB设备地址,一个时间片的序列,从USB设备发出或者发送到USB设备的数据,等等。

CRC:数据包使用16位的CRC,而别的包则5位的CRC。CRC的产生和检验仅仅用于信息包的具体数据。

信息包的结束(EOP):每个信息饭结束都收发送方发出一个信号来表示,具体方法是把两条差分数据线上的电压降低,并且这个低电压将持续两个位的传输时间,而且后接一个位的空闲时间。

令牌包的四种类型:

SOF(时间片开始)-----指出下一个毫秒时间的开始;

IN-----表示一个USB事务处理,把数据从目标USB设备发送到系统;

OUT-----表示一个USB事务处理,把数据从系统发送到目标USB设备;

SETUP-----表示一次控制传输的开始。SETUP是控制传输的第一阶段,并用来把一个请求从系统发往目标USB设备。

SOF包内含有一个11位的时间片编号。SOF包定义了一个事务处理,它仅仅由令牌包组成。

同步序列

包ID(标识符)

11位的时间片编号

5位CRC

包结束标志

当软件希望从一个指定的设备读取信息时,就用到一个IN令牌。IN包通知目标USB设备数据正在被系统请求。IN事务处理用于各种USB传输类型中。一个IN令牌包由ID类型字段、ID校验字段、USB设备地址和端点地址以及5位的CRC组成。一个IN事务处理从一个IN包广播开始,后接一个从目标USB设备返回的数据包。在某些情况,还包括发回到目标设备的握手包,用来确认数据接收。

系统软件指定一个OUT事务处理,当数据发送到一个目标USB设备时,有三种类型的传输采用OUT事务处理,块传输、控制传输的数据阶段、同步传输。一个OUT包由ID类型字段、ID校验字段、USB设备地址和端点地址以及5位的CRC组成。OUT令牌包后跟随一个数据包和一个握手包(仅用于块传输)。

SETUP包仅仅在控制传输的建立阶段使用。SETUP包后跟随着一个数据包,和一个确认包。SETUP事务处理可以跟随一个或多个IN或OUT事务处理(数据阶段)。或者可以仅仅伴随一个状态阶段,状态阶段由一个最后的数据包组成,它从端点传向主机系统。一个SETUP包由ID类型字段、ID校验字段、USB设备地址和端点地址以及5位的CRC组成。

数据包---Data0和Data1

数据包的传输方向由事务处理类型确定,数据既可以传向USB也可以从USB设备传出。一个数据包由ID类型字段、ID校验字段、数据字段(0-1023字节)和16位CRC。

USB设备使用握手包来报告一个给定的事务处理的状态。数据的接收器负责给发送方发回一个握手包。

确认包(ACK)---确认数据包被无错误地接收了;

非确认包(NACK)---报告主机目标设备暂时不能接收返回的数据。在中断事务处理中,NACK表示当前没有数据可以返回到主机。

停止包(STALL)---目标设备用来报告它不能完成传输,并且要求软件进行干预,使设备从停止状态恢复。

前导包

在广播一个低速信息包之前,必须广播一个前导包,通知所有的集线器在这个前导包后面跟随一个低速的事务处理。前导包由一个同步序列和一个包的ID组成的,该包以全速传输。之后延迟四个全速位的传输时间。

事务处理

IN事务处理:数据被无错误地接收;(主机发送ACK包)

数据接收的时候有错误; (没有握手包)

目标设备暂时不能返回数据;(USB设备返回NAK包)

错误状态被清除之前,目标不能返回数据;(USB设备返回STALL停止包)

发生了一次同步传输,返回数据,没有握手运作。

OUT事务处理:数据被无错误地发送;(USB设备返回ACK包)

数据发送出错; (没有握手包)

目标设备暂时不能接收数据;(USB设备返回NAK包)

错误状态被清除之前,目标不能接收数据;(目标设备返回STALL停止包)

发生了一次同步传输,数据被发送到目标设备,没有握手运作。

SETUP事务处理/控制传输:控制传输总是从一个SETUP事务处理开始,称为建立阶段。建立阶段定义控制传输的性质。某些控制传输包括一个数据阶段,该数据阶段由一个或几个IN或OUT事务处理组成。控制传输的最终阶段是状态阶段。该阶段确认所要求的操作已经成功完成了。控制传输以两种基本基本形式存在:①传输由建立阶段和状态阶段组成②传输由建立阶段、数据阶段和状态阶段组成。

SETUP事务处理的数据阶段包括8字节的信息,该信息指出了大量用于定义将被执行的设备请求信息。

错误恢复

信息包错误检查;

错误EOP;

总线超时(没有响应);

数据触发器错误检查;

串扰---在时间片结束之后发年事务处理;

LOA---总线活动丢失。

三种类型的包错误:包ID(PID);CRC;位填充错误。发生以上错误,接收方忽略这个信息包,并且不会返回一个信息包。

信息包的类型和CRC

信息包的类型

字段名

字段的最大长度

CRC

SOF

时间片编号

11位

5位

IN

设备地址和端点地址

11位

5位

OUT

设备地址和端点地址

11位

5位

SETUP

设备地址和端点地址

11位

5位

DATA0

数据

1023字节

16位

DATA1

数据

1023字节

16位

ACK

NAK

STALL

PREAMBLE

总线超时:事务处理的发送方在16个位时间内一定不会超时,但是在18个位时间后则一定时。

错误的EOP:如果接收方在发送方实际完成传输之前检测到包的结束(EOP)。错误的EOP往往会导致一个CRC错误。

数据触发出错:数据触发是一种机制,用来确保数据传输的发送方和接收方之间保持同步。数据触发机制解决了和握手包出错相关的问题。

串扰:如果在总线上的一个设备没有结束它的事务处理(不停地串扰),这种不断的串扰有可能对整个总线造成死锁。串扰在时间片结束时被检测到,如果设备在时间片结束时不处于空闲状态,那么这个设备必须被隔离,方法是把和这个设备相连的集线器端口禁止掉。

LOA---总线活动丢失:一个设备从一个包的传输开始,后接总线上的一个恒定的J或K状态,而且没有EOP。检测和处理类似串扰。

USB供电分配

USB电源管理

USB设备配置

设备描述符-----描述了设备所支持的配置的数量;

配置描述符-----指出了一个或多个接口而且定义了某些和这个配置相关的属性;

接口描述符-----定义了端点的数量,它们和接口相关,而且定义了某些和接口相关的属性;

端点描述符-----指出了和给定的端点相关的属性,以及那些主机软件需要的信息,这些信息可以确定这个端点应该怎样被访问;

字符串描述符-----可选的描述符,由UNICODE字符串组成。

类特定描述符-----设备类附加的描述符。

每一个描述符都包含一个类型字段,用它来识别上面列出的这此描述符的类型。

设备描述符:

字段编号

字段名

字段大小(字节)

字段取值

说明

0

长度

1

数字

描述符的长度(以字节为单位)

1

描述的符类型

1

常数

设备描述符,0x01

2

USB版本号

2

BCD

4

设备类

1

类代码

5

设备子类

1

子类

子类代码

6

设备协议

1

协议

7

最大数据包大小

1

数字

8、16、32、64

8

设备供应商

2

ID

供应商ID

10

产品

2

ID

产品ID

12

系列号

2

BCD

出厂编号

14

设备供应商索引

1

索引

15

产品索引

1

索引

16

系列号索引

1

索引

17

配置数目

1

数目

配置描述符:

字段编号

字段名

字段大小(字节)

字段取值

说明

0

长度

1

数字

描述符的长度(以字节为单位)

1

描述的符类型

1

常数

配置描述符,0x02

2

总长度

2

数字

用于配置的返回数据的总长度,包括所有被返回的用于配置的描述符(配置描述符、接口描述符、端点描述符、类或设备供应商自定的描述符)加在一起的长度。

4

接口的数目

1

数字

配置所支持的接口数目。

5

配置值

1

数字

作为Set Configuration的一个参数选择配置值。

6

配置索引

1

索引

描述配置的字符串描述符的索引。

7

属性

1

位段

D7 总线供电D6 自供电D5 远程唤醒D4..0 保留

8

最大供电量

1

毫安

以2毫安为单位

每一个配置描述符都有一个唯一的配置值,用来配置这个设备。配置软件通过使用“Set Configuration”请求配置一个设备。这个配置值是在“Set Configuration”期间的SETUP事务处理的数值字段被指定的。

接口描述符:

字段编号

字段名

字段大小(字节)

字段取值

说明

0

长度

1

数字

描述符的长度(以字节为单位)

1

描述的符类型

1

常数

接口描述符,

2

接口数

1

数字

接口的编号。

3

可选设置

1

数字

用于为在前面的的字段标识出来的接口选择一个可选设置的数值。

4

端点数目

1

数字

本接口所使用的端点数目(0端点除外)。

5

接口类

1

类代码

6

设备子类

1

子类

子类代码

7

接口协议

1

协议

协议代码

8

接口索引

1

索引

字符串描述符的索引。

接口数目和可选设置的字段用于支持USB的可选设置特征。设备可以在相同的配置下定义可选的特征。一个支持可选设置的设备将包含一个或多个附加的接口和端点描述符,同样的接口,但是包含可选的设置。

端点描述符:

字段编号

字段名

字段大小(字节)

字段取值

说明

0

长度

1

数字

描述符的长度(以字节为单位)

1

描述的符类型

1

常数

端点描述符,0x05

2

端点地址

1

端点

描述符所描述的USB设备上的端点地址D0..3 端点号D4..6 保留D7 传输方向,0:OUT;1:IN

3

属性

1

位段

D2..7 保留D0..1 00 控制传输01 同步传输10 块传输11 中断传输

4

最大包大小

2

数字

最大信息包的大小。对于同步端点,该值用于保留进度表中的总线时间,这是每一个时间片传输数据都需要的。

6

间隔

1

数字

数据传输的时候,查询的时间间隔,以微秒为单位。对于块传输端点和控制传输端点,这个字段无效。对于同步端点,这个字段被置为1,对于中断端点,它的值为1-255。

端点描述符定义了在一个给定的设备里实现的实际寄存器。定义了每个寄存器的功能和特定的信息:端点要求的传输类型;传输的方向;带宽需求;查询间隔。

配置软件必须确定USB是否能够支持端点描述所指定的传输,传输所要求的带宽大小在MaxPacketSize字段被指定。如果端点的带宽需求超过了USB的所能提供的带宽,那么设备就不会被配置,而且用户会得到设备没有配置的通知

来自:http://www.cnblogs.com/shengansong/archive/2012/04/19/2456495.html

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏搜云库

Java 10 新特性解密,引入类型推断机制,将于 2018 年 3 月 20 日发布

JDK 10 是 Java 10 标准版的部分实现,将于 2018 年 3 月 20 日发布,改进的关键点包括一个本地类型推断、一个垃圾回收的“干净”接口。

4168
来自专栏PPV课数据科学社区

如何使用Python对Instagram进行数据分析?

我写此文的目的在于展示以编程的方式使用Instagram的基本方法。我的方法可用于数据分析、计算机视觉以及任何你所能想到的酷炫项目中。 Instagram是最大...

2857

使用Apache Flink进行流处理

如果在你的脑海里,“Apache Flink”和“流处理”没有很强的联系,那么你可能最近没有看新闻。Apache Flink已经席卷全球大数据领域。现在正是这样...

4352
来自专栏IMWeb前端团队

Unix Pipes to Javascript Pipes

本文作者:IMWeb 杨文坚 原文出处:IMWeb社区 未经同意,禁止转载 Unix Pipes Unix管道扫描稿 ? 简单样例: $ ne...

19310
来自专栏noteless

2.计算机组成-数字逻辑电路 门电路与半加器 异或运算半加器 全加器组成 全加器结构 反馈电路 振荡器 存储 D T 触发器 循环移位 计数器 寄存器 传输门电路 译码器 晶体管

所以想要准确的保存一个比特,你需要保持住D的值,持续经过CP从0~1然后再到0的过程

4423
来自专栏瓜大三哥

UVM(十一)之各种port

UVM(十一)之各种port UVM中内置了各种port,用于实现TLM级别的。 1. uvm_component之间的通信 如果要在两个uvm_compone...

2567
来自专栏哲学驱动设计

《OEA - 实体扩展属性系统 - 设计方案说明书》

    这篇设计文档是 12 月份写来参加公司的研发峰会的,自己倒是信心满满,不过最后还是没有入围。现在想想也没啥大用,所以贴出来,期待与园友交流。     文...

3487
来自专栏zhisheng

《从0到1学习Flink》—— Data Source 介绍

Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时的处理些实时数据流,实时的产生数据流结果,只要数...

1483
来自专栏北京马哥教育

Python Unicode编码混乱 :来自大洋彼岸的怨念

Unicode已经解决了很多问题。知晓ISO-8859-*和CP437带来的混乱(当然对于非西方语言来说更糟糕)的人都可以证明这一点。当然,这些天他们正在做一项...

1484
来自专栏大宽宽的碎碎念

The Myth of volatileJDK1.5之前的volatileJDK1.5之后的volatilevolatile足够了吗?volatile VS 锁结论

41310

扫码关注云+社区

领取腾讯云代金券