リンク層
USB 3.0スーパースピードでは、USB 2.0で用いられた同じ通信線を上りと下りを切り替えて通信する半二重通信から、上りと下りそれぞれに専用の通信線を持つ全二重通信へと大きく変更されました。この全二重通信の採用により、上りと下りの切り替えに要するオーバーヘッドがなくなることや、パケットごとに同期パターンを持つ必要がなくなったことや、上りと下りの通信が同時に行えることなどの利点により5Gb/sの高速転送速度を十分に生かした高スループットの通信を実現しています。
そして、USB 2.0との下位互換を維持しながら、大きく変更された物理層の差を吸収するためにリンク層が設けられました。リンク層は、以下のような役割を担っています。
- リンクのトレーニング
- パワーマネジメント
- フレーミング
- フロー・コントロールとバッファのマネジメント
以下に、おのおのの役割を解説していこうと思います。
1. リンクのトレーニング
これは、リンク先のデバイスと同期を取り、リンクを確立することを目的としていますが、レシーバのイコライザは、リンクの減衰に応じてトレーニングを通して最適化しなければなりません。リンクの確立からループバックモードに入るまでの信号を示していましたが、通常の通信においてもほとんど同じ信号を使ってリンクをアクティブに設定します。異なるのは、TS1とTS2の内容だけです。こうした動きは、Link Training and Status State Machineによって管理されています。
2. パワーマネジメント
全二重通信においては、リンクがアクティブな状態ではデータの送受信が行われないアイドル状態でもアイドル信号を使って通信が続けられています。このことは、受信器が常に同期を維持している状態なので、USB 2.0のようにパケットの最初に同期パターンを持つ必要がないというメリットがありますが、5Gb/sもの高速通信を維持するにはそれなりの電力を必要とします。従って、第1回で紹介したように、きめ細かなパワーマネジメントが重要で、必要のないデバイスは通信を止めて低電力状態に行えるようになっているのです。USB 2.0では、アクティブとサスペンドの切り替えで電力管理を行っていましたが、USB 3.0スーパースピードでは、表1のように2種類のアイドル状態が追加されています。

表1 USB 3.0スーパースピードでは2種類のアイドル状態が追加
リンク層ではパワーマネジメント用のリンク・コマンドとして、LGO_UX(U1、U2、U3への移行要求)、LAU(移行要求の承認)、LXU (移行要求の拒否)、LPMA(LAUの受信通知)が用意されています。このようにパワーマネジメントがリンク層で管理することができるので、上位のプロトコル層やアプリケーション層で管理する手間が省けます。
ページトップに戻る
3. フレーミング
USB 3.0スーパースピードの信号が全二重通信であり、リンクがアクティブな状態ではデータ通信がなされない間(ロジカル・アイドル)であっても、5Gb/s での通信が続けられていることはすでに解説したとおりです。USB 2.0の通信ではパケットはバースト状に現れるので電気的に信号振幅を判定して検出することができますが、USB 3.0スーパースピードでは同様の方法が使えないのは明らかです。そこで、ロジカル・アイドル状態と有意なデータを区別するために、ある決まった枠にはめ込んだ構造にします。この構造をフレームと呼びます。
8b/10b
8b/10bコーディングは、リンク層ではなく物理層の役割とされていますが、フレーミングと関連するので少しここで解説しておきます。USB 2.0でもUSB 3.0スーパースピードでも同期を取るためには、受信器のクロック・リカバリ回路の動作が重要になります。USB 2.0では、データはNRZI(Non Return to Zero Invert)を使って変換されますが、元のデータで1が続くと信号の極性が反転しないため、クロック・リカバリ回路で同期が取れなくなり、これを避けるために、6個以上1が続かないようにスタッフ・ビットを入れることになっています。USB 3.0スーパースピードでは、NRZIではなくNRZ(Non Return to Zero)が使われているため、0または1が連続すると同様の問題が発生します。そこで、0または1が連続する数(Run Length)を制限するために8b/10bコードを用いて8ビットのデータを10ビットのコードに変換します。8ビットのデータは256種類あり、10 ビットのコードは1024種類ありますが、この1024種類のコードのうち、0または1が続く数が少なく、かつ0と1の数がほぼ同数のコードを選んで、8 ビットのデータに割り当てているものです。図1には8b/10bによって0または1の連続する数が制限される様子を示しています。

図1 8b/10bによって0または1の連続する数が制限される様子
ほかにもいくつかルールがありますが、詳述することはこの記事の目的ではありませんのでほかに譲るとにします。こうして変換されたコードはレシーバで安定的に同期を取ることができるようになりますが、・1100111101011100・のように流れてきたデータでどれがbit0かを判定するには、何か目印が必要です。8b/10bコードでは、データに割り当てたDコード以外にKコードと呼ばれる特殊コードを用意しています。最も有名なのは K28.5と呼ばれるコードですが、流れてきたデータ列の中にこのコードを見つけると、見つけた位置を基点としてデータ列を10ビット単位で区切ることができます。後は、10ビットごとに10b/8b変換して元のバイトデータに変換することができます。
フレーム
USB 3.0スーパースピードでは、USB 2.0の全トランザクション・タイプをサポートしますが、物理層が異なるので、その動きが若干異なっています。
INトランザクション
USB 2.0では、図2のようにINトークン・パケットをホストが流し、これに対応してデバイスがINトークン・パケットを正しく受信すると、データ・パケットを返します。ホストはデータ・パケットを正しく受信するとACKパケットを返して終了となります。

