【问题标题】:which driver controlling x86 serial port ttyS0 in linux在linux中控制x86串口ttyS0的驱动程序
【发布时间】:2019-06-17 21:42:21
【问题描述】:

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

那里有很多不同的串口驱动,哪个是x86的?

【问题讨论】:

  • Linux 使用 / 作为路径分隔符,而不是 \ 反斜杠。

标签: c x86 kernel driver uart


【解决方案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 芯片。

【讨论】:

  • x86 CPU没有集成UART功能?
  • @Mark 不,我不知道。一些 Skylake CPU 集成了 PCH(芯片组),但这只是 IC 的物理布局,功能上没有任何变化。 UART 是一个相当慢的设备,通常会将一些东西集成到 CPU 中以加快它们的速度。
  • @MargaretBloom:是的,我认为这没有意义。您不想将 2 个额外的 CPU 引脚专用于 RS-232 线路,而且您仍然需要一个外部芯片,因为您可能不希望外壳外部的电线直接电连接到 CPU 引脚。所以你不妨把那个外部芯片做成一个真正的 UART,或者把它烤到南桥上,然后通过 PCIe 或 DMI 以及硬盘驱动器 LED 和其他杂项与它通信。需要额外别针的东西。
  • 我不明白。 x86使用superIO时,是不是已经集成了UART?那么,这个UART应该有一个驱动程序。
  • @Mark SuperIO 本身就是一个芯片,它处理许多传统设备,包括 UART。这些 UART 具有与 16550 相同的接口,它是 8250 的超集。在 Linux 下,如文件本身中的 cmets 所述,它们都位于 8250 文件夹下。
【解决方案2】:

@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 接口,如下面的代码 sn-p 所示:

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

【讨论】:

  • 16550 对于普通 PC 来说当然是一个很好的默认假设,但您可以将其他串行卡插入 PCI 插槽。例如旧的调制解调器服务器可能有一个 cyclades 多端口串行卡(或来自另一个供应商的),Linux 有驱动程序,github.com/torvalds/linux/blob/…。如果您指出标准的 IBM-PC 兼容机器通常内置 16550,而不像所有 x86 机器那样过于宽泛,这将是一个更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多