「USB通信プロトコル」は本当に存在するのでしょうか?

「USB通信プロトコル」は本当に存在するのでしょうか?

によるとウィキペディア、 USB:

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

しかし、本当に「USB通信プロトコル"? 私の理解それは:

  1. USBデバイスをマシン(UbuntuやLinuxなど)に接続します
  2. Linuxはそのデバイスのデバイスドライバを見つけます(何らかの方法で -ボーナス知っていれば!)そしてそれをロードします
  3. デバイスは現在、/dev/theDevice
  4. ユーザー空間のアプリは読み取り/書き込みが可能になり/dev/theDevice、ドライバーは基盤となるデバイス/ハードウェアへの低レベルIOを処理します。

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

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

答え1

はい、見てUSBプロトコル

私の理解するところによると、USB 仕様は階層化されたプロトコルとデバイス プロファイルの複雑なセットを定義します。

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

答え2

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

答え:

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

USBプロトコルの仕組みの詳細については、OSDev ウィキ役に立つ。ここにもう一つ興味深い説明シーケンス図を使用して、USB プロトコルごとのさまざまなデータ トランザクションを記述します。

ボーナス質問: Linux はどのようにしてそのデバイスのデバイス ドライバーを見つけてロードするのでしょうか?

ボーナス答え:

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

私はこの素晴らしいOpensourceforu の記事には、Linux コンテキストでの質問に関するより詳しい説明と明確な情報が記載されています。

答え3

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

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

次に、バス管理プロトコルがあります。これは、誰がいつバス上で通信できるかを記述するために使用されます。これは、OSI モデルではメディア アクセス層と呼ばれます。USB では、この層は「デバイスはホストが送信するように指示したときに送信できる」と要約できるため、USB のこの層には特に複雑なプロトコルはありません。

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

最後に、デバイス自体に定義されたプロトコルがあります。USB 標準の一部として、大容量ストレージ デバイス、マウス、キーボードなどの一般的な使用例向けに、いくつかの共通の事前設計されたプロトコルが実際に含まれており、すべてのデバイス メーカーが車輪の再発明をする必要はありません。ただし、より複雑なデバイスでは、このレイヤーで独自のカスタム プロトコルを自由に設計できます。特定の送信に対するこのレイヤーの出力は、前のレイヤーでデータ パケットのペイロードとして渡されます。十分に複雑なデバイスの場合、プロトコルのデバイス固有の部分自体が複数の独立したレイヤーに分割される場合がありますが、下位レベルはそれを認識したり気にしたりする必要はありません。下位レベルが認識する必要があるのは、特定のバイト セットをホストから特定のデバイス エンドポイントに渡す必要があること、または特定のデバイス エンドポイントからホストに渡す必要があることだけです。ここでも、レイヤー間に標準インターフェイスがあると、関心の分離が可能になるため、1 つのレイヤーは別のレイヤーの内部動作を気にする必要はなく、スタック内のすぐ上または下のレイヤーに渡す必要がある、またはそこから受け取ることが予想される特定のデータのみを気にすればよいことになります。

答え4

おそらく答えの一部は「通信プロトコル「同じ情報源(Wikipedia)にアクセスすると、次のような役立つ情報が見つかります。

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

簡単に考えてみるとプロトコルとは、事前に定義され合意された方法である。この場合、何かUSB接続デバイスにデータを出し入れする方法です。ハードウェア的には、ピン電圧レベルと使用プロトコルがあらかじめ定義されており、各タイプのデバイスには、すべてのピン、そしてそれぞれデータパケット定義済みの構文とデータ形式があります。また、通信握手プロトコルが組み込まれています。これらはすべて、USBデバイスを使用するための標準規格の一部です。USBプロトコル、これは、メンバーによって決定(すなわち、設計、提案、議論、修正、そして最終的に合意)されます。USB インプリメンターズ フォーラム

そうです、USBプロトコル、またはより正確には事前に定義され合意されたUSBプロトコルの数sさまざまなUSBの用途に。

関連情報