web-dev-qa-db-ja.com

異常なIOポートアドレスで16550A UARTを初期化/検出できません

X86ベースのマイクロコントローラーであるVortex86DXCPUをベースにしたボードがあります。 5つの16550AUARTがあり、そのうち4つ(COM1-COM4)は通常のioポートアドレス(0x3f8、0x2f8、0x3e8、0x2e8)にありますが、5番目(COM9)は0x010、irq9にあります。

Vortex86DX

最初の4つのUARTが検出されましたが、問題はありません。問題は、5番目(COM9)をLinuxで動作させることができないことです。 COM9はスタンドアロンのDOSアプリケーションで動作しますが、Linuxからは検出できません。

私がこれまでにしたこと:

結果:カーネルはアドレス0x010でUART

そのため、ioポート0x010から直接読み取るioポートプローブユーティリティを作成しましたが、0x010から0x017の領域で16550Aレジスタを検出できませんでした。そこには何もないようです。スクラッチレジスタ(オフセット+7)からデータを読み書きしようとしていますが、アドレス0x017で何も取得しません。

CPUのデータシートにはあまり書かれていません。これは、COM9に対して「何か」を行うサウスブリッジレジスタに制御ビットがあることを示します。このビットに書き込むPCIユーティリティを作成しましたが、ioポートのプローブを行ったときに、COMポートを有効にしたり、何も変更したりしなかったようです。

この時点でどんな助けもいただければ幸いです!

5
Mr Stinky

この非標準のシリアルI/OポートとIRQのサポートを追加するために、カーネルのソースコードを変更するのに苦労した理由がわかりません。 setserial(8)プログラムは、それを構成できるはずです。このようなもの:

# setserial ttyS4 address 0x10 irq 9

詳細については、 LinuxシリアルHOWTO を参照してください。

1
Warren Young

BIOSまたはLinuxのいずれかがサウスブリッジレジスタのCOM9ポートを無効にしているようです。

レジスター:

  • 「内部UART9制御レジスタ」はデフォルト値の0x00810010にリセットする必要があります
  • COM9を再度有効にするには、「オンチップデバイス制御レジスタ」のビット9をクリアする必要があります。

これらが無効になっている理由や場所がわかりません。

デバイスドライバーでそれらを正常な値に設定すると、COM9UARTを検出できました。

Linuxには、Vortex86DX用の新しいx86チップタイプが必要です。 100%互換ではありません。

1
Mr Stinky