1. USB 发展历史

USB(Universal Serial Bus)通用串行总线是非常成功的一种总线技术,应用场景很广、发展也非常迅速。到现在一共经历了以下版本:

Version App Speed Direction Data Line
USB 1.0 低速 Low Speed 1.5Mbps Half 单工模式 1对差分线 D+/D1
USB 1.1 全速 Full Speed 12Mbps Half 单工模式 1对差分线 D+/D1
USB 2.0 高速 Hi-Speed 480Mbps Half 单工模式 1对差分线 D+/D1
USB 3.1 Gen1 超高速 SuperSpeed 5Gbps Full 双工模式 2对差分线
USB 3.1 Gen2 超高速 SuperSpeed+ 10Gbps Full 双工模式 2对差分线
USB 3.2 超高速 SuperSpeed+ 20Gbps Full 双工模式 4对差分线
USB 4.0 超高速 SuperSpeed+ 40Gbps Full 双工模式 4对差分线

1.1 USB 1.0/2.0

在 USB 1.0/2.0 时期只需要用到4根线:1根电源线、1根地线、1对差分数据线。因为只有1条数据通路,所以只能是单工的,同一时间只能是接收或者发送数据。

使用 Type AType B 型的接口:

还有一系列小尺寸的变种:

1.2 USB 3.0

在 USB 3.0 时代从两个方向来增加速度:

  • 增加传输的时钟速率,速率从480M增加到了5G。高速信号会给PCB走线、EMC、线缆带来不小的压力。
  • 增加差分数据通路的数量。首先发明了改进型的 USB3.0 Type A 接口,在原有4线的基础上再增加了5条线:

可以看到增加的5条线分别为1条地线和2对差分数据线。因为有了2条数据通路,所以可以双工,同一时间能同时接收和发送数据。在工作在 USB 3.0 模式时,原来的 D+/D- 差分线是不使用的。

上图是 USB3.0 Type A 接口示意图,注意新增的5条线已断针的形式隐藏在后面,这样的设计是为了和 USB 2.0 兼容。但是颜色改成了蓝色,以示区别。

在 USB 3.0 还出现了一种全新的接口类型 Type C 接口,它带来了以下好处:

  • 接口线数量猛增到了24线,其中数据通路在 D+/D- 之外再提供了 4条差分数据线。
  • 实现了正反面任意插拔,大大方便了用户使用。

    从 USB 3.2 开始,因为它需要使用 4 对数据差分线,所以目前唯一支持的只有 Type C 接口。

1.3 速度识别

USB 1.0 和 1.1 通过 D+/D- 的上拉电阻来进行区分:

  • D+ 上拉,USB 1.1 Full-speed。
  • D- 上拉,USB 1.0 Low-speed。

    USB 2.0 High-speed 首先 D+ 上拉,被当成 USB 1.1 Full-speed。然后通过编码识别来区分 High-speed 和 Full-speed:
  • 1、Hub检测到有设备插入/上电,向主机通报,主机发送Set_Port_Feature请求让hub复位新插入的设备。设备复位操作是hub通过驱动数据线到复位状态 SE0(即D+和D-全为低电平),并持续至少10ms。
  • 2、高速设备看到复位信号,通过内部的电流源向D-线持续灌大小为17.78mA电流。因为此时高速设备的1.5k上拉电阻未撤销,在hub端,全速/低速驱动器形成一个阻抗为45Ohm的终端电阻,1.5k与45Ohm的电阻并联,仍然是45Ohm,所以在Hub端看到一个约800mV的电压,这就是Chirp K信号。Chirp K信号持续1ms ~ 7ms。
  • 3、在Hub端,虽然设置了复位信号,并一直驱动着SE0,但USB2.0的高速接收器一直在检测Chirp K信号,如果没有Chirp K信号看到,就继续复位操作,直到复位结束,然后识别为全速设备。
  • 4、设备发送的Chirp K信号结束后100us内,hub必须开始恢复一连串的KJKJKJ…序列,向设备表明这是一个USB2.0的hub。这里的KJ序列是连续的,中间不能间断,而且每个K或J的持续时间在40us~60us。KJ序列停止后的的100-500us内结束复位操作。Hub发送Chirp KJ序列的方式和设备一样,通过电流源向差分数据线交替灌17.78mA的电流实现。
  • 5、在回到设备端来。设备检测到6个hub发送的Chirp信号后(3对KJ序列),它必须在500us内切换到高速模式。切换动作有:
    (1)断开1.5K的上拉电阻
    (2)连接D+/D-上的高速终端电阻,实际上就是全速/低速差分驱动器
    (3)进入默认的高速状态。
    执行(1)、(2)步后,USB信号线上看到的现象就发生变化,hub发送出来的Chirp KJ序列幅值降到原来的一半,即400mV。这是因为设备端挂载新的中断电阻,并联后的阻抗是22.5Ohm。之后高速操作的信号幅度就是400mV,而不像全速/低速那样的3V。

