• U0

U0はいわば、正常動作のStateとなる。要するにLink先とパケットの送受信を行うStateである。U0にはSubstateが存在しない。面白いのはこのU0では当然ながら5GHzのフルスピード信号を取り扱っている訳であるが、U0の要件として「LFPSの受信が可能な事」が入っている。これは相手先がLFPSモードに突然入る(例えば外的要因でDeviceのCold Resetがいきなり掛かってしまって、初期化からやり直している)場合に、それに対応する必要があるからだ。また、U0ではDownstream PortでLink Commandを受信した場合には、内部の1ms TimerをRestartして、次のLink Commandが来るまでの時間を測定し、異常が無いかを確認することになっている。逆にUpstream Portでは10μsのタイマーが用意され、最後のSymbol送信後にStart、(次のパケットの)最初のSymbol送信後にResetを掛ける事になっている。この10μsのタイマーがExpireした場合、LUPを送信することになっている。これは要するに、Deviceが特にUpstream Portにパケットを送出する必要が無い場合でも、あまり長時間何も送らないとLink Downが疑われてしまうので、これを防止するために10μsごとにLUPパケットを送るという、いってみればHello Message的な役割である。

このU0 Stateから抜けるのは、

(1) Deviceが省電力モードに入る事に伴い、U1~U3のStateへの遷移が要求された
(2) 相手先ポートが通信状態以外に入った
(3) その他のエラー状態(例えばVBusからの電源供給が急に無くなった、など)に陥った といった状況になった場合であり、その場合は当然ながら対応したStateに遷移することになる。

  • U1(Photo01)

Photo01: Universal Serial Bus 3.0 SpecificationのFigure 7-17からの抜粋。

U1~U3は原則としてLow Power Stateとなる。U1はこの中で、比較的高速にU0に復帰させやすいモードである。U1はパケットの送信が止まり、Linkの両側がLow Power Stateに入った状態である。パケットの送信を止めてLow Power Stateに入るといっても、すぐにLFPSの送信が可能な程度にはシステムの稼動状態を維持しておくのがこのStateとなる。

このStateはPhoto01にあるように、Substateを持たない。したがってここから抜けるのは、

  • LFPSのハンドシェイクに成功→Recoveryへ遷移
  • LFPSのハンドシェイクに失敗→SS.Inactiveへ遷移
  • DSPの300msのタイマーがExpire→U2へ遷移
  • Warm Resetを検出→Rx.Detectへ遷移
  • その他→SS.Disabledへ遷移

という形ですぐ次のStateに移動することになる。ここでU2の遷移のトリガとなるタイマーだが、U1 Stateに入った場合、DSPに300msのTimerを仕掛ける事が定められている。このTimerはLFPS.Pingを受信するごとにReset/Restartされることになっている。つまりLinkの両端がどちらもU1に入り、定期的にLFPS.Pingを送り続けている限り、このU1 Stateが維持されることになっている。ちなみにLFPS.Pingはこのケースでは平均200ms(最小160ms、最大240ms)毎に送信することが定められており、したがって300ms以内にLFPS.Pingを受け取らなければ相手側がU1から抜けたと判断できるわけだ。

  • U1(Photo02)

Photo02: Universal Serial Bus 3.0 SpecificationのFigure 7-18からの抜粋。

U2は、U1よりも電力消費を抑えやすいが、その分復帰に時間が掛かるモードとなっている。このStateでは、原則としてLFPSの受信する(もっと正確に書けば、Ping.LFPSとU1 LFPSを区別する)事は必要だが、LFPSの送信はU2 Exitの時だけで良い。送信を行わない分、より電力が抑えられるというわけだ。このU2 Stateの終了条件もU1に似ており、Photo02の様に、

  • LFPSのハンドシェイクに成功→Recoveryへ遷移
  • LFPSのハンドシェイクに失敗→SS.Inactiveへ遷移
  • Warm Resetを検出→Rx.Detectへ遷移
  • その他→SS.Disabledへ遷移

となる。先にU2では原則送信を行わないと書いたが、それでどうやってハンドシェイクを成立させるか?というと、U2から抜けるときには再びTransmitを有効にするからだ。つまりU2 Stateで待機状態にあるときに、相手からU2 Exitのハンドシェイクが来た場合はTransmitを再開してU2 Exitのハンドシェイクを成立させ、Recoveryに遷移するという形になる。ただ、これは実装によるのだろうが、Transmitterへの電源を切るような仕組みを設けていたとすれば、電源を入れてから初期化を行うまで多少時間がかかる。このため、LFPS U1 Exitではt10-t11(Linkの片方がハンドシェイクを開始してから、もう片方がハンドシェイクを開始するまでの時間)は最大0.9μsなのに、LFPS U2 Exitでは2msまで許される事になっている。勿論これは「最大2ms」なのであって、2msみっちりウォームアップしろという意味ではないのだが、立ち上がり時間がU1より壮絶に遅くなるであろう事は容易に想像できる。

(続く)