ではもう少し中身をみてみよう。Photo01は、Hubにぶら下がるUSB 3.0 DeviceのConnect State Machineの動作をまとめたものである。USB 3.0 Deviceの場合、まずはUSB 3.0で接続しようとし、それで駄目ならUSB 2.0で接続しようと試みる。まぁこの図では単純にUSB 2.0とまとめているが、実際はUSB 2.0の480Mbps(High-Speed)の他、USB 1.1の12Mbps(Full-Speed)と1.5Mbps(Low-Speed)もある訳で、この結果として接続の際には、

USB 3.0→High-Speed→Full-Speed→Low-Speed

と速度を変えながら接続を試みる形になる。重要なのは、VBUSがValidになったら、まずAttempt SS Connectに入り、最初にUSB 3.0での接続を試みることだ。そこで駄目ならUSB 1.1/2.0の接続を試みる形となる。ここでUSB 2.0での接続も駄目なら、後はひたすらUSB 2.0での接続が可能になるまでループする形となる。

Photo01: この図はUSB 1.1/2.0をひと括りにしてしまっているが、これはUSB 1.1/2.0に関しては従来のデバイスと動作が変わらないから、という事であろう。

ただ面白いのは、一旦USB 2.0でConnectした後で、再びUSB 3.0での接続が可能かどうかを確認することだ。USB 2.0と3.0では使っている配線が異なるから、USB 2.0 Deviceとして通信を行いながら、その一方でUSB 3.0のLink Trainingを行うことが可能である。なのでDeviceから見た場合、例えばUSB 3.0側の立ち上がりが遅い場合はまずUSB 2.0 Deviceとして接続しておき、後でUSB 3.0側が立ち上がったらその時点でUSB 2.0 DeviceとしてはDisconnectし、USB 3.0として接続する形になる。もっともUSB 3.0の接続に問題があった場合、再びUSB 2.0 DeviceとしてConnectを試みる形になる。以後このシーケンスは、再びVBUSがNot Validになるまで続く訳だ。

こうした動作をサポートするため、USB 3.0 HubのDownstream側ポートのState Machineは結構面倒な構造になっている(Photo02)。基本的な流れはUSB 3.0 Deviceと大きくは変わらない。VBUS Validのタイミング、あるいは一度USB 2.0としてDeviceが接続を確立した後でのLink Training開始のタイミングで、Hub側のDownstreamポートもDSPORT.DisconnectedからDSPORT.Trainingに遷移し、そこで無事にTrainingが終了するとDSPORT.Enabledに入る。以後はこのDSPORT.Enabledのまま通信を行うことになるわけだ。面白いのは、少々のエラーに関してはこのDSPORT.EnabledのStateの内部で処理をする事だ。図からもわかるように、Link StateがU0のみならずU1/U2/U3の場合もここで処理するし、Recoveryもこの中で行われる。ではDSPORT.ErrorというStateは何をするか? というと、実は何もしない。DSPORT.Errorは回復不能なエラーになった場合のStateで、このStateに入った場合、LinkはSS.Inactiveに落とされ、そこから基本的には復帰しない。実際図でもDSPORT.Errorから抜ける事が想定されていないことが判る。この場合、復帰は一度Hubの電源を落とし、再起動するしか方法は無い。現実問題としてこのStateに入るのは、そのDownstream Portが物理的あるいは電気的に壊れた場合になると思われる。

Photo02: Universal Serial Bus 3.0 SpecificationのFigure 10-9から抜粋し、一部改変。

もう少しこのシーケンスを追ってみよう。例えばPhoto03の様に、USB 3.0 Hubを介してUSB 3.0 DeviceがHostに繋がることを考えてみる。まずHostが立ち上がると、当然自分の配下のDeviceの初期化を行うことになる。具体的に言えばOSが立ち上がり、ベースドライバやらミニポートドライバがロードされた後ということになるが、このタイミングでUSB Hostの初期化が行われ、USB 3.0での通信がEnableになり、VBUSの供給が始まる事になる。潜在的な話をすれば、これがOSのロードではなく、POSTが終わってBIOSの起動中にVBUSの供給が始まる可能性はある(これはUSBキーボード/マウスの対応である)が、VBUSはともかく通信そのものはこの段階だとUSB 1.1の、それもLow-Speedでお釣りが来るレベルだから、間違ってもこのタイミングでUSB 3.0 Hostが稼動することはないだろう。

Photo03: ここでHubが複数とかだともう少し話は面倒になるが、基本的なシーケンスは同じで、途中の手順が繰り返されるだけである。

さてUSB 3.0コントローラが稼動を始めると、当然これにあわせてまずHub、次いでHubの下にあるUSB 3.0 Deviceがそれぞれ通信が開始されたことを検出、どちらもUSB 3.0での接続を開始する。これが正常に終了すると、HostはUSB 2.0と3.0で接続されているDeviceをそれぞれリストアップし、最終的にUSB 3.0で接続されているDevice Listが完成するという具合だ。(続く)