USB Chirp KChirp JSE0 信号定义:

信号 低速模式
Low-speed
全速速模式
Full-speed
高速模式
High-speed
Chirp J D+ = 0,D- = 1 D+ = 0,D- = 1 D+ = 1,D- =0
Chirp K D+ =1, D- = 0 D+ =1, D- = 0 D+ =0, D- = 1
SE0 D+ = 0, D- =0 D+ = 0, D- =0 D+ = 0, D- =0
IDLE K状态 J状态 SE0状态
  • 从J到K或者从K到J,信号翻转,说明发送的信号是0.从J到J或从K到K,信号不变,说明发送的信号是1.
  • Chirp J K状态高速设备与低速设备相反。

对于 USB 3.0 以后的速度识别,暂未研究。

1.4 OTG

USB OTG技术可实现没有主机时设备与设备之间的数据传输。例如:数码相机可以直接与打印机连接并打印照片, 手机与手机之间可以直接传送数据等,从而拓展了USB技术的应用范围。

在OTG中,初始主机设备称为A设备,外设称为B设备。也就是说,手机既可以做外设,又可以做主机来传送数据,可用电缆的连接方式来决定初始角色(由ID线的状态来决定)。

在 Mini/Micro USB 接口一共有 5 根线,在原有 USB 的基础上多出了一根 ID 线。OTG的识别是通过ID脚的电平进行决定OTG作为Device还是Host:


当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机),而检测到ID引脚浮空的设备则认为是B设备(外设)。

1.5 phy 总线

USB信号传输前,需要通过phy把usb控制器的数字信号转成线缆上的模拟信号。usb控制器和phy之间的总线主要有3种:

  • 1、UTMI (USB2.0 Transceiver Macrocell Interface)。最早的 USB controller和USB PHY通信的协议。
  • 2、ULPI (UTMI+Low Pin Interface)。从名字上就可以看出ULPI是UTMI的Low Pin版本
  • 3、HSIC (USB 2.0 High Speed Inter Chip)。是USB 2.0的芯片到芯片变体,它消除了普通USB中的传统模拟收发器。速度可达480M,是IIC的理想替代。

1.6 传输编码方式

USB 信号在线路上传输时,需要采取合适的编码方式。

  • 1、USB 1.0/2.0 采用的是 URZI (No Return Zero-Inverse) 编码。无需同步的时钟信号也能产生同步的数据存取。NRZI的编码规则是,当数据位为1时不转换,当数据位为0时转换,如下图所示。位传输的顺序以LSB优先。

    这种编码方式会遇到一个严重的问题,若重复相同的1信号时,就会造成数据长时间无法转换,逐渐的累积而导致堵塞的情况,使得读取的时序出现严重的错误。因此,在NRZI编码之间,还需执行所谓的位填塞(bit-stuffing)。即是,若原始的串行数据含有连续的6个1时,就执行位填塞工作,填塞一个0。

  • 2、USB 3.0 采用的是 8b/10b 编码。

  • 3、USB 3.1/3.2 采用的是 128/132 (64b/66b) 编码。

