1. 前言
在了解一个协议时,有几点是十分重要的:
- 层次结构
- 应用场景
不同的开发者,关心的协议层不一样,不是所有的都需要掌握。
为了向下兼容的设计
USB2.0是从USB1.0的基础上发展而来的,能够完美的向下兼容,USB1.0包含Low-Speed和Full-Speed模式,在USB2.0的时候引入了High-Speed模式,HS可以被看做FS的扩展。USB3.x在USB2.0的基础上又引入了Super-Speed。但是SS是单独的一根通道了,直接改变了物理结构。
冷知识:在插入USB3.x的U盘时,角度不对可能会被识别为2.0。
三部分:
- USB interconnect
- USB Devices
- USB Host
三种速度模式:
- high-Speed 480Mb/s HS
- full-Speed 12M/s FS
- low-Speed 1.5M/s LS
2. 电气特性-物理层
物理层还是和USB1.0一样,为四线串行,一根Vbus用于供电或者插拔检测,一根GND,两根差分数据线D+,D-用于数据传递。
差分线因为其抗干扰性得到了广泛的应用。
USB设备对总线上数据线的电压比较敏感,在不同的速度模式,D+和D-的关系表示不同的含义
USB供电的电压范围是4.4V-5.25V,电流范围为500mA。每个USB设备必须在自己的配置描述符中申明其对Vbus上电流的要求。
(所以很多快充应该都不是USB2.0的,最大功率才几w)
在物理层上,USB收发器包括一个接收器和一个发送器。在低速和全速的模式下,数据使用电压驱动,高速模式下使用电流驱动
发送器包括:
- 全、低速驱动器
- 支持高速传输的电流驱动器
接收器包括
- 全、低速的差分接收器和两个单端的接收器
- 支持高速传输的差分接收器和高速设备连接断开检测器
D+,D-信号线上都有一个1.5k上拉电阻和一个15k的下拉电阻。在高速模式下,USB主机和设备端会挂载一个45Ω的电阻。通过改变信号线上的上下拉可以改变信号线电平,从而进入不同的速度模式。
2.1 USB信号特性
三种状态:静止态,差分态,单端态。
- 静止态:无驱动,仅仅由上下拉电阻控制,在低速和全速模式下,D+和D-会极性相反(J/K)。
- 单端态:D+和D-同时为低时,SE0,在高速模式下D+和D-会被保持低电平(SE0)。
- 差分态:在低速和全速或者高速情况下,D+的电压比D-高时表示差分信号1,D-的电压比D+高时表示差分信号0,注意:高速要求的电压差值更高,为360mV。在高速和全速模式下,J状态代表差分信号1,K状态代表差分信号0,低速模式下相反。高速状态可以理解为一种特殊的全速模式。
注意:在高速模式下,还存在两种差分状态:Chirp K和Chirp J相比J/K,电压更高。
3. 传输层
3.1 数据编码方式
由于USB无时钟线,所以在传输信号时,使用反向不归零点编码(NRZI)。即当数据位为1时,状态不发生变化,数据位0时,状态翻转。
3.2 传输层结构
传输层用到的一些概念:
- USB Physical Device :位于USB电缆末端的一块硬件,可以执行一些有用的终端用户功能
- Client Software:在主机上执行的软件,对应于一个USB设备。此客户端软件通常与操作系统一起提供,或与USB设备一起提供
- USB System Software:在一个特定的操作系统中支持USB的软件。USB系统软件通常与操作系统一起提供,独立于特定的USB设备或客户端软件
- USB Host Controller (Host Side Bus Interface):允许将USB设备连接到主机上的硬件和软件
包,事务,传输的概念
一次传输包含多次事务,一个事务包含多个包
3.3 物理总线拓扑
USB网络可以通过USB Hub进行扩展,但是扩展不是无限的。最多127个。
3.4 逻辑总线拓扑
虽然物理上多个Hub连接了多个网络,但是,在逻辑上,所有的Logical Device都是挂载在Host下的,Hub对于Host来说是透明的。
对于运行在操作系统上的软件来说,每个CSw对应一个Function。
Function通过接口(Interface)和管道(Pipe Bundle)进行连接,管道又连接到Client SW上。
这些管道并不是物理上的,而是逻辑上的管道,一个Function对应一个Interface对应一个Pipe。一个Interface由多个Endpoint组成。
- USB Logical Device在USB系统中显示为Endpoint的集合,端点集合组成Interface
- Function直接操作Interface
- The USB System Software使用Default Control Pipe来管理Device
- Client Software使用Pipe bundles(与端点集相关联)来管理Interface
- Client Software 管理数据在 a buffer on the Host 和 an Endpoint on the USB Device之间传输。
- The Host Controller (or USB Device,depending on transfer direction) 打包数据在USB之间传输。
贴个原文以防翻译不到位:
每个Endpoint都是单向的,输入或输出,一个Device可以由多个Endpoint组成,每个Endpoint在连接时就会被设置唯一的地址和端点号
Endpoint zero:
端口0是一个特殊的端口,可以对所有设备进行初始配置,输入输出模式。The USB System Software使用 a default control method来初始化和一般操作逻辑设备(例如,配置逻辑设备)作为默认控制
4. 协议层内容
4.1 数据包字段格式(token)
由于在实际传输中,数据包还需要经过NRZI和位bit填充。为方便讨论时,不考虑上面两项。
4.1.1 PID
(Packet Identifier)
紧跟在SYNC上,8位,低四位代表包类型,高四位为低四位的取反
Host和Function可以根据PID包的内容确定包的类型。
PID(H) | 类型 |
---|---|
token | - |
E1 | OUT |
69 | IN |
A5 | SOF |
2D | SETUP |
data | - |
DATA0 | C3 |
DATA1 | 4B |
DATA2 | 87 |
MDATA | 0F |
handshake | - |
ACK | D2 |
NAK | 5A |
STALL | 1E |
NYET | 96 |
special | - |
PRE | 3C |
ERR | 3C(一样的) |
SPLIT | 78 |
PING | B4 |
PID的含义可以查看下图中的描述。 |
4.1.2 地址字段
地址字段包括地址(7bit)和Endpoint number (4bit)
Function address 字段指定特定的Function,根据PID的类型,表示原地址或者目的地址。
下面这些类型的包会包含地址字段:
- SETUP
- IN
- OUT
- PING
- SPLIT
7bit可以表示至少128个地址,但是0地址要保留,每一个地址对应一个Function,所以一共支持127个Function。
在地址字段后还附带了一个Endpoint字段,允许更灵活地寻址需要多个Endpoint的Function
LS设备支持最多三个Pipe,FS,HS最多支持16个IN和OUT Pipe
4.1.3 帧数字段
帧数字段是一个11位的字段,由主机按每帧递增。帧号字段在达到其最大值7FFH时滚动,并且仅在每个(微)帧开始时仅以SOF令牌发送。
4.1.4 data字段
数据字段的范围从0-1024字节,必须是字节的整数倍
4.1.5 CRC字段
Token(令牌包)的CRC为五位的
Data(数据包)的CRC是十六位的
计算方法:通过专用的CRC计算器即可:
http://www.ip33.com/crc.html
4.2 数据包结构
4.2.1 令牌包(token)
对于OUT和SETUP事务,ADDR和ENDP字段标识了后续DATA事务的地址,对于IN事务,指定了哪个端点才能传输数据包。只有主机可以发送token令牌包。CRC5只校验ADDR和ENDP字段。
4.2.2 帧开始数据包(SOF)
全速总线由主机以每1.00ms±0.0005ms发出一次帧启动(SOF)包,高速总线为125µs±0.0625µs。SOF数据包由一个指示包类型的PID和一个11位帧号字段组成,如图8-13所示。
SOF令牌包括仅限令牌的事务,该事务以与每个帧的开始相对应的精确时间间隔分配一个SOF标记和伴随的帧号。所有的高速和全速功能,包括集线器,接收SOF数据包。
帧与微帧是物理层的数据的表述吧。
4.2.2数据包(data)
低速设备允许的最大数据有效负载大小为8字节。全速设备的最大数据有效载荷大小为1023。高速设备的最大数据有效负载大小为1024字节
4.2.3握手包(handshake)
握手数据包用于报告数据事务的状态,并可以返回指示数据的接收成功、命令接受或拒绝、流控制和停止条件的值。只有支持流控制的事务类型才能返回握手
在握手阶段和数据阶段会返回handshake包,handshake包后面一个字节必定跟随一个EOP,如果没有那则会被认为无效。
- ACK表示在数据字段上接收到的数据包没有比特内容或CRC错误,并且数据PID接收到正确
- NAK表示Function无法接受来自主机(OUT)的数据,或者Function没有要传输到主机(IN)的数据
- STALL由Function响应IN令牌或在OUT的数据阶段之后或响应PING事务而返回
- NYET是一种高速的握手,在两种情况下返回。它由一个HS Endpoint 作为PING协议的一部分返回。当FS/LS transaction尚未完成或Hub无法处理拆分交易时,Hub也可以返回NYET以响应拆分交易
- ERR是一种高速的握手,它返回来允许高速集线器在全/低速总线上报告错误
4.2.4 SYNC
因为USB总线无单独的时钟信号,所以数据的跨时钟域同步只能通过特定的字段实现。需要通过在数据包的前面都以同步包(SYNC)开始,被将输入数据与本地时钟对齐。
4.2.5 Split Transaction Special Token Packets
还有几种特殊的包在分离传输时候使用。以后用到了再系统的学一下。
4.3 包传输过程
4.3.1 批量事务( Bulk Transactions)
当主机准备好传输批量数据时,它首先发出一个OUT令牌包,然后是一个数据包(或PING特殊令牌包)。
如果数据接收函数没有错误,它将返回三个(或四个包括NYET,设备高速运行)握手。
- ACK表示接收数据包没有错误,并通知主机它可能发送下一个数据包的顺序。
- NAK表示接收到的数据没有错误,但主机应该重新发送数据,因为该函数处于临时状态,阻止它接受数据(例如,缓冲区满)。
- 如果端点已停止,则返回STALL,以指示主机不应重试传输,因为该函数上存在错误条件。
如果接收到的数据包存在CRC或比特内容错误,则不返回握手。
从DATA0开始,DATA0和DATA1交替传输。
4.3.2 控制传输( Control Transfers)
控制事务最少有两个传输阶段:Setup and Status
在Setup and Status和之间可能包含DATA阶段
接收到SETUP正常回复ACK,如果数据损坏则丢弃,不回复。
Data阶段可能包含多个数据,数据传输规则与批量传输一致。
4.3.3 中断事务(Interrupt Transactions)
如果有中断被挂起,Function将中断信息作为数据包返回。
如果Endpoint没有要返回的新的中断信息(即,没有挂起的中断),则该Function将在数据阶段返回一个NAK握手。
如果为中断Endpoint设置了Halt功能,则该函数将返回一个STALL握手。
4.3.4 同步事务(Isochronous Transactions)
同步事务仅有Token和Data阶段,无handshake阶段。同步事务不支持握手阶段或重试功能
注意:FS设备或Host控制器应该能够接受数据包中的DATA0或DATA1 PID,但是只能发送DATA0。
HS主机控制器必须能够接受和发送数据包中的DATA0、DATA1、DATA2或MDATA PID。
4.3.5 数据切换同步和重试 (Data Toggle Synchronization and Retry)
USB提供了一种机制,以保证跨多个事务的数据发送器和接收器之间的数据序列同步。这种机制提供了一种保证发射机和接收机都能正确地解释事务的握手阶段的方法。
同步是通过使用DATA0和DATA1 PID 以及 数据发射器和接收器使用的独立的数据切换序列位来实现的。
只有当接收方能够接收数据并接收到具有正确数据PID的无错误数据包时,接收器序列位才会切换。
仅当数据发射器接收到有效的ACK握手时,发射器序列位才会切换。
数据发射器和接收器必须在事务开始时同步它们的序列位。所使用的同步机制随事务类型而异。同步传输不支持数据切换同步。
可以直接看图。
-
在数据传输之间,会有token传输用来初始化序列位:首先Tx和Rx都处于一个未知状态,当Tx给Rx发送DATA0后,Rx从x变为1
-
当Rx收到DATA0数据时,序列位从0变为1,Rx发送ACK,TX收到ACK后,序列位从0变为1,接下来发送DATA1数据,Rx收到后序列位变为0,并发送ACK,Tx从1变为0。如果不满足这个情况,将被认为错误。
- 如果错误,将重新传输上一个包。
- 如果ACK损坏
4.3.6 错误检测和补救(Error Detection and Recovery)
5. 后言
这次的整体架构是由FPGA实现的USB2.0控制器通过PCIe挂载在CPU上,USB2.0控制器通过UTMI总线与PHY芯片相连,主要由PHY芯片构成的转接板与外部USB设备相连。本实验打算主要在UTMI总线上分析USB包行为。可能前期理解会有问题,不断更新中。