Linux で USB プロトコルを変更できますか?

Linux で USB プロトコルを変更できますか?

私は、UART から USB へのブリッジを使用せずに、マイクロ コントローラーを USB 経由でコンピューターと直接通信させる方法を見つけようとしており、USB ポートの USB プロトコルを無効にして、ポートを通常のシリアル ポートとして使用することでそれができると考えていました。しかし、USB 部分をオフにすることはできないと言われました。また、Linux ではオペレーティング システムの内部動作の多くが変更可能であると聞きました。Linux では、USB プロトコルを変更して、USB ポートを通常のシリアル ポートに変えることができますか?

答え1

USB は、古い RS-232 シリアル ポート標準 (EIA/TIA-232 とも呼ばれる) に一致する意味では「単なるシリアル ポート」ではありません。「追加要件をオフにする」ことで USB を RS-232 に変換することはできません。

従来の RS-232 シリアル ポートとは異なり、USB は差動信号を使用します。信号レベルやその他の電気的特性は大きく異なりますが、実際には RS-485 と少し (非常に少し) 似ています。

RS-232 は最大 +/- 15 ボルトの信号電圧を使用できます。USB は、USB 1 モードでは論理ローに 0.3V 未満、論理ハイに 2.8 ~ 3.6 ボルトを使用します。USB 2 高速モードでは、電圧はそれよりもさらに小さくなります。

RS-232 で TTL ロジック レベル (0..5V) が使用されている場合でも、USB トランスミッタは RS-232 の「スペース」(= 高電圧状態) 信号を確実に生成できません。これらの標準間で信号レベルが一致しないため、USB トランスミッタの信号は RS-232 UART レシーバには弱すぎ、RS-232 出力信号は USB レシーバに過負荷をかけます。

単純なレベル コンバータ回路でも、非互換性を回避することはできません。USB トランシーバーは、1 つのスタート ビット、1 バイトのデータ、1 つまたは 2 つのストップ ビットを送信するのではなく、パケットを処理します。パケットの開始時に、同期シーケンス (USB 1 の場合は 8 ビット、USB 2 高速転送の場合は 32 ビット) があり、その後、数バイトが転送され、最後に、通常の「論理ロー」または「論理ハイ」状態のどちらにも一致しないパケット終了信号が送信されます。これらはすべて、効率化のためにハードウェアで実装できます。通常、異なる操作を行う理由はないため、ソフトウェアによる直接制御で実際のデータ ラインを「ビット バンギング」するためにこれをバイパスする手段はおそらくありません。

シグナリングの例を比較するRS-232そしてUSB1.1 についてWikipediaで。

要約すると、いいえ、問題は、実際のハードウェア レベルで USB と RS-232 の違いが大きすぎることです。

関連情報