本片博客是基于对韦东山老师的USB相关学习视频、《USB2.0》、《MindShare USB 3.0 Technology》、《vdocuments.mx_universal-serial-bus-system-architecture》的学习总结,主要是借鉴了韦东山老师的学习笔记。
在本节会展示USB2.0和USB3.0硬件拓扑结构,但是后续的介绍将会重点介绍低速、全速、高速以及控制报文的数据格式。
Devices on the USB are physically connected to the host via a tiered star topology, as illustrated in
Figure 5-5. USB attachment points are provided by a special class of USB device known as a hub. The
additional attachment points provided by a hub are called ports. A host includes an embedded hub called
the root hub. The host provides one or more attachment points via the root hub. USB devices that provide
additional functionality to the host are known as functions. To prevent circular attachments, a tiered
ordering is imposed on the star topology of the USB. This results in the tree-like configuration illustrated in
Figure 5-5.
USB上的设备通过一个分层的星形拓扑物理连接到主机,如图5-5所示。USB连接点是由一种特殊类型的USB设备提供的。集线器提供的附加连接点称为端口。主机包括一个称为根集线器的嵌入式集线器。主机通过根集线器提供一个或多个连接点。为主机提供额外功能的USB设备被称为功能。为了防止圆形附件,在USB的星形拓扑上施加了一个分层排序。这就导致了如图5-5所示的树状配置。
USB 3.0 cables include both the USB 2.0 and SuperSpeed buses. Each 3.0 port supports either a Low-, Full-, or High-Speed device attached to the 2.0 bus or a device attached to the SuperSpeed bus. It should be emphasized that the USB 2.0 bus and SuperSpeed buses are completely independent of each other. This
extends to the USB 3.0 hubs that contain a SuperSpeed hub and a USB 2.0 hub.
USB 3.0电缆包括USB 2.0和超高速总线。每个3.0端口都支持一个连接到2.0总线的低速、全速或高速设备,或支持一个连接到超高速总线的设备。需要强调的是,USB 2.0总线和超高速总线是完全独立的。这扩展到包含超速中心和USB 2.0集线器的USB 3.0集线器。
先传输最低位(LSB)。在后续文档中,描述数据时按照传输顺序从左到右列出来。
Host发出SOP信号后,就会发出SYNC信号:它是一系列的、最大传输频率的脉冲,接收方使用它来同步数据。
下面这个是各个不同类型的报文格式,后面会再详细介绍各个类型的报文
USB总线上传输的数据以包为单位。USB包里含有哪些内容(“域”)?
在USB包中,PID域使用8位来表示,格式如下:
前4位表示PID,后4位是对应位的取反。接收方发现后4位不是前4位的取反的话,就认为发生了错误。
注意:所有的USB文档提到的"输入"、“输出”,都是基于Host的角度,"输出"表示从Host输出到设备,"输入"表示Host从设备得到数据。
有哪些USB包?根据包数据里的PID的bit1, bit0可以分为4类:
令牌类的PID,起"通知作用",通知谁?SOF令牌包被用来通知所有设备,OUT/IN/SETUP令牌包被用来通知某个设备。
对于OUT、IN、SETUP令牌包,它们都是要通知到具体的设备,格式如下:
USB设备的地址有7位,格式如下:
USB设备的端点号有4位,格式如下:
对于SOF包,英文名为"Start-of-Frame marker and frame number"。对于USB全速设备,Host每1ms产生一个帧;对于高速设备,每125us产生一个微帧,1帧里有8个微帧。Host会对当前帧号进行累加计数,在每帧或每微帧开始时,通过SOF令牌包发送帧号。对于高速设备,每1毫秒里有8个微帧,这8个微帧的帧号是一样的,每125us发送一个SOF令牌包。
SOF令牌包格式如下:
Host使用OUT、IN、SETUP来通知设备:我要传输数据了。数据通过"数据包"进行传输。
数据包也有4种类型:DATA0、DATA1、DATA2、MDATA。其中DATA2、MDATA在高速设备中使用。对软件开发人员来说,我们暂时仅需了解DATA0、DATA1。
为什么要引入DATA0、DATA1这些不同类型的数据包?为了纠错。
Host和设备都会维护自己的数据包切换机制,当数据包成功发送或者接收时,数据包类型切换。当检测到对方使用的数据包类型不对时,USB系统认为发生了错误。
比如:
握手包有4类:ACK、NAK、STALL、NYET
USB传输的基本单位是包(Packet),包的类型由PID表示。一个单纯的包,是无法传输完整的数据。
为什么?比如想输出数据,可以发出OUT令牌包,OUT令牌包可以指定目的地。但是数据如何传输呢?还需要发出DATA0或DATA1数据包。设备收到数据后,还要回复一个ACK握手包。
所以,完整的数据传输,需要涉及多个包:令牌包、数据包、握手包。这个完整的数据传输过程,被称为事务(Transaction)。
有些事务需要握手包,有些事务不需要握手包,有些事务可以传输很大的数据,有些事务只能传输小量数据。
有四类事务:
有四类传输(Transfer):
暂时记住这个关系:
事务由多个包组成,比如Host要发送数据给设备,这就会涉及很多个包:
这个完整的事务涉及3个包(Packet),分为3个阶段(Phase):
事务由包组成,这些包分别处于3个阶段(phase):令牌阶段,数据阶段,握手阶段。
对于批量传输、中断传输、实时传输,它们分别由一个事务组成,不再细分为若干个过程。
但是控制传输由多个事务组成,这些事务分别处于3个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。
总结起来就是:
批量传输用批量事务来实现,用于传输大量的数据,数据的正确性有保证,时效没有保证。
批量事务由3个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有SOP、SYNC、PID、EOP。
下图中各个矩形框就对应一个完整的包。
Interrupt transactions may consist of IN or OUT transfers. Upon receipt of an IN token, a function may
return data, NAK, or STALL. If the endpoint has no new interrupt information to return (i.e., no interrupt is
pending), the function returns a NAK handshake during the data phase. If the Halt feature is set for the
interrupt endpoint, the function will return a STALL handshake. If an interrupt is pending, the function
returns the interrupt information as a data packet. The host, in response to receipt of the data packet, issues
either an ACK handshake if data was received error-free or returns no handshake if the data packet was
received corrupted. Figure 8-38 shows the interrupt transaction format.
中断的事务可能包括IN或OUT传输。在收到IN令牌时,函数可以返回数据、NAK或STALL。如果端点没有要返回的新的中断信息(即,没有中断是挂起的),则该函数将在数据阶段返回一个NAK握手。如果为中断端点设置了“Halt ”功能,则该函数将返回一个STALL 握手。如果中断正在等待,该函数将中断信息作为数据包返回。主机响应于接收到的数据包,如果接收到的数据没有错误,则发出ACK握手,如果接收到的数据包已损坏,则不返回握手。图8-38显示了中断事务的格式。
中断传输用中断事务来实现,用于传输小量的、周期性的数据,数据的正确性和时效都有保证。
中断事务由3个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有SOP、SYNC、PID、EOP。
下图8-38中各个矩形框就对应一个完整的包。
中断事务跟批量事务非常类似,Host使用它来周期性地读数据、写数据。
以鼠标为例,我们需要及时获得鼠标的数据,不及时的话你会感觉鼠标很迟钝。但是USB协议中并没有中断功能,它使用"周期性的读、写"来实现及时性。具体过程如下:
中断事务的优先级比批量事务更高,它要求实时性,而批量事务不要求实时性。
实时传输用实时事务来实现,用于传输实时数据,对数据的正确性没有要求。
实时事务由2个阶段(phase)组成:令牌阶段、数据阶段。每个阶段都是一个完整的包,含有SOP、SYNC、PID、EOP。
实时事务不需要握手阶段,一个示例的场景是:为了传输摄像头的实时数据,偶尔的数据错误是可以忍受的,大不了出现短暂的花屏。如果为了解决花屏而重传数据,那就会导致后续画面被推迟,实时性无法得到保证。
Isochronous transactions have a token and data phase, but no handshake phase, as shown in Figure 8-39.
The host issues either an IN or an OUT token followed by the data phase in which the endpoint (for INs) or
the host (for OUTs) transmits data. Isochronous transactions do not support a handshake phase or retry
capability
同步事务具有一个令牌和数据阶段,但没有握手阶段,如图8-39所示。主机发出IN或OUT令牌,然后是端点(IN)或主机(OUT)传输数据的数据阶段。等时事务不支持握手阶段或重试功能
下图8-39中各个矩形框就对应一个完整的包。
实时事务跟中断事务非常类似,Host也会周期性的发起实时事务,主要区别在于:
在使用批量传输时,使用IN令牌包或OUT令牌包表示数据传输方向。
控制传输的令牌包永远是SETUP,怎么分辨是读数据,还是写数据?发出SETUP令牌包后,还要发出DATA0数据包,根据数据的内容来确定后续是读数据,还是写数据。这个过程称为"建立事务"(SETUP Transaction)
但是控制传输由多个事务组成,这些事务分别处于3个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。
usbprotocolsuite是一款由专门生产示波器的生产常见LeCroy(力科)开发的,
安装"usbprotocolsuite"后,可以在文档目录里找打很多示程序(后缀名为usb):
下图是一个控制传输的样例: