Next Previous Contents

3. 核心印表機裝置

平行埠有兩種完全不同的裝置驅動程式; 你的核心版本決定了你用的是那一種. 驅動程式是在 Linux 2.1.33 版所做的改變.

兩種驅動程式的型態僅在很少的一些細節上相同. 最值得注意的是, 許多人發現 Linux 不會偵測他們的平行埠除非他們在 PC BIOS 的設定中把 "Plug and Play" 關掉. (這一點也不令人驚訝; 過去的記錄顯示在 Windows 和其它地方對非 PCI 裝置的 PnP 已經成了某種災難).

3.1 lp 裝置 (核心版本 <=2.1.32)

假如你已經編譯或載入了 lp 裝置(如果載入了的話, cat /proc/devices 的結果應該會看到 lp), Linux 核心 (<=2.1.32) 會提供一個或多個的 /dev/lp0, /dev/lp1, /dev/lp2 裝置檔案. 這些檔案不是隨意指定的, 相反的, 每一個檔案皆對應到一個特定的 I/O 位址. 這表示你的第一部印表機可能是 lp0lp1, 完全視你的硬體情況而定. 兩個都試試看吧!

有些使用者提到如果使用較舊的單向印表機連接線, 就無法偵測到他們的雙向印表機連接埠. 確定你使用了正確的連接線.

一個印表機埠不能同時載入 plip 和 lp 的驅動程式, 如果你用的是 2.x 或是 1.3.x 版以後的核心, 你可以用手動或核心的方式選擇載入不同的驅動程式. 只要小心的設定中斷等設定, 你應該可以在一個埠上執行 plip, 而在另一個埠上載入 lp 的驅動程式. 曾經有人修改驅動程式而成功; 我希望能早日聽到有人以一個簡單的指令完成相同的事情.

有一個小程式 tunelp, 如果你是 root, 可以用來設定 Linux 2.0 lp 裝置使用的中斷 (interrupt), 輪詢速率(polling rate) 和其它的項目.

若是核心編譯時包括了 lp 驅動程式, 核心接受 lp= 參數設定中斷及 IO 位址:

若將 lp 驅動程式編譯入核心, 你可以用 LILO/LOADLIN 的命令列來指定使用的
IO 位址及中斷.

語法:      lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

範例:   lp=0x378,0   或   lp=0x278,5,0x378,7 **

要注意的是假如你使用這個功能, 你必須指定 *所有* 要用的印表機埠,
系統不提供預設值. 你可以用 lp=0 來停用內建的驅動程式.

若是以載入模組的方式執行, 可以在 insmod 指令的命令列(或是在 /etc/conf.modules 來模擬核心模式) 以平常模組參數的語法來指定 IO 位址和中斷. 參數為 io=port0,port1,port2irq=irq0,irq1,irq2. 請參考 insmod 的線上手卌以取得更進一步的資訊.

**給那些當需要時卻總是找不到標準印表機埠位址的人, 位址便如同第二個範例中所示, 另一個印表機埠 (lp0) 則在 0x3bc. 我不知道一般所用的中斷是那一個.

Linux 2.0 並列埠驅動程式的原始碼在 /usr/src/linux/drivers/char/lp.c.

3.2 parport 裝置 (核心版本 >= 2.1.33)

從 2.1.33 版本後的核心(2.0.30 版核心可取得修正檔), lp 裝置成為新增加的 parport 裝置的客戶端. 增加 parport 裝置解決了許多困擾舊有 lp 裝置驅動程式的問題 - 像是可以和其它的驅動程式共用一個連接埠, 可以動態指定可用的並列埠而不須將裝置檔對應到固定的 I/O 位址等等.

parport 裝置的出現使得很多新的並列埠設備, 像是 Zip 磁碟機, 可攜式 CD-ROM 和磁碟機等等, 的驅動程式得以出現. 其中一些也有提供 2.0 核心可用的版本, 到網路上找找看吧.

你會注意到的主要差異, 以目前列印來看, 是基於 parport 的核心會動態地指定 lp 裝置給平行埠. 所以在 Linux 2.0 中的 lp1 在 Linux 2.2 中可能是 lp0. 如果你從使用 lp 驅動程式的核心升級到使用 parport 驅動程式的核心, 記得檢查這一點.

當我使用了 parport 驅動程式後, 我會更完整地探討它. 目前你可以看一下核心原始檔中的 Documentation/parport.txt. 或者你也可以到 parport web site 看看.

3.3 序列裝置(Serial devices)

序列裝置在 Linux 中通常有個像 /dev/ttyS1 這類的名稱. stty 這個工具程式可以讓你查看及設定序列埠. setserial 可以讓你調整更多的屬性及設定使用非標準的 IRQ 及 I/O 位址的序列埠. Serial-HOWTO 會對 Linux 下的序列埠做更進一步的探討.

如果你使用的是有流量控制的慢速序列印表機, 可能會發現有些報表被截斷. 這是因為系統預定在程式關閉序列埠 30 秒後, 所有在緩衝區內尚未傳送的字元都會被清除. 緩衝區內可容納最多 4096 個字元, 假使你的印表機使用流量控制, 而且慢到無法在程式關閉序列埠後 30 秒內印出緩衝區內的所有字元, 那麼緩衝區內最後的內容就會遺失. 如果 cat file > /dev/ttyS2 這個指令可以完整印出較小的檔案, 但會截斷較長的檔案時, 你可能就是遇到了這種情況.

30 秒的週期可以用 setserial (2.12 及以後的版本) 指令的 "closing_wait" 選項來調整. 一台機器通常是在 rc.serial 開機檔中呼叫 setserial 來初始化序列埠. 可以在這修改連接印表機的序列埠的 closing_wait 選項.


Next Previous Contents