ということで、簡単にPipeの説明が終わったところで、USB 3.0のStreamに話を移したい。前回ちょっと触れた通り、Burst Transferと似たスキームで実装されているものにBulk Streamingがあるという話をした。これをもう少し正確に書くと、Transactionの種類にはBulk、Control、Interrupt、Isochronousの4種類があり(これは以前も説明した)、BUrst TransferはこのうちBulkを使う事になる。で、このBulkには(連載の313回までに説明した)Simple Bulk IN/OUT以外にBulk Streamingがある、という話である。このBulk StreamingはStream Pipeと非常に似た構成であるが、Pipe IDではなくStream IDを使う、という話である。

ということでBulk Streamingである。Photo01はSPSM(General Stream Protocol State Machine)の構成である。細かなエラーハンドリングなどは全て下位層で行われることが前提だから、State Machineとしては恐ろしく単純な構造になっていることが判る。Bulk Streamを行うIN/OUT EndpointはどちらもこのSPSMに沿って処理を行うことになる。

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

ここで、

Disable (HostとDevice/Endpointとの間で)Pipeが構成された直後の初期状態、あるいはSPSMで何かエラーがあった場合にはこのStateとなる。初期状態の場合にはすぐにPrime Pipe Stateに遷移するが、エラーがあった場合はソフトウェア的にそのエラーを解消するまではPrime Pipe Stateに復帰できないことになっている。もっとも実際にはエラーがあった場合、Link Layerレベルでそのエラーの対処が行われ、場合によっては一度EndpointレベルでのLink Downが行われ、そこから再びLink Re-establishという形になるだろうから、この間ずっとStreamを待機状態においておくよりも、あっさりDisabledという形でStreamを破棄するほうが賢明かもしれない。
Prime Pipe この状態は、Endpoint Buffer setが用意された事を、HostからDeviceに通知するものとなる。
Idle 文字通り待機状態。この段階では、まだStreamは何も選択されていない。ここでBufferの状態に変更があれば再びPrime Pipeに遷移するし、Hostが転送を開始する場合はMoveDataに向けてHost Initiated Transitionが、Deviceが転送開始する場合はStartStreamに向けてDevice Initiated Transitionがそれぞれ発生する。転送が終了すると、再びIdleに戻る形だ。
StartStream DeviceからHostにStreamを使ってデータ転送を要求する場合には、このStateに入る。もっともUSBの場合、実際の転送そのものは必ずHost側が行うから、DeviceがInitiateするといっても、実際にはHostに転送要求を出すようにDevice側が要請するといった形になる。この要請がHost側に受け入れられるとAccept、Hostから拒否されるとRejectのTransitionになるわけだ。
MoveData ここが実際にStream Dataの転送を行うStateとなる。Host InitiatedのTransitionでここに推移してきた場合、Current StreamはHost側で定めることになり、逆にStart Stream State経由で推移してきた場合、Current StreamはStart Stream Stateの中で(Device側によって)定められることになる。MoveData Stateは転送が完了するか、中断した場合に終了、(エラーでなければ)そのままIdle Stateに戻る形になる。ちなみにIdle Stateに戻った時点で、Current Streamは無効となる。

といった仕組みである。

この一連のState Machineで利用されるのが、Stream IDと呼ばれる16bitの値である。実は既に説明してきたDPHやACK/NRDY/ERDYといったTPには、Stream IDのためのFieldが確保されている。(これはStreamを使う場合のみなので、Streamを使わない場合はReserved扱いだが)。Stream IDのFieldには幾つかのSID値が定められている。

  • NoStream : 特定のStream IDが入っていないことを示す。値はFFFFhとなっており、この値を持つTPが流れている場合、実際にはStreamが存在していないことを示す。
  • Prime : Prime Pipe Stateへの遷移中にこのSIDが使われる。値はFFFEhが割り当てられている。

(続く)