2. 总线拓扑

USB 是星型拓扑总线,由 hub 来进行多级扩展。最大的层级不能超过7层,在任何一条路径上不能超过5个非根hub。

USB 总线由 3 种角色组成:

  • Host。星型总线的中心,配置所有Hub和Device,调度总线上所有的数据收发。
  • Hub。提供了扩展端口,能连接更多的Device。Hub本身也是一种特殊的Device。
  • Device。提供了实际的设备功能。

    经过几种角色的组合以后,USB 总线形成了逻辑上的星型拓扑,Host 到任一 Device 都是点对点传输。

2.1 Device 内部的逻辑关系

USB 将 Device 内部的资源进一步细分成了3个层级:Configuration 配置、Interface 接口、Endpoint 端点。

  • 1、Configuration 配置

每个USB设备都可以包含一个或者多个配置,不同的配置使设备表现出不同的功能组合,配置有多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本的功能。

看下面的一个例子。一个USB播放器带有音频视领功能,还有旋钮和按钮。那么这个 Device 设备 可以提供3种 Configuration 配置:
配置1:音须(接口) + 旅钮(接口)
配置2: 音频(接口) + 视频(接口) + 按钮(接口)
配置3:视频(接口) + 旋钮(接口)

  • 2、Interface 接口 / Function 功能

Interface 接口代表一个独立的基本的功能,所以有时也称之为 Function 功能。如果我们开发 USB Client 驱动,我们面向的对象就是 USB Interface,上述实例中的音烦接口、视频接口、投钮接口、旋钮接口均需要一个独立的 USB Client 驱动程序。

一个 Interface 接口中包含了完成这个基本功能的所需要的一个或者多个 Endpoint 端点。

  • 3、Endpoint 端点 (Pipe 管道)

端点是USB设备中最基本的可寻址单位,它是位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。

设备的Endpoint 0 是一个特殊端点,在设备初始化时系统需要使用该端点读配置设备。其他编号的端点 USB Client 驱动都可以使用。

一个 Host 主机的端点和一个设备 Device 的端点建立的连接称之为 Pipe 管道:

2.2 Compound/Composite Device


在 USB 协议描述中,有两个非常相近的名字:Compund DeviceComposite Device。正确的理解的它们有助于我们理解清楚随后的一些概念。

  • Compund Device。指的是一个 hub 设备中,还包含了其他的功能 device。
  • Composite Device。指的是一个 Device 当中,包含了多个 Interface,能提供多个独立的功能。

2.3 Hub


在 USB 的总线结构中,Hub是一个重要的组成成员,它主要的作用是控制 Port 端口来连接更多的 USB Device设备。

它的核心点如下:usb host需要给总线上的设备分配不同的地址才不会冲突,usb的星形拓扑连接设备都是通过hub的端口连结到总线上的。总线初始化枚举设备时,usb设备的地址都是默认地址0,但是hub的端口都是关闭的所以并不产生设备冲突,host逐个打开hub的端口,逐个利用打开端口上设备的默认地址0来配置设备,给其分配新的地址,从endpoint 0中读出设备的配置并设置。在运行过程中usb设备的热插拔也是和这类似的。

2.4 Configure Descriptor

对于一个 USB 设备,在 DeviceConfigurationInterfaceEndpoint 每个层次上都有对应的描述信息。可以使用 endpoint0 在设备初始化的时候读出和配置这些信息。

以下是USB协议中对这些描述信息的详细定义:

