我有一个基于 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% 兼容。