下一篇 上一篇 目录

8. 定位串口:IO 地址、IRQ

8.1 我的串口在哪个总线上?

如果您需要找到串口,了解它在哪个总线上通常很有帮助。如果串口在扩展卡上,您可能知道该卡插入哪个总线插槽,例如 PCI 插槽。但是,如果串口内置在主板上,则可能不清楚它在哪个总线上。对于具有 ISA 总线插槽的旧主板,它很可能在 ISA 总线上,甚至可能不是即插即用 (Plug-and-Play)。但是,即使您的所有插槽都是 PCI,串口也可能在 ISA 总线或 LPC 总线(也称为“LPC 接口”)上。LPC 在笔记本电脑上很常见。键入“lspci”以查看它是否显示“LPC”。不幸的是,LPC 总线没有标准的即插即用方法来低级别配置其上的设备。但是根据规范,BIOS 应该进行此类配置(使用 ACPI ??)。要查看您是否拥有 LPC 总线,请键入“lspci”并查找 LPC 桥接器或类似物。

8.2 IO 和 IRQ 概述

为了使串口正常工作,首先必须为其提供 IO 地址和 IRQ。对于旧硬件(1990 年代中期),通过卡上的跳线或保存的 BIOS 设置来完成。对于较新的硬件,BIOS 或 Linux 必须在启动时设置它们,并且新硬件在断电后不记得它是如何设置的。启用硬件(通过使用软件)会为其提供 IRQ 和 IO 地址。没有 IO 地址,就无法使用它。没有 IRQ,它将需要使用效率低下的轮询方法,为此必须在串口驱动程序中将 IRQ 设置为 0。使用 BIOS 或 Linux 发送到硬件的数字信号,所有这些都应该自动配置(前提是 BIOS 之前没有设置为禁用它)。因此,只有在遇到问题或者想了解其工作原理时,才需要阅读本文。

驱动程序当然必须知道 IO 地址和 IRQ,以便它可以与串口芯片通信。现代串口驱动程序(内核 2.4)尝试通过 PnP 方法来确定这一点,因此通常不需要告诉驱动程序(通过使用“setserial”)。驱动程序也可能在硬件中设置 IO 地址或 IRQ。但不幸的是,有些 PCI 串口硬件驱动程序无法识别,因此您可能需要自己启用端口。请参阅 PCI:启用已禁用的端口

对于旧的 ISA 总线,驱动程序还会探测可能的串口地址,以查看那里是否有任何串口。这适用于跳线的情况,有时适用于 ISA PnP 端口,当驱动程序不执行 ISA PnP 时(内核 2.4 之前)。

通过为串口指定 IRQ 和 IO 地址来定位串口是低级别配置。它通常由串口驱动程序自动完成,但有时您必须自己完成。以下内容重复了上面所说的内容,但更详细。

低级别配置包括分配 IO 地址、IRQ 和名称(例如 ttyS2)。此 IO-IRQ 对必须在硬件中设置,并告知串口驱动程序。驱动程序需要将此对称为名称(例如 ttyS2)。我们可以将此简称为“io-irq”配置。现代方法是让驱动程序使用 PnP 方法来检测/设置 IO/IRQ,然后记住它所做的事情。驱动程序执行此操作的一种简单方法是让驱动程序请求内核启用设备,然后内核告诉驱动程序它使用的 IO/IRQ。旧方法是使用“setserial”程序告诉驱动程序。对于跳线,没有 PnP,但如果跳线设置为通常的 IO/IRQ,驱动程序可能会检测到端口。如果您需要配置但不理解某些细节,很容易陷入困境。

当 Linux 启动时,会努力检测和配置(低级别)串口。确切发生的情况取决于您的 BIOS、硬件、Linux 发行版、内核版本等。如果串口工作正常,则可能无需进行任何更低级别的配置。

如果您在使用串口时遇到问题,则可能需要进行低级别配置。如果您使用的是内核 2.2 或更低版本,那么在以下情况下您需要这样做:

从内核 2.2 开始,您可能能够通过共享中断来使用超过 2 个串口,而无需进行任何低级别配置。所有 PCI 端口都应支持此功能,但对于 ISA 来说,它仅适用于某些硬件。如果中断可用,为每个端口提供唯一的中断可能同样容易。请参阅 中断共享和内核 2.2+

