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

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

私は x86 ベースのマイクロコントローラである Vortex86DX CPU をベースにしたボードを持っています。このボードには 5 つの 16550A UART があり、そのうち 4 つ (COM1-COM4) は通常の IO ポート アドレス (0x3f8、0x2f8、0x3e8、0x2e8) にありますが、5 つ目 (COM9) は 0x010、irq 9 にあります。

ボルテックス86DX

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

これまでやったこと:

結果: カーネルはアドレス 0x010 の UART のプローブに失敗しました

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

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

この時点ではどんな助けでもありがたいです!

答え1

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

# setserial ttyS4 address 0x10 irq 9

見るLinux シリアル HOWTO詳細については。

答え2

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

レジスター:

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

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

デバイス ドライバーで適切な値に設定すると、COM9 UART を検出できるようになりました。

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

関連情報