(转)USB体系结构
转载地址:http://blog.ednchina.com/zenhuateng/203584/Message.aspx
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的所能提供的带宽,那么设备就不会被配置,而且用户会得到设备没有配置的通知。
(转)USB体系结构的更多相关文章
- USB协议规范学习(一)
什么是USB OHCI规范? OHCI(Open HCI)是目前使用比较广泛的三种USB主机控制器规范之一.USB体系结构是由四个主要部分组成:客户软件/USB驱动,主机控制器驱动(HCD),主机控制 ...
- 【驱动】USB驱动·入门
[驱动]USB驱动·入门 Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导致计算机外部总线种类繁多,管理困难.USB总线正是因此而诞生的. ...
- (转)支持 PS/2 与 USB 的键盘过滤驱动(可卸载)
Author: sinisterEmail: sinister@whitecell.orgHomepage:http://www.whitecell.org Date: 2007-02-2 ...
- 【驱动】USB驱动·入门【转】
转自:http://www.cnblogs.com/lcw/p/3159371.html Preface USB是目前最流行的系统总线之一.随着计算机周围硬件的不断扩展,各种设备使用不同的总线接口,导 ...
- USB 3.0规范中译本 第3章 USB 3.0体系结构概览
本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章呈现USB 3.0体系结构和关键概念的概览.USB 3.0与前面版本的USB类似,因为它是线缆总线,支持 ...
- usb驱动开发13之设备生命线
上一节勉勉强强把struct urb这个中心给说完,接着看那三个基本点. 第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/ ...
- Linux内核--usb子系统的分析
drivers/usb/core/usb.c subsys_init(usb_init); module_exit(usb_exit); 我们 看到一个subsys_initcall,它也是一个宏,我 ...
- 基于 USB 传输的针式打印机驱动程序开发
1.引言 针式打印机曾经在相当长的一段时间占据打印机市场的主导地位,但是近年来由于喷墨.激光等非击打式打印机的冲击,针式打印机的市场份额逐年下降.即便如此,由于针式打印机在票据打印领域的不可取代性,同 ...
- 从USB驱动器运行Windows 10
我相信很多人和我一样.梦想着有个随身携带的U盘版操作系统.无论走到哪里,只要有电脑都可以随时运行自己配置好的操作系统.本篇博文就会一步步的教你如何从USB驱动器加载和运行Windows 10. 让我想 ...
随机推荐
- 【数据库】Mysql更改默认引擎为Innodb的步骤方法
前言 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.M ...
- BZOJ4985 评分(二分答案+树形dp)
首先二分答案简化一下问题,现在只有0和1了,要求最后剩下的是1.再简化一下考虑没有已固定的位置怎么做.考虑每个位置由其合并到的位置连边,显然这样形成了一棵三叉树.设f[i]为使得某位置为1其子树至少要 ...
- BZOJ4975 区间翻转
这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了.然后瞎猜了一发结论就过掉了. 求出逆序对数,判断是否为奇数即可.因为翻转区间会把将这段区间的逆序对取反,而长度为4 ...
- vue使用过程中的一些小技巧
这些也是自己平时项目中遇到过的一些问题,看到有人整理了出来,也就转载保存一下 文章内容总结: 组件style的scoped Vue 数组/对象更新 视图不更新 vue filters 过滤器的使用 列 ...
- 洛谷P1658 购物
题目戳 题目描述 你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个.为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值. 输入输出格式 输入格式: 第一行两个数X.N ...
- XML 增加属性
var resultDoc = new XmlDocument(); resultDoc.LoadXml("<root></root>"); resultD ...
- 【ZJOI2005】沼泽鳄鱼 题解报告
题目描述 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客. 为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥 ...
- 并发时-修改Linux系统下的最大文件描述符限制
通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下: $ulimit -n1024 当然可以通过ulimit -SHn 1024 ...
- java 注解详解
先引用一下百度百科的名词解析: 定义:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段. ...
- Kubernetes 1.5通过Ceph实现有状态容器
在上一篇博文,我们通过kubernetes的devlopment和service完成了sonarqube的部署.看起来已经可用,但是仍然有一个很大的问题.我们知道,像mysql这种数据库是需要保存数据 ...