今天从系统标准层面先来梳理一下。
USB是比较复杂的协议栈,如果发现文章中有错误,请帮忙指正。
注:本文主要参考USB2.0规范第4章,将标准中个人认为比较重要的一些点尽量条理清晰的总结出来。我感觉很多朋友可能对于阅读英文标准有点轻度抗拒,所以整理此文这也是一个起因,希望对朋友们有所帮助。
说到总线拓扑,这张图大家一定都见过:
USB标准上说USB总线拓扑是一种分层星形结构,这张拓扑图延申出来的一些要点:
- 所谓星型是针对Hub而言的,一个Hub下面可以挂Hub或者设备,最顶层就是USB主机控制器
- USB主机控制器一般都伴随有一个根集线器Root Hub。
- Hub级联最多5层
- 总线上理论最大允许连接127个设备。
- Hub级联遵循向下兼容,USB2.0主机或者高速Hub可以连接USB1.1Hub。
- 一个USB分层星型结构有且仅有一个USB主机控制器
- 线缆最长不超过5米
这个最大7层星形结构,代表的是一条USB总线,一个USB分层星型结构有且仅有一个USB主机控制器,但并不是说一台计算机就只有一个USB总线,比如我的计算机内部就是2个USB主控制器+Root Hub,从Windows设备管理器可以看到:
7层拓扑图中的第2层只画了一个Hub,并不意味真正的第2层就只能有一个Hub,但这个图无法显示出更为详细的总线连接关系,用USBTrace软件来看看:
第1条总线有4个端口,第2条总线的根集线器具有18个端口,其中8、9、10为计算机内部的USB设备占用了。我这台笔记本对外有两个USB接口,通过分别将U盘插入这两个端口,再利用USBTrace探测可以推断出这两个端口都属于第2条总线的Port 3以及Port 4:
那么Hub长什么样呢?比如下面是一个7口的USB Hub示意图,来源于USB2.0标准:
USB 通过四线电缆传输信号和电源。信令发生在每个点对点网段上的两条线上。
- VBUS/GND:供电
- D+/D-:USB差分信号线。
具有三种数据速率:
- 高速模式 high-speed:480 Mb/s,常缩写为HS模式
- 全速模式 full-speed:12 Mb/s,常缩写为FS模式
- 低速模式 low-speed:1.5 Mb/s,常缩写为LS模式
至于数据编码模式,这里先不管它。
机械部分主要定义USB采用什么尺寸的接插件,线缆的颜色定义、线号。线缆的抗拉强度等。主要从以下几个方面去标准化:
- 主要连接器类型规范,主要分A、B系列。定义了公头、母头。
线缆规范。高速/全速电缆由信号双绞线、VBUS、GND 和整体屏蔽组成。当高速/全速电缆与低速设备一起使用时,电缆必须满足所有低速设备要求。低速设备可以不使用双绞线。双绞线可有效抵抗共模噪声。
连接器机械尺寸及材料要求。
- A/B系列插座规范
- A/B系列插头规范
- 电缆尺寸材料规范,这里就不罗列了,知道在哪里查就可以了。
- 电气、机械和环境合规性标准
- 接地规范,屏蔽层一定要焊接在插头的外壳接地点。
- 插座PCB尺寸规范。所以对于有绘制接插件需要的,可以参考6.9节的尺寸。
- Logo位置
- 线芯颜色规范。
- USB Logo尺寸规范。
USB采用主从通讯模式,是一种轮询总线。所有数据传输都由主机控制器发起。这是USB标准中最难啃的部分,这里先不总结。
标准关于协议健壮性,又称鲁棒性,做了这几个方面的设计:
- 从信号完整性角度:使用差分驱动器、差分接收器和以及对信号线缆的屏蔽处理。差分收发策略主要在抵抗共模干扰方面效果显著,而屏蔽层则有两方面的作用:其一,有效降低USB线通过无线电波对外界干扰;其二、能有效隔断外界无线干扰对USB信号线、电源线的干扰。
- CRC报文校验。报文中数据如果出错,可以检测出来,可以做相应的处置。
- 热插拔检测及对相应硬件设备的系统配置管理。这个设计有助于提升用户体验,用户随用随插,而无需关机插拔。
- 利用对数据丢失或数据损坏超时检测实现通讯自恢复机制,以增强协议的健壮性。
- 对流数据的进行流量控制以确保同步以及底层收发硬件缓冲区管理。
- 数据管道和控制管道分离
USB支持热插拔,所谓热插拔就是,设备插入,系统需要正确识别设备加载驱动程序,断开后,系统需要从软件层面识别到设备已经从总线上移除了。这里所谓的系统,有可能是带操作系统的计算机,也有可能是不带操作系统的嵌入式设备。
比如下面这个U盘插入移除的过程:
所有的USB设备都必须经过集线器上的USB端口连接到总线。从总线拓扑图可以看出,总线上有一个主控制器,位于金字塔的顶端。上面动图中也可以看出,即便是计算机内部USB设备也是经由Hub的端口连接到总线的,现在的计算机内部很多设备也会采用USB总线进行互联,比如内置的蓝牙设备。
主机控制器位于顶端,设备是经过集线器的端口连接到总线,那么主控制器怎么知道设备插入呢?这是由于集线器具有用于报告USB设备在其端口之一上的连接或移除的状态位。主控制器查询集线器检索这些状态位。在设备插入时,主控制器启用端口并通过设备的控制管道在默认地址对USB设备进行寻址。主机为设备分配一个唯一的USB地址,然后确定新连接的USB设备是集线器还是功能设备。主机使用分配的USB地址和端点编号0为USB设备建立其控制管道的端点。
- 如果新连接的USB设备是集线器,如果这个新连接的集线器的端口上有USB 设备,则对每个连接的USB设备执行上述识别操作。
- 如果连接的USB设备是一个功能设备,则连接通知将由适用于该功能的主机软件处理。如果是基于通用操作系统的计算机系统,则由一般驱动程序处理,如果主机控制器是单片机类嵌入式设备,则由单片机程序负责处理。
同样移除时,从标准设计角度来看,也需要考虑两种情况。
如果是设备从集线器移除,集线器会禁用该端口并向主机提供设备移除的指示。然后主机控制器从软件层面做相应的移除处理。
如果是集线器移除,需要从软件层面移除该集线器所有端口的USB设备或级联集线器,当然如果集线器又连集线器,则有点递归的意思。
总线枚举是主控制器识别连接到总线的设备并为该设备分配唯一地址的活动。由于USB允许USB设备随时连接到USB总线或从USB总线断开,因此总线枚举是 USB系统软件的持续进行的过程。USB总线枚举还包括移除的检测和处理。
USB利用单向或双向管道在USB主机控制器和USB设备之间进行应用数据和功能数据传输。管道Pipe是一个底层软件及硬件逻辑概念,数据就像水一样从管道中的一侧流向另一侧,就对应着主机控制器与设备的两个端点endpoint。endpoint就像管道的两头,也是软件逻辑概念。将主机与设备侧的端点逻辑关联起来,就是所谓的管道了。当然这管道之所以能传输数据,是因为主端、设备端两侧相应的代码配合芯片内部硬件实现的。
数据流经由一侧的端点通过逻辑管道传输到另一侧端点,USB架构包含四种基本类型的数据传输:
- 控制传输
- 批量传输
- 中断传输
- 同步传输
下表是这四类传输在不同速度模式下支持的最大包长度,放在这里有一个整体概念:
控制传输,主要用于在设备首次连接时配置设备;并可用于其他设备自定义的传输目的,比如控制设备上的其他管道。
USB系统软件在设备首次连接时使用控制传输进行设备配置。其他驱动程序软件也可以选择以自定义方式使用控制传输。控制传输主要使用管道0,数据传输是无损的。
每个USB设备都必须有控制端点,支持控制传输来进行命令和状态的传输。此外,控制传输是双向传输。
批量传输Bulk Transfer就像其名字一样,数据量相对较大,具有突发性。这种突发性可能来源于用户对USB设备的操作,比如对U盘的读写操作就会触发批量传输。批量传输这种突发性也就意味着是非周期性的,一般用于没有实时性要求、数据量比较大设备。比如用于打印机或扫描仪的数据。批量传输数据是连续的。通过在硬件中使用错误检测并采用前面所说的错误重传机制,可以在硬件级别确保可靠的数据交换。此外,大量数据占用的带宽可能会有所不同,具体取决于其他总线活动,这是由主机控制器动态仲裁管理的。
批量传输是单向的,使用单向大容量端点来实现。
一般用于需要实时可靠的传输场景。此类数据可随时由设备传输,并以不低于设备指定的速率进行传输。中断数据通常由一个或多个字节的事件通知、字符或坐标组成。比如USB鼠标就是一个采用中断传输的实例。
占用预先约定好的USB带宽以及传输延迟,也称为流式实时传输。所需要的带宽以及延迟要求,与特定设备的相关数据吞吐率以及端点的缓冲管理有关,比如用于音频会议USB耳麦,对于音频的采样率是有参数要求的。
USB标准定义了如何允许每种传输类型访问总线的规则。带宽分配主要在从两个方面进行规定:
- 带宽在管道之间分配。当管道建立时,USB会为一些管道分配带宽。USB底层软硬件需要提供数据缓冲,带宽需求大的场景需要提供更大的缓冲区。
- 带宽可以在许多不同的数据流之间分配。从而能实现将各种设备连接到USB总线。此外,可以同时支持具有宽动态范围的不同设备比特率需求。所谓宽动态范围是指其带宽需求是随着使用场景在动态变化的。
好了,先总结这么多。
转贴自网络