低级别配置(设置 IRQ 和 IO 地址)似乎比高级别配置给人们带来更多麻烦,尽管对于许多人来说,它是完全自动的,并且无需进行任何配置。在端口启用并且串口驱动程序知道正确的 IRQ 和 IO 地址之前,端口通常根本无法工作。

端口可能被禁用,可能是由 BIOS 禁用,也可能是 Linux 未能找到并启用端口。对于现代端口(前提是 BIOS 没有禁用它们),手动 PnP 工具(如 lspci)应该能够找到它们。应用程序和实用程序(如“setserial”和“scanport”(仅限 Debian ??))仅探测 IO 地址,不使用 PnP 工具,因此无法检测到禁用的端口。

即使串口驱动程序的探测可以找到 ISA 端口,如果 IRQ 错误,它也可能工作得非常慢。请参阅 极其缓慢:文本在长时间延迟后缓慢显示在屏幕上 。PCI 端口不太可能出现 IRQ 错误。

IO 地址、IRQ 等被称为“资源”,因此我们正在配置某些资源。但是还有许多其他类型的“资源”,因此该术语还有许多其他含义。总而言之,低级别配置包括启用设备,为其命名(例如 ttyS2),并将两个值(IRQ 号和 IO 地址)放入两个位置:

  1. 设备驱动程序(通过 PnP 或“ setserial ”完成)
  2. 串口硬件本身的配置寄存器,由 PnP 软件(或传统硬件上的跳线)完成。

您可以观看启动(= 启动时间)消息。它们通常是正确的。但是,如果您遇到问题,您的串口可能根本不会显示,或者如果您看到来自“setserial”的消息,它可能不会显示硬件的真实配置(并且不一定应该显示)。请参阅 I/O 地址和 IRQ:启动时间消息

8.3 PCI 总线支持

简介

如果您使用的是内核 2.4 或更高版本,则应该支持 PCI 和 ISA 总线的 PnP(内置或通过模块)。某些 PCI 串口可以由串口驱动程序自动检测和低级别配置。其他可能无法做到。

虽然内核 2.2 通常支持 PCI,但它不支持 PCI 串口(尽管有些人无论如何都使其工作)。从内核 2.4 开始,串口驱动程序将读取数字存储在串口硬件中的 ID 号,以确定如何支持它(如果它知道如何支持)。它应该为其分配 I/O 地址,确定其 IRQ 等。因此,您无需为其使用“setserial”。

如果您不使用设备文件系统,则可能会出现问题。驱动程序可能会根据启动时间消息将端口分配给 tt/ttyS4(使用 dmesg 查看)。但是,如果您没有“文件”/dev/ttyS4,则端口将无法工作。因此,您需要使用以下命令创建它:
cd /dev; ./MAKEDEV ttyS4

有关 PCI 的更多信息

PCI 端口没有很好的标准化。有些使用主内存与 PC 通信。有些需要特殊启用 IRQ。 “lspci -vv”的输出可以帮助确定是否可以支持某个端口。如果您看到 4 位 IO 端口,则可能只需告诉“setserial”IO 端口和 IRQ 即可使端口工作。例如,如果 lspci 显示 IRQ 10,I/O 地址为 0xecb8,并且您决定将其命名为 ttyS2,则命令是:

setserial /dev/ttyS2 irq 10 port 0xecb8 autoconfig

请注意,启动时间消息“Probing PCI hardware”表示读取 PCI 设备中的 PnP 配置寄存器,这会检测有关所有 PCI 卡和板载 PCI 设备的信息。这与串口驱动程序探测 IO 地址不同,后者表示读取某些 IO 地址以查看读取的内容是否看起来像该地址上存在串口。

8.4 低级别配置中常犯的错误

以下是人们常犯的一些错误:

8.5 IRQ 和 IO 地址必须正确

对于问题“我的 IO 和 IRQ 是什么?”,实际上有两个答案:1. 设备驱动程序认为已设置的内容(这是 setserial 通常设置和显示的内容)。2. 硬件中实际设置的内容。以上 1 和 2 应该相同。如果它们不同,则意味着麻烦,因为驱动程序具有关于物理串口的不正确信息。在某些情况下,硬件被禁用,因此它没有 IO 地址或 IRQ。

如果驱动程序的 IO 地址错误,它将尝试将数据发送到不存在的串口 - 或者更糟糕的是,发送到其他设备。如果它的 IRQ 错误,驱动程序将不会收到来自串口的中断服务请求,从而导致非常慢或没有响应。请参阅 极其缓慢:文本在长时间延迟后缓慢显示在屏幕上 。如果 UART 的型号错误,也容易出现问题。要确定 IO-IRQ 对是否相同,您必须找出它们在驱动程序和硬件中是如何设置的。

