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

news2024/11/17 11:30:34

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.coloradmin.cn/o/1676277.html

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

相关文章

76岁林子祥升级做爷爷,亲自为孙女取名

林子祥与前妻吴正元的儿子,现年39岁的林德信入行以来绯闻不少,自与圈外女友Candace拍拖后便修心养性,去年他已经低调与拍拖5年多Candace完婚,正式步入人生另一阶段。 昨日(5月12日)林德信借母亲节这个温馨日…

如何在控制台应用程序里面托管ASP.NET Core网站

目录 介绍运行效果开发环境项目结构第三方库引用编写代码介绍 本文如何不通过IIS,使用控制台程序作为宿主主机来运行我们的asp.net core开发的网站程序。通过改案例你也可以后期通过winform或者wpf作为宿主来运行我们的asp.net core开发的网站。 运行效果 开发环境 vs2022+.…

2024年5月面试准备

2024年5月面试准备 资料来源Java基础泛型注解异常反射SPI机制Java集合CollectionMap 并发基础线程并发关键字并发集合Lock核心类并发集合核心类原子类核心类线程池核心类ScheduledThreadPoolExecutorForkJoinPoolFokJoinTask JUC原子类: CAS, Unsafe和原子类详解JUC 工具类 Jav…

【打字】打字训练之针对性键盘区域练习

本文章的核心点是:使用代码生成自己想要训练的键位的词汇,然后导入到打字软件针对性练习 一个程序员突然想纠正打字习惯源于腱鞘炎,虽然使用双拼打字已经不慢了,但是姿势不是很正确,导致了腱鞘炎。 所以想着好好纠正指…

odoo16 银行对账单导入改造

解决问题: odoo原生功能的话 是不能在系统上临时处理文件内容的,只会提示文件内容格式不对。 原始文件格式 在头部与尾部 格式问题,例如csv文件和 C53 文件,做一个前置弹框处理数据之后再导入 camt效果: csv效果:

bugfix:遇见“隐形字符”:ⅰ与i的编码迷局

前言 在软件开发的世界里,遇到各种奇奇怪怪的bug是在所难免的。今天,我就遭遇了一个看似简单实则棘手的问题——用户反馈账号无法登录,系统一直提示“账号不存在”。一番抽丝剥茧后,我发现问题竟然出在一个不起眼的字符上&#x…

xFormers

文章目录 一、关于 xFormers二、安装 xFormers三、基准测试(可选)测试安装 四、使用 xFormers1、Transformers 关键概念2、Repo 地图注意力机制Feed forward mechanismsPositional embeddingResidual pathsInitializations 3、主要特征4、安装故障排除 一…

小红书自动私信获客,打造个人品牌

在当今这个内容为王、社交至上的时代,小红书作为新兴的社交电商平台,凭借其独特的社区氛围和强大的种草能力,成为了众多KOL、商家以及个人品牌打造的首选平台。想要在小红书上脱颖而出,精准引流获客,利用自动私信功能不…

Ajax额

原生Ajax xml 已被json取代 http 请求方法urlhttp版本号 network 谷歌浏览器查看请求报文和响应报文 F12 network header里面有 请求头 响应头 点击view source 可以查看请求响应行 请求体在请求行头下面 get请求有url参数,请求体变为query String…

汇昌联信科技:拼多多电商的运营流程有哪些?

在当今互联网高速发展的时代,电商平台层出不穷,其中拼多多以其独特的团购模式和低价策略迅速崛起,成为众多消费者和商家的新宠。那么,拼多多电商的运营流程究竟包含哪些环节呢?接下来,我们将从商品上架、营销推广、订…

基于PySpark进行去哪儿网数据分析

基于PySpark进行去哪儿网数据分析 本文介绍了如何使用PySpark对去哪儿网的数据进行分析,从而洞察用户偏好、热门目的地以及销售趋势。 1.数据加载 我们需要确保已经准备好了PySpark的开发环境,并且准备好了去哪儿网的数据集。可以通过创建SparkSessio…

vue cmd执行报错 ‘vue‘ 不是内部或外部命令

使用vue脚手架快速搭建项目,在cmd中执行:vue init webpack vue-demo,报错: vue 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决方法,执行如下的命令 npm config list 注意:找到prefix等号后…

在Ubuntu命令行中一行代码配置C++的OpenCV库

本文介绍在Linux操作系统的Ubuntu版本中,配置C 语言环境下的计算机视觉库OpenCV的方法。 首先,为了保证我们可以在Ubuntu中正确配置OpenCV库,需要使得计算机内具有C 开发环境。其中,在Ubuntu中,我们可以基于命令行方便…

第16节 实战:文件转shellcode

我最近做了一个关于shellcode入门和开发的专题课👩🏻‍💻,主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料,内容里面的每一个环境我都亲自测试实操过的记录,有需要的小伙伴可以参考…

在微信小程序项目中安装和使用 Vant 组件库

vant Wwapp 小程序开发组件库官网 Vant Weapp - 轻量、可靠的小程序 UI 组件库 安装 Vant 组件库 1.在微信小程序项目文件目录的空白位置右键,选择在外部终端窗口中打开 2在命令行输入如下命令(在项目中创建包管理配置文件 package.json) …

PHP 自提时间

前端: 后台设置: 代码: public function getBusinessHour(){// 需求单门店$data (new StoreModel())->limit(1)->select()->toArray();$days explode(,, $data[0][shop_hours]);$businessHours $days[1];// 使用 explode 分割字符串,获取开始和结束时…

局域网监控软件有哪些:好用的局域网桌面监控软件神器分享

如何有效地监控和管理内部员工的计算机使用行为,防范潜在的安全风险,提高工作效率,是众多企业管理者关注的焦点。 而一款优秀的局域网桌面监控软件无疑能为企业的IT治理提供有力支撑。 小编在此给大家推荐一款好用的局域网桌面监控软件——域…

地平线X3开发板配置wifi调试

1. 系统镜像制作 系统镜像的制作依赖bsp与补丁包,bsp在天工开物全量包中:https://developer.horizon.ai/resource 补丁下载链接:链接:https://pan.baidu.com/s/1YKcOWL0EpboGq-SnqwIGeQ 提取码:b6lf 补丁包中有详细…

TSINGSEE青犀智慧校园视频综合管理系统建设方案及平台功能

一、方案背景 智慧校园视频综合管理系统以物联网、云计算、大数据分析等新技术为核心,将基于计算机网络的信息服务融入学校的各个应用与服务领域,实现互联和协作。通过“云边缘计算”构架,在各应用子系统的基础数据层面上,打通上…

高级查询(一)

解决需求&#xff1a;Excel都可以轻松搞定 分组查询原理&#xff1a; 语法&#xff1a; SELECT …<列名> FROM <表名> [WHERE<条件表达式> ] GROUP BY 参与分组的列 可以与 聚合函数作用的列 一块显示 注意 SELECT列表中只能包含&#xff1a; 1、被分…