一方DeviceがDPを受け取った場合のアクションをまとめたのがPhoto01である。

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

こちらは、

(1) DPHがそもそもおかしい: 具体的な項目はHostが受け取った場合と同じ。やはりPacketを破棄して終了。

(2) DPHにDeferred bitが立っており、しかもDeviceがHalt状態可能: Defered bitがたっているということは、途中のHubによる遅延が発生している(要するにHubが待機状態だったため、立ち上がりに時間を要した)事を示す。またDeviceがHALT状態をサポートしているので、(Hubが待機状態に入る位だから)Deviceも当然HALT状態にあり、ここから復帰するまでに時間を要している。ただしこのPacketを受け取ったということは、Hub及びDeviceはNormal Stateにあるわけで、なのでそれをHostに通知するためにERDY TPを送る形になる。

(3) DPHにDeferred bitが立っており、DeviceはHALT状態不可ながら受信不能: Defered bitは上述の通り。今度はDeviceはHALT状態をサポートしていないからNormal Stateに入っていると見なされるが、ここでDeviceが受信不能というのは要するに何かしら処理を行っていて、受信処理が間に合わない事を示す。その場合、処理が終わって受信可能になってから、ERDY TPを送ればよいとされる。どのみちDeferred bitが立っている時点で遅延が発生しているので、急いでNRDYとかを送らなくてもいい、という事であろう。

(4) DPHにDeferred bitが立っており、DeviceはHALT状態不可、受信可能: これは要するに(3)の状態からいくばくかの時間が過ぎ、処理可能になった状態と見なせるわけで、やはりERDY TPを送り返すことになる。

(5) Deffered bitが正常、DPHも正常で、DeviceはHALT状態可能: この状態の場合、DPを受け取ることでDeviceはHALTから抜けた(というか、まだNormal Stateへの遷移途中の可能性もある)わけで、Hubに因らず遅延が発生していた事になる。そこで、STALL TPを送り返すことでこれまでSTALL状態にあったことをHostに通知する。

(6) Deffered bitが正常、DPHも正常で、DeviceはHALT状態不能ながら受信不能: これはもうDeviceが何かをやっているなどの理由で到着したDPを処理出来ない状態となる。したがって対処としては、到着したDPは破棄し、Hostに対しNRDY TPを送り返す事でDevice Not Readyを伝える事になる。

(7) DPHは正常に伝達されたが、Data Payload Errorの場合: このErrorというのは前回にも出てきたが、

・CRCが不正
・DPPが途中で破壊されている
・DPPが無い
・DHPのData lengthと実際のDPPのサイズがマッチしていない

というケースである。この場合はDPを破棄し、DP expected bitとRetry bitを立ててACK TPを送り返す事で再送を要求する事になる。

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

といった流れとなる。

ここまでの話は、DeviceがIN Endpointだった場合であるが、ではDeviceがOUT EndpointのDeviceのふるまいは? だとどうか? というのがPhoto02である。詳細はもう説明しないが、基本的には同じシーケンスであることが判る。今度はDeviceからデータがでるので、DPH InvalidとかDPP Invalidを考慮する必要がない(わざとInvalid Packetを送り出す必要性は考えにくいし、少なくとも仕様で規定する必要はない)ということだろう。

Photo02: Universal Serial Bus 3.0 SpecificationのFigure 8-25から抜粋

(続く)