8.6 驱动程序认为的 IO 地址和 IRQ 是什么?

简介

驱动程序认为的内容不一定是硬件的实际设置方式。如果一切工作正常,那么驱动程序认为的内容很可能是正确的(在硬件中设置),您无需调查(除非您好奇或想成为专家)。确定驱动程序认为的内容的方法包括:启动时间消息 I/O 地址和 IRQ:启动时间消息 、/proc 目录“文件” /proc 目录和 setserial 以及“setserial”命令。

I/O 地址和 IRQ:启动时间消息

在许多情况下,您的端口将在启动时自动进行低级别配置(但并非总是正确)。要查看正在发生的事情,请查看屏幕上的启动消息。不要忽略检查在加载 Linux 之前来自 BIOS 的消息(此处未显示示例)。可以按 Pause 键(同时按住 Shift 键)冻结这些 BIOS 消息。冻结它们通常很棘手,您可能需要在 Linux 启动时按 Ctrl-Alt-Del 以启动重新启动并重试。这些消息显示的内容可能会随着启动的进行而变化,并且在完全正确的单词处冻结它通常很棘手。

使用 Shift-PageUp 向上滚动到消息,在它们闪过之后。 Shift-PageDown 将在相反方向滚动。 dmesg 命令(或查看 /var/log 中的日志)将仅显示这两条消息中的第一条。以下是启动消息的示例(截至 2004 年,与 1999 年几乎相同)。请注意,在旧版本中,ttyS1 在这些消息中显示为 ttyS01 等。

首先,您会看到检测到的内容(但 irq 只是一个猜测):

Serial driver version 4.27 with no serial options enabled
ttyS0 at 0x03f8 (irq = 4) is a 16550A
ttyS1 at 0x02f8 (irq = 3) is a 16550A
ttyS2 at 0x03e8 (irq = 4) is a 16550A
ttyS4 at port 0xeff0 (irq = 10) is a 16550A

请注意,ttyS0-ttyS2 是通过探测标准地址检测到的,而 ttyS4 是通过探测 PCI 配置检测到的 PCI 端口。稍后 setserial 会向您显示保存在配置文件中的内容(您可以编辑),但它也不一定是正确的:

Loading the saved-state of the serial devices...
/dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A
/dev/ttyS2 at 0x03e8 (irq = 5) is a 16550A

请注意,配置文件中只有 ttyS1-2,因此 ttyS0 和 ttyS4 不受其影响。还存在细微的差异:第一条消息显示 ttyS2 的 irq=4,而第二条消息显示其 irq=5。在大多数情况下,第二条消息是正确的。但是,如果您遇到问题,它可能会产生误导。在阅读本节其余部分中关于所有这些复杂性的解释之前,您不妨尝试使用您的串口,看看它是否工作正常。如果是这样,则可能没有必要进一步阅读。

第二条消息来自在启动时从 /etc 目录树中的脚本运行的 setserial 程序。它显示了设备驱动程序认为的正确配置。但这也可能是错误的。例如,irq 实际上可能在硬件中设置为 irq=8(两条消息都错误)。 irq=5 可能是因为配置文件不正确。

对于旧的跳线设置的串口,Linux 有时会错误地获取 IRQ,因为它默认情况下不探测 IRQ。它只是假设“标准”的 IRQ(第一条消息),或者接受配置文件中的内容(第二条消息)。这些都不一定是正确的。如果串口驱动程序的 IRQ 错误,则串口非常慢,或者似乎根本无法工作。

第一条消息是 Linux 探测 ISA 串口地址的结果,但它不探测 IRQ。如果此处显示端口,则该端口存在,但 IRQ 可能错误。 Linux 不检查 IRQ,因为这样做并非万无一失。它只是假设 IRQ 如图所示,因为它们是“标准”值。您可以使用 setserial 以及 autoconfigauto_irq 选项手动检查它们,但这也不能保证是正确的。

BIOS 消息(您在 Linux 启动之前首先看到的消息)显示的数据是最初在硬件中设置的数据。如果您的串口是即插即用 (PnP),则“isapnp”或“setpci”可能会运行并更改这些设置。在 Linux 启动后查找有关此消息的消息。示例中显示的最后一条串口消息应与 BIOS 消息(可能由 isapnp 或 setpci 修改)一致。如果它们不一致,那么您要么需要更改端口硬件中的设置,要么使用 setserial 告诉驱动程序硬件中实际设置的内容。

