ではもう少し中身をみてみよう。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での接続が可能になるまでループする形となる。
ただ面白いのは、一旦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が物理的あるいは電気的に壊れた場合になると思われる。
もう少しこのシーケンスを追ってみよう。例えば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が稼動することはないだろう。
さてUSB 3.0コントローラが稼動を始めると、当然これにあわせてまずHub、次いでHubの下にあるUSB 3.0 Deviceがそれぞれ通信が開始されたことを検出、どちらもUSB 3.0での接続を開始する。これが正常に終了すると、HostはUSB 2.0と3.0で接続されているDeviceをそれぞれリストアップし、最終的にUSB 3.0で接続されているDevice Listが完成するという具合だ。(続く)