新しいボードでシリアルポートを識別する方法

新しいボードでシリアルポートを識別する方法

私はカスタムI.MX233ベースのボードを移植するためにyoctoを使用していますが、最初に「コンソール」カーネルパラメータをどのように設定したのか疑問に思います。

カーネルは、デバイスツリーの最初の参照またはメモリアドレスに基づいてシリアルデバイスを割り当てますか?

コンソール名が何であるかをどうやって知ることができますか?例: ttyACM0、ttyS0、または serial0

ベストアンサー1

カーネルは、デバイスツリーの最初の参照またはメモリアドレスに基づいてシリアルデバイスを割り当てますか?

これは、ハードウェアで使用可能な正確なシリアルドライバによって異なります。ある種の自動検索機能がある場合は、メモリアドレス(または関連する自動検索メカニズムに適したもの)に進むことができます。そうしないと、デバイスツリーシーケンスの配列に進むことができます。

コンソール名が何であるかをどうやって知ることができますか?

デフォルト名はドライバによって決定されます。ハードウェアがクラシック8250チップまたはそのサブアイテム/複製/互換チップに基づいている場合は、スタイルttyS<N>名を使用する先例があります。他のドライバには独自の命名スキームがあります。

これらのttyACM<N>名前はUSBモデム用のUSB抽象制御モデルドライバを正しく参照し、USBシリアルアダプタを内蔵したISDNシリアルコンソールはこの仕様に準拠したUSBデバイスとして表示される可能性があるため、ベンダーは必要ありません。特定のUSBシリアルアダプタドライバが利用可能です。しかし、これは単に意味開発ワークステーションボードをUSBシリアルコンソールに接続しました。/dev/ttyACM0マザーボード自体はそれを通常のシリアルポートとして扱います(マザーボードのハードウェアアーキテクチャで「一般シリアルポート」と呼ぶものとは関係ありません)。

