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