CoryXie

一垄青竹映陋室,半枝桃花衬碧窗。

  :: :: 博问 :: 闪存 :: 新随笔 :: :: 订阅 订阅 :: 管理 ::

故纸堆里翻出来的两年前开始做USB3.0时翻译的UASP规范1.0版本。虽非原创,翻译辛苦,转载请注明出处! 

译者:Cory Xie<cory.xie@gmail.com>

USB大容量存储设备类- USB Attached SCSI Protocol (UASP)

1 介绍

1.1 目标

本规范的目标是提供在[USB2] 或者 [USB3]系统上实现[UAS]传输标准的相关信息。

1.2 范围

本规范提供在[USB2] 或者 [USB3]系统上实现[UAS]传输标准的使用示例以及系统建议。如果本规范和[UAS]有任何冲突,[UAS]在所有冲突上都具有优先性。

1.3 相关文档

[SAM4] ISO/IEC 14776-414, SCSI ArchitectureModel-4 (SAM-4) (ANSI INCITS 447:2008)

[SAS] Serial Attached SCSI Revision 1.1 (SAS1.1), (ANSI INCITS 417:2006)

[SPC] SCSI Primary Commands - 3 (SPC-3) (ANSIINCITS 408:2005)

[SBC] SCSI Block Commands - 2 (SBC-2) (ANSIINCITS 405:2005)

[RBC] Reduced Block Command Set (RBC) (ANSIINCITS 330:2000)

[MMC] MultiMedia Command Set - 5 (MMC-5) (ANSIINCITS 430:2007)

[SSC] SCSI Stream Commands - 2 (SSC-2) (ANSIINCITS 380:2003)

[OSD] Object-Based Storage Devices (OSD) (ANSIINCITS 400:2004)

[UAS] D2095 - USB Attached SCSI, INCITS T10.Download from www.t10.org.

[USB2] Universal Serial Bus SpecificationRevision 2.0, April 27, 2000. Download from www.usb.org.

[USB3] Universal Serial Bus 3.0 SpecificationRevision 1.0, November 12, 2008. Download from www.usb.org

[BOT] Universal Serial Bus Bulk Only TransportRev 1.0, September 31, 1999. Download from www.usb.org.

[SATA] Serial ATA Rev 2.6 (SATA 2.6), February15, 2007. Download from www.sata-io.org.

[AHCI] Advanced Host Controller Interface Rev1.3, June 26, 2008. Download from developer.intel.com

[EHCI] Enhanced Host Controller Interface Rev1.0, March 12, 2002. Download from www.intel.com

[xHCI] Extensible Host Controller Interface,still in development. Download from www.intel.com

For further information regarding ANSI standards,contact ANSI Customer Service Department at 212-642-4900

(phone), 212-302-1286 (fax) or via the World WideWeb at http://www.ansi.org

 

2 管理概览

[USB2]大容量类设备所使用的Bulk Only Transport比较简单,而且在微控制器内实现起来不贵-因此比较适合于基于闪存的存储产品。

[BOT]是单线程的,因为主机发起的每个事务都必须被设备完成,并且完成状态要在开始下一个事务之前必须被传回发起该事务的进程。这就造成了一个总共的数据传输中的较大的开销(大约20%)。[USB3]将数据传输带宽从480 Mb/s增长到5 Gb/s,但是如果仍然使用 [BOT]协议,分析表明,在一个2.4 GHz Core Duo™系统上,实际的传输率大约在250 MB/s,同时CPU利用率达12%。

这个新协议要求新的主机软件和设备固件。通过让设备同时支持[BOT] 和 [UAS],维护了后向兼容性。本文档定义在[USB2] 以及 [USB3]上实现[UAS]协议。

