web-dev-qa-db-ja.com

本当に「USB通信プロトコル」はありますか?

Wikipedia によると、USB:

コンピュータと電子デバイス間の接続、通信、および電源供給のためにバスで使用されるケーブル、コネクタ、および通信プロトコルを定義します

しかし、本当に「USB通信プロトコル」があるのでしょうか?私の理解は次のとおりです。

  1. USBデバイスをマシンに接続します(たとえば、Ubuntuまたは任意の種類のLinux)
  2. Linuxはそのデバイスのデバイスドライバーを見つけ(知っている場合、どういうわけか-bonus!)、それをロードします。
  3. デバイスが/dev/theDeviceで接続されました
  4. ユーザー空間アプリは/dev/theDeviceへの読み取り/書き込みができるようになり、ドライバーは低レベルのIOを基になるデバイス/ハードウェアに処理します

私には、このフローのどこにも「USB通信プロトコル」は表示されません。私の理解が正しければ、USBはPCとデバイス間のケーブルと電気接続にすぎません。

私はここで間違っていますか? USBは実際、上記のフローを強調する何らかの低レベルのプロトコルを実装していますか?もしそうなら、それは何ですか、それは30,000フィートのビューでどのように機能しますか?

24
smeeb

はい、参照してください SBプロトコル

私が理解しているように、USB仕様は、レイヤードプロトコルとデバイスプロファイルの複雑なセットを定義しています。

たとえば、USBデバイスは、大容量記憶装置、キーボード(またはヒューマンインターフェイスデバイスなど)のような高レベルのテンプレートに準拠し、汎用デバイスドライバーによって管理できます。一部のUSBデバイスは、OSの低レベルUSBサポートがデバイス固有の高レベルのドライバーが必要であることを認識できるように、低レベルで通信できます。

47
RedGrittyBrick

質問:低レベルのUSB通信プロトコルが動作していますか?それは何ですか?

回答:

はい、あります。USB仕様には、バスがビットレベルで使用される方法を定義するUSBプロトコルが含まれています。これは、高レベルのプロトコル、つまり大容量ストレージ、HIDなどの基礎となる「低レベル」プロトコルになります。

USBプロトコルがどのように機能するかの詳細については、これ OSDev wiki が役立ちます。次に、別の 興味深い説明 シーケンス図を使用して、USBプロトコルごとのさまざまなデータトランザクションを説明します。

おまけの質問:Linuxは、そのデバイスのデバイスドライバーをどのように見つけてロードしますか?

ボーナスの答え:

'LinuxでUSB対応カーネルを使用している場合、動作中のUSBデバイスは、ハードウェアおよびカーネル USB仕様。ハードウェア側では、検出はUSBホストコントローラーによって行われます。次に、カーネルでホストコントローラードライバーが引き継ぎ、ワイヤー上の低レベルのビットをUSBプロトコルでフォーマットされた情報に変換します。この情報は、カーネルのUSBコアドライバーに読み込まれます。

私はこの優れた Opensourceforuの記事 から言い換えました。これはLinuxのコンテキストでの質問についてより詳細で明確です。

30
projectdp

他のほとんどすべてのタイプの通信インターフェースと同様に、USBはプロトコルstackとして実装されています。すべてまたは複数のタイプのデバイスに共通するこのスタック内のレベルは、USB標準自体によって定義されます。これにより、互換性が可能になり、各デバイスが冗長なプロトコル設計を行うのを防ぎます。さらに、プロトコルの各層は、次の層が気にする必要がない詳細を抽象化します。したがって、実際にデバイス固有のレイヤーを書き込んでいるときは、エンドポイントAからエンドポイントBにデータを取得する一般的な「送信」関数と「受信」関数しかありません。デバイス設計者として、あなたは気にする必要はありませんそれがどのように起こるか。さらに、プロトコルスタック内の下位レベルは、それらの上位層に共通のインターフェイスを公開している限り、実装を変更できます。このように、プロトコルスタックの一部が変更されても、スタックの残りの部分は必ずしも変更する必要はありません。理想的には、スタックのより高いレベルのプロトコルは厳密に気にする必要さえありませんwhichスタックのより低いレベルでプロトコルが使用されています。一般的に言えば、スタックの下の連続する各層は、メッセージが送信されているときに、次に高い層によって生成されたメッセージを独自のペイロードフィールド内にカプセル化します。メッセージが受信されると、各層はその層に関連する部分をはぎ取り、そのペイロードをスタックの上の適切な次の層に転送します。これは、USBだけでなく、ほぼすべての通信バスにも当てはまります。たとえば、TCP/IP/Ethernetスタックは、おそらくこれらの中で最も一般的に使用されています。特定の層が一般的に担当するタスクは、 OSIモデル などのモデルで記述されます。

USBには、電圧状態/タイミングなどを定義する物理層プロトコルがあります。線上とそれらがどのように解釈されるべきか。このプロトコルは明らかに、特定のデバイスに固有ではなく、USB標準自体の一部である必要があります(特に、ホストが特定のUSBポートに接続されるデバイスの種類を知る方法がないため)。

