• Rx.Detect(Photo01)

Photo01: Rx.Detectは分類的にはPower on Stateとなる。内部にはReset/Active/Quiteの3つのSubstateを持つ。

Rx.DetectはデバイスがLow Power Stateから抜けて最初に入るStateとなる。このStateの目的は、UPS/DPSの先にデバイスが接続され、そのStateがどうなっているかを、配線のインピーダンスを測定することで確認することである。

まず最初に入るStateはRx.Detect.Resetで、これによりWarm Resetを行うことになる。UPSに関しては、その後でWarm Resetを終了し、Rx.Detect.Activeに遷移することになるが、DSPに関しては相手側がLow Powerに入っている場合はそのままSS.Disabledに遷移することになる。

Warm Resetをかけた後は、Rx.Detect.ActiveとRx.Detect.Quietを行き戻りすることになる。このRx.Detect.Quietは前回説明したSS.Inactive.Quietと同じく12msの間待機するモードで、要するに12ms毎にWarm Resetが完了したかをRx.Detect.Activeで確認し、まだならRx.Detect.Quietに戻って待機する事になる。このあたりは、当然ながら省電力向けの配慮である。さて、ここで一定期間確認しても相手がWarm Resetに対応しなかった、あるいはDSポートからLow Power Modeが通知されたという場合はSS.Disabledに遷移するし、相手がWarm Resetを完了した場合はPollingに遷移する。

  • Polling(Photo02,03)

Photo02: Pollingはちょっと複雑だが、State的には一本道である。

Photo03: 殆どこのスライドで説明が終わっている気もする。

PollingはLPFSを使ったLink Training全体を司るStateである。内部的には5つのStateがあるが、これはそれぞれLink Trainingの各処理に対応しており、他のStateにExitすることはあっても、内部的に繰り返しをしたりすることは無い。要するに問題があればやり直し、という訳だ。

まず最初に入るのがPolling.LFPSである。Rx.Detectが成功すると、LFPSを使ってポート同士が互いにLinkの確立を始めることになる。このSubstateでは、

  • 最低16個の連続するPolling.LFPS burstの転送の状況がSpecificationの要件に合致していること。
  • 2回の連続するPolling.LFPS burstを受信する。
  • 1回のPolling.LFPS burstの受信後に、4回の連続するPolling.LFPS burstを送信できるという条件が満たされれば完了で、次のPolling.RxEQに遷移することになる。このSubstateに入ったタイミングで360msのタイマーがスタートし、仮にここでタイムアウトした場合は、Compliance ModeもしくはRx.Detect/SS.Disabledに遷移することになる(このどれに遷移するのか、は条件によって変わってくる)。ちなみにポートはこのモードに入ったら80μs以内にPolling.LFPS burstの送受信を開始すべきであるとされている。

次がPolling.RxEQである。ここでは、

  • 受信用イコライザの調整
  • レーンの極性確認
  • Bit/SymbolのLock

を行う。これはTSEQ(Training SEQuence)を送受信することで行う。TSEQはあらかじめ送受信するSymbolが決まっているから、受信側は受信したSymbolと本来受信すべきSymbolを付き合わせ、問題があればイコライザの調整を行うという仕組みだ。このPolling.RxEQは連続する65536回のTSEQの受信が完了すると終了という事になっている。ちなみにここからはLFPSではなく、USB 3.0本来の5GT/secで通信が行われることになる。

イコライザの調整などが終わると、次に遷移するSubstateがPolling.Activeである。これもまだLink Trainingの一部であり、ここではTS1(Training Set 1)として定められた符号セットの送受信を行う。面白いのは、ここで速度調整も行われることだ。向かい合った2種類のデバイスが同時にPolling.Activeに入ったとしても、両方のデバイスのインプリメントが異なる場合、先に片方のデバイスがTrainingを完了する場合がある。この場合、先に済んだほうは次のPolling.Configに遷移することになるが、ここではTS2の符号セットを使うことになる。そこで、まだTrainigが完了していない方は、TS1ではなくTS2を受信することになってしまう。このため、Polling.ActiveではTS1とTS2のどちらを使ってもいいことになっている。このSubstateは、同一のTS(TS1かTS2)を連続して8回受信できるのが終了条件となっており、Link Trainingに時間が掛かっていると、途中で受信するSymbolがTS1からTS2に変わるというわけだ。

その次のPolling.Configurationは、そういうわけでLink Trainingの完了待ちとなるSubstateである。このSubstateは連続する8回のTS2を受信後、連続して16回TS2を送信すると完了となる。これが無事終了すると、双方のポートのTrainingが完了したと見做し、Polling.Idleに遷移する。

Polling.Idleは、Trainingの後処理とでも言うべきSubstateである。Training中に上がったError Counterをリセットしたり、Polling.Configurationで受信したLink Configuration Field(これはTS1/TS2に含まれている)にしたがってパラメータをセットしたりした後、Idle Symbolを送出してU0に遷移することになる。

ちなみに途中から説明は省いたが、各Substateから条件次第ではSS.Disabledに遷移したり、あるいはRx.Detectに戻ったりするというのはPhoto02に示すとおりである。

(続く)