我有一個基於 Vortex86DX CPU 的板,它是一個基於 x86 的微控制器。它有五個 16550A UART,其中四個(COM1-COM4)位於常用的 io 連接埠位址(0x3f8、0x2f8、0x3e8、0x2e8),但第五個(COM9)位於 0x010、irq 9。
前四個 UART 已被檢測到,我對它們沒有任何問題。問題是我無法讓第五個(COM9)在 Linux 中運作。 COM9 在獨立的 DOS 應用程式中工作,但我甚至無法從 Linux 中檢測到它。
到目前為止我所做的:
將我的額外 UART 加到/驅動程式/tty/序列/8250/
啟用DEBUG_AUTOCONF/drivers/tty/serial/8250/8250.c這樣我就可以看到何時以及哪些位址被偵測。
已編輯/arch/x86/kernel/setup.c因為 io 連接埠 0x010 與為 dma1 保留的現有區域重疊
結果:核心無法偵測位址 0x010 處的 UART
因此,我編寫了一個 io 連接埠探測實用程式來直接從 io 連接埠 0x010 讀取數據,但在 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
- 「片上裝置控制暫存器」必須清除第 9 位元才能重新啟用 COM9。
我不知道為什麼或在哪裡禁用它們。
當我在裝置驅動程式中將它們設定為正常值時,我能夠偵測到 COM9 UART。
Linux 需要為 Vortex86DX 使用新的 x86 晶片類型。它不是 100% 相容。