構成したい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ファイル内。