ということで、Hubについてもちょっと内部を紹介しておく。これまでも触れてきた話だが、USB 3.0の場合、1つのHubは最高で15 Downstreamまでサポートされ、5層までのスタッキングが可能で、最大1つのコントローラの下に127までのデバイスが接続できる(Photo01)。

Photo01: Dan Froelich氏(USB 3.0 Hub Workgroup Chair, Intel)の"SuperSpeed USB Hubs"のプレゼンテーションより。これはHubだけをまとめた図。

ちなみにこの制限はUSB 2.0の場合と同じである。USB 2.0はTier 1にHostとRootHub、Tier 7がEndpointになっており、Tier 2~Tier 6にHubが入る形となるので、やはりHubそのものは5層である。ただその中身は変わっており、USB 3.0のHubは、USB 2.0とUSB 3.0の2つの機能を別に用意することが当初から想定されている(Photo03)。まぁしかしこれは当然で、片や送受信が共用の2線式で480Mbps、片や送受信が分離された5Gbpsである。しかもUSB 2.0はBroadcastが原則で、対してUSB 3.0ではPeer to Peerだから、まるっきり通信方法が異なっており、こうなるとPhoto03の様な構造が一番賢明であろう。

Photo02: Universal Serial Bus 2.0 SpecificationのFigure 4-1から抜粋。Hubの層数だけで比較すればUSB 3.0と同じ(というか、USB 3.0がUSB 2.0にあわせたというべきか)。

Photo03: 変な言い方かもしれないが、USB 2.0は丁度10/100BASE-TのDumb Hubに近いイメージで、USB 3.0はSwitching Hubに近い。

ちなみにこの図では、VBUSの制御のみ両者が連動しているようになっているが、これはVBUSのラインそのものはUSB 1.1/2.0とUSB 3.0で共通で、にも関わらず出力が切り替わるためだ。前回紹介したとおり、USB 1.1/2.0は500mAまで、USB 3.0では900mAまでとなっているから、接続形態にあわせてこの電力供給量を切り替えてやる必要がある。ただ逆に言えば、現時点で連動しているのは唯一この程度であり、USB 1.1/2.0のHubとUSB 3.0のHubは、完全に独立してState Machineが動作すると規定されている。

もっとも個人的にはこのインプリメントはちょっと疑問である。というのは、USB 3.0に限って言えばBroadcastモデルを廃したために、HostとDeviceは仮想的にPeer-to-Peerで通信できるが、USB 1.1/2.0はHost→DeviceにBroadcastモデルを使っているままである。ということは、例えばあるDeviceがUSB 3.0で通信を行っていても、それとは無関係にUSB 1.1/2.0の通信ライン経由でHostからのMessageがBoradcastされることになるからだ。あるいは、Deviceが省電力モードに入ったとすると、USB 3.0の通信は必要最小限に抑えられて、不用意にDeviceを起動させてPacketを受信しないように配慮される。ところがUSB 1.1/2.0に関してはこうした状況はお構いなしにPacketを送りつけることになる。

勿論プロトコル上は、こうした形でUSB 1.1/2.0 Packetが送りつけられる事そのものは問題ない。USB 3.0 DeviceはまずUSB 3.0を使ってのLink Training~Session確立を行い、ここで確立に成功すればそのままUSB 3.0で通信を行い、これに失敗したらUSB 2.0での通信を行うという形になる(勿論それ以前にUSB 3.0の配線が繋がってなければそもそもUSB 3.0のLink Trainingすら行わないだろうが、USB 3.0 DeviceがUSB 3.0 Hub経由でUSB 2.0 Hostに繋がってる、なんて場合は信号線だけでは区別できないからだ)。つまりUSB 3.0で通信中はUSB 1.1/2.0のI/Fそのものが初期化されていない、あるいは休止状態に置かれるといったインプリメントが期待できるため、そこにどんなメッセージが来ても実害は無いからだ。

ただ上で述べたようなケースでは、明らかにUSB 1.1/2.0のMessageをBroadcastするのは無駄である。HubについてもDevice同様省電力化が求められつつあることを考えると、無駄にBroadcastしないことで省電力化を図るという方向性は当然ありえるだろうし、その場合USB 1.1/2.0に省電力のStateがそもそも無い以上、USB 3.0のState Macineから省電力動作の指示を引っ張ってきてUSB 1.1/2.0のHubの動作を規定する、という方向に長期的には向かうのではないかと筆者は考えている。

さてちょっと話が逸れたので元に戻す。HubはUSB 1.1/2.0とUSB 3.0で別々のState Machineが動作する。USB 1.1/2.0については従来のState Machineそのままである。ではUSB 3.0は? というのがこちらだ(Photo04)。

Photo04: もっともこれはOverviewであって、実際はもう少し色々とある。

Hubは基本的にPacketをリピートするだけだから、異常が無い限りひたすらConnected to SSを継続し、セッションが切れた(配線が抜かれた/切れたとか、繋いでいるDeviceの電源が落ちたとか)場合にはAttempt to connectに戻るだけである。勿論そもそもUpstream方向(つまりHost側)が繋がっていない場合はState Machineを動かしても無駄なので、その場合はState Machineが止まることになる。この検出をVBUSで行っているのはなかなか興味深い。

(続く)