Parport

parport 代码提供了 Linux 下的并行端口支持。 这包括在多个设备驱动程序之间共享一个端口的能力。

您可以将参数传递给 parport 代码,以覆盖其对硬件的自动检测。 如果您想使用 IRQ,这尤其有用,因为通常无法成功自动探测这些 IRQ。 默认情况下,即使可以探测到 IRQ,也不会使用它们。 这是因为很多人将相同的 IRQ 用于并行端口以及声卡或网卡。

parport 代码分为两部分:通用部分(处理端口共享)和架构相关部分(处理实际使用端口)。

将 Parport 作为模块

如果您将 parport` 代码作为模块加载,例如

# insmod parport

加载通用的 parport 代码。 然后,您必须加载架构相关的代码,例如

# insmod parport_pc io=0x3bc,0x378,0x278 irq=none,7,auto

告诉 parport 代码您想要三个 PC 风格的端口,一个位于 0x3bc 且没有 IRQ,一个位于 0x378 且使用 IRQ 7,另一个位于 0x278 且具有自动检测的 IRQ。 目前,支持 PC 风格 (parport_pc)、Sun bpp、Amiga、Atari 和 MFC3 硬件。

PCI 并行 I/O 卡支持来自 parport_pc。 不应为受支持的 PCI 卡指定基本 I/O 地址,因为它们会自动检测到。

modprobe

如果您使用 modprobe,您会发现将如下行添加到 /etc/modprobe.d/ 目录中的配置文件很有用

alias parport_lowlevel parport_pc
options parport_pc io=0x378,0x278 irq=7,auto

每当加载并行端口设备驱动程序(例如 lp)时,modprobe 将加载 parport_pc(带有选项 io=0x378,0x278 irq=7,auto)。

请注意,这些只是示例行! 一般来说,您不需要为 parport_pc 指定任何选项即可使用并行端口。

Parport 探测 [可选]

在 2.2 内核中,有一个名为 parport_probe 的模块,用于收集 IEEE 1284 设备 ID 信息。 现在已经增强了这一点,现在与 IEEE 1284 支持一起存在。 检测到并行端口后,将分析连接到该端口的设备,并记录如下信息

parport0: Printer, BJC-210 (Canon)

探测信息可从 /proc/sys/dev/parport/ 中的文件中获得。

Parport 静态链接到内核中

如果将 parport 代码编译到内核中,则可以使用内核启动参数来获得相同的效果。 将类似以下内容添加到您的 LILO 命令行

parport=0x3bc parport=0x378,7 parport=0x278,auto,nofifo

您可以有许多 parport=... 语句,每个要添加的端口一个。 将 parport=0 添加到内核命令行将完全禁用 parport 支持。 将 parport=auto 添加到内核命令行将使 parport 使用其自动检测到的任何 IRQ 线或 DMA 通道。

/proc 中的文件

如果已将 /proc 文件系统配置到内核中,您将看到一个新的目录项:/proc/sys/dev/parport。 其中将为配置了 parport 的每个并行端口创建一个目录项。 在每个目录中,都有一系列描述该并行端口的文件。

/proc/sys/dev/parport 目录树如下所示

parport
|-- default
|   |-- spintime
|   `-- timeslice
|-- parport0
|   |-- autoprobe
|   |-- autoprobe0
|   |-- autoprobe1
|   |-- autoprobe2
|   |-- autoprobe3
|   |-- devices
|   |   |-- active
|   |   `-- lp
|   |       `-- timeslice
|   |-- base-addr
|   |-- irq
|   |-- dma
|   |-- modes
|   `-- spintime
`-- parport1
|-- autoprobe
|-- autoprobe0
|-- autoprobe1
|-- autoprobe2
|-- autoprobe3
|-- devices
|   |-- active
|   `-- ppa
|       `-- timeslice
|-- base-addr
|-- irq
|-- dma
|-- modes
`-- spintime

文件

目录

devices/active

使用该端口的设备驱动程序的列表。 当前正在使用该端口的设备名称旁边将显示一个“+”(可能不会显示任何)。 字符串“none”表示没有设备驱动程序正在使用该端口。

base-addr

并行端口的基本地址,如果端口有多个地址,则用制表符分隔。 这些值对于某些端口可能没有任何实际意义。

irq

并行端口的 IRQ,如果未使用,则为 -1。

dma

并行端口的 DMA 通道,如果未使用,则为 -1。

modes

并行端口的硬件模式,以逗号分隔,含义如下

  • PCSPP

    PC 风格的 SPP 寄存器可用。

  • TRISTATE

    端口是双向的。

  • COMPAT

    打印机的硬件加速可用并将被使用。

  • EPP

    EPP 协议的硬件加速可用并将被使用。

  • ECP

    ECP 协议的硬件加速可用并将被使用。

  • DMA

    DMA 可用并将被使用。

请注意,如果当前实现有 IRQ 线可用,它将仅利用 COMPAT 和 ECP 模式。

autoprobe

已从(非 IEEE 1284.3)设备获取的任何 IEEE-1284 设备 ID 信息。

autoprobe[0-3]

从符合 IEEE 1284.3 的菊花链设备检索到的 IEEE 1284 设备 ID 信息。

spintime

在等待外围设备响应时忙循环的微秒数。 您可能会发现调整此设置可以提高性能,具体取决于您的外围设备。 这是一个端口范围的设置,即它适用于特定端口上的所有设备。

timeslice

允许设备驱动程序保持端口声明的时间(以毫秒为单位)。 这是建议性的,如果必须,驱动程序可以忽略它。

default/*

spintime 和 timeslice 的默认值。 注册新端口时,它会获取默认的 spintime。 注册新设备时,它会获取默认的 timeslice。

设备驱动程序

初始化 parport 代码后,您可以将设备驱动程序连接到特定端口。 通常,这会自动发生; 如果加载 lp 驱动程序,它将为找到的每个端口创建一个 lp 设备。 但是,您可以使用参数覆盖此设置,无论是加载 lp 驱动程序时

# insmod lp parport=0,2

还是在 LILO 命令行上

lp=parport0 lp=parport2

以上两个示例都将通知 lp 您希望 /dev/lp0 成为第一个并行端口,并且 /dev/lp1 成为**第三个**并行端口,而第二个端口 (parport1) 没有关联的 lp 设备。 请注意,这与旧内核的工作方式不同; 过去 I/O 端口地址和设备名称之间存在静态关联,因此 /dev/lp0 始终是位于 0x3bc 的端口。 现在情况并非如此 - 如果您只有一个端口,无论基本地址如何,它都将默认为 /dev/lp0

此外

  • 如果在编译时选择了 IEEE 1284 支持,则可以在内核命令行上说 lp=auto,并且 lp 将仅为那些似乎连接了打印机的端口创建设备。

  • 如果您给 PLIP 提供 timid 参数,无论是在命令行上使用 plip=timid,还是在使用模块时使用 insmod plip timid=1,它都会避免任何似乎被其他设备使用的端口。

  • 目前,IRQ 自动探测仅适用于少数端口类型。

报告 parport 的打印机问题

如果打印时遇到问题,请按照以下步骤尝试缩小问题区域。

报告 parport 的问题时,实际上需要提供 parport_pc 在初始化时输出的所有消息。 有几个代码路径

  • 轮询

  • 中断驱动,协议在软件中

  • 中断驱动,协议在使用 PIO 的硬件中

  • 中断驱动,协议在使用 DMA 的硬件中

parport_pc 记录的内核消息指示正在使用哪个代码路径。 (实际上,它们可以更好..)

对于正常的打印机协议,启用或不启用 IEEE 1284 模式不应有任何区别。

要关闭“硬件协议”代码路径,请禁用 CONFIG_PARPORT_PC_FIFO。 请注意,启用它们后,它们不一定会被**使用**; 这取决于硬件是否可用、是否已由 BIOS 启用以及是否已由驱动程序检测到。

因此,首先禁用 CONFIG_PARPORT_PC_FIFO,并使用 irq=none 加载 parport_pc。 看看打印是否正常。 确实应该正常,因为这是最简单的代码路径。

如果这工作正常,请尝试使用 io=0x378 irq=7(根据您的硬件进行调整),使其使用中断驱动的软件协议。

如果**那**工作正常,那么其中一种硬件模式无法正常工作。 启用 CONFIG_FIFO(不,它不是一个模块选项,是的,它应该是),在 BIOS 中将端口设置为 ECP 模式,并记下 DMA 通道,然后尝试

io=0x378 irq=7 dma=none (for PIO)
io=0x378 irq=7 dma=3 (for DMA)

philb@gnu.org tim@cyberelk.net