setserial /dev/ttyS4:无法设置串行信息

setserial /dev/ttyS4:无法设置串行信息

因此,我有一块带有 6 个硬件串行端口的板:前 2 个位于 ETX 总线上,后 4 个位于 ISA 总线上。以下配置应该是这样的:

/dev/ttyS0 port 0x03F8 irq 4
/dev/ttyS1 port 0x02F8 irq 3
/dev/ttyS2 port 0x0100 irq 5
/dev/ttyS3 port 0x0108 irq 5
/dev/ttyS4 port 0x0110 irq 5
/dev/ttyS5 port 0x0118 irq 5

启动时,我运行:

# dmesg | egrep -i 'serial|ttys'
Serial: 8250/16550 driver, 6 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A

# cat /proc/tty/driver/serial
Serinfo:1.0 driver revision:
0: uart:16550A port: 000003F8 irq:4 tx:0 rx:0
1: uart:16550A port: 000002F8 irq:3 tx:0 rx:0
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:unknown port:00000000 irq:0
5: uart:unknown port:00000000 irq:0

因此,我尝试使用 setserial 使用正确的值配置端口 ttyS2-ttyS5:

# setserial /dev/ttyS2 irq 5 port 0x100 uart 16550A
# setserial /dev/ttyS3 irq 5 port 0x108 uart 16550A
# setserial /dev/ttyS4 irq 5 port 0x110 uart 16550A
Cannot set serial info: Invalid argument
# setserial /dev/ttyS5 irq 5 port 0x118 uart 16550A
Cannot set serial info: Invalid argument

甚至从最后一个命令中取出 uart 选项:

# setserial /dev/ttyS4 irq 5
Cannot set serial info: Invalid argument

我需要做什么才能通过setserial配置ttyS4和ttyS5?

答案1

/proc关于我在你的和dmesg输出中看到的内容,有几件事让我印象深刻:

  • 您不应该尝试在设备之间共享 IRQ。它可能有效,但 ISA 的目的是总线上需要中断线才能工作的每个设备都有自己的 IRQ。如果您的串行端口卡没有为您提供足够的 IRQ 选项,您可能根本无法在该 PC 中同时使用它们。

  • 用于第二对串行端口的 I/O 地址是非标准的。ttyS2通常位于 0x3E8,ttyS3通常位于 0x2E8。如果您有串行卡的选项,我会移动这些。 (对于及以上版本没有标准 I/O 地址或 IRQ ttyS4。)

除此之外,如果我需要在 Linux 机器上有 6 个串行端口,我不会尝试使用普通的旧串行端口适配器卡。我会用类似的东西数码加速端口。他们仍然提供一种可以在 ISA 插槽中工作的 Xe 型号。如果你需要便宜的,你应该可以在二手市场上找到一个;它们在当时非常受欢迎。

答案2

尝试在内核启动参数中添加8250.nr_uarts=6 或。nr_uarts=6

编辑:一些可能有帮助的信息(希望如此)。

答案3

尝试使用baud_rate 115200参数setserial

答案4

除了我在这个问题的其他答案中提到的base_baud之外,它也可能是参数的顺序:(我没有时间尝试不同的顺序来看看到底是什么解决了它,因为base_baud确实有效)

我在尝试将新串行端口安装到嵌入式 x86 应用程序中时遇到了一系列类似的问题。对我来说,问题在于setserial 程序将其命令行参数按顺序转换为相应的ioctl() 操作以设置各种设备参数。基本上,setserial 应用了以下策略:1)读取特定 /dev/ttySx 的当前设置 2)修改每个命令行参数指定的值,每个单独的命令行参数或标志变成一个 ioctl

因此,在指定端口或 irq 之前指定 uart 类型(或自动配置)对于大于 /dev/ttyS3 的端口将无法正常工作,因为 /dev/ttyS3 的端口值未初始化为任何值。这会导致 ioctl() 操作返回,并将 errno 设置为 EINVAL(无效参数)。我怀疑 ioctl() 的链 ^fourport 标志后跟 low_latency 标志变成了对驱动程序没有意义的东西。https://bugzilla.kernel.org/show_bug.cgi?id=8458

相关内容