果壳中的USB(4)端点类型

端点类型(Endpoint Types)

通用串行总线规范定义了 4 种传输/端点类型:

  • 控制传输,usb 端点 0 使用控制传输,控制传输用来控制对 USB 设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告(《Linux那些事儿之我是USB Core》)
  • 中断传输,usb 键盘鼠标等,此类设备大多依靠中断驱动,数据量小
  • 同步传输,usb 移动硬盘等,一般对数据的正确性要求高,对延时不敏感,数据量大
  • 批量传输,usb 摄像头等,用来传输大量的数据,但并不保证数据是否到达,一般对数据的时延要求较高,对数据的正确性要求较低。显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流

控制传输(Control Transfers)

控制传输通常用于命令和状态操作。控制传输在枚举过程中设备建立连接阶段具有举足轻重的作用。它们通常是突发的、随机的数据包,由主机启动并传输,并使用尽力而为(,best effort delivery)的方式发送。控制传输数据包长度,低速设备必须为 8 个字节,高速设备允许的数据包大小为 8、16、32 或64 字节,全速设备的数据包大小必须为64字节。
 
控制传输最多可以分为三个阶段。
  • 设置阶段(Setup Stage):该阶段发送请求。请求包括三个数据包。首先发送设置令牌(setup token),令牌包含地址和端点号。接下来发送数据包,该数据包总是包含 data0 的 PID 类型,并包含详细说明请求类型的设置包。我们稍后将详细介绍设置包。最后一个数据包是用于确认成功接收或表示错误的握手数据包(handshake)。 如果功能设备成功接收到设置数据(CRC 和 PID 等都确定 OK 了),它将响应 ACK,否则将忽略该数据,并且不发送握手数据包。设置数据包阶段,功能设备不能响应 STALL 或 NAK 数据包。
 
  • (可选的)数据阶段(Data Stage):数据阶段由一个或多个 IN 或 OUT 传输组成。设置阶段的请求指明了在此阶段要发送的数据量,如果超过最大数据包大小,数据将以多次传输的形式发送,每个传输都是最大数据包长度(最后一个数据包除外)。数据阶段根据数据传输的方向有两种不同的方案。
(1)IN:当主机准备好接收控制数据时,它将发出一个 IN 令牌。如果功能设备接收到有错误的 IN 令牌——比如 PID 与反转的 PID 位不匹配,则忽略该数据包。如果正确接收到令牌,则设备可以回应一个包含要发送的控制数据的 DATA 数据包,或指示端点出现错误的停止数据包(stall packet),或告知主机端点可以正常工作、但暂时没有数据要发送的NAK数据包。

 
(2)OUT:当主机需要向设备发送控制数据包时,它会发出 OUT 令牌,后跟负载为控制数据的数据包。如果 OUT 令牌或数据包的任何部分损坏,则功能设备忽略该包。如果功能设备的端点缓冲区为空,并且已将数据输入至端点缓冲区,它将发出 ACK 通知主机已成功接收数据。如果端点缓冲区因在处理前一个数据包而不为空,功能设备回复一个 NAK。但是,如果端点出现故障并且其停止位(halt bit)已设置,它将返回一个STALL。
  • 状态阶段(Status Stage):状态阶段报告整个请求的状态,并且数据包随传输方向的不同而变化。 状态报告始终由功能设备执行。
(1)IN:如果主机在数据阶段(data stage)发送 IN 令牌以接收数据,则主机必须确认该数据已成功接收——这个功能是通过主机发送 OUT 令牌,后跟一个零长度数据包来完成的。功能设备现在可以在握手阶段报告其状态。ACK 表示功能设备已经完成了命令并准备好接受另一个命令。如果在处理此命令期间发生错误,功能设备将发出 STALL 包。如果该功能设备仍在处理命令中,它将返回一个 NAK,告知主机稍后会重新回复状态信息。
 
(2)OUT:如果主机在数据阶段发送了 OUT 令牌以传输数据,功能设备将回复一个已成功收到数据的确信息——在 IN 令牌中发送长度为 0 的数据包。如果发生错误,则应发出一个 STALL 包,或者如果它仍在忙于处理数据,则应发出NAK 包,要求主机稍后重试。

