カーネル 2.2 のシリアルドライバは PCI バスに対応していません。 しかし、カーネル 2.3 と 2.4 では、ついに一部の PCI シリアルカード(およ びモデムカード)に対応します。ほとんどの PCI カードは、ドライバによる特殊なサポートが必要です。ドライバはカードに デジタル的に格納されている ID を読み込み、そのカードにどうやって対応す るか(あるいはサポートするかどうか)を決めます。確実に Windows モデムで はないにもかかわらず動作しない PCI カードをお持ちであれば、そのカード 用のドライバを作る手助けができます。これを行うには、シリアルドライバの メンテナである Theodore (Ted) Y. Ts'o さんに連絡する必要があります。
この際には、"lspci -vv" の出力のコピーと PCI モデム(またはシリアルポー ト)のモデルとメーカーに関する詳しい情報を電子メールで送る必要がありま す。そうすれば、彼は動作するかもしれないテスト用ドライバの場所をできる だけ教えてくれるでしょう。次に、このドライバを入手してコンパイルします。 カーネルも多分再コンパイルすることになるでしょう。そして、このドライバ をテストしてうまく動作するかどうかを調べ、その結果を Ted Ts'o に報告し ます。上記の手順全てをちゃんと行うつもりがあるなら(そしてこの文書が最 新版なら)、彼に必要な情報を送ってください。 メールアドレスは mailto:tytso@mit.edu です。
PCI モデムはあまり標準化されていません。一部のカードは PC との I/O に メインメモリを使います(ISA カードはこういった場合には I/O アドレス空間 を使います)。一部のカードは、特殊な方法を使わないと IRQ が有効になりま せん。"lspci" の出力を見れば、カードがサポートされているかどうかを調べ る役に立つでしょう。細かい話があまり難しくなければ、筆者がこの方法につ いて調べ、この文書の将来の版で説明するかもしれません。
多くの場合、設定は自動的に行われるので、ユーザがすることは何もあり ません。しかし場合によっては設定を行う必要があります(あるいは単に設定 を確かめるだけのこともあるでしょう)。こういった場合に最初にすべきこと は、Linux におけるシリアルポートの設定の 2 つの部分を知ることです。
最初の部分(低レベル設定)は、I/O アドレス、IRQ、名前(ttyS2 など)を割り
当てることです。この I/O と IRQ の組は、ハードウェアとシリアルドライバ
の両方に設定しなければなりません。これを簡単に「IO と IRQ の設定」と呼
ぶことにしましょう。setserial
はドライバを設定するために使います。
PnP の機構やジャンパなどはハードウェアの設定に用います。詳しくは後述し
ます。設定をする必要があるにも関わらず詳しいことが分かっていなければ、
すぐに問題に出会ってしまうでしょう。
2 番目の部分(高レベルの設定)は速度(38.4K ビット/秒など)の設定やフロー
制御の選択などです。これはしばしば PPP や minicom といった通信プログラ
ムや、getty (他の人があなたのマシンにログインできるようにポート上で動
作します)が行います。
しかし、こういったプログラムに対しては、希望する速度等の設定をメニュー
や設定ファイルを使って行う必要があります。この高レベルの設定は、
stty
プログラムによっても行えます。stty
は、問題がある時に現
在の状態を表示する際にも役立ちます。
詳しくは
stty の章をご覧ください。
Linux が起動する時には、いくつかのシリアルポートの検出と(低レベル)設定
が試みられます。正確にどうなるのかは、お使いの BIOS, ハードウェア、
Linux ディストリビューション等によって違います。シリアルポートがうまく
動作しているならば、何もする必要はありません。アプリケーションプログラム
はたいてい高レベルの設定を行ってくれますが、必要な情報を与えてやる必要
があるかもしれません。プラグ&プレイのシリアルポート(内蔵モデムに組
み込まれることが多いです)では、事情はずっと複雑になります。低レベルの
設定(IRQ と I/O アドレスの設定)が必要となる場合を以下に示します:
バージョン 2.2 以降のカーネルでは、割り込みの共有を使えば低レベルの設 定を行わなくても 3 つ以上のシリアルポートを使うことができます。ただし、 これが動作するのはシリアルポートのハードウェアが割り込みの共有に対応し ている場合だけですし、その設定もシリアルポートの低レベルの設定より簡単 とは言えません。 2.2 以降のカーネルと割り込みの共有 をご覧ください。
低レベルの設定(IRQ と I/O アドレスの設定)は、(高レベルの設定と比べると) 比較的問題を起こしやすいようです。多くの場合は完全に自動で、何も設定す ることがないのにです。そこで、この章の大部分はその話題を扱います。 シリアルドライバが正しい IRQ と I/O アドレスを知るまでは、ポートは全く 動作しません。Linux では検出さえされないでしょう。検出されたとしても、 IRQ が間違っていれば、動作は極めて遅いかもしれません。 この上なく遅い: テキストがすごく遅れてゆっくり画面に表示されます を見てください。
Wintel の世界では、I/O アドレスと IRQ は「リソース」と呼ばれます。した がって、我々は特定のリソースを設定していることになります。 しかし、他の種類の「リソース」がたくさんあるので、この言葉は他に色々な 意味を持つことになります。復習になりますが、低レベルの設定は 2 つの値 (IRQ 番号と I/O )アドレスを 2 つの場所に設定することです:
setserial
" を実行し
て設定します)起動(= ブート時)メッセージを見てください。これは通常は正しいです。しか し問題が起きている場合には、これらのメッセージの一部がハードウェアの正 しい設定を示していない(そして正しくないと思われる)可能性が高いです。 I/O アドレスと IRQ: 起動時のメッセージ を ご覧ください。
多くの人がやってしまう一般的な間違いを示します:
多くの場合、ポートの低レベルの設定は起動時に自動的に行われます(し
かし常に正しいとは限りません)。何が起きているか調べるには、画面上の起
動メッセージを見ましょう。Linux がロードされる前に BIOS が出すメッセー
ジ(例は挙げません)の確認も怠らないでください。このような BIOS の
メッセージの出力は Pause キーを押すと一時的に止めることができます。
スクロールして流れてしまったメッセージを戻して見るには、Shift-PageUp
キーを使います。Shift-PageDown キーを押すと反対向きにスクロールします。
dmesg
コマンドを
使えばいつでも起動メッセージの一部を見ることができますが、大事な部分が
抜け落ちていることもよくあります。起動メッセージ(1999 半ばの時点)の例
を以下に示します: ttyS00 は /dev/ttyS0 と同じである点に注意してくださ
い。
検出されたものが最初に表示されます(ただし IRQ は大雑把に推定したものに
過ぎません):
Serial driver version 4.27 with no serial options enabled
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A
ttyS02 at 0x03e8 (irq = 4) is a 16550A
保存された値が後で表示されますが、これも正しいとは限りません:
Loading the saved-state of the serial devices...
/dev/ttyS0 at 0x03f8 (irq = 4) is a 16550A
/dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A
/dev/ttyS2 at 0x03e8 (irq = 5) is a 16550A
ちょっとした不一致がある点に注意してください。最初のメッセージでは IRQ=4 に ttyS2 があるように表示されていますが、二番目のメッセージでは IRQ=5 になっています。最初のメッセージしか表示されないかもしれません。 ほとんどの場合は最後に表示されるものが正しいメッセージです。しかし問題 がある場合には紛らわしいかもしれません。この章の残りに書かれているこの 難しいことの説明を読む前には、とりあえずシリアルポートを使ってみて、正 しく動作するかどうかを調べるとよいでしょう。ちゃんと動作しているならば、 この先は特に読まなくてもかまいません。
2 番目のメッセージは、起動時に実行される setserial
プログラムが出
力します。このメッセージは、デバイスドライバが正しいと思っている設定を
示します。しかし、これも間違っていることがあります。例えば、ハードウェ
アの IRQ が実際には IRQ=8 に設定されていることもあります(どちらのメッ
セージも間違っている)。IRQ=5 が表示されるのは、誰かが間違ってその情報
を設定ファイルに入れたため(あるいはこれと同様の理由)かもしれません。
Linux が時々
間違った IRQ を取得するのは、Linux が IRQ の探査を行わないからです。
Linux は単に「標準」の IRQ を仮定するか(最初のメッセージ)、ユーザが行っ
た設定をそのまま使います(2番目のメッセージ)。この両者はいずれも、正し
いとは限りません。シリアルドライバの IRQ が間違っていると、シリアルポー
トの動作が非常に遅くなったり、まったく動作していないように見えたりしま
す。
最初のメッセージは、Linux がシリアルポートの探査を行った結果ですが、
IRQ の探査は行われていません。ポートがここに現われた場合、そのポートは
存在しますが、IRQ は間違っていることがあります。Linux は IRQ のチェック
は行いません。なぜなら、チェックをしても安全対策にならないからです。
Linux は IRQ が先に示した値であることを仮定します。なぜなら、これらが
「標準的」な値だからです。setserial
に autoconfig
オプション
や auto_irq
オプションを付けて実行すると手動で確認を行えますが、
これで正しいことを保証できるわけではありません。
BIOS のメッセージに表示されるデータ(最初に表示される)はハードウェアに
設定されている値です。シリアルポートがプラグ&プレイならば、
isapnp
を実行してこれらの設定を変えることができます。Linux が起動
した後に、これに関するメッセージを探しましょう。先の例に挙げられている、
最後のシリアルポートのメッセージは、BIOS のメッセージと一致していなけ
ればなりません。一致しない場合には、ポートのハードウェアの設定を変更す
るか、ハードウェアに実際に設定されている内容をsetserial を使ってドライ
バに教えなくてはなりません。
また、プラグ&プレイのシリアルポートをお使いの場合には、プラグ& プレイのソフトウェアがハードウェア内部の IRQ と I/O を設定しなければ、 Linux はこれらを検出しません。これは、物理的に存在するシリアルポートが 起動メッセージで表示されない一般的な理由です。PC のハードウェア(PnP BIOS) はこのようなシリアルポートの低レベルな設定を自動的に行います。PnP の設 定は後で説明します。
前の節では、起動メッセージをみることにより設定を調べる方法を説明し ました。起動メッセージで十分な情報が得られれば、この節を読む必要はあり ません。情報が十分でなければ、これを調べる方法がいくつかあります。
「I/O と IRQ の設定はどうなっているの?」という問いへの答えは実際には 2 通りあります。1. デバイスドライバに設定されている値(これは普通は setserial コマンドで設定と表示を行います)。 2. 実際にハードウェアに設定されてい る値。両者は同じ値でなければなりません。同じ値でなければ問題が起こりま す。なぜなら、ドライバが物理的なシリアルポートに関して間違った情報を持 つことになるからです。間違った I/O アドレスがドライバに設定されている と、ドライバは存在しないポートにデータを送ろうとします。あるいはもっと 悪いケースとしては、シリアルポートでない実在のポートにデータを送ろうと します。間違った IRQ がドライバに設定されていると、 ドライバがシリアルポートからの割り込みサービス要求を受け取れずに、非常 に遅かったり全く応答しなかったりします。この場合は、 この上なく遅い: テキストがすごく遅れてゆっくり画面に表示されます の節をご覧ください。ドライバに設定されている UART のモデルが間違ってい る場合にも問題が起こりがちです。I/O-IRQ の組がドライバとハードウェアで同じ かどうかを確かめるには、これらの値がどのように設定されているのかを ドライバとハードウェアの両方について調べなければなりません。
これを調べるのは簡単です。単に起動メッセージを見るか、 "setserial -g /dev/ttyS*" を実行するだけです。シリアルポートがうまく動 作していれば、この表示内容がハードウェアにも設定されているでしょう。こ の情報を調べる別の方法としては、/proc ディレクトリにある「ファイル」を 見る方法があります。このような別の方法を説明する重要な理由は、 これらはデバイスドライバに設定されている情報しか表示しないことに注意し てもらうためです。一部の人は、/proc ディレクトリにある特定のファイルを 見て、これがハードウェアに設定されていると勘違いしてしまいますが、 「必ずしもそうではありません」。
/proc/ioports は、ドライバが使っている I/O アドレスを表示します。 /proc/interrupt は、現在動作している(デバイスをオープンした)プロセスの ドライバが使っている IRQ を表示します。上記のいずれの場合も、表示され るのはドライバの設定内容であり、ハードウェアの実際の設定内容では必ずし もありません。/proc/interrupt は、それぞれのデバイスに対して割り込みが いくつ発行されたのかも表示します(数千個のこともよくあります)。この情報 から問題解決の手がかりをつかむことができます。なぜなら、大量の割り込み が発行されていれば、その割り込みを使っているハードウェアがどこかにある ということだからです。割り込みが少ししか表示されないことは時に、その割 り込みが実際にはどのシリアルポートによっても物理的に生成されていないこ とを意味します。したがって、使おうとしているシリアルポートに対してほと んど割り込みが発行されていなければ、ハードウェアには割り込みが設定され ていないかもしれず、つまりドライバが間違った割り込みを使っているという ことかもしれません。現在実行中の("minicom" のような)プログラムをチェッ クするために /proc/interruputs を見るには、このファイルを見ている間は ずっとプログラムを実行し続ける必要があります。これを行うには、プログラ ムを終了せずにシェルに行ってみましょう。
デバイスのハードウェアに実際にどの I/O アドレスと IRQ が設定されて いるのかを調べるにはどうすればいいのでしょうか? Linux が起動を始める前 に、多分 BIOS のメッセージがある程度の情報を教えてくれるでしょう。 Shift-PageUp キーを使って起動メッセージの表示を戻し、BIOS が出した一番 最初のメッセージを見ましょう。これは Linux が起動する前の設定です。 setserial はこの設定を変えることはできませんが、isapnp や pciutils は 設定を変えることができます。
大雑把な方法の一つとして、"autoconfig" オプションを付けて setserial に 検出を行わせてみる方法があります。この方法では、検出を行うアドレスを推定 する必要があります。 setserial とは何か? を見てください。PCI シリアルポートの場合には、"lspci" コマンドを使って ください(2.2 より前のカーネルの場合は/proc/pci を見てください)。 お使いのシリアルポートがプラグ&プレイならば、以下の 2 つの節を見て ください。
ジャンパで設定したポートの場合は、これはジャンパで設定した内容です。ポー トがプラグ&プレイ(PnP)ではないけれど DOS プログラムを使って設定さ れている場合には、そのプログラムを実行した人が設定したように設定されて います。
PnP シリアルポートは、電源が切られた時に設定をハードウェアに保存し
ません。これは、電源を切っても設定が変わらないジャンパ(非 PnP)と対照的
です。ISA PnP シリアルポートをお使いであれば、シリアルポートが全く I/O
アドレスや IRQ を持たず、事実上使えない状態になる可能性があります。こ
の場合でもまだ、pnpdump
を使ってそのシリアルポートを見つけること
が可能なはずです。
ISA バスでのプラグ&プレイの場合、pnpdump
(isapnptools
に
含まれています)を試すとよいでしょう。--dumpregs オプションを使うと、ポー
トに設定されている実際の I/O アドレスと IRQ が表示されるはずです。
pnpdump
が「試した」アドレスはデバイスの I/O アドレスではなく、特
殊なものです。
PnP ポートを調べるに当たっては、DOS/Windows での設定内容はあまり役に立 ちません。Windows は設定情報をレジストリに保存しますが、これは Linux では使われません。これは何らかの情報付きで BIOS の不揮発性メモリに設定 されることもありますが、レジストリ内にある Windows の現在の設定とは同 期が取れていないことがあります(??)。Linux の起動時に PnP BIOS に自動設 定をさせているのならば(そして Linux を起動する際には、PnP オペレーティ ングシステムでないと BIOS を設定しているならば)、Linux は BIOS の不揮 発性メモリ内の設定を使うはずです。
OS か PnP BIOS が全てのデバイスを設定するという本物のプラグ&プ レイ設定を行っているならば、IRQ を選ぶことはありません。PnP は最も良い と思われる割り当てを選んでこれを設定します。しかし、Linux でプラグ &プレイ用のツール(isapnp と pcitools)を使っている場合には、IRQ の 選択を行う必要があります。使いたい IRQ を既に知っている場合には、この 節を飛ばしてもかまいませんが、IRQ 0 の使い方が特殊であることだけは知っ ておいてください(次の段落を読んでください)。
IRQ 0 は実際には(ハードウェアでは)タイマですが、setserial を使った シリアルポートの設定においては特殊な意味を持っています。この指定は、 そのポートには割り込みがないことをドライバに伝え、ドライバはポーリング を使った動作を行います。ポーリングは非常に効率が悪いのですが、割り込み が衝突した場合や、割り込みの設定ミスがあった場合には試すとよいでしょう。 IRQ 0 を設定する利点は、ハードウェアに設定されている割り込み番号を知る 必要がない点です。IRQ 0 は、実際に使える割り込みが見つかるまでの急場を しのぐためだけに使うべきです。
一般的な規則では、全てのデバイスが固有の IRQ を持ち、IRQ の共有を 行わないことになっています。しかし大抵のマルチポートを使う場合のように、 IRQ の共有が許されている場合もあります。ただし、共有が許されているとし ても、効率は良くないかもしれません。というのも、共有されている割り込み が与えられる度に、どこで割り込みが発行されたのかを調べなければならない からです。したがって、可能であれば、全てのデバイスに固有の割り込みを与 えるといいでしょう。
バージョン 2.2 より前のカーネルでは、IRQ はほとんどのマルチポートボー ド同士だけでしか共有できませんでした。バージョン 2.2 のカーネル以降は、 場合によっては全てのシリアルポートで IRQ を共有できます。バージョン 2.2 のカーネルで共有を動作させるには、CONFIG_SERIAL_SHARE_IRQ を設定し てカーネルをコンパイルしなければなりません。また、シリアルポートのハー ドウェアも共有に対応していなければなりません(したがって、2 つのシリア ルカードが 1 つの割り込み線に異なる電圧を流しても、「これが割り込みで す」という意味の電圧しか受け取られません)。よってバージョン 2.2 のカー ネルであっても、割り込みの共有はしない方が良いかもしれません。
シリアルポートのハードウェアには、限られた IRQ しか設定できないこ
とがよくあります。しかし IRQ が衝突するも嫌でしょう。したがって、選択
の余地はあまりありません。PC では普通、ttyS0
と ttyS2
が
IRQ4 に、ttyS1
と ttyS3
が IRQ にあります。
/proc/interrupts
を見れば、現在動作中のプログラムがどの IRQ
を使っているのかがわかります。このような IRQ は使わない方がいいでしょ
う。昔は IRQ 5 はサウンドカードが使っていましたが、シリアルポート
でもよく使われていました。
以下に、Greg (Serial-HOWTO の元々の著者)がどのように /etc/rc.d/rc.serial を設定しているかを示します。rc.serial は起動時に実 行されるファイル(シェルスクリプト)です(場所や名前は違うことがあります)。 バージョン 2.15 より後の "setserial" では、必ずしもこのように設定が行 われるわけではありませんが、これは IRQ の選択の例にもなります。
/sbin/setserial /dev/ttyS0 irq 3 # シリアルマウス
/sbin/setserial /dev/ttyS1 irq 4 # Wyse 製のダム端末
/sbin/setserial /dev/ttyS2 irq 5 # Zoom 製のモデム
/sbin/setserial /dev/ttyS3 irq 9 # US Robotics 製のモデム
標準の IRQ 割り当てを示します:
IRQ 0 タイマチャネル 0 (「割り込み無し」を意味することもあります。詳しくは後述します) IRQ 1 キーボード IRQ 2 コントローラ 2 へのカスケード IRQ 3 シリアルポート 2 IRQ 4 シリアルポート 1 IRQ 5 パラレルポート 2, サウンドカード IRQ 6 フロッピーディスク IRQ 7 パラレルポート 1 IRQ 8 リアルタイムクロック IRQ 9 IRQ2 にリダイレクト IRQ 10 割り当て無し IRQ 11 割り当て無し IRQ 12 割り当て無し IRQ 13 数値コプロセッサ IRQ 14 ハードディスクコントローラ 1 IRQ 15 ハードディスクコントローラ 2
割り込みを選ぶための決定的な方法はありません。割り込みをマザーボードや、 他のボードが使っていないことを確かめるしかありません。2, 3, 4, 5, 7, 10, 11, 12, 15 を選ぶことができます。IRQ 2 と 9 は同じであることに注意 してください。IRQ 2 と 9 のどちらを使っても、シリアルドライバはこれを うまく認識します。非常に古いシリアルボードをお使いの場合には、8 以上の IRQ は使えないかもしれません。
IRQ 1, 6, 8, 13, 14 は使わないでください! これらの IRQ はマザーボー
ドが使うからです。マザーボードが使っている IRQ を取り上げると、とても
悲しいことになります。設定が終わったら、割り込みを使うプログラムを実行
する時に /proc/interrupts
を再確認し、IRQ の衝突が起こってい
ないことを確かめてください。
IBM 8514 ビデオカード(とその類似品)の I/O アドレスは、聞くところで
は 0x?2e8 です(? は 2, 4, 8, 9 のいずれか)。16 進値の先頭の 0 である桁
をシリアルポートが無視する場合には(多くの場合はそうです)、これは
0x02e8 にある ttyS3
と衝突するかもしれません(しかし、シリアルポー
トがうまく設計されていれば衝突しないはずです)。このアドレスで
ttyS3
を使おうとしている場合には、これは悪い知らせです。
ほとんどの場合は、可能であればデフォルトのアドレスを使うべきです。ここ で言うアドレスは、8 バイトの範囲の最初のアドレスを表しています。例えば、 3f8 は実際には 3f8-3ff の範囲です。それぞれのシリアルデバイスは(I/O ア ドレスを必要とする他のタイプのデバイスと同じく)固有のアドレス範囲を必 要とします。これは重なっては(衝突しては)いけません。シリアルポートのデ フォルトのアドレスを以下に示します:
ttyS0 のアドレス 0x3f8
ttyS1 のアドレス 0x2f8
ttyS2 のアドレス 0x3e8
ttyS3 のアドレス 0x2e8
これをハードウェアに設定した後には、setserial
を使ってドライバ
も設定することを忘れないでください。非 PnP のシリアルポートの場合には、
ポートのハードウェアの設定はジャンパか、("ジャンパレス"の場合には)設定
を行うための DOS プログラムの実行によって行います(このプログラムで PnP
が無効になるかもしれません)。PnP シリアルポートを設定する際に考えられ
る方法のリストを以下に示します:
isapnp
を用いるI/O アドレスと IRQ は電源を入れる度に(PnP を使って)シリアルポートのレ ジスタに設定しなければなりません。というのも、PnP ハードウェアは電源が 切られた時の設定内容を覚えていないからです。これを行う簡単な方法は、 PnP OS を使っておらず、起動する度に BIOS が自動的に設定を行うことを PnP BIOS に教えてやることです。(PnP OS である)Windows が PnP OS でない と BIOS に設定して Windows を起動すると、問題が起こることがあります。 詳しくは Plug-and-Play-HOWTO をご覧ください。
プラグ&プレイは IO と IRQ の設定を自動化するために設計されました。
しかし現時点の Linux では、話をややこしくしているだけです。標準の
Linux カーネルはプラグ&プレイをあまりうまくサポートしていません。
Linux カーネルをプラグ&プレイ OS にするパッチを使っているならば、
上記のことは全て OS が自動的に処理できるはずです。しかし、これを使って
シリアルポート以外のデバイスの設定を自動化しようとしても、手動でドライ
バの設定をしなければなりません。というのも、Linux のドライバは PnP 対
応の Linux 向けに書かれていないからです。isapnptools
や BIOS を使っ
てプラグ&プレイの設定を行っているならば、これは 2 つの値をモデムカー
ドのシリアルポート部分のレジスタに設定するだけであり、setserial の設定
はユーザが行う必要があります。1999 年初めの時点では、これらの設定は簡
単でもありませんし、詳しい文書にもされてもいません。
Plug-and-Play-HOWTO と isapnptools FAQ をご覧ください。
PnP OS や isapnp を使って IO と IRQ の設定を行う方法の説明がそれら のソフトウェアに付いてくるにもかかわらず、PnP BIOS にそういった設定を させようと思っていたらそれは間違いです。全ての PnP BIOS がこれを行える わけではありません。BIOS には普通、最初の 2 つのシリアルポートを設定す るための CMOS メニューがあります。このメニューは見つけにくいかもしれま せんが、Award 製の BIOS ならば "chipset features setup" の下にあります。 多くの場合、ここではほとんど何も選べません。他のものがメニューになけれ ば、最初の 2 つのシリアルポートには標準の I/O アドレスと IRQ が設定さ れます。 シリアルポートデバイスの名前と番号を ご覧ください。
好むと好まざるとに関わらず、PC を起動すると PnP BIOS が PnP によるハー ドウェアデバイスの(I/O と IRQ の)設定を始めます。PnP BIOS が行う処理 が不十分で、残りの設定が(読者の皆さんがおそらく持っていない) PnP OS に 残されるかもしれません。あるいは PnP OS を持っていないと設定されている 場合には、全ての PnP デバイスを完全に設定するかもしれませんが、デバイ スドライバの設定は行いません。これは読者の皆さんが望む動作ですが、PnP BIOS が行った設定を正確に調べることは必ずしも容易ではありません。
PnP OS を持っていないことを BIOS に設定してあれば、PnP BIOS は最初の 2 つだけでなく全ての PnP シリアルポートの設定を行うはずです。 BIOS の動作を間接的に制御する方法は(もし MS Windows9x を同じ PC で使っ ていれば)、Windows における設定を「強制」することです。 Plug-and-Play-HOWTO を「forced」で検索してください。Windows 上で「強制」 した設定を CMOS BIOS メニューを使って上書きするのは簡単です。 この「上書き」機能の設定・解除が行える BIOS オプションがあると思います。
新しい PnP デバイスが追加されると、BIOS は PnP 設定を変更して調整を行 わなければなりません。衝突を避ける必要が生じれば、既存のデバイスの I/O と IRQ の設定が変わることもあります。この目的のため、非 PnP デバイスの I/O と IRQ をどのように設定しているのかを BIOS に教えてあれば、BIOS は 非 PnP デバイスのリストを保存しています。これを BIOS に教える方法の一 つは、DOS/Windows 上で ICU と呼ばれるプログラムを実行することです。
しかし、この情報でデバイスドライバを設定するために、BIOS が行った設定 を調べるにはどうすればよいでしょうか? BIOS 自身もある程度の情報を出し ます。これは設定メニューや、コンピュータの起動時に画面に現われるメッ セージを通じて得られます。 シリアルポートのハードウェアの設定は? をご覧ください。
ハードウェアの IRQ と I/O アドレスを一度設定すれば(あるいは PnP で 割り当てられるようにすれば)、Linux が起動される度に "setserial" コマン ドが実行されるようにする必要があります。 起動時の設定の節をご覧ください。
原則としては、アプリケーションプログラムが設定の大部分(あるいは全
て)を行います。これを行うコマンドは stty
です。
stty をご覧ください。
解説が フロー制御にあるので、そちら もご覧ください。普通は Xon/Xoff を使ったソフトウェアフロー制御よりもハー ドウェアフロー制御を使う方がいいでしょう。完全なハードウェアフロー制御 を用いるには普通、シリアルポートとデバイスを接続するケーブル内にフロー 制御用の線が 2 本必要です。デバイスがカード上にあるならば、確実にハー ドウェアフロー制御が使えるはずです。
多くのアプリケーション(と getty プログラム)には、フロー制御に関するオ プションがあり、必要に応じて設定できます。デフォルトでハードウェアフロー 制御を設定することもできます。IRQ と I/O アドレスのように、フロー制御 もシリアルドライバとシリアルポートに接続されているハードウェアの両方に 設定しなければなりません。ハードウェアにどのように設定するのかは、ハー ドウェア依存です。多くの場合は、PC からシリアルポート経由でハードウェ アデバイスに送る特定の「初期化文字列」があります。モデムの場合は、通信 プログラムは両方の設定を行うはずです。
お使いのプログラムがシリアルドライバのフロー制御を設定しない場合には、
stty
コマンドを使って自分自身で設定することができます。ドライバは
Linux が停止した時の設定を覚えていないので、起動時やログイン時に実行さ
れるファイル(bash の場合には /etc/profile など)に stty コマンドを入れ
ておくとよいでしょう。以下にポート ttyS2 でハードウェアフロー制御を行
うために追加する内容を示します:
stty crtscts < /dev/ttyS2
stty のバージョンが 1.17 以上の場合は:
stty -F /dev/ttyS2 crtscts
crtscts
は、シリアルポートの RTS と CTS ピンを使ってハードウェア
フロー制御を行う設定の指定を表します。前の文の大文字を
crtscts
と綴ります。