Parport¶
parport 代码在 Linux 下提供并行端口支持。这包括在多个设备驱动程序之间共享一个端口的能力。
您可以向 parport 代码传递参数,以覆盖其对硬件的自动检测。如果您想使用 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
文件 |
目录 |
|---|---|
|
使用该端口的设备驱动程序列表。当前正在使用该端口的设备名称旁边会显示一个 “+”(可能不会针对任何设备显示)。字符串 “none” 意味着没有设备驱动程序在使用该端口。 |
|
并行端口的基础地址,如果端口有多个地址,则用制表符分隔。对于某些端口,这些值可能没有任何实际意义。 |
|
并行端口的 IRQ,如果未使用则为 -1。 |
|
并行端口的 DMA 通道,如果未使用则为 -1。 |
|
并行端口的硬件模式,以逗号分隔,含义如下
请注意,当前实现只有在具有可用的 IRQ 线路时才会利用 COMPAT 和 ECP 模式。 |
|
从(非 IEEE 1284.3)设备获取的任何 IEEE-1284 设备 ID 信息。 |
|
从符合 IEEE 1284.3 的菊花链设备检索到的 IEEE 1284 设备 ID 信息。 |
|
等待外设响应时进行忙循环的微秒数。您可能会发现调整此项可以提高性能,具体取决于您的外设。这是一个端口范围的设置,即它适用于特定端口上的所有设备。 |
|
允许设备驱动程序保持占用端口的毫秒数。这只是建议性的,如果必须,驱动程序可以忽略它。 |
|
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)