控制传输整体流程概览

上述数据包发送过程是如何融合在一起的?举个例子,主机希望在枚举期间请求设备描述符,数据包按如下流程发送。
 
主机通过发送 Setup 令牌,告知功能设备接下来的数据包是 Setup 数据包。地址字段包含主机所请求的描述符的设备的地址。,端点号为零,以指定默认管道。然后,主机将发送 DATA0 数据包,该数据包带有 8 字节的有效负载,这是 USB 规范第 9 章中提到的设备描述符请求(Device Descriptor Request)。然后,USB 功能设备确认已正确读取了设置数据包,没有任何错误。如果收到的数据包损坏,设备将忽略该数据包。然后,主机将在短暂的延迟后重新发送数据包。
 
上面三个数据包代表第一个 USB 事务。USB 设备现在将解码接收到的 8 个字节,并确定它是否是设备描述符请求。然后,设备将尝试发送设备描述符,这是下一个 USB 事务。
这种情况下,我们假设最大有效负载大小为 8 字节。主机发送 IN 令牌,告知设备它现在可以为此端点发送数据。由于最大数据包大小为 8 字节,因此我们必须将 12 字节的设备描述符拆分为多个块进行发送。 每个块必须为 8 字节,最后一个事务除外。 主机确认我们发送的每个数据包。
 
设备描述符发送过后,下面进行状态事务(status transaction)处理。如果事务成功,主机将发送零长度的数据包,表示整个事务成功。然后,功能设备会对此零长度数据包进行回应,以指示其状态。
 

中断传输(Interrupt Transfers)

接触过微控制器中断的人都知道,中断是由设备产生的。但是在 USB 体系结构中,如果设备需要得到主机的注意,它必须等到主机轮询它后才能报告需要紧急注意的事项!
中断传输特点
  • 可以保证的延迟(Guaranteed Latency)
  • Stream Pipe - 单向
  • 错误检测和下次重试(next period retry)
 
中断传输通常是非周期性的,小型设备“启动”的通信,需要保证等待时间在限定范围内。设备将中断请求排队,直到主机轮询 USB 设备以请求数据。
  • 低速设备的最大数据有效载荷大小为 8 字节。
  • 全速设备的最大数据有效载荷大小为 64 字节。
  • 高速设备的最大数据有效载荷大小为 1024 字节。
 
上图显示了 Interrupt IN 和 Interrupt OUT 事务的格式。
(1)IN:主机将定期轮询中断端点。轮询速率在端点描述符中指定,稍后进行介绍。每次轮询将主机都会发送 IN 令牌。如果 IN 令牌损坏,功能设备忽略数据包,并继续监视总线以等待新的令牌。如果中断已经在设备的队列中,一旦收到 IN 令牌,设备就会发送一个数据包,包中包含与该中断有关的数据。主机成功接收后,主机将返回 ACK。但是,如果数据已损坏,则主机将不返回任何状态。另一方面,如果在主机使用 IN 令牌轮询中断端点时中断条件不存在,则该功能设备通过发送 NAK 来发出此状态信号。如果此端点发生错误,则会发送一个 STALL 包最为对 IN 令牌的回复。
 
(2)OUT:如果主机要发送中断数据,设备,它将发出 OUT 令牌,后跟一个包含中断数据的数据包。如果 OUT 令牌或数据包的任何部分损坏,则功能设备将忽略该包。如果功能设备的端点缓冲区为空,并且已将数据输入至端点缓冲区,则设备将发出 ACK 通知主机已成功接收数据。如果端点忙于处理先前的数据包而导致端点缓冲区不为空,则设备返回 NAK。果端点发生错误,并且其停止位已设置,它将返回一个 STALL。

 

同步传输(Isochronous Transfers)