此外,如果您有即插即用 (PnP) 串口,除非 IRQ 和 IO 已由即插即用软件在硬件内部设置,否则只能通过 PnP 软件找到它们。在内核 2.4 之前,这是启动消息未显示物理存在的串口的常见原因。 PnP BIOS 可能会自动低级别配置它们。 PnP 配置将在稍后解释。

/proc 目录和 setserial

键入“setserial -g /dev/ttyS*”。还有其他一些方法可以通过查看 /proc 目录中的“文件”来找到此信息。请注意,不能保证硬件中设置的内容相同。

/proc/ioports 将显示驱动程序正在使用的 IO 地址。 /proc/interrupts 显示当前正在运行的进程(已打开设备)的驱动程序使用的 IRQ。它显示了实际发出的中断数。 /proc/tty/driver/serial 显示了以上大部分信息,以及已接收和发送的字节数(即使设备现在未打开)。

请注意,对于 IO 地址和 IRQ 分配,您只能看到驱动程序认为的内容,而不一定是硬件中实际设置的内容。但是,关于实际发出的中断数和处理的字节数的数据是真实的。如果您看到大量中断和/或字节,则可能意味着设备正在(或曾经)工作。但是中断可能来自另一个设备。如果没有接收到字节 (rx:0),但传输了字节(例如 tx:3749),则只有一个方向的流量工作(或正在使用)。

有时,仅显示少量中断并不意味着中断实际上是由任何串口物理生成的。因此,如果您看到正在尝试使用的端口几乎没有中断,则可能未在硬件中设置该中断。要查看 /proc/interrupts 以检查您当前正在运行的程序(例如“minicom”),您需要在查看时保持程序运行。

8.7 我的串口硬件的 IO 地址和 IRQ 是什么?

简介

如果是 PCI 或 ISA PnP,则在硬件中设置的内容是通过 PnP 方法完成的。即使未设置任何内容或端口已禁用,仍然可以使用“lspci -v”或“isapnp --dumpregs”找到 PnP 端口。由跳线(或硬件故障)禁用的端口完全丢失。请参阅 ISA PnP 端口PCI:已设置的 IO 和 IRQ 是什么?PCI:启用已禁用的端口

PnP 端口在关闭电源时不会将其配置存储在硬件中。这与跳线(非 PnP)形成对比,跳线在断电后保持不变。这就是为什么 PnP 端口比旧的非 PnP 端口更可能处于禁用状态的原因。

PCI:已设置的 IO 和 IRQ 是什么?

对于 PCI,BIOS 几乎总是设置 IRQ,也可能设置 IO 地址。要查看它是如何设置的,请使用“lspci -vv”(最佳)或查看 /proc/bus/pci(或对于内核 <2.2,/proc/pci)。调制解调器的串口通常称为“通信控制器”。查找此项。如果 lspci 显示“I/O ports at ... [disabled]”,则串口已禁用,并且硬件没有 IO 地址,因此它丢失且无法使用。有关如何启用它的信息,请参阅 PCI:启用已禁用的端口

如果显示了多个 IO 地址,则第一个地址更可能是正确的地址。您无法更改 IRQ(至少不能使用“setpci”)。这是因为如果写入 IRQ,则不会对其硬件寄存器采取任何操作。应该是 BIOS 实际设置 IRQ,然后将正确的值写入此寄存器以供 lspci 查看。如果必须更改 IO 地址,请使用“setpci”通过更改 BASE_ADDRESS_0 或类似项来更改。

PCI:启用已禁用的端口

如果端口通过 IO 地址通信,则“lspci -vv”应显示“Control: I/O+ ...”,其中 + 表示 IO 地址已启用。如果它显示“I/O-”(和“I/O ports at ... [disabled]”),则您可能需要使用 setpci 命令来启用它。例如,“setpci -d 151f:000 command=101”。 151f 是供应商 ID,000 是设备 ID,两者都从“lspci -n -v”或 /proc/bus/pci 或“scanpci -v”获得。 “command=101”表示 101 被放入命令寄存器,该寄存器与“lspci”显示的“Control”寄存器相同。 101h 设置了两个位:1 将 I/O 设置为 +,100 部分保持 SERR# 设置为 +。在本例中,当运行 lspci 命令时,最初观察到 Control 寄存器的 SERR# 位为 +。因此,我们通过将位 8(其中位 0 是 I/O)设置为 1(通过 101 中的第一个 1)来保持启用状态为 +。某些串口卡不使用 SERR#,因此如果您看到 SERR#-,则无需启用它,因此请使用:command=1。然后,您需要设置“setserial”以告诉驱动程序 IO 和 IRQ。

