X86ベースのマイクロコントローラーであるVortex86DXCPUをベースにしたボードがあります。 5つの16550AUARTがあり、そのうち4つ(COM1-COM4)は通常のioポートアドレス(0x3f8、0x2f8、0x3e8、0x2e8)にありますが、5番目(COM9)は0x010、irq9にあります。
最初の4つのUARTが検出されましたが、問題はありません。問題は、5番目(COM9)をLinuxで動作させることができないことです。 COM9はスタンドアロンのDOSアプリケーションで動作しますが、Linuxからは検出できません。
私がこれまでにしたこと:
私の余分なUARTを / drivers/tty/serial/8250 / に追加しました
/ drivers/tty/serial/8250/8250.c でDEBUG_AUTOCONFを有効にしたので、いつどのアドレスがプローブされているかを確認できます。
編集済み / Arch/x86/kernel/setup.c ioポート0x010がdma1用に予約されている既存の領域とオーバーラップしたため
結果:カーネルはアドレス0x010でUART
そのため、ioポート0x010から直接読み取るioポートプローブユーティリティを作成しましたが、0x010から0x017の領域で16550Aレジスタを検出できませんでした。そこには何もないようです。スクラッチレジスタ(オフセット+7)からデータを読み書きしようとしていますが、アドレス0x017で何も取得しません。
CPUのデータシートにはあまり書かれていません。これは、COM9に対して「何か」を行うサウスブリッジレジスタに制御ビットがあることを示します。このビットに書き込むPCIユーティリティを作成しましたが、ioポートのプローブを行ったときに、COMポートを有効にしたり、何も変更したりしなかったようです。
この時点でどんな助けもいただければ幸いです!
この非標準のシリアルI/OポートとIRQのサポートを追加するために、カーネルのソースコードを変更するのに苦労した理由がわかりません。 setserial(8)
プログラムは、それを構成できるはずです。このようなもの:
# setserial ttyS4 address 0x10 irq 9
詳細については、 LinuxシリアルHOWTO を参照してください。
BIOSまたはLinuxのいずれかがサウスブリッジレジスタのCOM9ポートを無効にしているようです。
レジスター:
これらが無効になっている理由や場所がわかりません。
デバイスドライバーでそれらを正常な値に設定すると、COM9UARTを検出できました。
Linuxには、Vortex86DX用の新しいx86チップタイプが必要です。 100%互換ではありません。