同步传输的特点是持续不断(continuously )且具有周期性(periodically),它们通常包含对时间敏感的信息,例如音频流或视频流。如果音频流中的数据存在延迟或重传,听到的声音就有毛刺,节奏也不再同步。相反,如果数据包或帧偶尔被丢弃,则监听者却不太可能注意到它。
同步传输特点:
  • USB 带宽的使用得到保证
  • 可控的延迟(Bounded latency)
  • Stream Pipe - 单向
  • 通过 CRC 进行错误检测,但没有重传或可保证的交付
  • 仅支持全速和高速模式
  • 没有数据切换
 
最大数据有效负载在同步端点(Isochronous Endpoint)的端点描述符(endpoint descriptor)中指定。对于全速设备,最大为 1023 字节;对于高速设备,最大为 1024 字节。负载数据量的大小会影响总线的带宽,所以明智的做法是指定保守的(conservative payload size)有效负载大小。如果使用较大的有效负载,一种较好的做法是,指定一系列具有不同同步有效负载数据量的备用接口(alternative interfaces)。在枚举过程中,主机由于带宽限制而无法启用您首选的同步端点,它可以回滚到其他可选项,而不仅仅是完全失败掉。同步端点上发送的数据可能小于预先协商的大小,而且不同事务之间长度也可能会有所不同。
 
上图显示了同步 IN 和 OUT 事务的数据格式。同步事务没有握手阶段,无法报告错误,无法通告 STALL/HALT 情况。
 

批量传输(Bulk Transfers)

批量传输用于大量突发数据的情况,典型的如打印机的打印作业,扫描仪生成扫描图像作业。批量传输提供错误纠正(以数据负载中的 CRC16 字段形式提供)、错误检测、错误重传机制,可确保数据的发送和接收不会出错。
 
在分配了所有其他事务之后,批量传输使用总线上备用的、未分配的带宽。如果总线正忙于同步和/或者中断事务,批量数据可能会在总线上缓慢低速传输。因此,批量传输只能用于对时间不敏感的通信场合,因为它不能保证延迟。
 
批量传输特点:
  • 用于传输大量突发数据。
  • 通过CRC进行错误检测,并保证交付。
  • 无法保证带宽或最小延迟。
  • Stream Pipe - 单向
  • 仅全速和高速模式支持。
 
批量传输仅全速和高速设备支持。对于全速端点,最大批量数据包大小为 8、16、32 或 64 字节长。对于高速端点,最大数据包大小最多可以为 512 字节。如果数据负载小于最大数据包大小,不需要用 0 填充。批量传输完成的判定是:已传输的数据量是请求的数据量;传输的数据包小于端点的最大值;传输了零长度的数据包。
 
上图显示了批量传输 IN 和 OUT 事务的格式。
(1)IN:当主机准备好接收批量数据时,它将发出 IN 令牌。如果功能设备接收到的 IN 令牌有错误,它将忽略该数据包;否则设备要么回复一个包含要发送的批量数据的 DATA 包,要么发送一个指示端点错误的 STALL 包,要么发送一个指示端点忙、暂时无数据要发送的 NAK 包。
 
(2)OUT:当主机要向功能设备发送批量数据包时,先发出 OUT 令牌,后跟一个包含批量数据的数据包。如果 OUT 令牌或数据包的任何部分损坏,则设备将忽略该包。如果设备端点缓冲区为空并且已经将数据输入至端点缓冲区,它将发出 ACK 包通知主机自己已成功接收数据。如果由于处理先前的数据包而导致端点缓冲区不为空,设备返回 NAK 包。如果端点有错误并且其停止位(halt bit)已设置,它将返回一个 STALL 包。

 

带宽管理(Bandwidth Management)

总线带宽由主机负责管理。在枚举阶段的配置同步/中断传输端点和总线的整个操作过程当中都可以进行带宽管理。规范对总线做了限制:任何帧只要分配的带宽不超过 90%,都可以在全速总线上周期性传输(中断和同步)。在高速总线上,此限制减少到不超过80%的微帧可以分配给周期性传输。
 
因此,很快您可以看到,如果您有一个周期性传输的高度饱和的总线,则剩下的 10% 留给控制传输使用,这些分配完后,批量传输将获得剩余的带宽。

附录

原文地址:https://www.cnblogs.com/rockyching2009/p/13945741.html