位 8 实际上是第 9 位,因为我们从位 0 开始计数位。不要惊慌 lspci 显示了很多 - 符号,表明该卡没有很多可用(或已启用)的功能。串口相对较慢,不需要这些功能。

另一种启用方法是让 BIOS 执行此操作,方法是告诉 BIOS 您没有即插即用操作系统。然后 BIOS 应该在您启动 PC 时启用它。如果您在同一台 PC 上安装了 MS Windows9x,则这样做可能会导致 Windows 出现问题(请参阅 Plug-and-Play-HOWTO)。

ISA PnP 端口

对于 ISA 即插即用 (PnP) 端口,可以尝试 pnpdump 程序( isapnptools 的一部分)。如果您使用 --dumpregs 选项,则它应该告诉您在端口中设置的实际 IO 地址和 IRQ。它还应该找到已禁用的 ISA PnP 端口。它“尝试”的地址不是设备的 IO 地址,而是用于与 PnP 卡通信的特殊地址。

查找未禁用的端口(ISA、PCI、PnP、非 PnP)

也许 BIOS 消息会在 Linux 开始启动之前告诉您一些信息。使用 Shift-PageUp 键向后浏览启动时间消息,并查看最开始的 BIOS 消息。这是 Linux 启动之前的状态。 Setserial 无法更改它,但 isapnp 或 setpci 可以。从内核 2.4 开始,串口驱动程序可以为许多(但不是全部)串口进行此类更改。

使用“scanport”(仅限 Debian ??)将探测所有 I/O 端口,并将指示它认为可能是串口的内容。在此之后,您可以尝试使用“autoconfig”选项使用 setserial 进行探测。您需要猜测要探测的地址(使用“scanport”中的线索)。请参阅 什么是 Setserial

对于通过跳线设置的端口,IO 端口和 IRQ 根据跳线设置。如果端口不是即插即用 (PnP),但已通过使用 DOS 程序设置,则它设置为运行该程序的人员设置的任何内容。

通过 MS Windows 探索(最后的手段)

对于 PnP 端口,检查 DOS/Windows 下的配置方式可能(或可能不)暗示 Linux 下的配置方式。 MS Windows 将其配置信息存储在其注册表中,Linux 不使用该注册表,因此它们的配置不一定相同。如果您让 PnP BIOS 在您启动 Linux 时自动进行配置(并且在启动 Linux 时告诉 BIOS 您没有 PnP 操作系统),则 Linux 应该使用 BIOS 非易失性存储器中的任何配置。 Windows 也使用相同的非易失性存储器,但不一定以这种方式配置它。

8.8 选择串口 IRQ

如果您有即插即用端口,则 PnP BIOS 或串口驱动程序可能会为您配置所有设备,这样您可能无需选择任何 IRQ。 PnP 软件确定它认为最佳的 IRQ 并分配它们(但并非总是最佳)。但是,如果您直接使用 isapnp(ISA 总线)或跳线,则必须选择。如果您已经知道要使用的 IRQ,则可以跳过本节,但您可能想知道 IRQ 0 有特殊用途(请参阅下一段)。

IRQ 0 不是 IRQ

虽然 IRQ 0 实际上是计时器(在硬件中),但它对于使用 setserial 设置串口具有特殊含义。它告诉驱动程序端口没有中断,然后驱动程序将使用轮询方法。这种轮询会给 CPU 带来更多负载,但如果存在中断冲突或错误设置的中断,则可以尝试。分配 IRQ 0 的优点是您无需知道硬件中设置了什么中断。它应该仅用作临时权宜之计,直到您能够找到要使用的真实中断。

中断共享,内核 2.2+

IRQ 共享是指两个设备使用相同的 IRQ。作为一般规则,ISA 总线不允许这样做。 PCI 总线可以共享 IRQ,但不能在 ISA 和 PCI 总线之间共享相同的 IRQ。大多数多端口板可以共享 IRQ。共享效率不高,因为每次给出共享中断时,都必须进行检查以确定它来自何处。因此,如果可行,为每个设备分配自己的中断会更好。

