0

構成したい16550互換UARTが市場に出回っています。Linuxドライバーはメーカーから提供されており、ユーザースペースプログラムを介して(複数の)UARTを永続的に構成する必要があります。

永続性とは、コンフィギュレーターが終了した後も、構成がチップ内に残ることを意味します。

私が遭遇した問題は、カーネルドライバーのuart_ops操作が、.startupおよび.shutdown操作を通じてMCR(モデム制御レジスター)の内容に影響を与えているように見えることです。手元のタスクは、MCRレジスタのビット5(0から7)を1に設定することにより、UARTをループバックモードにすることです。これは、製造元が提供するIOCTLを介して行います(他に方法はありますか?)。しかし、IOCTLにアクセスするには、ファイル記述子を提供する必要があります。つまり、open()を意味します。次に、私のコンフィギュレーターが終了すると、システムはファイル記述子をclose()します。

そのため、uart_ops.shutdown()関数が呼び出され、MCRの内容が失われます。後続のアプリケーションはUARTをループバックモードで認識しないため、テストする方法はありません。

どうやってするか?ポート/関連デバイスノードを開き、MCRでループバックを有効にしてから、記述子を閉じないでください(スリープまたは無限ループを介して)?それは許容できる解決策ですか?後続のアプリケーションは、ループバックモードでUARTを認識できますか?

後続のアプリケーションがループバックモードをテストする前に、uart_ops.shutdown関数とそれが実行するMCR-overwriteの呼び出しを回避するにはどうすればよいですか?

ありがとうございました。

編集:

問題のUARTはExarXR17D158(http://www.exar.com/connectivity/uart-and-bridging-solutions/pci-uarts/pci-uarts-universal-3-3v-or-5v/xr17d158)であり、ドライバーはここにあります:http://www.exar.com/common/content/document.ashx? id = 20639&languageid = 1033 uart_ops.startupおよびuart_ops.shutdownメンバーとして渡されるserialxr_startupおよびserialxr_shutdownは、行806および902にあります。 xr17c15x.cファイル内。

4

2 に答える 2

0

本当の問題は、起動時にカーネルドライバーを自動的にロードし(デバイスを自動初期化する)、Linuxに二度と推測させたくないということのようです。

その場合、最善の策は、ベンダーのカーネルドライバーの自動読み込みを無効にするように「modprobe.conf」を構成することです。

これが機能する場合は、独自のスタートアップスクリプトを追加して独自の方法で構成することにより、ソリューションを「強化」できます。必要に応じて。

「お役に立てば幸いです。

于 2012-08-23T22:49:01.333 に答える
0

私はついに問題を解決しました:Exarドライバーがuart_ops.shutdown()関数を呼び出さないようにすることで:最初にデバイスファイルを開く()だけで、ドライバーがuart_ops.shutdownを呼び出さないように閉じる()ことはありません() 働き。プログラムの最後にオペレーティングシステムが自動的にclose()を呼び出さないようにするために、私はそれを無限ループに入れます。

while(1) {
        sleep(100);
}
return 0; //unreachable

どうやら、最後のclose()が呼び出されるたびに、ドライバーはuart_ops.shutdown()を呼び出します。これを防ぐために、デバイスファイルでopen()を維持することにより、少なくとも1つのclose()を呼び出す必要があることを確認します。

于 2012-08-24T18:31:54.583 に答える