私は x86 ベースのマイクロコントローラである Vortex86DX CPU をベースにしたボードを持っています。このボードには 5 つの 16550A UART があり、そのうち 4 つ (COM1-COM4) は通常の IO ポート アドレス (0x3f8、0x2f8、0x3e8、0x2e8) にありますが、5 つ目 (COM9) は 0x010、irq 9 にあります。
最初の 4 つの UART は検出され、問題はありません。問題は、5 番目 (COM9) を Linux で動作させることができないことです。COM9 はスタンドアロンの DOS アプリケーションでは動作しますが、Linux からは検出すらできません。
これまでやったこと:
追加のUARTを追加しました/ドライバー/tty/シリアル/8250/
DEBUG_AUTOCONFを有効にしました/drivers/tty/シリアル/8250/8250.cいつ、どのアドレスが調査されているかを確認できます。
編集済み/arch/x86/カーネル/セットアップ.cIOポート0x010がDMA1用に予約された既存の領域と重複しているため
結果: カーネルはアドレス 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% 互換性はありません。