USB3.0接口——(3)协议层(包格式)

1.协议层

1.1.超高速传输事务

超高速事务(SuperSpeed transactions)由主机对设备端点请求或发送数据开始,并在端点发送数据或确认收到数据时完成。
超高速总线上的数据传输(transfer)是主机请求设备应用程序生成的数据,然后该请求被分解成一个或多个突发事务(burst transactions)。
当等待完成当前的总线事务时,超高速主机可以启动一个或多个OUT总线事务到一个或多个端点。

注意:在满足如下条件之一前,超高速主机不可以发起另一个IN总线事务到任何端点:

• 接收到所有DPs,或者一个NRDY,或者一个STALL TP,或者发送给非等时(non-isochronous)端点的当前ACK TP事务超时;

或者

• 接收到所有的已经请求过的DPs,或者接收到一个短包(short packet),或者接收到一个last packet flag被设置的DP,或者发送给等时(isochronous)端点的当前ACK TP事务超时。

对于非等时传输(non-isochronous transfers),端点可能通过如下方式对有效的事务(valid transactions)做出响应:

• 返回一个NRDY事务包(Transaction Packet)

• 返回ACK事务包(Transaction Packet)来接受OUT事务 • 返回一个或多个数据包来响应IN事务

• 如果遇到端点内部错误,返回一个STALL事务包(Transaction Packet)

NRDY 事务包(TP)响应表示端点没有准备好接受或者发送数据。结果,在该端点通知主机它已经准备好之前,主机和该端点之间不应该有进一步的活动。这就允许主机和设备之间的链路被设置到低功耗状态(reduced power state),直到端点准备好接受或者发送数据。一旦准备好,端点异步发送一个通知(ERDY TP)给主机,告诉主机它现在已经准备好搬移数据,而主机也通过重新调度先前的请求来做出对该通知的响应。注意等时传输不使用ERDY 或者 NRDY TPs,因为它们是由主机周期性地服务的。此外,在等时端点上发送或者接收的数据包不需要确认,也就是说,没有ACK TPs被发送来确认数据包的接收。

端点只响应由主机作出的请求。主机负责调度总线上的事务,并维护总线上数据搬移的优先级和公平性(priority and fairness);这是通过对IN和OUT请求进行计时和排序(timing and ordering)达到的。事务不是广播;包通过一条直接的路径在主机和设备间穿越(traverse a direct path)。任何没有被使用的链路都可以被设置到低功耗状态(reduced power states),使得总线可以满足严苛的电源管理要求(amenable to aggressive power management)。

1.2.数据包类型

在这里插入图片描述

超高速USB使用4种基本数据包类型,每个类型又有一个或者多个子类型。这4种类型如下:

• 链路管理包【Link Management Packets (LMP)】
只在一对链路(一对直接连接的端口)之间传送,主要用于管理这条链路。

• 事务包【Transaction Packets (TP)】
在所有的直接连接主机和设备的链路上传送。它们被用于数据包流程控制制,配置设备及集线器等等。事务包没有数据负载。

• 数据包【Data Packets (DP)】
在所有的直接连接主机和设备的链路上传送。数据包有两部分:数据包头【Data Packet Header (DPH)】以及数据包负载【Data Packet Payload (DPP)】。

• 等时时戳包【Isochronous Timestamp Packets (ITP)】
是在主机到一个或多个设备间的所有活动链路(active links)上的多播(multicast)。

所有的包都包含一个14字节的头部,紧接包尾的2字节链路控制字(Link Control Word)(总共16字节)。所有的头都有一个Type字段,被接收实体(receiving entity)(例如主机,集线器,或者设备)用来判断如何处理这个包。所有的头部都包含2字节CRC (CRC-16)。包头具有在1020个比特中少于1个不可校正或不可检验(uncorrectable or undetectable)的错误率。

