哪个驱动程序在Linux中控制x86串行端口ttyS0

时间:2019-01-24 07:59:19

标签: c x86 kernel driver uart

通过检查串行文件夹@: \ drivers \ tty \ serial

那里有许多不同的串行端口驱动程序,哪个是x86的?

2 个答案:

答案 0 :(得分:1)

x86没有单个UART芯片。
IBM PC最初使用8250,后来开始习惯将其替换为16550,后来又替换为16750。
随着SuperIO chips的到来,每个制造商都实现了UART,但是它们都或多或少地与16550/750和8250兼容。
如今,芯片组通常在PCH中集成一个或多个16750 UART,但它们没有外部插槽,因此市场上有很多USB / PCI第三方串行。
最后,驱动程序取决于UART芯片。


如果您对集成UART(PC背面的插座)感兴趣,则驱动程序可能位于8250 folder中,除非您的芯片组使用其他UART芯片。

答案 1 :(得分:1)

@Margaret Bloom 有一个很好的答案。兼容 8250/16550 的 UART 是普通 x86 PC 的基础,并集成到北桥/南桥 ICH/PCH 芯片组中。正如所指出的,这并不意味着使用集成的 UART;可以添加第三方串行卡(Maxim MAX310x 串行驱动程序见下文。)

那么,你怎么知道正在使用什么?以下是运行 debian 10 的 QEMU 会话中的一些命令:

q35ek:511> ls -l /dev/ttyS0
crw------- 1 dave tty 4, 64 Feb  2 12:09 /dev/ttyS0

q35ek:512> sudo cat /proc/tty/driver/serial | egrep '^0:'
0: uart:16550A port:000003F8 irq:4 tx:11291 rx:18 RTS|CTS|DTR|DSR|CD

q35ek:513> sudo cat /proc/tty/drivers
/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
/dev/vc/0            /dev/vc/0       4       0 system:vtmaster
ttyprintk            /dev/ttyprintk   5       3 console
max310x              /dev/ttyMAX   204 209-224 serial
serial               /dev/ttyS       4 64-111 serial
pty_slave            /dev/pts      136 0-1048575 pty:slave
pty_master           /dev/ptm      128 0-1048575 pty:master
unknown              /dev/tty        4 1-63 console
q35ek:514> 

第一个命令查找您感兴趣的 tty 的主要/次要编号。

第二个查找有关驱动程序的信息: 它是一个 uart:16550A('A' 模型有一个字符 fifo),它在 IO 端口 0x3F8 上并使用 IRQ 4、tx 和 rx 字符计数以及最后可用的控制选项。

第三个显示每个设备的匹配驱动程序。 4:64 使用 serial driver_name。一些开发人员不太擅长唯一定义 driver_name,因此这可能是 8250/16550 兼容设备(在 $K/drivers/tty/serial/8250 下)、DECstation DZ 芯片或 GRLIB uart。我想说这是一个 8250/16550 接口,如下面的代码片段所示:

static struct uart_driver serial8250_reg = {
    .owner          = THIS_MODULE,
    .driver_name        = "serial",
    .dev_name       = "ttyS",
    .major          = TTY_MAJOR,
    .minor          = 64,
    .cons           = SERIAL8250_CONSOLE,
};