在内核 2.2 之前,串口 IRQ 彼此之间不能共享,除了大多数多端口板。从内核 2.2 开始,串口 IRQ 有时可以在串口之间共享。为了使共享在 2.2 中工作,内核必须已编译了 CONFIG_SERIAL_SHARE_IRQ,并且串口硬件必须支持共享(这样,如果两个串口卡在同一中断线上施加不同的电压,则只有表示“这是一个中断”的电压才会占上风)。由于 PCI 总线规范允许共享,因此任何 PCI 卡都应允许共享。

选择哪些 IRQ?

串口硬件通常只有有限数量的 IRQ。此外,您不希望出现 IRQ 冲突。因此可能没有太多选择。您的 PC 通常可能带有 IRQ 4 上的 ttyS0ttyS2 ,以及 IRQ 3 上的 ttyS1ttyS3 。查看 /proc/interrupts 将显示当前正在运行的程序正在使用的 IRQ。您可能不想使用其中之一。在 IRQ 5 用于声卡之前,它通常用于串口。

以下是 Greg(Serial-HOWTO 的原始作者)如何在 /etc/rc.d/rc.serial 中设置他的。 rc.serial 是一个在启动时运行的文件(shell 脚本)(它可能具有不同的名称或位置)。对于 2.15 之后的“setserial”版本,不再总是以这种方式完成,但此示例确实显示了 IRQ 的选择。

/sbin/setserial /dev/ttyS0 irq 3        # my serial mouse
/sbin/setserial /dev/ttyS1 irq 4        # my Wyse dumb terminal
/sbin/setserial /dev/ttyS2 irq 5        # my Zoom modem
/sbin/setserial /dev/ttyS3 irq 9        # my USR modem

标准 IRQ 分配

        IRQ  0    Timer channel 0 (May mean "no interrupt".  See below.)
        IRQ  1    Keyboard
        IRQ  2    Cascade for controller 2
        IRQ  3    Serial port 2
        IRQ  4    Serial port 1
        IRQ  5    Parallel port 2, Sound card
        IRQ  6    Floppy diskette
        IRQ  7    Parallel port 1
        IRQ  8    Real-time clock
        IRQ  9    Redirected to IRQ2
        IRQ 10    not assigned
        IRQ 11    not assigned
        IRQ 12    not assigned
        IRQ 13    Math co-processor
        IRQ 14    Hard disk controller 1
        IRQ 15    Hard disk controller 2

在选择中断时,实际上没有正确的方法。尝试找到一个未被主板或任何其他板使用的中断。 2、3、4、5、7、10、11、12 或 15 是可能的选择。请注意,IRQ 2 与 IRQ 9 相同。您可以将其称为 2 或 9,串口驱动程序非常理解。如果您的串口板非常旧,则可能无法使用 IRQ 8 及以上。

确保不要使用 IRQ 1、6、8、13 或 14!这些由您的主板使用。您占用她的 IRQ 会让她非常不高兴。完成后,您可能需要在使用中断的程序运行时仔细检查 /proc/interrupts ,并确保没有冲突。

8.9 选择地址 - 视频卡与 ttyS3 冲突

这是某些旧串口卡的问题。 IBM 8514 视频板(以及其他类似产品)的 IO 地址据称是 0x?2e8,其中 ? 是 2、4、8 或 9。这可能与 0x02e8 的 ttyS3 的 IO 地址冲突。您可能会认为这不应该发生,因为地址在高位数字(02e8 中的前导 0)中不同。您是对的,但是设计不良的串口可能会忽略高位数字,并响应以 2e8 结尾的任何地址。如果您尝试在此 IO 地址使用 ttyS3 (ISA 总线),那将是坏消息。

对于 ISA 总线,您应该尝试使用下面显示的默认地址。 PCI 卡使用不同的地址,以免与 ISA 地址冲突。下面显示的地址表示 8 字节范围的第一个地址。例如,3f8 实际上是范围 3f8-3ff。每个串口设备(以及其他使用 IO 地址的设备类型)都需要其自己唯一的地址范围。不应有重叠(冲突)。以下是 ISA 总线上常用串口的默认地址:

ttyS0 address 0x3f8
ttyS1 address 0x2f8
ttyS2 address 0x3e8
ttyS3 address 0x2e8