図2 USB 2.0では、ホストが流したINトークン・パケットを正しく受信するとデータ・パケットを返す
USB 3.0スーパースピードでは、INトークン・パケットはなくなりACKになっています。データはData Header PacketとData Packet Payloadが合体されて送信されます。基本的にはUSB 2.0の動きとほぼ同様の動きに見えますが、デバイスは上り専用に通信線を持っているので、ホストに対してERDY(End Point Ready)を発行して準備完了を知らせることができます。また、リンク層に下って見るとERDYやACKを含めてすべてのパケットを通信するには、それぞれフレームにしなければいけません。つまり、どこからパケットが始まってどこでパケットが終わるかを示す構造体(フレーム)にして送らなければならないのです。
例えばDPPは、Data Packet Payloadの始まりを知らせるために、K28.2コード(SDP)3つに続いてK23.7コード(EPF)をデータの前に付けてパケットの始まりを、データの後ろにはCRC-32とK29.7(END)3つに続いてK23.7コード(EPF)を付けてパケットの終わりをそれぞれリンク層に知らせます。 ERDYやACK、DPPも同様に始めと終わりを示すコードを前後に取り付けたフレームにして通信しています。リンク層で見ると、図3のようにフレームにしてデータの通信を行い、必要な情報をプロトコル層に受け渡しをしています。

図3 フレームにしてデータの通信を行い、必要な情報をプロトコル層に受け渡す
これを、プロトコル・アナライザで観測すると図4のように見えます。

図4 プロトコル・アナライザで観測した様子
ページトップに戻る
4. フロー・コントロールとバッファのマネジメント
前ページのように、リンク層ではフレーミングされたパケットを処理してプロトコル層に引き渡していますが、ここではフレーム・レベルの通信の制御を行っています(リンク・コマンドを使って制御)。LGOOD_n(フレーム受信成功の通知)、LBAD(フレーム受信失敗の通知)、LRTY(再送の通知)、LCRD_x(バッファ準備の通知)、LUP(リンク・アクティブの通知上りのみ)などです。
上記の例では、ACKやDHPのフレームに対してハンドシェイクが行われます。図5に示したように、まず、デバイスが準備完了をERDY Transaction Packetで知らせます。ホストはこのフレームの受信が成功するとAcknowledgeとしてLGOOD_0を送り、続いてバッファの準備を知らせる LCRD_Dを送ります。ホストは、ここでACK Transaction Packetを送ってデバイスからのデータ送信を要求しますが、デバイスでこのフレームの受信が成功すると、やはり同様にAcknowledgeとして LGOOD_5がデバイスから返送され、続いてバッファの準備を知らせるLCRD_Bが返送されます。その後、ホストへのデータの転送が開始されますが、ホストがData Header Packetの受信に成功すると、そのAcknowledgeとしてLGOOD_1返送され、続いてバッファの準備を知らせるLCRD_Aが送られます。
データの受信が完了すると、ホストはACK Transaction Packetを送って受信を完了しますが、デバイスはACK Transaction Packetの受信をLGOOD_6で知らせ、バッファの準備をLCRD_Cで知らせます。ここで、LGOODの後の数字はシーケンス番号ですが、これは 0〜7まで順番に使われます。またLCRDの後の文字は、バッファの番号に相当し、A〜Dまで順番に使われます。ホスト側とデバイス側は独立してナンバリングが行われていますので、ホストがLGOOD_0を送った後にデバイスがLGGOD_5を送っているのは特におかしなことではありません。

図5 リンク・コマンドによるフレームのフロー・コントロール
これをプロトコル・アナライザで見るには、リンク・コマンド・レベルまで見るように設定すればよく、その結果は、図6のようになりフレーム・レベルでのハンドシェイクの様子が分かります。

図6 プロトコル・アナライザで見るとフレーム・レベルでのハンドシェイクの様子が分かる
このように、USB 3.0スーパースピードの通信では、リンク層の動きは非常に重要な役割を果たしていますので、この動きを理解することがUSB 3.0スーパースピードのプロトコルを理解する近道となります。
ユニキャスト
USB 2.0ではホストが接続されたすべてのデバイスに一斉に送信(ブロードキャスト)し、応答すべきと判断したデバイスが返信する方式を取っていました。

図7 USB 2.0では、応答すべきと判断したデバイスが返信する方式を取っていた
これは、不必要なデバイスに対しても送信するということなので、電力管理という意味でも非効率でした。USB 3.0スーパースピードでは、通信を行う場合にルート・ストリングを指定して対象のデバイスにのみ送信(ユニキャスト)する方式を取っています。ルート・ストリングは、4つのサブ・ストリングからなっており、それぞれがハブのルートを指定しています。

図8 USB 3.0スーパースピードでは、ユニキャスト方式を採用
ポーリング
USB 2.0では半二重通信であり、その通信の主導権はホストが握っているので、通信したいデバイスはホストからの問い合わせ(ポーリング)がなければ、通信することができません。しかしながら、USB 3.0スーパースピードでは全二重通信となり上り専用の通信線があるために、デバイスから通信の要求ができるようになりました。そのため、ポーリングは廃止されています。
そのほか
USB 3.0スーパースピードではデータ・ストレージ・デバイスの転送の効率化を主目的として、ストリームがバルク転送で利用できるようになっています。これも、5Gb/sの高速通信でリッチなコンテンツを効率的に転送するための工夫です。またアイソクロナス転送にも改良が加えられており、リッチな画像コンテンツの利用をサポートしています。
関連するウェブサイト
ページトップに戻る