0

ARM9 Atmel AT91SAM960 ボード用に Linux をカスタマイズしています。

デバイス ファイルで、Atmel はすべての USART に同じ名前を付けましたatmel_usart。もちろん、ID列挙を使用:

static struct platform_device at91sam9260_uart0_device = {
        .name           = "atmel_usart",
        .id             = 1,
        .dev            = { ...}
}

Linux デバイス モデルによると、これらすべてのデバイス (SAM9260 上の 5 つの UART) は、 という名前のドライバーatmel_usartにバインドされます。

登録されるすべての UART に TTYS ドライバーを設定したくありません。さまざまな特殊な目的 (LON、RS-485 など) に対応する独自のドライバーがいくつかあります。特定の USART に対応するドライバーを制御したいと考えています。だから私は何ができるでしょうか:

  • Atmel デバイス ファイルは不十分であり、改善することができます。そのため、デバイス ファイル内のデバイスの名前を変更 (パッチ) します。ただし、UART4 で TTYS ドライバーが必要な場合は、問題が発生します。

  • 構造体にアクセスできるように、デバイス ファイルを操作 (パッチ) しますplatform_device。登録する前に名前を変更できました。しかし、 Linux Driver Modelの考え方を理解している限り、デバイスは起動時の早い段階で登録する必要がありますが、ドライバーへのバインドは後で .... 後で行います。

  • エイリアス名を持ち、特定の bus_Id -> にバインドされるドライバーを作成できます atmel_usart.4。私は本当にできますか?

他にどのような解決策が存在しますか。カーネルファイルの最小限のセットに触れたいのですが、可能な限りすべての自由が欲しいですか?

補遺私にとって自由とは何か:実行時にUARTSの使用方法を指定できます

  • Atmel-Serial ドライバー (ttyS) を使用
  • 自分のドライバーで

これは、カーネル ソースへの変更が最小限であることも意味します。

4

2 に答える 2

2

私は独自のラインディシプリンドライバーを作成しました。それらをカーネルモジュールとしてビルドし、実行時にUARTに接続できます。Linuxソースを変更する必要はありません。

面白いタイミングや制御は、ioctl()を介して実行できます。具体的には、このようにタイミングに敏感なRS-485プロトコルを実装しました。

これを行ったとき(Linux 2.6.17)、動的登録メカニズムがなかったため、既存の回線分野を上書きしました。Linuxのコードは(以前は)非常に単純で、これが安全な方法であることに満足しました。

于 2011-01-28T10:20:45.707 に答える
0

あなたの問題は非常に簡単に解決されます。現在、5 つの UART デバイスはカーネルの起動時に登録されており、それらの機能はロックされています。これは、PCI または USB デバイスの通常の動作方法ですよね? そのため、デバイス登録をスタートアップ コードから取り出して動的に登録する必要があります。必要に応じて登録/登録解除することもできます。

at91_register_uart() は、登録が必要なすべての UART に対してボード ファイルから呼び出されています。at91_add_device_serial() は、設定したものすべてを platform_device_register します。1 つの解決策は、at91_register_uart() を 5 つの UART すべてに対して呼び出せるようにすることですが、ボードから at91_add_device_serial() への呼び出しを削除します。その後、ローダブル ドライバーから呼び出すことができるエクスポートされた関数にすることができます。引数 (int) を追加して、すべての UART をループする代わりに、登録するものを個別に選択することもできます。デバイスの登録を解除する機能を作成することで、この機能をミラーリングすることもできます。

注: コンソール専用の UART を 1 つ使用している場合は、常に 1 つの UART を残しておく必要があると思います。入力のようにインデックス 0->3 のみを許可し、0->3 を 0-4 にマッピングして、コンソールに使用する UART をスキップすることで、エクスポートされた関数でおそらくそれを隠すことができます。

于 2011-04-17T08:29:23.123 に答える