パラレルポートのデバイスドライバは、全く異なるものが二つ存在しています。
あなたがどちらをお使いかは、
そのカーネルのバージョン (uname -a
とコマンドを打てばわかります)
によります。
ドライバの変更は Linux 2.1.33 で行われました。
これら二つのドライバには似ているところもあります。 特に気をつけておくべきは、PC BIOS の "Plug and Play" を無効にしておかないと、 Linux はパラレルポートを検知しない、ということでしょう (驚くことじゃありません。 Windows などでの非 PCI デバイスの PnP 接続追跡情報はある意味災厄でしたから...)。
2.1.32 以前のカーネルでは、lp デバイスを組み込むかロードしておけば
(ロードされてれば cat /proc/devices
の出力に
lp デバイスが入るはず)、
/dev/lp0, /dev/lp1, /dev/lp2
のうちのどれか (あるいは複数個) が使えます。
これらのデバイスは動的に割り当てられるものでは *ありません*。
そうではなく、それぞれが特定のハードウェア I/O アドレスに
関連づけられているのです。つまり一番目に接続したプリンタが
lp0 となるか lp1
となるかはハードウェアしだいです。
両方試してみましょう。
何人かのユーザからの報告によれば、単方向 (unidirectional) 用の古い プリンタケーブルを使っていると、双方向 (bidirectional) の lp ポートが 認識されないことがあるそうです。ちゃんとしたケーブルを使っているか 確かめておきましょう。
plip ドライバと lp ドライバは、一つのポートに同時に使うことは できません (2.0 以下では)。しかし、必要に応じて どちらかのドライバを選択してロードすることは可能です。 これは手動で、あるいは 2.x (及び 1.3.x の後期) カーネルなら kerneld を使って行うことができます。割り込みなどを注意深く設定すれば、 おそらく plip を一つのポートで、 lp を別のポートで動作させることが 可能でしょう。こいつをうまいことコマンドラインだけで成功させた例が あるようなら、私はその話がとても聞きたいです。
さて、世の中には tunelp という小さなユーティリティがあります。 これを root 権限で用いれば、 Linux 2.0 lp デバイスに対して、 割り込みの利用法やポーリングレートなどのオプションを 調整することができます。
lp ドライバがカーネルに直接組み込まれているときは、
カーネルは lp=
オプションを受け付けるようになり、
ドライバが利用する割り込みと I/O アドレスを設定できます。
例えば LILO や LOADLIN のコマンドラインを用いて、ドライバの使う
ポートアドレスと割り込みを設定できます。
書式: lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]
例; lp=0x378,0 または lp=0x278,5,0x378,7 など。
この機能を使ったときは、必要となるポートを *ぜんぶ* 指定 しなければいけません。デフォルトで有効となるポートはありません。 なお lp=0 とすれば組み込みのドライバを無効にすることもできます。
モジュールとしてロードされる場合には、
I/O アドレスと割り込みを insmod のコマンドラインから
(あるいは /etc/conf.modules で kerneld に設定して)
通常のモジュール引数の指定方法で設定できます。
パラメータは io=port0,port1,port2
と irq=irq0,irq1,irq2
です。
より詳しいことを知りたい場合は insmod
のマニュアルページを
読んでください。
必要なときに標準のポート番号を思い出せない人 (わたしもそうです) のためにコメントを。 二つは上記の二番目の例に出ています。もう一つ (lp0) は 0x3bc に あります。標準の割り込み、に関しては、ちょっと知識がありません。
Linux 2.0 パラレルポートドライバのソースコードは /usr/src/linux/drivers/char/lp.c にあります。
カーネル 2.1.33 から (カーネル 2.0.30 用のパッチもありますが)、 lp デバイスは新たに導入された parport デバイスの単なるクライアントに なりました。 parport デバイスが追加されたことによって、 以前の lp デバイスドライバにあった多くの問題が是正されました。 lp が他のドライバとポートを共有できるようになりましたし、 利用できるパラレルポートをデバイス番号に動的に割り当てることも 可能になりました (以前は I/O アドレスとポート番号の関係は 固定されていました)。
parport デバイスの登場によって、 Zip ドライブや Backpack CD-ROM, ディスクなど、新たなパラレルポートデバイスが何でも利用できるように なりました。これらのうちのいくつかは 2.0 カーネルでもバージョンに よっては利用できます。 web を捜し回ってみてください。
お気づきになると思いますが、印刷に関連する主な違いは、 parport ベースのカーネルでは lp デバイスがパラレルポートに 動的に割り当てられる、と言うことです。 ですから Linux 2.0 で lp1 だったポートが Linux 2.2 では lp0 になるかもしれません。 lp ドライバのカーネルから parport ドライバのカーネルに アップグレードするときは、この点のチェックを忘れないようにしてください。
このデバイスについて一番ありがちな問題は、 設定のミスから起こるようです:
Linux ディストリビューションのなかには、 きちんと設定された /etc/modules.conf (ないしは /etc/conf.modules) が入っていないため、 ドライバが、必要となる場面で、ちゃんと読み込まれないようなものがあります。 modules.conf の正しい `魔法の' 設定行は、 最近の modutils ではこんなふうになります:
alias /dev/printers lp alias /dev/lp* lp alias parport_lowlevel parport_pc
パラレルポートを Plug and Play にしようとする PC の BIOS はいっぱいあります。 でもこれは、「いつだってそこにある」完璧に単純なデバイスに、 無用な複雑さを植え付けるだけです。 Linux のドライバがパラレルポートを検出してくれない場合は、 パラレルポート (``LPT1'' となっている BIOS が多いです) の Plug and Play 設定を切ってください。 正しい設定内容は、``legacy'' とか ``ISA'', ``0x378'' などです。 ``disabled'' にしてしまうのは、おそらく間違いでしょう。
カーネルソースの Documentation/parport.txt を読むか、 parport web site に目を通してみてください。
Linux ではシリアルデバイスには /dev/ttyS1
のような名前がつきます。 stty
ユーティリティを用いれば、
シリアルポートの設定をインタラクティブに閲覧・設定できます。
setserial
を使うと、さらに高度な属性を制御でき、
標準的でないポートに対して IRQ や I/O アドレスを設定することも
できます。 Linux でのシリアルポートに対するより詳しい議論は
Serial-HOWTO にあるでしょう。
遅いシリアルプリンタにフロー制御を使うと、 プリントジョブが捨てられてしまうことがあります。 これはおそらくシリアルポートのせいで、 デフォルトの動作では送信されなかった文字を、 ポートがクローズされた 30 秒後にバッファにから捨ててしまうからです。 バッファは 4096 文字まで保持できますが、 プリンタでフロー制御が使われており、 かつプリンタの速度が遅くて、印刷を行ったソフトウェアがポートを クローズした後 30 秒の間にデータを受け切れない場合には、 バッファの内容の末尾の部分が失われることになります。 コマンド
cat file > /dev/ttyS2
を行って、短いファイルなら完全にプリントアウトされ、
長いファイルでは尻切れになるようなら、
おそらくこの状況にあります。
30 秒のインターバルは setserial (バージョン 2.12 以降) の "closing_wait" コマンドラインオプションによって調整できます。 通常マシンのシリアルポートは rc.serial というブートファイルから setserial を呼び出すことによって初期化されています。 問題になっている印刷用シリアルポートへのこの setserial の 実行を修正して、そのポートへの他のパラメータの設定と同時に closing_wait も設定するようにすれば良いでしょう。