同様に、Bulk OUT Streamの場合を次に示す。Bulk OUT Streamの場合、Host側のEndpointがもつデータが、Device側のFunction Bufferに転送される形になる。

Photo01はOSPSM(OUT Stream Protocol State Machine)の模式図である。Endpoint構成後にPipeがDisabled Stateに遷移し、そこからPrimeを指定してNRDYを受け取るとIdle Stateに遷移するところまでは同じだが、そこからがちょっと異なる。IN Streamの場合はACK TPを使い、ここでPrimeを指定する形を取っていたが、OUT Streamの場合はDPにPrimeを指定する形でこれを行うようになっている点だ。これはハンドシェイクの手順が異なる(IN StreamだとACK→DPでハンドシェイクが行われるが、OUT Streamでは逆にDP→ACKとなる)ためである。ここで無事にDeviceがIdle Stateに遷移できた場合、HostにはNRDY TPをPrimeを指定して返す形になる。

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

ちなみにOUT Streamの場合でも、やはりHostとDeviceの間に複数のHubが入り込み、Deffered bitが立てられた状態でDPが届くケースが考えられる。この場合の対処もやはりIN Streamの場合と同じく、HostはPrime Pipe StateからIdle Stateに遷移するし、Deviceは一旦(Defered bitの立った)DPを受け取る事でPrime Pipe Stateに遷移し、続いてPrimeの指定付きDPを受け取る事でやはりIdle Stateに遷移する。

Idle Stateに入ったら、以後はStart StreamなりMove Dataへの遷移を待つか、もしくはPrime Pipe Stateに再び戻る形になる。ここからの遷移のトリガーとなるのはHostから来るDPで、ここにPrime以外のStream IDが指定されるとMove Data StateないしStart Stream Stateに遷移することになる。またこの際にPP(Packet Pending)=0であれば単発のPacketであるが、PP=1の場合は複数のPacketの転送が用意される形になる。

さてStar tStreamかMove Dataか、の選択はHost側から行う事になる。HostからStream ID nかつNumP > 0を指定してDPが届いた場合、DeviceはStart Streamに遷移する形になる。一方、

(1) Endpoint BufferがLCStreamを扱っており、かつ直前のOSPSMの遷移がMove Data exit「ではない」
(2) Endpoint Bufferが新しいStreamを扱っており、HostよりERDY TPで新しいStream IDが指定され、NumP > 0である

のどちらかの場合にはMove Dataに遷移することになる。(2)は要するに新しい転送の開始だし、(1)は直前の転送が複数Packet分に跨っており、しかも現在転送の途中であることを示す。

さて、Start Stream Stateでは先ずHost側がDeviceからのStream要求を受諾するか拒否するかを判断する。ここで拒否された(NoStreamが指定され、PP=0のDPが返ってきた)場合はStart Stream Endに遷移する。Star Stream EndはHostにNoStreamを指定したNRDY TPを送り、自身はIdleに遷移する。一方Hostから受諾された場合はそのままMove Dataに遷移する。

一方直接Move Dataに推移する場合は、DPを受け取ったらすぐにMove Dataに遷移し、そのまま処理を行う形になる。Move Dataから抜けるのは、原則としてCStreamがNoStreamになる場合のみで、この場合にはIdle Stateに推移することになる。これは例えば10Packetを転送するようなケースであっても、必ずしも連続して転送が続くとは限らず、合間に待ちが入る可能性があり、そうしたケースでは一旦Idleに戻るというわけだ。

OSPSMもまた、HostのDeviceの両方で独立に動作することになる。従ってISPSMの場合同様に一時的な競合状態に陥ることがあるが、これもまた最終的にはどちらもIdleに自発的に戻る形で競合が解消できる仕組みとなっている。

(続く)