次は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)
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の略)。
(続く)