8 协议层(Protocol Layer)
协议层管理 Host 和 Device 间 end-to-end 数据流,是建立在链路层正确传输基础上的。本章详细描述:
- 包类型;(LMP,DP,TP,ITP)
- 包格式;
- 包期待的响应;
- 四种 transaction 类型
8.8 三个参数地址信息(Addressing Triple)
数据包和大部分事务包提供使用一个由三个域构成的地址访问指定数据流的权限。它们是设备地址(Device Address)、端点号(Endpoint Number)和方向域(Direction)。
一旦复位和上电,设备地址默认值为 0 ,应该在枚举过程期间被主机用 1 到 127 之间的值来编程。设备地址 0 保留成默认地址,不能分配给任何其他使用。
设备除去必须的默认端点号为 0 的默认控制端点外,可以支持最大值达到 15 个 IN 和 15 个 OUT 端点(由方向域指示)。
8.9 路由字符域
路由字符是在下游导向(向下游端口方向发送)的包中一个 20 位的域,集线器使用其进行路由选择,将包传递到指定的下游端口。它由一串下游端口号(每个集线器 4 位)组成,集线器使用它到达设备。 集线器使用集线器深度值 HubDepth 乘以 4 作为在路由字符域中要定位的偏移值,集线器用它来决定下游端口号。集线器深度值在枚举过程期间,由每个集线器决定和分配。
注意这个域(路由字符)只在主机发送的包中有效,当被设备发送时,这个域是保留的。
上图中集线器 @Tier1 域值是直接连接到主机根端口之一的集线器的下游端口号。
注意:上图中结构是每 4bit 表示一个端口号。因此不同端口号是以4为模进行偏移。
8.9.1 路由字符端口域(Route String Port Field)
在路由字符中的这 4 位宽度区域代表要被寻址的集线器端口
8.9.2 路由字符端口域宽度(Route String Port Field Width)
路由字符端口域宽度是固定为 4 位,端口号的最大值限制为 15 。
8.9.3 端口号(Port Number)
包直接传向的集线器上指定的端口,由路由字符端口域值确定。当寻址集线器控制器时,然后在集线器层的路由字符中端口号域应该被设置为 0 。集线器的下游端口以 1 开头寻址,并按顺序计数。
8.10 事务包使用(Transaction Packet Usages)
TP 被用来报告数据事务传输的状态,能返回指示数据包、命令接收或拒绝,流控的成功接收和停止条件的值。
8.10.1 流控制条件
这部分描述当一个端点返回一个流控制应答时,在主机和设备之间的相互作用。流控制是在主机和设备端点之间的端对端级的。只有块,控制和中断端点可以发送流控制应答。同步端点不能发送流控制应答。
如果一个 IN 端点返回下面对 ACK TP 的应答之一(返回数据),则应该被认为这是在一次流控制条件中:(对主机请求数据事务包的应答)
- NRDY TP 应答
- 发送一个 DPH 中 EOB(End Of Burst) 域值为 1 的 DP。
如果一个 OUT 端点返回下面的对 DP 的应答之一, 则应该被认为在流控制条件中:
- NRDY TP 应答
- 发送一个 NumP 域值为 0 的 ACK TP
只有当被主机设置时 Packets Pending 域才有效,它不影响端点进入流控制状态。详细参考 8.11 的主机与设备的 TP 应答。
当端点在流控制条件中,它应该发送一个 ERDY TP 使自己进入活动状态。而且,如果端点是 IN 端点,那么它应该一直等待,直到它在能发送 ERDY TP 之前,为它发送的最后一个 DP 收到 ACK TP。当端点不在一个流控制条件中,它不应该发送一个 ERDY TP,除非端点是支持流的块端点。注意主机能重新开始到任何端点的事务处理 —— 甚至端点在返回一个流控制应答以后还没有返回 ERDY TP 。
8.10.2 Burst Transactions(突发事务处理)
只要设备能够接收数据,超速 USB 协议就允许主机连续发送数据给一个设备或者只要设备能够发送数据,主机就连续能从设备接受数据。设备端点能不需 ACK 而一次发送或者接受数据包数量(burst size)被记录在设备的 endpoint companion descriptor 中。在端点最大突发大小中记录的值为不止一个包(最大突发尺寸大于 1 ),则被认为能支持 “突发” 事务处理。(如果突发大小为1,则意义为发送一个数据包而不需要 ACK 应答,这相当于没有突发,还是发送每个数据包后要发送 ACK TP )下面的规则适用于突发:
在收到 ACK 之前,能在突发中发送的最大包数,被限制为 端点的最大突发大小 加上 端点或主机收到最后一个 ACK TP 包的 NumP 域的值,减去在被最后一个 ACK TP 包应答之后端点或主机已经发送的包数。
(收到一个 ACK 之前一次突发中能被发送的最大包数 <= 端点的最大突发大小 + 收到的最后一个 ACK TP 包的 NumP 域值 - 在被最后一个 ACK TP 包应答的包之后已经发送的包数)
在突发中的每个包都要有一个最大数据包尺寸的数据负载。仅仅在一次突发的最后一个包的大小能比描述符中记录的最大数据包尺寸小(类似于 USB2.0 )。如果最后一个包较小,则对于短包的相同规则也适用一个在一次突发结尾的短包(参考 8.10.3 短包)。
只要 ACK TP 包的 NumP 域值不为 0,突发传输事务就能持续,每个包都有最大包尺寸大小的数据负载。
只要主机或者设备想要持续接受数据,NumP 域值能在任何时候通过主机或者设备发送 ACK TP 包来增加。仅仅要求是 NumP 域值不能比设备支持的最大突发尺寸大。
如果设备或者主机发送一个 NumP 域值减少的 ACK TP 包,那么减少的值不能比 1 大。例如,如果前一个 ACK TP 包 NumP 域值为 5,那么对下一个收到的包的 ACK TP 的 NumP 域值不应该比 4 小,只有下面的情况除外:
如果设备能够接受数据但是不能再接收更多的数据了,则它应该发送一个 NumP 域值设为 0 的 ACK TP 包。
主机应该发送一个 NumP 域值设为 0 的 ACK TP 包作为设备发送一个带有 EOB 域值被置位的 DP 包或者是短包的的应答。
但是,如果主机收到一个短包,主机还需要在同一个端点上开始另外一次传输,那么主机可以发送一条 NumP 域值为非零值的 ACK TP 包来替代发送一个为 0 的 ACK TP 包。
8.10.3 短包
超速保持 USB2.0 支持的短包功能。当设备或主机收到数据长度区域比端点最大包尺寸小的 DP,则它应该认为传输完成了。
在 IN 传输中,设备应该在发送一个短包 DP 后,停止发送 DPs 。主机应该用一个 NumP 域为 0 的 ACK TP 对短包应答。当此端点开始另外一次传输,主机应该对设备端点安排事务。
在 OUT 事务中,主机可以在发送一个短包后停止发送 DPs ,主机在此端点开始另外一次传输时应该给设备端点安排事务。注意这为端点的一次新突发的开始。
8.10.4 SuperSpeedPlus 事务重新排序
SuperSpeedPlus Transaction Reordering。
8.11 TP 或 DP应答
发送和接收设备应该返回 DPs 或 TPs,正如 Table 8-25 到 Table 8-27 详细描述的。注意依赖域传输类型和 TP 流的方向,并非所有 TP 被允许。
8.11.1 设备对 TP 请求数据的应答
Device Response to TP Requesting Data。
Table 8-25 显示了设备对块、控制和中断端点的 TP 请求数据的可能应答方式。如果有个不正确的设备地址或者端点号和方向,一个 TP 被当作无效。
8.11.2 主机对收到设备的数据应答
Host Response to Data Received from a Device 。
Table 8-28 显示了主机对块,控制和中断端点收到设备的数据的应答。主机能返回仅仅一个 ACK TP。如果存在以下任何条件,则 DPH 被视为无效:
- 它的设备地址不正确
- 其端点编号和方向不是指属于当前配置一部分的端点
- 它没有预期的序列号
- 它在 DPH 中的数据长度大于端点的最大数据包大小
- 其 TT 与端点类型不匹配(来自在 SuperSpeedPlus 模式下运行的设备)。
在 Table 8-28 中,DPP 错误可能由于下面一个或几个导致:
- CRC 不正确
- DPP 终止
- DPP 丢失
- DPH 中的数据长度不与实际数据长度相符
8.11.3 设备对从主机那收到数据应答
Device Response to Data Received from the Host 。
设备对块,控制和中断端点从主机收到的数据的 TP 应答在 Table 8-29 中表示。如果存在以下任何条件,则 DPH 被视为无效:
- 它的设备地址不正确
- 其端点编号和方向不是指属于当前配置一部分的端点
- 它没有预期的序列号
- 它在 DPH 中的数据长度大于端点的最大数据包大小
- 其 TT 与端点类型不匹配(来自在 SuperSpeedPlus 模式下运行的设备)。
DPP 错误可能由下面一个或多个导致:
- CRC 不正确
- DPP 终止
- DPP 丢失
- DPH 中的数据长度不与实际数据长度相符
注意:ACK TP 的接收是向主机指示前一个顺序号的 DP 被设备成功接收,也指示设备还能够接收主机将要发送 DPs 的有效的数据包的缓存数(NumP 域指示)。设备应该为每个 DP 发送一个 ACK TP 。
8.11.4 设备对 SETUP DP 的应答
SETUP DP 是一种特别的 DP,它通过 Setup 域被设置为 1 来认证,可被寻址到任意端点。 SETUP 是一种主机到设备的特别的数据事务处理,它允许主机初始化一条设备要执行的命令。收到 SETUP DP 的话,设备应该以 Table 8-30 中的应答:
注意如果出现任何下面之一,SETUP DP 应该被当作无效的:
- 不正确的设备地址
- 端点号和方向与端点当前配置部分不符
- 端点号没有适用于一个控制端点
- 非零顺序号(SETUP DP 中所有顺序号都要为 0)
- 数据长度没有被设置为 8
在 Table 8-30 中,DPP 错误可能由于下面一个或多个导致:
- CRC 错误
- DPP 终止
- DPP 丢失
- SETUP DPH 中的数据长度域实际数据长度不符