次はTransaction Packet(TR)である。こちらはHostとDeviceの間でやりとりされるPacketだ。TRは8種類のSubTypeを持ち、まずこれを識別するために4bitのSubTypeフィールドが用意される(Photo01)では、具体的にもう少し見てみたい。

Photo01: SubTypeはこの8種類。8種類なら3bitで済むわけだが、将来の拡張を考えて4bitにしたものと思われる。0000bと1001b~1111bはReservedになっており、Ackが0001b、NRDYが0010b、...と順に並び、Ping Responseが1000bになっている。

ACK TP(Photo02)

Photo02: TPの場合、先頭のDWORDはTypeとRoute String、Device Addressのみとなっており、SubTypeは2番目のDWORDに入る。これはHubのインプリメントでCut Through(先頭のDWORDだけを見てRoutingを判断し、転送する)が出来るようにということではないかと思う。仮に先頭のDWORDにSubTypeまで入れてしまうとRoute StringかDevice Addressが入りきらなくなるから、Hubは2番目のDWORDまで解釈せねばならず、処理時間が余分にかかり消費電力も無駄に増える形になる。

ACKには2つの意味があり

  • IN endpoint: この場合、HostからDeviceがACKは送られ、直前にDeviceから送られたPacketがが正常受信した事をDeviceに通知する。
  • OUT endpoint: この場合、DeviceからHostにACKが送られ、直前にHostから送られたPacketが正常に受信出来たことをHostに通知する。同時にHostはDeviceに対し、あとどれだけバッファに余りがあるかを通知する
  • といった目的で利用される。各フィールドの意味は(Photo01にも多少入っているが)
  • Rty(Retrt Data Packet): 1bit

これはHostなりDeviceなりが、実際にはData Packetを受け取っていない、あるいは受け取ったものの破損していることを検出し、再送要求を出す場合にSetする。この際に再送されるのは、後述するSequence Numberフィールドで指定されたものとなる。

  • D(Direction): 1bit

送受信方向を示す。0ならばHost→Deviceの転送だし、1ならばDevice→Hostの転送となる。

  • Ept Num(Endpoint Number): 4bit

各Deviceは、理論上15のIN EndpointとOUT Endpointを利用できる。例えばUSBで2ポートのSATAポートを持つブリッジを作った場合、IN #1とOUT #1を1つ目のSATAポートに、IN #2とOUT #2を2つ目のSATAポートにそれぞれ割り当てることが出来る。同時に複数のINなりOUTなりのトランザクションを実行できるわけではないから、これで高速化とかは不可能だが、開発の容易さを考えるとこれは便利だ。あるいはMultiFunction Deviceの場合、各々のFunctionにそれぞれ別のEndpoint Numberを割り振るなんていうこともあるだろう。こうした場合に、どのEndpointかをこのフィールドで指定する。

  • HE(Host Error): 1bit

これはHost→Deviceの転送の場合にのみ関係する。Host側が自身の内部エラーなどでパケットを受け取れない(or解釈できない)場合にこれをセットする。ちなみにこれがセットされた場合、同時にRtyフィールドもセットする必要がある。

  • NumP(Number of Packets): 5bit

このフィールドを使い、Data Packetの受信側は最大いくつのData Packetを受信できるかを指示する。このサイズは、Endpointがサポートする最大バースト転送長以下でなければならない。

  • SeqNum(Sequence Number): 5bit

文字通りSequence Number。次に到着するData PacketのSequence Numberをここから算出することになる。

  • Stream ID: 16bit

これはEndpointがバルク転送を行う場合に必要とされるStream IDを指定する。ちなみに値は1~65535までで、0はStream PIPE用に予約されている。バルク転送を行わない場合は0となる。

  • PP(Packet Pending): 1bit

これもまたHostのみで使われる。これがSetされている場合、HostはEndpoint NumberとDirectionで示される、別のPacketを処理中であることが示される。ただし、存在しないEndpoint Numberが指定されている場合は、Hostが例えばU1とかU2のLow Power stateに入っており、このためにPacketの処理が留保されていることを示す。

となっている(ちなみにRsvdはReservedの略)。

(続く)