(「両端」にACMインターフェイスを提供するUSB​​インターフェイスデバイスを構築することは技術的に可能ですが、コンソールとして使用する前に起動するには非常に複雑なUSBサブシステムが必要なため、コンソールとは不利です。一般的に言えば、他のハードウェア初期化時に発生する問題をより簡単にデバッグできるように、起動プロセスの早い段階で使用できるようにコンソールデバイスをできるだけ単純にしたいと思います。

ARMアーキテクチャでは、最初のシリアルポートはAMBA PrimeCell UART(PL011 UARTとも呼ばれます)を使用して実装できます。これにより、ttyAMA0カーネルドライバによって名前が付けられます。


「私はカスタムI.MX233ベースのボードを移植するためにyoctoを使用しています」と言いました。これは、これまでLinuxで実行されたことのないカスタムボードタイプでLinuxを実行しようとしているという意味ですか?その場合は、まずハードウェアデータシートが必要です。カスタムハードウェアのデバイスツリー記述を作成するか、ほぼ同様の既存のデバイスツリー記述を調整する必要があります。これを行うには、ボード上のすべてのハードウェア要素を理解(または把握)し、各ハードウェア要素に適したLinuxドライバを識別(または最悪の場合は作成)する必要があります。また、ハードウェア要素(またはドライバがハードウェア要素にアクセスするために必要なすべて)のベースアドレスを見つける必要があります。

PCハードウェアでは、システムハードウェア/ファームウェアには自分自身を説明するさまざまな方法があります。 PCI / PCIeバスには、すべてのPCI / PCIeデバイスが持つ必要がある指定された標準機能セットがあり、バス上のすべてのデバイスを自動的に検出できるように設計されています。 ACPIファームウェアは、シリアルポート、割り込みコントローラなど、PCI(e)バスにないすべてのPCハードウェア要素に関する広範なシステム情報も提供します。

場合によっては(たとえば、ISAPnPなしでISAバスを使用する非常に古いシステムで実行されている場合)、そのハードウェア情報は利用できませんが、シリアルポートと互換性のある最初の4つの8250を持つなど、特定の業界標準ルールがあります。 / Oベースアドレスは、順番に0x3f8、0x2f8、0x3e8、0x2e8です。これらのルールを使用すると、シリアルポートドライバが特定のアドレスを慎重に調査し、UARTのように応答することを確認できますが、異なる方法で設定するとシステムがクラッシュまたは中断される可能性があるため、現代では「通過」などの自動検出のために盲目的にナビゲートします。 「は最後の手段と見なされるので、可能であれば避けるべきです。

ARMハードウェアではこれらの機能は使用できない場合があります。ARMハードウェアは非常に多様で(小さなRaspberry Pi Zeroから複数のPCIeスロットを備えたマルチプロセッササーバーシステムまで)、システムバスアーキテクチャが異なるため、検出を自動化する努力は役に立ちません。代わりに、Linuxを新しいARMシステムタイプに移植するとき、最初のタスクの1つは、システムにどのハードウェア要素があるのか​​、その要素がプロセッサのアドレス空間にあるのか、どのドライバが使用されるのかをカーネルに伝えるデバイスツリー記述を作成します。することです。それぞれを制御します。

もしシステムには設計にバスの自動検出が含まれており、デバイスツリーの説明では、そのバスのバスコントローラのみを説明すると、そのバスコントローラドライバはそのバスの残りの部分を自動的に検出できます。

たとえば、Raspberry Piのシリアルポートを識別する前に、ハードウェアのマニュアルを確認する必要があります。 RasPiはLinux用に特別に開発されたため、デバイスツリーの説明はすでに存在しています。しかし、最初から始めるとしましょう。

Linuxを新しいARMハードウェアプラットフォームに移植するときは、ハードウェアデータシートから始めます。RasPiにとって、それはすべてです。

8ページでは、「ミニUART」とそのレジスタアドレスへの最初の言及を見つけることができます。 8250準拠のUARTに精通している場合は、レジスタのレイアウトに慣れているようです。ただし、ミニUARTについて詳しく説明する10ページを読んでください。それは言う:

実装されたUARTは16650準拠のUARTではありませんが、最初の8つの制御およびステータスレジスタは可能な限り16550 UARTと同様に配置されます。

16550は元の8250 PC UARTの後継製品であり、以前のバージョンと互換性があります。ああ!このUARTは、CONFIG_SERIAL_8250PCシリアルポートドライバと同様のLinuxドライバで駆動できるようです。したがって、UARTはttyS0Linux PCシリアルポートドライバが実行する操作であるため、デフォルト名を持つことになります。

UARTの別の説明は135ページで始まります。

BCM2835デバイスには2つのUARTがあります。ミニUARTとPL011 UART。このセクションではPL011 UARTを紹介します。 Mini UARTの詳細については、2.2 Mini UARTを参照してください。

PL011 UARTは汎用の非同期受信機/送信機です。これはARM UART(PL011)実装です。

したがって、ミニUARTについて説明しました。この説明は、他のUART(例:「PL011 UART」または「ARM UART」)に適用されます。つまり、このタイプのUARTはARM設計にのみ適用されます。

Googleで「PL011 UART Linux」を検索または直接検索できます。drivers/tty/serial/KconfigLinuxソースパッケージのファイル「PL011」の場合。

あなたは発見するでしょうLinuxにはすでにカーネル構成エントリとしてドライバがあります。CONFIG_SERIAL_AMBA_PL011。次の設定オプションCONFIG_SERIAL_AMBA_PL011_CONSOLEPL011 UARTをシステムコンソールとして使用でき、設定オプションの説明に起動パラメータがあることを知らせますconsole=ttyAMA0。これで、別の作業をしなくても、このUARTのデフォルトのLinux名がわかります。実際のUARTドライバのソースコードを読んでください。

ハードウェアデータシートの137ページでは、RasPiのデバイスツリー記述を最初から作成するときに必要なPL011 UARTのベースアドレスが識別されています。

だからラズベリー自体UARTをttyS0合計として処理しますttyAMA0。ただし、RasPiのコンソール出力を見るためにUSBシリアル(3.3v)ケーブルを別のコンピュータに接続する場合は、シリアル端をRasPiの対応するGPIOピンに接続し、USB端を別のコンピュータに接続すると、他のコンピュータ見るでしょうUSB-シリアルポートアダプタまたは(特定のUSBシリアルアダプタの種類に応じて)他のコンピュータでもLinuxを実行している場合ttyACM0ttyUSB0

単純なUSBケーブルを使用してシリアルコンソールにアクセスできるように、USBシリアルアダプタチップがカスタムボードに統合されている場合、状況は同じです。コンソールを表示するために使用されている他のコンピュータでデバイスを表示できますttyACM0。 USB抽象制御モデルをサポートすると主張するUSB​​シリアルデバイスを表示します。

しかし、ARMデバイス自体は、独自のUARTの1つを使用してコンバータチップの直列側に接続します。 ARM デバイス側のシリアルデバイス名は、ARM 側で使用される UART によって決定されます。いいえUSB経由でチップのシリアルポートをシリアルポートに変換します。

おすすめ記事