最重要的是设备在初始化时,通过这些信息来进行枚举配置的过程。一个设备枚举的过程分为如下8步:

  • 1.获取设备描述符

    • Host/Hub通过数据线上拉电阻的阻值变化检测到新设备接入。Host等待100ms以保证设备电源稳定。
    • Host向device发Bus Reset使得设备进入default状态,从此之后,设备可以响应默认地址0.
    • Host请求Device发送Device Descriptor的前64个字节。
  • 2.复位

    • Host在收到Device Descritptor的前8个字节后,再次向Device发出Bus Reset。
  • 3.设置地址

    • Host发送一个Set Address命令给Deivce, 从此Device有个通信地址,不再使用默认地址0进行通信。
  • 4.再次获取设备描述符

    • Host请求获取完整的Device Descritpor, 总计18字节。
  • 5.获取配置描述符

    • Host请求获取9个字节的Configuration Descriptor以了解 Configuration descriptor的总大小。
    • Host请求255字节的Configuration Descritpor。
  • 6.获取接口,端点描述符

  • 7.获取字符串描述符

  • 8.选择设备配置

3. 总线调度

USB 作为一个高速总线,它需要充分利用起其带宽,并且能承担其多种业务类型的数据包的传输。

对数据传输来说,最重要的有几种因素 带宽时间延迟完整性校验。根据这几种因素的组合,USB 把数据传输分成了4类:

Type KeyPoint Sample Descript
Control Transfers
控制传输
完整性校验 USB 配置命令 突发的、非周期性的,主机软件发起的请求/响应通信,通常用于命令/状态操作。
数据量小对带宽、时间延迟要求不高,但是要求数据必须正确
Isochronous Transfers
等时传输
带宽时间延迟 摄像头 等时传输:主机和设备之间定期、连续的通信,通常用于时间相关信息。
这种传输类型还保留了数据中封装的时间概念。然而,这并不意味着这些数据的交付需求总是时间紧迫的。
数据量大需要大带宽、对时间延迟也很高,但是不要求数据必须正确。也正因为前两者的要求高,也很难做到数据校验和重传
Interrupt Transfers
中断传输
时间延迟完整性校验 键盘、鼠标 低频、有边界延迟通信。
对时间延迟要求高,但数据量小所以要求数据必须正确
Bulk Transfers
批量传输
带宽时间延迟完整性校验 文件存储 非周期性、大包突发通信,通常用于可以使用任何可用带宽的数据,也可以延迟到带宽可用。
数据量大需要大带宽,但对时间延迟也不高,要求数据必须正确。也正因为对延迟要求不高,所以可以做数据校验和重传

USB使用以下方法来满足多种类型的数据在一条共享通道上传输:

  • 时间延迟。从时间维度上把数据传输切成多个时间片,在每个时间片内绝大部分份额(最多80%)优先传输对时间延迟有要求的数据,如Interrupt TransfersIsochronous Transfers。在时间片剩下的额度内传输对时间延迟没要求的数据,如Control TransfersBulk Transfers
  • 完整性校验。对需要保证数据完整性的数据加上了CRC 校验,接收端使用 ACK 来知会发送端正确接收,如果没有收到 ACK 发端会尝试重发 3 次。

3.1 Frames/Microframes

如上图,USB从时间维度上把数据传输切成多个时间片:

  • Frames。Low-speed 和 Full-speed 的时间切片大小为 1ms,USB 控制器每1ms重新调度一下传输。
  • Microframes。High-speed 的时间切片大小为 125us,USB 控制器每125us重新调度一下传输。

这个时间切片,和操作系统上 schedule tick 的概念是一样的。

在数据格式传输上又会进一步细分:

  • Transfer。每个时间片的所有传输称之为一个 Transfer,或者为一个 Frames/Microframes。
  • Transcation。根据某次数据传输的目的,一个 Transfer 可以分成多个 Transcation 事务。
  • Packet。数据传输的最小单位,一个 Transcation 可能由多个 Packet 事务组成。

3.2 Bulk Transactions


上图可以看到 Bulk 类型的 In/Out Endpint 在数据收发时的状态流程图:

  • NAK。接收端数据未准备好。
  • ACK。接收端接收到数据且数据校验正确。
  • 不回应。接收端接收到错误数据,发端会重发 3 次。

3.3 Control Transfers