假设在真实串口和另一个物理上不存在的端口之间存在地址冲突(如 setserial -g /dev/ttyS* 报告)(并显示 UART:未知)。这种冲突不应引起问题,但在旧内核中有时会引起问题。为避免此问题,请不要允许此类地址冲突,如果 /dev/ttySx 物理上不存在,则删除它。

8.10 在硬件中设置 IO 地址和 IRQ(主要用于 PnP)

在硬件中设置后,不要忘记确保也使用 setserial 在驱动程序中设置它。对于非 PnP 串口,它们要么通过跳线在硬件中设置,要么通过运行 DOS 程序(“无跳线”)来设置它们(这可能会禁用 PnP)。本小节的其余部分仅适用于 PnP 串口。以下是配置 PnP 串口的可能方法列表:

每次系统通电时,都必须在其寄存器中设置(通过 PnP)IO 地址和 IRQ,因为 PnP 硬件不记得断电时的设置方式。执行此操作的一种简单方法是让 PnP BIOS 知道您没有 PnP 操作系统,并且 BIOS 每次启动时都会自动执行此操作。如果您使用 BIOS 认为 Windows 不是 PnP 操作系统的方式启动 Windows,这可能会导致 Windows 出现问题(Windows 是 PnP 操作系统)。请参阅 Plug-and-Play-HOWTO。

即插即用 (PnP) 旨在自动化此 io-irq 配置,但对于 Linux,它最初使生活变得更加复杂。在现代 Linux(2.4 内核 - 部分在 2.2 内核中)中,每个设备驱动程序都必须执行自己的 PnP(使用它可能使用的提供的软件)。不幸的是,像 MS Windows 中那样,没有用于分配 IO 地址和 IRQ 的集中计划。但无论如何,它通常在 Linux 中都能正常工作。

使用 PnP BIOS 进行 IO-IRQ 配置

虽然关于如何使用 setpci 或 isapnp 进行 io-irq 配置的说明应该随此类软件一起提供,但如果您想让 PnP BIOS 进行此类配置,则情况并非如此。并非所有 PnP BIOS 都可以做到这一点。 BIOS 通常具有用于设置前两个串口的 CMOS 菜单。此菜单可能很难找到。对于“Award”BIOS,它在“芯片组功能设置”下找到。通常几乎没有选择。对于 ISA 串口,前两个端口通常设置为标准 IO 地址和 IRQ。请参阅 有关串口名称的更多信息

无论您是否喜欢,当您启动 PC 时,PnP BIOS 都会开始对硬件设备进行 PnP (io-irq) 配置。它可能会部分完成这项工作,并将剩余部分交给 PnP 操作系统(Linux 在某种意义上是 PnP 操作系统),或者如果认为您没有 PnP 操作系统,它可能会完全配置所有 PnP 设备,但不配置设备驱动程序。

如果你告诉BIOS你没有PnP操作系统,那么PnP BIOS应该配置所有PnP串口——而不仅仅是前两个。一种间接控制BIOS行为的方法(如果你在同一台电脑上安装了Windows 9x)是在Windows下“强制”配置。请参阅 Plug-and-Play-HOWTO 并搜索“forced”。使用CMOS BIOS菜单更容易,它可能会覆盖你在Windows下“强制”的配置。可能有一个BIOS选项可以设置或禁用这种“覆盖”功能。

如果你添加一个新的PnP设备,BIOS应该对其进行PnP配置。如果需要避免任何冲突,它甚至可以更改现有设备的io-irq。为此,它会保存一份非PnP设备的列表,前提是你已经告诉BIOS这些非PnP设备是如何配置io-irq的。告诉BIOS这一信息的一种方法是在DOS/Windows下运行一个名为ICU的程序。

但是,你如何才能知道BIOS做了什么,以便你使用这些信息设置设备驱动程序呢?BIOS本身可能会提供一些信息,或者在其设置菜单中,或者在开机时通过屏幕上的消息。请参阅我的串口硬件中设置了什么?。其他查找方法是使用lspci命令查看PCI总线,或使用isapnp --dumpregs命令查看ISA总线。它显示的晦涩难懂的结果对于新手来说可能不清楚。

8.11 为Setserial提供IRQ和IO地址

一旦你在硬件中设置了IRQ和IO地址(或安排由PnP完成),你还需要确保每次启动Linux时都运行“setserial”命令。请参阅子章节启动时配置


下一篇 上一篇 目录