さて、まずはDataFlow Modelから説明して行くことにしたい。そのDataFlow Modelであるが、USB 1.1/2.0と3.0では通信方式が変わったため、かなりFlow Modelに影響が出ている。実際、通信方式の差異としては、

  • USB 2.0は3-part transaction(Token/Data/Handshake)を採用している。USB 3.0も同じく(論理上は)3-part transactionだが、Host→DeviceではTokenがDataに内包されており、一方Device→HostではTokenがHandshakeで代替されてしまっている。
  • USB 3.0ではContinuous bursting(連続バースト転送)がサポートされたが、これはUSB 2.0には無い。
  • USB 2.0は半二重通信だが、USB 3.0では送受信が同時に行えるため全二重通信となっている。
  • USB 2.0はPollingを使っているが、USB 3.0では非同期通知(Asynchronous notification)を採用している。
  • USB 3.0はbulk endpointのためのストリーミングをサポートしているが、これはUSB 2.0には無い。
  • USB 2.0ではIsochronous deviceを接続している場合、バスをLow power stateにすることが出来ない。USB 3.0ではIsochronous deviceが接続されていても、同期の間にLow power stateにすることが可能である。この場合、HostはPINGパケットをDeviceに送信することで、Low power stateから復帰させることが出来る。
  • USB 2.0では、Low power stateに入った場合、デバイスの復帰がどの位遅れるかを知るためのメカニズムが無かった。USB 3.0ではLatency Torelant Messagingを使う事で、DeviceからHostに、Latencyを通知することが可能となっている。
  • USB 2.0ではSOF/μSOF(Start-of-Frame)の送出タイミングは1msないし125μsおきと決められていた。USB 3.0にはBus Interval Adjustment Messageが追加され、これにより125μs±13.333μsの範囲でSOFの送出タイミングを調整できるようになった。またHostはITP(Isochnronous Timestamp Packet)を使い、Timing windowを緩くすることも可能になった。
  • USB 2.0では電源管理はLink Levelを含めてHost側からのみ可能だった。USB 3.0ではLink Levelに関してはHostとDeviceの両方から可能となった。
  • USB 2.0でのエラー検出/訂正はend-to-end transactionのみであった。USB 3.0ではend-to-end transactionに加え、Link Levelのエラー検出/訂正が行えるようになった。

というあたりが主な相違点とされている。

とりあえずPower Managementに関わる部分は措いておくとして、Continuous burstingに関しては、アプリケーションレベルでも差が出てくるだろう。おそらくこの機能はHDDなりFlashなりといったblock device(しかもそのblock sizeが結構大きい)のデータ転送を効果的に行うための追加機能と考えられるが、USB 2.0では単なるBurstしかサポートされないから、Applicationを作る(この場合のApplicationとは、例えばUSB 3.0/SATA Bridgeの様なものである)場合の、上位層のデータの持ち方なども変わってくる事になろう。少なくともUSB 2.0よりは明らかに内部Bufferの容量を大きくしなければ、Continuousが間に合わない事になるからだ。またPolling→Asynchronous notificationとメカニズムが変わった事で、例えばこれまでならば処理を行った結果はPolling用のBufferに溜め込んでおけば良かったが、これからはその先にNotificationを出す処理を追加しなければいけなくなった。

うまくこうした差異を吸収できるようなMiddlewareが作れれば、USB 2.0か3.0かを意識せずにApplicationを作る事も可能だろうが、当面はApplicationの側においてもUSB 3.0であることを意識した構造にすることが求められる事になるだろう。

(続く)