[转]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的所能提供的带宽,那么设备就不会被配置,而且用户会得到设备没有配置的通知