所有的设备(包括集线器)以及主机都消耗掉它们接收到的链路管理包(LMPs)。集线器有附加的责任来转发DPs, ITPs, 以及TPs到接近设备的下行端口(downstream port nearer a device),或者到接近主机的上行端口(upstream port nearer the host)。注意等时时戳包(ITPs)只由主机发送,而由设备接收。所有除链路管理包(LMPs)之外的包都会被集线器转发,除非这个包是路由给该集线器自己的。对路由等时时戳包(ITPs)的附加规则在第8.7节中描述。注意,在TP, ITP, 或者DPH中的链路控制字(Link Control Word)可能会被集线器在转发之前改变。

如果Type字段的值是Transaction Packet 或者Data Packet Header,那么Route String和Device Address字段将依照Type字段而定。Route String字段被集线器用于路由在其上行端口出现的数据包到适当的下行端口。从设备来的数据包总是从集线器的下行端口路由到其上行端口。Device Address字段用来供主机识别一个数据包的源。所有其它的字段将在本章后面得以详述。

数据包在包头中包含附加的信息用来描述数据块(Data Block)。数据块(Data Block)总是紧跟4字节的CRC-32字段,用以判定数据的正确性。数据块和CRC-32一起被称作数据包负载(Data Packet Payload)。

1.3.数据包格式

注意:保留值和保留字段的处理
保留字段和保留值不允许以Vendor特定的方式使用。
发送方应该将所有的保留字段都设置为零值,接收方应该忽略所有的保留字段。
发送方不允许将已定义的字段设置成保留值,接收方应该忽略所有的将已定义字段的值设成了保留值的数据包。

1.3.1.包头

在这里插入图片描述

组成包类型和子类型(packet type and subtypes)的各个字段。
数据包字节和bit位定义使用未编码的数据格式来定义。

1.3.1.1.所有包头都有的字段
1.3.1.1.1.Type字段

所有的超高速头包都是以Type字段开始的,用以判定如何解释该包。在高层次上这告诉包的接收者如何处理它:要么使用它来管理链路,要么用来控制设备和主机之间的数据流。

Type字段是一个5-bit的字段,用于指定数据包的具体格式。类型是被中间的链路用于判定数据包如何被使用或者被转发。

在这里插入图片描述

1.3.1.1.2.CRC-16

所有的包头都有16-bit CRC字段。这个字段是对前面的12字节进行CRC计算而得到的。

1.3.1.1.3.链路控制字(Link Control Word)

在这里插入图片描述
在这里插入图片描述

1.4.链路管理包

在这里插入图片描述

Type 字段设置成Link Management Packet 的数据包被称作链路管理包LMPs。这些数据包被用来管理单个链路。它们不携带地址信息,因此不能被路由。它们可能因执行集线器端口命令而被生成。例如,一个集线器命令可被用来设置U2不活动超时值(U2 inactivity timeout)。此外,他们被用来交换端口能力信息以及完成测试目的。

1.4.1.Sub Type字段

LMP Subtype字段的值进一步标示LMP的内容
在这里插入图片描述

1.4.2.Set Link Function

Set Link Function LMP应该被用来配置可以无须脱离活动状态(U0)就能被改变的功能性(functionality)。

一旦接收到一个Force_LinkPM_Accept bit有效的(asserted)LMP包,端口应该接受所有的LGO_U1 和 LGO_U2链路命令,直到端口接收到Force_LinkPM_Accept无效的(de-asserted)LMP包。

设备必须保持在U1或U2,直到下行端口发起退出到U0。软件在发起导致生成LGO_U1 或者LGO_U2链路命令的SetPortFeature命令之前,需要确保链路层级上没有正在等待的包(no pending packets at the link level)。在常规操作期间,该特性只能在所有将链路状态从U0降低到U1或U2的其他方式都失败的情况下使用。这个LMP是在集线器接收到一个SetPortFeature (FORCE_LINKPM_ACCEPT)命令时,发送给连接给特定端口上的设备。
注意,不恰当地使用Force_LinkPM_Accept功能可能极大地影响链路性能,而在某些情况下(仅指在常规操作期间使用时)可能导致设备不能被返回到正常操作。