次に、誰がいつバスで話せるかを説明するために使用されるバス管理プロトコルがあります。これは、OSIモデルではメディアアクセスレイヤーと呼ばれます。 USBでは、このレイヤーは「ホストが指示したときにデバイスが送信できる」とほぼまとめることができるため、USBのこのレイヤーには特に複雑なプロトコルはありません。

次に、 データのパケットを説明する の標準プロトコルと、送信側から受信側へのルーティング方法を示します。この層もUSB標準自体の一部である必要があるため、特定のタイプのデバイスがホストによって実際に認識される前に、接続されているデバイスのタイプを検出するための初期通信を行うことができます。この層で特定のIDを持つ各デバイスに加えて、USBにはエンドポイントIDの概念もあります。これにより、任意のデバイスに複数のUSBエンドポイントを持たせることができます。これらのエンドポイントは、標準のUSBスタックによって多重化および逆多重化されます。これは、ソケットが標準のTCP/IPスタックによって多重化および逆多重化されるのと同じです。アプリケーションは、これらの各エンドポイントを個別のデータストリームとして扱うことができます。

最後に、デバイス自体に定義されたプロトコルがあります。大容量記憶装置、マウス、キーボードなど、一般的なユースケースのUSB標準の一部として含まれる一般的な事前設計されたものが実際にあるため、すべてのデバイスメーカーが再発明する必要がないことに注意してください。ホイール。ただし、より複雑なデバイスは、この層で独自のカスタムプロトコルを自由に設計できます。所定の送信に対するこの層の出力は、前の層のデータパケットのペイロードとして渡されます。十分に複雑なデバイスの場合、プロトコルのデバイス固有の部分自体が複数の独立したレイヤーに分割される場合がありますが、下位レベルはそれを認識したり気にする必要はありません。彼らが知る必要があるのは、ホストから特定のデバイスエンドポイントへ、または特定のデバイスエンドポイントからホストへ、特定のバイトセットを渡す必要があることだけです。繰り返しますが、レイヤー間に標準のインターフェースを使用すると、懸念事項を分離できるため、1つのレイヤーは別のレイヤーの内部の仕組みを気にする必要はありませんが、すぐ上のレイヤーまたはスタック内でその下。

14
reirab

実際には、相互に作用する一連の関連する通信プロトコルがあります。

最下位レベルでは、バイトパケットがシリアル接続を介して送信される方法を記述するプロトコルがあります。これはすべてのUSBデバイスに共通です(ただし、USB2とUSB3では異なります)。

送信される最初のパケットの1つは、デバイスにそれ自体を説明するように要求します。鶏と卵の問題を防ぐために、識別プロトコルはすべてのUSBデバイスで同じです。 OSはこのIDを使用して正しいドライバーをロードできます。

さらに別のレベルでは、USBはバスです。つまり、複数のデバイスが帯域幅を共有する必要があります。これは、各デバイスが通信できるときと通信できないときを通知するプロトコルがあることを意味します。すべてのUSBデバイスがこれに準拠する必要があるため、これを調整するために共通のプロトコルが使用されます。

最後に、多くの単純なUSBデバイスは非常に単純なので、デバイスのクラス全体(マウス、キーボード、ストレージ、イーサネットアダプターなど)を記述する追加のプロトコルがあります。ほとんどのデバイスは、これらの機能プロトコルのゼロまたは1つをサポートしています。

9
MSalters

おそらく、答えの一部は「 通信プロトコル 」というフレーズの定義内にあるでしょう。行ったのと同じソース(Wikipedia)にアクセスすると、次のような役立つ情報が見つかります。

  • 通信を行うには、プロトコルについて合意する必要があります。
  • 通信システムは、メッセージを交換するために明確に定義されたフォーマット(プロトコル)を使用します。
  • プロトコルは、通信の構文、セマンティクス、および同期を定義する必要があります。
  • したがって、プロトコルはハードウェア、ソフトウェア、またはその両方として実装できます。

それを考える簡単な方法はプロトコルはあらかじめ定義され、合意された方法であるです。この場合、somethingはUSB接続デバイスとの間でデータを移動します。ハードウェア的には、各 ピン には事前定義された電圧レベルと使用プロトコルがあり、各タイプのデバイスには事前定義された使用プロトコル すべてのピン があり、各 データパケット には、定義済みの構文とデータ形式があります。通信 ハンドシェイク プロトコルも組み込まれています。総称して、これらはUSBデバイスを使用するための標準のコレクションのすべての部分、別名 SBプロトコル であり、メンバーによって決定(つまり、設計、提案、討論、改訂、最終的に合意)されます。 of SB Implementers Forum、Inc。

だからはい、そこにUSBプロトコルがあります、より正確にはそこにいくつかの事前定義され合意されたUSBプロトコルがありますs USBのさまざまな用途。

5
O.M.Y.