选择而进入的,则当前流应该被主机设置。如果这个状态是从Start Stream状态进入的,则当前流选择被设备设置。当流传输完成时或者如果主机或设备决定终止流传输时,SPSM转变回Idle状态。转变成Idle状态使管道的当前流无效。
8.12.1.4.1 流ID
一个16位域的流ID域在DP头中被保留,也保留在主机和设备间传输流ID的ACK ,NRDY,ERDY TP中。指定的被流协议保留流的ID值和其他流ID标记:
·NoStream——这个流ID指示没有流ID被分配给各个相关的总线包,流ID域应该不被解释成有效流。NoStream流ID值是FFFFh。
·Prime——这个流ID被用来定义转变到Prime Pipe状态或从Prime Pipe状态中转变出来。Prime流ID是FFFEh。
·Stream n——n是在1到65533(FFFDh)之间的值。这个标记是用来指示一个有效流ID。如果使用这种标记,则在包头中的流ID域是有效的。有效的Stream n流ID值当中的n值 是在1到65533(FFFDh)之间。
·Stream 0——这个值保留,不被管道用来支持流。Stream 0流ID值是0000h。它需要被标准块管道使用。
·CStream ——代表被分配给管道的当前流ID的值,一个CStream 值都被主机和设备操控。流协议确保CStream 值在主机与设备中是一致的。有效值是NoStream 或 Stream n .
·LCStream——代表在最后一个状态转变之前被分配给管道的CStream流ID的值。一个LCStream值被主机操控,有效值为Prime, NoStream, 或Stream n。例如,当在Move Data状态下CStream = Stream n的管道从 Move Data 到Idle 状态转变时,LCStream被设置为Stream n ,CStream 被设置为NoStream,因此LCStream记录了“最后的(上一个)当前流”值。
Stream n 流ID值被主机分配,被传递到一个设备。Stream n 流ID值应该被设备当成一个逻辑值对待,即设备不应该从值中推断出任何意思或修改它。
注意:下面描述的块IN和OUT流协议是简化了的状态机制,没有明确仔细说明超速端点的突发特性(允许DP没有收到ACK 就被发送)。一个实施应该扩展这些状态机制管理突发。
8.12.1.4.2 块IN流协议
这里定义了在IN块端点上,从一个状态到另外状态的转变流协议超速包的交换
对于IN管道,主机中端点buffers从设备收到功能数据。
45
此包应该为设备发送的包
端点被配置以后,管道在Disabled状态。主机应该通过发送流ID域设置为Prime的ACK TP将管道转变成Prime Pipe状态。这个转变在端点buffers被系统软件分配到管道上后发生。
设备会通过发流ID域设置为Prime的NRDY TP引起管道退出Prime Pipe 状态,转变到Idle状态。
注意:如果中间的集线器(deferred)延迟了ACK TP,则主机和设备会犹如设备发送一个NRDY TP一样。即,当收到延迟应答时,主机会转变到Idle状态。当收到延迟ACK TP时,设备会转变到 Prime Pipe状态,然后立刻转变到Idle状态犹如它已经发送了流ID域设置为Prime的NRDY TP。
在Idle状态下,管道正在等待流选择(例如一次到Start Stream 或Move Data的转变)或等待端点buffers已经为管道被添加或修改的主机通知(转变到Prime Pipe )。在Idle状态,被主机初始化的流选择通过流ID被设置为Stream n和NumP 值大于0的ACK TP确认。这个包会将ISPSM从Idle状态转变成Move Data状态。如果最后一次的ISPSM是从Start Stream 或Move Data转变的,则主机会由于两个可能的条件而开始一次从Idle到Move Data状态的转变:1)如果为 LCStream而给管道布置端点buffer,并且最后的 ISPSM转变不是由于一个NRDY(Stream n )Move Data状态退出;(2)如果是为新的流布置端点buffer(例如新发送的不等于LCStream的流ID)。在Idle中,被设备开始的流选择是通过一个流ID被设置为 Stream n,NumP值大于0的ERDY TP来确认的。这个包会将ISPSM从Idle状态到Start Stream状态转变。当设备想要开始流传输时,不管它是否在一个流控制条件中,都应该开始这个转变。
46
在Start Stream状态下,管道正等待主机接收或拒绝设备发起的流选择。主机会通过发送一个Stream ID = Stream n 和NumP > 0的ACK TP来指示接收到设备初始化的流选择。这个包会历经从Start Stream状态到Move Data状态的ISPSM转变。主机会通过发送Stream ID = NoStream, NumP = 0,Packet Pending (PP) = 0的ACK TP来指示拒绝由设备初始化的流选择。这个包会历经从Start Stream state 到Idle state的ISPSM转变。如果没有有效端点buffer为设备选择流ID,主机会拒绝流选择。
ISPSM独立的在主机和设备上执行。一种条件发生:如果设备发送一个ERDY给主机,并且进入Start Stream状态,与此同时,主机发送ACK(Prime,PP=0)给设备,并且进入 Prime Pipe 状态。为了从此条件中恢复,如果设备在Start Stream状态下接收到一个ACK(Prime,PP=0),它会转变到Prime Pipe Ack状态,并且发送一个NRDY(Prime)给主机,为主机完成从Prime Pipe 到Idle 状态的转变,和为设备完成从Prime Pipe Ack到 Idle状态的转变。
在Move Data状态,当前流在管道的两端被设置,并且管道被激活移动数据到主机。总线事务处理在Move Data状态的执行和它的退出条件在下面的IN Move Data State Machine详细定义。
如上面描述,IN Move Data状态机制(IMDSM)是从Start Stream或Idle 状态进入的。当转变到INMvData Device状态,就立刻进入IMDSM。所有被IMDSM产生的包的流ID域会是Stream n.
每次进入 INMvData Device状态时,设备都会进行下面的操作进入IMDSM: if ( Device Function Data bytes > Max Packet Size )
设备会产生一个EOB域值为0的DP , 这会引起管道转变成INMvData Host状态.
else if ( Device Function Data bytes = Max Packet Size )
47
设备会产生一个EOB域值为1的DP, 这会引起管道转变成 INMvData Device Terminate状态
else ( Device Function Data bytes < Max Packet Size )
设备会产生一个短包DP, 这会引起管道转变成 INMvData Device Terminate状态。
可选择的,设备可以产生一个流ID设置为Stream n的NRDY TP终止流,会引起管道退出IMDSM,转变成Idle状态。设备可以使用这个转变来拒绝由主机初始化的Move Data。
注意:如果中间的集线器(deferred)延迟了ACK TP,主机和设备会视如设备发送了一个NRDY TP。即当主机收到延迟的应答,它会转变到Idle状态。当设备收到(deferred)延迟的ACK TP时犹如它收到了一个流ID域设置为Stream n的NRDY TP,它会退出IMDSM,转变到Idle状态。如果设备接收主机初始化的流ID,它会发送一个流ID域设置为Stream n 的ERDY。如果设备拒绝由主机初始化的流ID,它会停留在Idle状态,并且等待下一个主机或设备初始化的流选择。
INMvData Host状态的进入是因为设备有更多的功能数据要发送,所以主机要执行下面的操作进入IMDSM:
if ( 在此次突发中能安排另外的DP ) {
if ( 主机有更多的有效端点buffers )
产生NumP > 0 的ACK TP ,这会引起管道转变到 INMvData Device 状态 Else(主机没有有效空间)
产生一个NumP = 0 and PP = 0的ACK TP结束, 这会引起管道退出 IMDSM 转变到Idle状态。 }
else ( 已经收到突发的最后一个DP ) {
终止突发;
if ( 主机有更多的有效端点buffers)
通知设备突发完成(NumP = 0)主机应该为CStream安排另外一次突发 (PP = 1) 产生 NumP = 0,PP = 1 的ACK TP,这会引起管道转变成 INMvData Burst End 状态。 else(主机没有有效空间)
产生NumP = 0 and PP = 0的ACK TP终止,这会引起管道退出IMDSM,转 变成Idle状态。 }
在 INMvData Burst End状态中,主机会产生 NumP > 0 and PP = 1 的ACK 开始下一次突发,引起管道转变成INMvData Device 状态。
Pseudo码描述IMDSM假设收到的DP是有效的。如果它无效,则ACK TP被产生,这会把管道转变成 INMvData Device状态。ACK TP中的顺序号不会上涨,然后,重试位可以减少发送的NumP值。如果NumP = 0 ,并且主机中还有有效的端点buffer,PP会被设置为1;否则,PP被设置为0.
INMvData Device Terminate状态的进入是因为设备没有更多的功能数据要发送,所以主机会产生一个NumP = 0 and PP = 0的ACK TP终止,这会引起管道退出IMDSM,并
48