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)