这个LMP被集线器在接收到SetPortFeature (FORCE_LINKPM_ACCEPT)命令时,发送给连接到特定端口上的设备。
在这里插入图片描述

在这里插入图片描述

1.4.3.U2不活动超时(Inactivity Timeout)

U2不活动超时LMP应该被用来定义从U1转换到U2的超时值。【已勘误,对于上行端口,没有U1不活动定时器。】
在这里插入图片描述

U2不活动超时功能(Inactivity Timer Functionality)

在这里插入图片描述
在这里插入图片描述

1.4.4.制造商设备测试(Vendor Device Test)

使用这个LMP主要是为了制造商特定的测试目的,不应该用于正常的链路操作。

在这里插入图片描述

制造商特定的测试功能
在这里插入图片描述

1.4.5.端口能力(Port Capabilities)

端口能力LMP(Port Capability LMP)描述每个端口的链路能力,且在成功完成训练和链路初始化之后,链路伙伴双方都要发送。在端口从Polling进入U0之后,端口应该发送在链路初始化(完成之后的tPortConfiguration时间内发送Port Capability LMP。注意端口可能不总是从Polling直接转换进入U0,而是在进入U0之前可能通过其他中间状态(例如,Recovery或Hot Reset)转换。不论在Polling和进入U0之间经过了什么状态,设备都应该在进入U0时立即发送一个Port Capability LMP。

如果一个链路伙伴在tPortConfiguration时间内没有接收到这个LMP,那么:

如果链路伙伴有下行能力,它应该按照第10.14.2.6节所描述的那样发送一个错误信号。
如果链路伙伴只支持上行能力,那么上行端口应该转换到SS.Disabled状态,并且应该尝试以这个设备支持的其它速度进行连接。
在这里插入图片描述

端口能力LMP 格式
在这里插入图片描述
在交换端口能力LMPs之后,链路伙伴应该根据下表所指定的那样来判定由哪一方被配置为下行端口。

端口类型选择矩阵
在这里插入图片描述
注1: 如果TieBreaker字段相等,那么链路伙伴双方应该用新的不同TieBreaker值来重新交换端口能力LMPs。端口生成TieBreaker字段值的顺序应该足够随机。【译注:TieBreaker本身就含有决胜局之意。】

1.4.6.端口配置(Port Configuration)

这一节只描述与端口能力LMP有区别的字段。所有的支持下行端口能力的超高速端口都应该能够发送这个LMP。如果即将被配置成上行模式的端口没有在链路被初始化之后的tPortConfiguration时间内接收到这个LMP,那么这个上行端口应该切换到SS.Disabled状态,并且应该尝试以这个设备支持的其它速度进行连接。
在这里插入图片描述

端口配置LMP格式 (与端口能力LMP有区别之处)

在这里插入图片描述
被配置为下行模式的端口应该发送这个端口配置LMP给上行端口。发送该LMP的端口应该只选择Link Speed字段的其中1个比特。如果有能力充当下行端口的端口不能与其链路伙伴协同工作,那么该有能力充当下行端口的端口应该发送一个错误信号。

1.4.7.端口配置响应(Port Configuration Response)

在这里插入图片描述

这个LMP是由上行端口作为对端口配置LMP的响应而发出的。他被用作对端口配置LMP的接受或者拒绝的指示。这一节也只描述与端口能力LMP有区别的字段。
所有支持上行端口能力的超高速端口都应该能够发送这个LMP。
如果下行端口在tPortConfiguration之内没有收到这个LMP,则它应该发送一个错误信号。

端口配置响应LMP格式 (与端口能力LMP有区别之处)

在这里插入图片描述
如果Response Code 指示Link Speed 被上行端口拒绝, 下行端口应该发送一个错误信号。

1.5.事务包【Transaction Packet (TP)】

事务包(TPs)被用来报告数据事务的状态,并且可以返回值用以指示数据包的成功接收(reception of data packets),命令被接收或拒绝(command acceptance or rejection),流程控制(flow control),以及暂停情况(halt conditions)。
组成事务的包依端点类型的不同而有所不同。有4种端点类型:批量(bulk),控制(control),中断(interrupt),以及等时(isochronous)。
在这里插入图片描述

事务包 (TPs) 穿越主机和设备之间的直接路径。
事务包被用来控制数据流和管理端到端的连接。
Type字段的值应该设置为Transaction Packet (即00100b)。
Route String字段是被集线器用来路由出现在其上行端口上的包到正确的下行端口。从设备发出的事务包的路由字串被设置为零。
当主机发送一个事务包时,Device Address字段包含预定的接收者的地址。当设备发送一个事务包给主机时,它将Device Address字段设置为它自己的设备地址。该字段被主机用来识别事务包的来源。
事务包中SubType字段被接收者用来判定事务包的格式和使用方式。

在这里插入图片描述

1.5.1.ACK

这个事务包用于两个目的:

对于IN端点,由主机发送该事务包,用来从设备请求数据,以及对主机之前接收到的数据包进行确认。
对于OUT端点,由设备发送该事务包,用来对主机之前发送的数据包进行接收确认,以及通知主机在接收到这个包后设备还有多少个数据包缓冲区可用。
在这里插入图片描述

确认事务包 ACK TP 格式
在这里插入图片描述
在这里插入图片描述

1.5.2.NRDY

只能由设备的非等时端点发送这个事务包。OUT端点在设备没有包缓冲区来接收主机已经发送来的数据包DP的情况下,发送这个TP给主机。IN端点在不能发送数据包DP给主机的情况下,发送这个TP给主机,作为对主机已经发送来的ACK TP的响应。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

在这里插入图片描述

1.5.3.ERDY

只能由设备的非等时端点发送这个事务包。它被用来通知主机,端点已经准备好发送或者接收数据包。

本节只描述与ACK TP有区别的字段。

在这里插入图片描述

ERDY TP 格式 (与 ACK TP 有区别部分)
在这里插入图片描述

1.5.4.STATUS

只能由主机发送这个事务包。它被用来通知设备的控制端点,主机已经发起控制传输的状态阶段。这个TP应该只被发送给控制端点。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

STATUS TP 格式(与 ACK TP 有区别部分)
在这里插入图片描述

1.5.5.STALL

只能由设备的端点发送这个事务包。它被用来通知主机,端点已经被暂停(halted)或者控制传输无效。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

在这里插入图片描述

1.5.6.DEV_NOTIFICATION

只能由设备发送这个事务包。它被设备用来通知主机,设备或者接口状态有异步改变,例如,用来识别设备中引起设备执行一次远程唤醒操作的功能(function)。这个事务包不是从一个特别的端点发送的,在总体上是由设备发送的。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

设备通知 TP 格式 (与 ACK TP 有区别部分)
在这里插入图片描述

1.5.7.PING

这个事务包只能被主机发送。他被主机用来在发起一个等时传输之前,将到一个设备的所有链路转换到U0状态。参考附录C中关于使用这个TP的细节。本节只描述与ACK TP有区别的字段。

设备应该通过在tPingResponse时间(参考表8-33)内,发送PING_RESPONSE TP给主机,来响应PING TP(参考8.5.8节)。注意设备不应该验证EP_NUM和Direction字段,而是简单地将它们拷贝到PING_RESPONSE TP的相关字段中【已勘误】。

设备应该将其链路保持在U0状态,直到它从主机接收到一个后续包,或者直到tPingResponse时间(参考表8-33)超时。

在这里插入图片描述

PING TP 格式 (与 ACK TP 有区别的地方)

在这里插入图片描述

1.5.8.PING_RESPONSE

这个事务包只能由设备发送,来响应主机发送的PING TP。每接收到一个PING TP都应该发送一个PING_RESPONSE TP。参考附录C中关于使用这个TP的细节。本节只描述与ACK TP有区别的字段。

PING_RESPONSE TP 格式 (与 ACK TP 有区别的地方)
在这里插入图片描述

1.6.数据包

数据包可以被主机或者设备发送。主机用这个包发送数据给设备。设备用这个包返回数据给主机,作为对ACK TP的相应。
所有的数据包都由数据包头(Data Packet Header)和数据包负载(Data Packet Payload)组成。本节只描述与ACK TP有区别的字段。

数据包在主机和设备间的直接路径上穿行。
注意发送零长数据块的数据包是允许的,但还是需要一个CRC-32。
在这里插入图片描述

数据包格式 (与 ACK TP 有区别的地方)

在这里插入图片描述
在这里插入图片描述

1.7.等时时戳包【ITP】

ITP的Type字段是01100b (Isochronous Timestamp Packet)。ITPs 被用于从主机传送时间戳信息到所有的活动设备。ITPs不携带寻址或者路由信息,被集线器多播(multicast)到其链路处于U0状态的所有下行端口。设备不应该响应ITP。ITP用来提供主机端的时序信息到设备以达到同步。注意所有的设备或者集线器都可能接收ITP。主机应该当且仅当根端口链路已经在U0状态时在该链路上传送ITP。只有主机应该发起ITP传送。主机不应该为了要传送ITP而将根端口链路带进U0状态。如果根端口链路处于U0状态,主机应该在每个总线间隔的边界的tTimestampWindow内传送一个ITP。主机应该在主机的根端口的链路从轮询状态进入U0状态tIsochronousTimestampStart时间内开始传送ITPs。ITP可以在一个突发的包之间传送。如果一个设备接收到一个链路控制字中的延迟标志(DL)被设置的ITP,其时间戳值可能非常不精确,可以被设备忽略。
在这里插入图片描述

等时时戳包格式

在这里插入图片描述
在ITP的第一个分帧符号(framing symbol)被传送时测量的ITP的ITS值精确度应该具有主机时钟(用于ITP生成)值的±1个 tIsochTimestampGranularity单位。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LAMMPS学习】九、LAMMPS脚本 示例

9. 示例脚本 LAMMPS 发行版包含一个包含许多示例问题的示例子目录。许多是二维模型,运行速度快且易于可视化,在台式机上运行最多需要几分钟。每个问题都有一个输入脚本 (in.*),并在运行时生成一个日志文件 (log.*)。有些使用初始坐标的数据文…

Linux-基础IO

🌎Linux基础IO 文章目录: Linux基础IO C语言中IO交互       常用C接口         fopen         fputs         fwrite         fgets 当前路径       三个文件流 系统文件IO       open函数     …

特征模态分解(FMD):一种小众而又新颖的分解方法

​ 声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 今天为大家介绍一个小众而又新颖的信号分…

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …

接口文档不显示新写的接口

新写的接口,但是不显示: 仔细对比源码才发现没有写tag: 然后就有了:

ES6之正则扩展

正则表达式扩展 u修饰符(Unicode模式)y修饰符(Sticky或粘连模式)s修饰符(dotAll模式)Unicode属性转义正则实例的flags属性字符串方法与正则表达式的整合 javascript的常用的正则表达式 验证数字邮箱验证手机…

C语言中的循环队列与栈、队列之间的转换实现

引言 在数据结构的学习中,栈(Stack)和队列(Queue)是两个非常重要的概念。它们分别遵循着后进先出(LIFO)和先进先出(FIFO)的原则。在某些情况下,我们可能需要…

C++——超简单登录项目

程序入口文件 #include <QtWidgets/QApplication> // 包含登录页面头文件 #include "DlgLogin.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 程序入口// 调页面起来//DlgMain w;//w.show();// 换成登录页面DlgLogin w;w.show();return…

开源禅道zentao的使用

很不幸禅道因为漏洞被人进攻了&#xff0c;被迫研究。 1.安装 直接使用docker进行部署&#xff0c;这里有非常多门道。官网的镜像easysoft-zentao是属于docker安装&#xff0c;而idoop的镜像虽然也是docker安装&#xff0c;但是实际是使用官网linux一键安装的版本&#xff0c…

一周学习总结:数组与链表

学习内容&#xff1a;数组与链表、计算机网络知识 数组&#xff1a; 从数组的基础知识到相关应用 数组的基础知识&#xff1a;数组在内存中的存储、数组的相关操作&#xff08;获取与更新&#xff09;、数组的相关应用&#xff1a; 二分查找法⭐⭐⭐⭐⭐ ● 掌握左闭右闭的…

2024第16届四川教育后勤装备展6月1日举办 欢迎参观

2024第16届四川教育后勤装备展6月1日举办 欢迎参观 邀请函 主办单位&#xff1a; 中国西部教体融合博览会组委会 承办单位&#xff1a;重庆港华展览有限公司 博览会主题&#xff1a;责任教育 科教兴邦 组委会&#xff1a;交易会159交易会2351交易会9466 展会背景 成都…

Chatgpt教你使用Python开发iPhone风格计算器

上次使用Chatgpt写爬虫&#xff0c;虽然写出来的代码很多需要修改后才能运行&#xff0c;但Chatgpt提供的思路和框架都是没问题。 这次让Chatgpt写一写GUI程序&#xff0c;也就是你常看到的桌面图形程序。 由于第一次测试&#xff0c;就来个简单点的&#xff0c;用Python写用…

GPU Burn测试指导

工具下载链接&#xff1a; https://codeload.github.com/wilicc/gpu-burn/zip/master测试方法&#xff1a; 上传工具到操作系统下&#xff0c;解压缩工具&#xff0c;使用make命令完成编译&#xff08;确保cuda环境变量已经配置成功、 nvcc -v能显示结果&#xff09;。 如果安…

文献速递:多模态深度学习在医疗中的应用--多模式婴儿脑分割技术:模糊引导深度学习

Title 题目 Multimodal Infant Brain Segmentation by Fuzzy-informed Deep Learning 多模式婴儿脑分割技术&#xff1a;模糊引导深度学习 01 文献速递介绍 日益普及的非侵入式婴儿脑磁共振图像&#xff08;MRI&#xff09;为准确理解脑主要发展轨迹的动态性提供了机会&…

树莓派|串口通信协议

1、串口通信原理 串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种通讯方式。串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的协议。串…

“ModuleNotFoundError: No module named ‘selenium‘”报错如何解决

接上节&#xff1a;测试平台开发之测试框架改造并发执行及结果隔离(1) 上节博客的末尾提到&#xff1a;在命令窗口执行python main.py 可是执行的时候遇到了如下报错&#xff1a; ERRORS _____________________________________________________________ ERROR collecting te…

如何安全高效地进行4S店文件分发,保护核心资产?

4S店与总部之间的文件分发是确保双方沟通顺畅、信息共享和决策支持的重要环节。4S店文件分发涉及到以下文件类型&#xff1a; 销售报告&#xff1a;4S店需要定期向总部提交销售报告&#xff0c;包括销售数量、销售额、市场份额等关键指标。 库存管理文件&#xff1a;包括车辆库…

使用docker创建hadoop集群:Couldn‘t upload the file

运行的环境; Windows10 Docker Desktopdocker-hadoop 出现的问题如下: 解决方法 https://github.com/big-data-europe/docker-hadoop/issues/98

Unity Pixels Per Unit 与 Sprite Renderer Scale的逻辑关系,为什么平铺的Sprite Renderer会变形?

SpriteRenderer之前用的比较基础&#xff0c;没遇到过什么问题&#xff0c;这几天使用SpriteRenderer的平铺时发现平铺变形了&#xff0c;研究了一下&#xff0c;原来有这么多在逻辑在里面。 当我们导入图片选择Texture Type为Sprite时表示我们的图片用途是UI或者SpriteRendere…

【go项目01_学习记录12】

代码组织 1 代码结构2 重构与测试2.1 安装测试功能2.2 testify 的常用断言函数 3 表组测试 1 代码结构 所有的代码写在一个main.go文件里面&#xff0c;GO编译器也是可以正常执行的。但是当代码量很庞大时&#xff0c;很难进行维护。 Go Web 程序的代码组织 单文件——反模式…