当这些标准(([UAS] 和 UASP)被在主机和设备端实现后,设备会被使用主机端的SCSI软件协议栈来访问,而USB接口将会在主机协议栈中作为SCSI主机适配器。设备将要实现[SAM4]体系结构模型,因此能够在设备中对命令排队(queue commands),在性能上具有相应的增加。

3 功能特性

参见 [UAS], "USB Class Specific Requests" 中类特定的命令。

4 标准描述符【Standard Descriptors】

参见 [UAS], "USB Descriptors" 中对 UASP 描述符的描述. 表1 列出了UAS定义了的描述符。

 

5 [USB3] 操作

5.1 概览

5.3 和 5.4 小节提供对于非数据,输入数据,输出数据,以及双向数据的样例。这些样例基于图1所描述的系统体系结构。

 

在图1中,有一个应用程序在读或者写一个文件。该应用程序使用文件系统来打开一个在逻辑设备上的文件。文件系统使用逻辑设备信息来定位类驱动。类驱动提供参数,允许文件系统在逻辑设备的范围内发起数据传输请求。类驱动处理来自文件系统的请求,创建命令或者命令序列,并被通过协议驱动发送给目标设备。一旦命令序列被创建完成,类驱动就是用逻辑设备信息来选择协议驱动。协议驱动通过执行任何协议特定的操作,来将命令序列准备好,以便可以传输该命令。最后,协议驱动使用逻辑设备信息来将请求传递给硬件驱动。可能有多个在协议驱动和硬件驱动之间的交互才能完成一个来自类驱动的请求。

使用这个System Driver Stack Example示例,具有许多实现的可能性。在有些实现中,类和协议驱动被合成到一个驱动中。在其他实现中,所有的3层都可能被合在一个驱动中。

[UAS]在体系结构上设计为可以与任意的SCSI命令集标准(例如,[SPC],[SBC], [RBC], [MMC], [SSC], 以及 [OSD])联合工作的协议标准。系统的协议处理部分准备好命令集特定的请求,而且具有对底层物理层体系结构的理解。

5.3 和 5.4 小节中的梯形图以UAS协议驱动收到一个命令开始,显示了随着命令被放置进入恰当的协议格式,并转换成[USB2] 和[USB3]链路层请求,准备传输给设备的通讯流程。这些梯形图没有对物理层进行文档说明。

每一个图都以UAS驱动接收到一个命令开始,这个命令被格式化,而事务请求被发送给硬件驱动。在梯形图中,硬件驱动是xHCI 或者 EHCI驱动。而xHCI 或者 EHCI驱动又导致xHCI 或者 EHCI硬件发送事务包。事务包被设备接收,包含着完成该请求必要的命令,数据或者状态信息。梯形图没有显示各层(链路层,协议,以及命令),这些层会被用来解释并且完成来自主机的请求。

5.2 图示的标注

下面是在图中和图的描述中要使用到的标注(参见5.3 和 5.4 小节)。

a) ITr (Pipe): 在指定管道上的输入传输请求。

b) OTr (Pipe): 在指定管道上的输出传输请求。

c) ITc (Pipe): 在指定管道上的输入传输请求完成。

d) OTc (Pipe): 在指定管道上的输出传输请求完成。

e) NAK (Pipe): [USB2] 中的指定管道上的NAK响应。

f) DATA (Pipe): [USB2] 中的指定管道上的数据事务包。

g) OUT (Pipe): [USB2] 中的指定管道上的输出事务包。

h) IN (Pipe): [USB2] 中的指定管道上的输入事务包。

i) ACK (Pipe): [USB2] 以及[USB3]中的指定管道上的确认事务包。

j) IN ACK (Pipe): [USB3]中的指定管道上的输入确认事务包。

k) IN ACK (Pipe, Prime): [USB3]中的正在准备(priming)第一个操作(SID = Prime)的指定管道上的输入确认事务包。

l) NRDY (Pipe): [USB3] 中设备用来指示设备在指定管道上尚未准备好传输数据的原语。

m) NRDY (Pipe, Prime): [USB3] 中设备在响应Prime pipe(SID = Prime)操作时,用来指示设备在指定管道上尚未准备好传输数据的原语。

n) DP (Pipe): [USB3] 数据包。

o) DP (Pipe, Prime): [USB3] 中的正在准备(priming)第一个操作(SID =Prime)的指定管道上输出数据包。

p) ERDY (Pipe): [USB3] 中设备用来发起输入或者输出操作的原语。

q) SIU: [UAS] 感测信息单元【SenseInformation Unit】.

r) RRIU: [UAS] 读准备好信息单元【ReadReady Information Unit】.

s) WRIU: [UAS] 写准备好信息单元【WriteReady Information Unit】.

t) CIU: [UAS] 命令信息单元【CommandInformation Unit】.

u) SID: [USB3] 流ID【Stream ID】

这些图中打上括号表示这些依赖于实现。如果系统不遵循在这些梯形图中所描述的模型的话,则打上括号的要求可能改变。[UAS]提供了协议排序的要求(protocol ordering requirements)。

5.3 高速UASP

5.3.1 概览

这一小节描述UASP所要求的高速包交换。高速设备仿真[USB3] Streams协议的一个子集。参考[USB3]规范中4.4.6.4 和 8.12.4.1中更多的关于Streams协议的信息。

这个图是使用EHCI驱动的用作高速操作的系统的例子。他们也适用于使用xHCI但是进行高速操作的系统。

5.3.2 非数据传输(Non-data transfer)

非数据传输是UASP中最简单的操作。非数据传输只是用命令和状态管道。主机在命令管道上传输一个Command IU (CIU),而设备在状态管道上用一个Response IU (RIU) 做出响应。

图2说明了高速UASP的非数据(Non-Data)传输。一个发给UAS驱动的非数据传输命令(Non-data Transfer Command)导致UAS驱动发起ITr (Stat) 给EHCI驱动,来允许状态管道接收这个命令的SIU;以及一个OTr (Cmd, CIU) 来传输这个CIU给设备。这个CIU包含用来匹配SIU和CIU的标签。

ITr (Stat) 导致EHCI控制器生成一个IN(Stat)。EHCI控制器通过先传送一个OUT (Cmd), 接着传送一个DATA (Cmd) (里面包含CIU)来作为对OTr (Cmd)的响应。

