さてまずDPHの方だが、先頭DWORD 0は従来と同じである。続くFieldであるが、

  • Seq Num(Sequence Number): これもここまで出てきたSequence Numberと同じものである。つまりData PacketのSequence Numberが入る。ちなみにこのFieldは5bitなので、最大31になると、再び0に戻る形だ。
  • EOB/LPF(End Of Burst/Last Packet Flag): このフィールドはIsochronous Transferの場合にはLPF、そうで無い場合はEOBとなる。Isochronous Transferで無い場合、IN EndpointはこのFieldがセットされたPacketを受け取ることでBurst TransferがこのPacketで終了することを判断できる。もしここでDevice側が更に転送を継続できる場合、EndpointからHostに対してERDY TPを送ることになっている。ちなみに注訳として、EOBだけでBurst Transferの終了を判断してはいけない、とされている。逆にOUT Endpointの場合、このFieldは常に0とされる。

またIsochronous Transferの場合、このFieldがセットされた場合は、現在のService IntervalにおけるBurst Transferが終了である事を意味する。これは、HostとDeviceのどちらでもセット可能とされている。

  • Ept Num(Endpoint Number): これもここまで出てきたものと同じ。
  • S(Setup): これはHostのみセット可能である。これがセットされた場合、DPがSetup Data Packetであることを示す。この場合、Data Lengthは8になる。
  • Data Length: 文字通りデータの長さ。これはDPPのサイズをByteで示す。ただしここにはDPPの最後に入るCRC-32の4Bytes分は含まれない。なお、仕様上Sizeが0のDPPを送ることも許されているが、その場合もCRC-32 fieldを付加することが求められる。またData Lengthは16bit幅を持つから理論上は65535Bytesまでを指定できるが、実際は最大でも1024Bytesとされる。
  • Data: これはもうデータそのものである。
  • CRC-32: Data fieldに対してはCRC-32を付加してエラー検出/訂正を行うことが定められている。このため、DPPはPhoto01の様な構造になる。このCRC-32の計算方法はここでは示さないがSpecificationの7.2.1.2.2で定められている。

Photo01: Universal Serial Bus 3.0 SpecificationのFigure 7-8から抜粋

さて、このDP(つまりDPH+DPP)をHostが受け取った場合のアクションをまとめたのがPhoto02である。

Photo02: これはOUT EndpointのDeviceからHostがDPを受け取った場合の処理

簡単に説明すると、

(1) DPHがそもそもおかしい: 具体的には、
・Device Addressが間違っている
・Endpoint NumberやDirectionが現在の構成とマッチしていない
・Endpoint Numberがあっていない
・Sequence Numberが正しく無い

といった場合がこれに該当する。これらの場合、単純に破棄して終了である。

(2) DPHは正しくてもDPPがおかしい: 具体的には、
・CRCが不正
・DPPが途中で破壊されている
・DPPが無い
・DHPのData lengthと実際のDPPのサイズがマッチしていない

といった事が挙げられる。これらの場合、受け取ったパケットは破棄するが、同時にRetry bitを立ててACK TPを送り返すことでデータ再送を試みる事になる。

(3) DPH/DPPも正常であっても受け取れない: これは要するにHostが(例えば処理中とかで)、到達したパケットを処理できない状態を意味する。この場合、やはりRetry bitを立ててACK TPを送り返して再送を掛けることになるが、その際にデータエラーではなくホスト側の問題であることを示すために、Host Error bitを立てることが必要になる。

(4) 何もエラーがなく受け取れた: この場合は素直にACK TPを送り返してそのPacketに対する処理は終了となる。

(続く)