Control 类型 和 Bulk 类型的处理类似。

3.4 Interrupt Transactions


Interrupt 类型对 完整性校验 也是有要求,处理流程和前面一样。

3.5 Isochronous Transactions


Isochronous 类型是唯一对 完整性校验 没有要求的,所以它的数据不需要 ACK 回应。

3.6 USB 和 PCIE 调度的区别

PCIE 总线也是一个非常成功和流行的总线,从底层来说它和 USB 总线是非常像的:

  • 它也是高速串行总线。

  • 它也是共享性的总线。都是把带宽逻辑切割成多份,分给不同的Device和驱动。

    但是它又看起来和 USB 如此的不同,主要的差异就在总线的调度上面:

  • PCIE 硬件使用了一个专门的仲裁器来做总线调度,所以在Device配置好以后,所有的 Mem/Io 空间被映射到一个统一地址空间当中,只要发起普通的读写操作就能访问。而USB的总线调度被暴露了出来,需要硬件软件共同配合才能完成。毫无疑问,PCIE 的硬件复杂度和成本会远远高于 USB。

  • 另外由于 PCIE 有独立的仲裁器来进行调度,所以 PCIE 支持多个设备同时操作总线。而 USB 的所有操作都需要 Host 来调度,所以只能由 Host 发起总线操作。从效率来说 USB 要低。

  • 还有一点PCIE硬件仲裁器对软件是透明的,所以软件读写总线是同步的。而软件操作USB总线是异步的,通过回调的操作来进行usb和cpu之间的状态对齐。

4. 传输格式

上文说过一个传输时间片 Tranfer/Frame/MicroFrame,可以分割成多个 Transaction 事务,一个 Transaction 事务又可以细分成多个 Packet 包。

4.1 Packet

Packet 包是 USB 传输的最小单位,由五部分组成:

  • 同步字段(SYNC)
  • 包标识符字段(PID)
  • 数据字段
  • 循环冗余校验字段(CRC)
  • 包结尾字段(EOP)

    主要的数据包格式有四类,对应不同的 PID 类型:

4.1.1 Token Packet


此格式适用于IN、OUT、SETUP、PING。

4.1.2 Data Packet


有四种类类型的数据包:DATA0, DATA1, DATA2,and MDATA,且由PID来区分。DATA0和DATA1被定义为支持数据切换同步(data toggle synchronization)。

4.1.3 Handshake Packet


ACK: 对于IN事务,它将由host发出;对于OUT、SETUP和PING事务,它将由device发出。
NAK: 在数据阶段,对于IN事务,它将由device发出;在握手阶段,对于OUT和PING事务,它也将由device发出;host从不发送NAK包。

4.2 Transcation

在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)即:The delivery of service to an endpoint。一个事务由一系统packet组成,通常的一次 Transaction 由3个Packets组成:Token -> Data -> Handshake

4.2.1 IN/Read/Upstream Transaction


4.2.2 OUT/Write/Downstream Transaction


4.2.3 Control Transaction

Control Transaction最多由3个Stage组成, Setup stage, Data stage, Status stage。其中Data stage不是必需的,有的control transaction没有data stage

  • Control No Data (Transfer)

  • Control Read (Transfer)

  • Control Write (Transfer)

5. 通讯模型

USB 的主要作用就是建立起 Host 和 Device 之间的通讯。

  • 简要的通讯模型:

  • 详细的通讯模型:

参考资料

1.USB 2.0 Specification
2.USB中文网
3.USB协通讯议–深入理解