对于IN (Stat)包的响应,设备先一直返回NAK (Stat)包,直到设备有状态可以返回。当设备接收到DATA (Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。CIU中包含命令标签,用于在命令完成时匹配SIU和CIU。

接收到CIU的ACK (Cmd) 就算完成了EHCI控制器的OTr (Cmd),从而生成一个OTc (Cmd) 给EHCI驱动。EHCI驱动接着返回OTc (Cmd) 给UAS驱动,指示命令已经成功传递给设备。

当命令完成后,设备就用DATA (Stat, SIU) 来响应IN (Stat) ,其中包含SIU。

EHCI控制器用ACK (Stat)响应DATA (Stat) 包,确认SIU的成功接收。对DATA(Stat) 的接收完成了对设备的ITr (Stat) ,从而生成一个In ITc (Stat, SIU) 给EHCI控制器。继而,生成一个ITc (Stat,SIU)给UAS驱动,指示命令已经完成。

接收到CIU的OTc (Cmd) 和SIU的ITc (Stat, SIU) ,导致UAS驱动比较SIU中的标签和CIU中标签,从而完成该命令序列,返回状态给UAS驱动的上层。

5.3.3 数据输入传输(Data-in transfer)

图3说明了高速UASP的数据输入(Data-in)传输。一个来自UAS驱动的数据输入传输命令(Data-in Transfer Command)导致EHCI驱动发起ITr (Stat),来允许EHCI控制器接收这个命令的RRIU;同时也发起一个OTr(Cmd, CIU) 来传输这个CIU给设备。

ITr (Stat) 导致EHCI控制器生成一个IN(Stat)。EHCI控制器通过先传送一个OUT (Cmd), 接着传送一个DATA (Cmd, CIU)来作为对OTr (Cmd)的响应。

对于IN (Stat)包的响应,设备先一直返回NAK (Stat)包,直到设备有状态可以返回。当设备接收到DATA (Cmd),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。CIU中包含命令标签,用于在命令完成时匹配SIU和CIU。

接收到CIU的ACK (Cmd) 就算完成了EHCI控制器的OTr (Cmd),从而生成一个OTc (Cmd) 给EHCI驱动。EHCI驱动接着返回OTc (Cmd) 给UAS驱动,指示命令已经成功传递给设备。

当设备准备好发送数据时,设备就用DATA (Stat, RRIU) 来响应IN (Stat) 轮训。

EHCI控制器用ACK (Stat)响应DATA (Stat,RRIU)包,确认RRIU的成功接收。对DATA (Stat, RRIU)的接收完成了EHCI控制器的ITr (Stat) ,从而生成一个ITc(Stat, RRIU)给EHCI驱动。继而,EHCI驱动返回ITc (Stat, RRIU)给UAS驱动,指示有状态可用。UAS驱动评估该RRIU,并检查标签,来判定设备正在响应哪一个命令的数据。UAS驱动接着发起一个ITr (Stat)给EHCI驱动,使得设备可以返回下一个状态。UAS驱动接着使用RRIU中的标签所指示的buffer来发起一个ITr (Data-in)。

作为对ITr (Stat)的响应, EHCI驱动生成一个IN (Stat),在状态管道上调度一个数据传输。作为对ITr (Stat)的响应,EHCI控制器发送IN (Stat)包给设备,而设备使用NAK (Stat)包来响应,直到设备有状态可以返回。

作为对ITr (Data-in)的响应, EHCI驱动在Data-in管道上调度一个数据传输。

EHCI控制器通过传送IN (Data-in),开始从设备接收数据。

当设备接收到一个IN (Data-in)时,设备用一个包含用于读取数据的DATA (Data-in) 做出响应。当EHCI控制器接在Data-in管道上收到DATA (Data-in)包时 ,它使用 ACK(Data-in)做出响应,确认对读取数据的成功接收。

前面三段所描述的步骤一直重复,直到Data-in 传输完成。

EHCI接收到最后一个Data (Data-in)时(例如,主机buffer满了,或者收到一个短包),就完成了EHCI控制器的ITr (Data-in) ,从而生成一个ITc (Data-in) 给EHCI驱动。继而生成一个ITc(Data-in) 完成给UAS驱动。

当命令完成时,设备用DATA (Stat, SIU) 对IN (Stat) 做出响应。该SIU包含CIU的标签。

EHCI控制器用ACK (Stat) 包来响应DATA (Stat,SIU) ,确认对SIU的成功接收。对DATA (Stat, SIU) 的接收完成了EHCI控制器的ITr (Stat) ,从而生成一个In ITc(Stat, SIU)给EHCI驱动。继而导致EHCI驱动生成一个ITc (Stat, SIU) 给UAS驱动。

接收到的CIU的OTc (Cmd) ,读取数据的ITc (Data-in),以及SIU的ITc (Stat, SIU) ,如果都具有相同的标签,导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。如果ITc (Data-in)还没有被UAS驱动收到,那么就发生了一个错误,UAS驱动应该在返回状态之前终结该ITc (Data-in)。

5.3.4 数据输出传输(Data-out transfer)

图4说明了高速UASP的数据输出(Data-out)传输。一个来自UAS驱动的数据输出传输命令(Data-out Transfer Command)导致EHCI驱动发起ITr (Stat),来允许EHCI控制器接收这个命令的WRIU;同时也发起一个OTr(Cmd, CIU) 来传输这个CIU给设备。

 

ITr (Stat) 导致EHCI控制器生成一个IN(Stat)。EHCI控制器通过先传送一个OUT (Cmd), 接着传送一个DATA (Cmd, CIU)来作为对OTr (Cmd)的响应。

对于IN (Stat)包的响应,设备先一直返回NAK (Stat)包,直到设备有状态可以返回。当设备接收到DATA (Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。CIU中包含命令标签,用于在命令完成时匹配SIU和CIU。

接收到CIU的ACK (Cmd) 就算完成了EHCI控制器的OTr (Cmd),从而生成一个OTc (Cmd) 给EHCI驱动。EHCI驱动接着返回OTc (Cmd) 给UAS驱动,指示命令已经成功传递给设备。

当设备准备好接收数据时,设备就用DATA(Stat, WRIU)来响应IN (Stat) 轮训。

EHCI控制器用ACK (Stat)响应DATA (Stat, WRIU)包,确认WRIU的成功接收。对DATA(Stat, WRIU)的接收完成了EHCI

控制器的ITr (Stat) ,从而生成一个ITc (Stat, WRIU)给EHCI驱动。继而,EHCI驱动返回ITc (Stat, WRIU)给UAS驱动,指示有状态可用。UAS驱动评估该WRIU,并检查标签,来判定设备正在请求哪一个命令的数据。UAS驱动接着发起一个ITr (Stat)给EHCI驱动,使得设备可以返回下一个状态。UAS驱动接着使用WRIU中的标签所指示的buffer来发起一个ITr (Data-out)。

作为对ITr (Stat)的响应, EHCI驱动生成一个IN (Stat),在状态管道上调度一个数据传输。作为对ITr (Stat)的响应,EHCI控制器发送IN (Stat)包给设备,而设备使用NAK (Stat)包来响应,直到设备有状态可以返回。

作为对OTr (Data-out)的响应, EHCI驱动在Data-out管道上调度一个数据传输。

EHCI控制器通过传送一个OUT (Data-out)接着发送一个DATA(Data-out),来开始向设备发送数据。

当设备接收到一个DATA (Data-out)时,设备用一个ACK (Data-out)做出响应,指示写数据已经被收到。           

前面三段所描述的步骤一直重复,直到Data-out传输完成。

EHCI控制器接收到最后一个ACK (Data-out) 时(例如,主机buffer空了,或者发送了一个短包),就完成了EHCI控制器的OTr (Data-out),从而生成一个OTc (Data-out)给EHCI驱动。继而生成一个OTc(Data-out)完成给UAS驱动。

当命令完成时,设备用DATA (Stat, SIU) 对IN (Stat) 做出响应。该SIU包含CIU的标签。

EHCI控制器用ACK (Stat) 包来响应DATA (Stat,SIU) ,确认对SIU的成功接收。对DATA (Stat, SIU) 的接收完成了EHCI控制器的ITr (Stat) ,从而生成一个In ITc(Stat, SIU)给EHCI驱动。继而导致EHCI驱动生成一个ITc (Stat, SIU) 给UAS驱动。

接收到的CIU的OTc (Cmd) ,写出数据的OTc (Data-out),以及SIU的ITc (Stat, SIU) ,如果都具有相同的标签,导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。如果OTc (Data-out)还没有被UAS驱动收到,那么就发生了一个错误,UAS驱动应该在返回状态之前终结该OTc (Data-out)。

5.3.5 双向数据传输(Bi-directional data transfer)

在图5中展示的双向数据传输中,写数据部分在读数据部分之前开始和结束。UASP没有规定双向数据传输的读数据和写数据部分的相对开始和结束时间的顺序要求。

图5说明了高速UASP的双向(Bi-directional)数据传输。一个来自UAS驱动的双向数据传输命令(Bi-directional Transfer Command)导致EHCI驱动发起ITr (Stat),来允许EHCI控制器接收这个命令的WRIU或者RRIU;同时也发起一个OTr(Cmd, CIU) 来传输这个CIU给设备。

ITr (Stat) 导致EHCI控制器生成一个IN(Stat)。EHCI控制器通过先传送一个OUT (Cmd), 接着传送一个DATA (Cmd, CIU)来作为对OTr (Cmd)的响应。

对于IN (Stat)包的响应,设备先一直返回NAK (Stat)包,直到设备有状态可以返回。

当设备接收到DATA (Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。CIU中包含命令标签,用于在命令完成时匹配SIU和CIU。

接收到CIU的ACK (Cmd) 就算完成了EHCI控制器的OTr (Cmd),从而生成一个OTc (Cmd) 给EHCI驱动。EHCI驱动接着返回OTc (Cmd) 给UAS驱动,指示命令已经成功传递给设备。

当设备准备好接收数据时,设备就用DATA(Stat, WRIU)来响应IN (Stat) 轮训。

EHCI控制器用ACK (Stat)响应DATA (Stat,WRIU)包,确认WRIU的成功接收。对DATA (Stat, WRIU)的接收完成了EHCI

控制器的ITr (Stat) ,从而生成一个ITc (Stat, WRIU)给EHCI驱动。继而,EHCI驱动返回ITc (Stat,WRIU)给UAS驱动,指示有状态可用。UAS驱动评估该WRIU,并检查标签,来判定设备正在请求哪一个命令的数据。UAS驱动接着发起一个ITr (Stat)给EHCI驱动,使得设备可以返回下一个状态。UAS驱动接着使用WRIU中的标签所指示的buffer来发起一个ITr (Data-out)。

作为对ITr (Stat)的响应, EHCI驱动生成一个IN (Stat),在状态管道上调度一个数据传输。作为对ITr (Stat)的响应,EHCI控制器发送IN (Stat)包给设备,而设备使用NAK (Stat)包来响应,直到设备有状态可以返回。

作为对OTr (Data-out)的响应, EHCI驱动在Data-out管道上调度一个数据传输。

EHCI控制器通过传送一个OUT (Data-out)接着发送一个DATA(Data-out),来开始向设备发送数据。

当设备接收到一个DATA (Data-out)时,设备用一个ACK (Data-out)做出响应,指示写数据已经被收到。  

前面三段所描述的步骤一直重复,直到Data-out传输完成。

当数据正在主机和设备之间被传输时, EHCI控制器用ACK (Stat)响应DATA (Stat,RRIU)包,确认RRIU的成功接收。对DATA (Stat, RRIU)的接收完成了EHCI控制器的ITr (Stat) ,从而生成一个ITc(Stat, RRIU)给EHCI驱动。继而,EHCI驱动返回ITc (Stat, RRIU)给UAS驱动,指示有状态可用。UAS驱动评估该RRIU,并检查标签,来判定设备正在响应哪一个命令的数据。UAS驱动接着发起一个ITr (Stat)给EHCI驱动,使得设备可以返回下一个状态。UAS驱动接着使用RRIU中的标签所指示的buffer来发起一个ITr (Data-in)。

作为对ITr (Stat)的响应, EHCI驱动生成一个IN (Stat),在状态管道上调度一个数据传输。作为对ITr (Stat)的响应,EHCI控制器发送IN (Stat)包给设备,而设备使用NAK (Stat)包来响应,直到设备有状态可以返回。

作为对ITr (Data-in)的响应, EHCI驱动在Data-in管道上调度一个数据传输。

EHCI控制器通过传送IN (Data-in),开始从设备接收数据。

当设备接收到一个IN (Data-in)时,设备用一个包含由于读取数据的DATA (Data-in) 做出响应。当EHCI控制器接在Data-in管道上收到DATA (Data-in)包时 ,它使用 ACK(Data-in)做出响应,确认对读取数据的成功接收。          

前面三段所描述的步骤一直重复,直到Data-in 传输完成。

EHCI控制器接收到最后一个ACK(Data-out)  时(例如,主机buffer空了,或者发送了一个短包),就完成了EHCI控制器的OTr (Data-out),从而生成一个OTc (Data-out)给EHCI驱动。继而生成一个OTc(Data-out)完成给UAS驱动。

EHCI接收到最后一个Data (Data-in)时(例如,主机buffer满了,或者收到一个短包),就完成了EHCI控制器的ITr (Data-in) ,从而生成一个ITc (Data-in) 给EHCI驱动。继而生成一个ITc(Data-in) 完成给UAS驱动。

当命令完成时,设备用DATA (Stat, SIU) 对IN (Stat) 做出响应。该SIU包含CIU的标签。

EHCI控制器用ACK (Stat) 包来响应DATA (Stat,SIU) ,确认对SIU的成功接收。对DATA (Stat, SIU) 的接收完成了EHCI控制器的ITr (Stat) ,从而生成一个In ITc(Stat, SIU)给EHCI驱动。继而导致EHCI驱动生成一个ITc (Stat, SIU) 给UAS驱动。

接收到的CIU的OTc (Cmd) ,写出数据的OTc (Data-out),读入数据的ITc (Data-in),以及SIU的ITc (Stat,SIU) ,如果都具有相同的标签,导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。如果ITc (Data-in) 或者OTc (Data-out)还没有被UAS驱动收到,那么就发生了一个错误,UAS驱动应该在返回状态之前终结该正在进行的ITc (Data-in) 或者OTc (Data-out)。

5.4 超高速UASP

5.4.1 概览

本节描述为了支持UASP所需要的超高速包交换。本节假设读者熟悉[USB3] 的Streams 协议。参考[USB3] 的4.4.6.4 和 8.12.4.1 中关于Streams 协议的更多信息。

命令管道并不使用[USB3] 的Streams。Data-in, Data-out, 以及 Stat管道对于每一个事务都要求有一个StreamID。 这里的Stream ID 要么是Prime (如图的标注所示),或者是由恰当的CIU提供的Stream ID。

5.4.2 非数据传输(Non-data transfer)

非数据传输是UASP中最简单的操作。非数据传输只是用命令和状态管道。主机在命令管道上传输一个Command IU (CIU),而设备在状态管道上用一个Response IU (RIU) 做出响应。

图6说明了超高速UASP的非数据(Non-Data)传输。UAS驱动所接收到的非数据传输命令(Non-data Transfer Command)导致UAS驱动发起ITr (Stat) 给xHCI驱动,来接收这个命令的SIU;也发送一个OTr (Cmd, CIU)来传输这个CIU给xHCI驱动。由于状态管道是Streams管道,这个ITr (Stat)包含与这个传输相关的标签。

ITr (Stat) 导致xHCI控制器生成一个IN ACK(Stat, Prime)。这个包将状态管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好接收一个SIU。xHCI控制器通过传送一个DP (Cmd, CIU)来作为对OTr (Cmd, CIU)的响应。

作为对IN ACK (Stat, Prime)包的响应,设备返回一个NRDY (Stat, Prime)。这个动作将状态管道转换回到空闲(Idle)状态。当设备接收到DP (Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。 

接收到CIU的ACK (Cmd) 就算完成了xHCI控制器的OTr (Cmd, CIU),从而生成一个OTc (Cmd) 给xHCI驱动。xHCI驱动接收到OTc (Cmd)就生成OTc (Cmd) 给UAS驱动。

当命令完成后,设备生成一个ERDY (Stat),其中的SID字段设置为CIU的Tag字段所提供的Tag值。这就将管道转换到Start Stream状态,从而通知xHCI控制器设备已经准备好在状态管道上传输SIU。

作为对ERDY (Stat)的响应,xHCI控制器发送一个IN ACK (Stat) 给设备,使用的SID设置为 ERDY的Tag值。

作为对这个IN ACK (Stat)的响应,设备返回一个DP (Stat, SIU) ,其中包含的SID设置为这个IN ACK (Stat)中所返回的值。

xHCI控制器用ACK (Stat)响应DP (Stat, SIU)包,确认SIU的成功接收。对DP(Stat, SIU)的接收完成了对xHCI控制器的ITr (Stat) ,从而生成一个ITc (Stat, SIU) 给xHCI驱动。继而,当xHCI驱动从xHCI控制器收到ITc (Stat,SIU),xHCI驱动生成一个ITc (Stat, SIU)给UAS驱动。

接收到CIU的OTc (Cmd) 和SIU的ITc (Stat, SIU) ,如果两者都具有相同的标签,就导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。

5.4.3 数据输入传输(Data-in transfer)

图7说明了超高速UASP的数据输入(Data-in)传输。UAS驱动接收到的数据输入传输命令(Data-in Transfer Command)导致UAS驱动发起ITr (Stat)来接收这个命令的SIU;一个ITr (Data-in)来接收数据;以及一个OTr(Cmd, CIU) 来传输这个CIU给xHCI驱动。由于状态管道是Streams管道,这个ITr (Stat)包含与这个传输相关的标签(Tag)。

ITr (Stat) 导致xHCI控制器生成一个IN ACK(Stat, Prime)。这个包将状态管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好接收一个SIU。ITr (Data-in)导致xHCI控制器生成一个IN ACK(Data-in, Prime)。这个包将状态管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好接收数据。xHCI控制器通过传送一个DP (Cmd, CIU)来作为对OTr (Cmd, CIU)的响应。

作为对IN ACK (Stat, Prime)包的响应,设备返回一个NRDY (Stat, Prime)。这个动作将状态管道转换回到空闲(Idle)状态。作为对IN ACK (Data-in, Prime)包的响应,设备返回一个NRDY (Data-in, Prime)。这个动作将数据输入(Data-in)管道转换回到空闲(Idle)状态。当设备接收到DP(Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。

接收到CIU的ACK (Cmd) 就算完成了xHCI控制器的OTr (Cmd, CIU),从而生成一个OTc (Cmd) 给xHCI驱动。xHCI驱动接收到OTc (Cmd)就生成OTc (Cmd) 给UAS驱动。

当设备准备好发送数据时,设备就用ERDY (Data-in),其中的SID设置为对应的CIU的Tag字段的Tag值。这就将管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好传输数据。

作为对ERDY (Data-in)的响应,xHCI控制器发送一个IN ACK(Data-in) 给设备,使用的SID设置为 ERDY的Tag值。这就将数据流状态机从Start Stream状态转换到Move Data状态,并开始数据传输。

作为对IN ACK (Data-in)的响应,设备返回一个DP (Data-in) ,其中包含读取的数据,其中的SID设置为该IN ACK (Data-in)中的SID值。

xHCI 控制器用一个ACK (Data-in)来响应该DP (Data-in) ,确认成功接收到读取的数据。         

前面两段所描述的步骤一直重复,直到数据传输完成。

当命令完成后,设备生产一个ERDY (Stat) ,其中的SID设置为对应的CIU的Tag字段的Tag值。这就将管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好在状态管道上传输SIU。

作为对ERDY (Stat)的响应,xHCI控制器发送一个IN ACK (Stat) 给设备,使用的SID设置为 ERDY的Tag值。

作为对这个IN ACK (Stat)的响应,设备返回一个DP (Stat, SIU) ,其中包含的SID设置为这个IN ACK (Stat)中所返回的值。

xHCI控制器用ACK (Stat)响应DP (Stat, SIU)包,确认SIU的成功接收。对DP(Stat, SIU)的接收完成了对xHCI控制器的ITr (Stat) ,从而生成一个ITc (Stat, SIU) 给xHCI驱动。继而,当xHCI驱动从xHCI控制器收到ITc (Stat, SIU),xHCI驱动生成一个ITc (Stat,SIU)给UAS驱动。

接收到CIU的OTc (Cmd) ,数据的ITc (Data-in),以及SIU的ITc (Stat) ,如果都具有相同的标签,就导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。如果ITc (Data-in)没有被UAS驱动收到,那么就发生了错误,UAS就应该在返回状态前终结ITc (Data-in)。

5.4.4 数据输出传输(Data-out transfer)

图8说明了超高速UASP的数据输出(Data-out)传输。UAS驱动接收到的数据输出传输命令(Data-out Transfer Command)导致UAS驱动发起ITr (Stat)来接收这个命令的SIU;一个OTr (Data-out)来发送数据;以及一个OTr(Cmd, CIU) 来传输这个CIU给xHCI驱动。由于状态管道是Streams管道,这个ITr (Stat)包含与这个传输相关的标签(Tag)。

ITr (Stat) 导致xHCI控制器生成一个IN ACK(Stat, Prime)。这个包将状态管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好接收一个SIU。OTr (Data-out)导致xHCI控制器生成一个DP (Data-out,Prime)。这个包将Data-out管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好发送数据。xHCI控制器通过传送一个DP (Cmd, CIU)来作为对OTr (Cmd, CIU)的响应。 

作为对IN ACK (Stat, Prime)包的响应,设备返回一个NRDY (Stat, Prime)。这个动作将状态管道转换回到空闲(Idle)状态。作为对IN ACK (Data- out, Prime)包的响应,设备返回一个NRDY (Data-out,Prime)。这个动作将数据输出(Data-out)管道转换回到空闲(Idle)状态。当设备接收到DP (Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。

接收到CIU的ACK (Cmd) 就算完成了xHCI控制器的OTr (Cmd, CIU),从而生成一个OTc (Cmd) 给xHCI驱动。xHCI驱动接收到OTc (Cmd)就生成OTc (Cmd) 给UAS驱动。

当设备准备好接收数据时,设备就生产一个ERDY (Data-out),其中的SID设置为对应的CIU的Tag字段的Tag值。这就将管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好接收数据。

作为对ERDY (Data-out)的响应,xHCI控制器发送一个DP (Data-out)给设备,使用的SID设置为 ERDY的Tag值。这就将数据流状态机从Start Stream状态转换到Move Data状态,并开始数据传输。

作为对DP (Data-out)的响应,设备返回一个ACK (Data-out) ,确认成功接收到数据。ACK(Data-out)中的SID设置为该DP (Data-out)中的SID值。

xHCI 控制器用一个DP (Data-out)来响应该ACK (Data-out)。【译注:此处原规范"The xHCI controller responds to the ACK (Data-in) with a DP (Data-in)"显然是错误的,应是从Data-in传输一节中拷贝过来而造成的错误。译文对此作了更正。】     

前面两段所描述的步骤一直重复,直到数据传输完成。

当命令完成后,设备生产一个ERDY (Stat) ,其中的SID设置为对应的CIU的Tag字段的Tag值。这就将管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好在状态管道上传输SIU。

作为对ERDY (Stat)的响应,xHCI控制器发送一个IN ACK (Stat) 给设备,使用的SID设置为 ERDY的Tag值。

作为对这个IN ACK (Stat)的响应,设备返回一个DP (Stat, SIU) ,其中包含的SID设置为这个IN ACK (Stat)中所返回的值。

xHCI控制器用ACK (Stat)响应DP (Stat, SIU)包,确认SIU的成功接收。对DP(Stat, SIU)的接收完成了对xHCI控制器的ITr (Stat) ,从而生成一个ITc (Stat, SIU) 给xHCI驱动。继而,当xHCI驱动从xHCI控制器收到ITc (Stat,SIU),xHCI驱动生成一个ITc (Stat, SIU)给UAS驱动。

接收到CIU的OTc (Cmd) ,数据的OTc (Data-out),以及SIU的ITc (Stat) ,如果都具有相同的标签,就导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。如果OTc (Data-out)没有被UAS驱动收到,那么就发生了错误,UAS就应该在返回状态前终结OTc (Data-out)。

5.4.5 双向数据传输(Bi-directional data transfer)

 图9中展示的双向数据传输中,写数据部分在读数据部分之前开始和结束。UASP没有规定双向数据传输的读数据和写数据部分的相对开始和结束时间的顺序要求。

图9说明了超高速UASP的双向(Bi-directional)数据传输。UAS驱动接收到的双向数据传输命令(Bi-directional Transfer Command)导致UAS驱动发起ITr (Stat)来接收这个命令的SIU;一个ITr (Data-in)来接收数据;一个OTr(Data-out)来发送数据;以及一个OTr (Cmd, CIU) 来传输这个CIU给xHCI驱动。由于状态管道是Streams管道,这个ITr (Stat)包含与这个传输相关的标签(Tag)。

ITr (Stat) 导致xHCI控制器生成一个IN ACK(Stat, Prime)。这个包将状态管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好接收一个SIU。ITr (Data-in)导致xHCI控制器生成一个IN ACK(Data-in, Prime)。这个包将Data-in管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好接收数据。OTr (Data-out)导致xHCI控制器生成一个DP (Data-out,Prime)。这个包将Data-out管道的Streams状态机转换到Prime Pipe状态,通知设备主机已经准备好发送数据。xHCI控制器通过传送一个DP (Cmd, CIU)来作为对OTr (Cmd, CIU)的响应。

作为对IN ACK (Stat, Prime)包的响应,设备返回一个NRDY (Stat, Prime)。这个动作将状态管道转换回到空闲(Idle)状态。作为对IN ACK(Data-in, Prime)包的响应,设备返回一个NRDY(Data-in, Prime)。这个动作将数据输入(Data-in)管道转换回到空闲(Idle)状态。作为对IN ACK (Data- out,Prime)包的响应,设备返回一个NRDY (Data-out, Prime)。这个动作将数据输出(Data-out)管道转换回到空闲(Idle)状态。当设备接收到DP(Cmd, CIU),就用一个ACK (Cmd)来做出响应,确认成功接收到CIU。

接收到CIU的ACK (Cmd) 就算完成了xHCI控制器的OTr (Cmd),从而生成一个OTc (Cmd) 给xHCI驱动。xHCI驱动接收到OTc (Cmd)就生成OTc (Cmd) 给UAS驱动。

当设备准备好发送【译注,规范原文此处为"When the device is ready to receive the data for a command",显然不对,译文此处做了更正。】数据时,设备就生产一个ERDY (Data-in),其中的SID设置为对应的CIU的Tag字段的Tag值。这就将管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好传输数据。

作为对ERDY (Data-in)的响应,xHCI控制器发送一个IN ACK (Data-in)给设备,使用的SID设置为 ERDY的Tag值。这就将数据流状态机从Start Stream状态转换到Move Data状态,并开始数据传输。

作为对IN ACK(Data-in)的响应,设备返回一个DP(Data-in) ,其中包含读取的数据,并且SID设置为从IN ACK (Data-in)中而来的SID值。

xHCI 控制器用一个ACK (Data-in)来响应该DP (Data-in),确认成功接收到读取的数据。

前面两段所描述的步骤一直重复,直到数据传输完成。

在数据被从设备传输到主机的过程中,设备准备好接收对于同一个命令的数据,这时,设备就生产一个ERDY (Data-out),其中的SID设置为对应的CIU的Tag字段的Tag值。这就将Data-out管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好接收数据。

作为对ERDY (Data-out)的响应,xHCI控制器发送一个DP (Data-out)给设备,使用的SID设置为 ERDY的Tag值。这就将数据流状态机从Start Stream状态转换到Move Data状态,并开始数据传输。

作为对DP (Data-out)的响应,设备返回一个ACK (Data-out) ,确认成功接收到数据。ACK(Data-out)中的SID设置为该DP (Data-out)中的SID值。

xHCI 控制器用一个DP (Data-out)来响应该ACK (Data-out)。【译注:此处原规范"The xHCI controller responds to the ACK (Data-in) with a DP (Data-in)"显然是错误的,应是从Data-in传输一节中拷贝过来而造成的错误。译文对此作了更正。】      

前面两段所描述的步骤一直重复,直到数据传输完成。

当命令完成后,设备生产一个ERDY (Stat) ,其中的SID设置为对应的CIU的Tag字段的Tag值。这就将管道转换到Start Stream状态,并通知xHCI控制器设备已经准备好在状态管道上传输SIU。

作为对ERDY (Stat)的响应,xHCI控制器发送一个IN ACK (Stat) 给设备,使用的SID设置为 ERDY的Tag值。

作为对这个IN ACK (Stat)的响应,设备返回一个DP (Stat, SIU) ,其中包含的SID设置为这个IN ACK (Stat)中所返回的值。

xHCI控制器用ACK (Stat)响应DP (Stat, SIU)包,确认SIU的成功接收。对DP(Stat, SIU)的接收完成了对xHCI控制器的ITr (Stat) ,从而生成一个ITc (Stat, SIU) 给xHCI驱动。继而,当xHCI驱动从xHCI控制器收到ITc (Stat,SIU),xHCI驱动生成一个ITc (Stat, SIU)给UAS驱动。

接收到CIU的OTc (Cmd) ,读数据的ITc(Data-in),写数据的OTc (Data-out),以及SIU的ITc (Stat) ,如果都具有相同的标签,就导致UAS驱动完成该命令序列,返回状态给UAS驱动的上层。如果ITc(Data-in) 或者OTc (Data-out)没有被UAS驱动收到,那么就发生了错误,UAS就应该在返回状态前终结ITc(Data-in) 或者OTc (Data-out)。

附录A

(参考信息)

后向兼容性

A.1 概览

为了保持对[USB2]的后向兼容性,设备应该呈现[BOT]为可选接口0(主),而将[UAS]呈现为接口1(副)。不需要后向兼容性的设备应该将[UAS]呈现为可选接口0。在[USB2]系统中,[BOT]驱动或者相关的过滤驱动可能需要发送一个针对可选接口1的SET INTERFACE请求,进而允许[UAS]驱动加载。

posted on 2013-03-05 13:31  CoryXie  阅读(2024)  评论(0编辑  收藏  举报