Linux usb 1. 总线简介的更多相关文章

  1. linux usb总线驱动(一)

    目录 linux usb总线驱动框架 USB 介绍 传输类型 控制器接口 2440接口 基本流程 alloc_dev choose_address hub_port_init usb_get_devi ...

  2. Linux 内核引导选项简介

    Linux 内核引导选项简介 作者:金步国 连接地址:http://www.jinbuguo.com/kernel/boot_parameters.html 参考参数:https://www.cnbl ...

  3. 《网蜂A8实战演练》——8.Linux USB 主机控制器和设备驱动

    USB 的全称是 Universal Serial Bus,顾名思义:通用串行总线. 提到总线,联想一下,在你心目中总线总是用来干嘛的?还记得 I2C 总线? I2C 总线上挂有二条信号线,一条是 S ...

  4. Linux usb 2. 协议分析

    文章目录 0. 背景 1. USB 协议传输格式 1.1 Packet 1.1.1 Token Packet 1.1.2 Data Packet 1.1.3 Handshake Packet 1.1. ...

  5. Linux usb子系统(二):USB设备驱动usb-skeleton.c

    usb驱动分为通过usbfs操作设备的用户空间驱动,内核空间的内核驱动.两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在usbfs里驱动该设备. 下面转载的一篇分析u ...

  6. Linux usb子系统(一):子系统架构

    一.USB协议基础知识   前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB). ...

  7. linux usb 驱动详解

    linux usb 驱动详解 USB 设备驱动代码通过urb和所有的 USB 设备通讯.urb用 struct urb 结构描述(include/linux/usb.h ). urb 以一种异步的方式 ...

  8. Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

  9. Linux USB驱动框架分析(2)【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3243543.html   看了http://blog.chinaunix.net/uid-11848011 ...

随机推荐

  1. 《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)

    1.简介 尽管有的小伙伴或者童鞋们觉得很简单,不就是关闭退出浏览器,但是宏哥还是把两个方法的区别说一下,不然遇到坑后根本不会想到是这里的问题. 2.源码 本文介绍webdriver中关于浏览器退出操作 ...

  2. CometOJ-[Contest #10]鱼跃龙门【exgcd】

    正题 题目链接:https://cometoj.com/problem/1479 题目大意 给出\(n\)求一个最小的\(x(x>0)\)满足 \[\left(\sum_{i=1}^xi\rig ...

  3. YbtOJ#526-折纸游戏【二分,hash】

    正题 题目链接:https://www.ybtoj.com.cn/problem/526 题目大意 一个\(n\times m\)的网格上有字母,你每次可以沿平行坐标轴对折网格,要求对折的对应位置字母 ...

  4. P3793-由乃救爷爷【分块,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3793 题目大意 给出\(n\)个数字的一个序列\(m\)次询问区间最大值 保证数据随机 \(1\leq n,m\ ...

  5. Java程序的种类

    Java程序的种类 Application:Java应用程序,是可以由Java解释器直接运行的程序. Applet:即Java小应用程序,是可随网页下载到客户端由浏览器解释执行的Java程序. Ser ...

  6. golang []byte和string的高性能转换

    golang []byte和string的高性能转换 在fasthttp的最佳实践中有这么一句话: Avoid conversion between []byte and string, since ...

  7. bzoj1834 ZJOI2010网络扩容(费用流)

    给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容费用. 其中\(n ...

  8. 阿里P8面试官:如何设计一个扛住千万级并发的架构?

    大家先思考一个问题,这也是在面试过程中经常遇到的问题. 如果你们公司现在的产品能够支持10W用户访问,你们老板突然和你说,融到钱了,会大量投放广告,预计在1个月后用户量会达到1000W,如果这个任务交 ...

  9. 用C++实现的数独解题程序 SudokuSolver 2.3 及实例分析

    SudokuSolver 2.3 程序实现 用C++实现的数独解题程序 SudokuSolver 2.2 及实例分析 里新发现了一处可以改进 grp 算法的地方,本次版本实现了对应的改进 grp 算法 ...

  10. 深入理解Java虚拟机之垃圾回收篇

    垃圾回收简介 ​ Java 会对内存进行自动分配与回收管理,使上层业务更加安全,方便地使用内存实现程序逻辑.在不同的 JVM 实现及不同的回收机制中,堆内存的划分方式是不一样的. ​ 简要地介绍下垃圾 ...