カーネル 2.2 のシリアルドライバは PCI バスをサポートしていません。 しかし、カーネル 2.3 と 2.4 では、ついに一部の PCI シリアルボード(およ びモデムボード)に対応します。ほとんどの PCI ボードは、ドライバによる特 殊なサポートが必要です。ドライバはボードにデジタル的に格納されている ID を読み込み、そのボードにどうやって対応するか(あるいはサポートするか どうか)を決めます。確実にソフトウェアモデムではないのに動作しない 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
は、問題があるとき
に現在の状態を表示する役にも立ちます。Serial-HOWTO 中の ``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: 起動時のメッセージ を ご覧ください。
多くの人がやってしまう一般的な間違いを示します:
setserial
コマンド: (autoconfig
オプションを付けずに)
setserial
を実行し、ハードウェアも調べられたと思い込む(実際には調
べられません)setserial
のメッセージ: 起動時に画面に表示されるメッセージ
を見て、ハードウェアが実際に設定された結果だと間違って信じてしまう/proc/interrupt
: シリアルポートが使われていないときは、
その割込みは /proc/interrupts
に現われないが、それを見てシリ
アルポートが見つからない(あるいは割込みが設定されていない)と誤って信じ
てしまう/proc/ioports
: このファイルが(たぶん間違いで)
setserial
と同じデータしか表示していないとき、これがハードウェア設
定を表示すると考えてしまう
多くの場合、ポートの低レベルの設定は起動時に自動的に行われます(し
かし常に正しいとは限りません)。何が起きているか調べるには、画面上の起
動メッセージを見ましょう。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 通りあります。
両者は同じ値でなければなりません。そうなっていないと、ドライバが持って いる物理的なシリアルポートに関する情報が間違っているので、問題を引き起 こします。間違った 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
が IRQ3 にあります。
/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 シリアルポートを設定する際に
考えられる方法のリストを以下に示します:
ttyS0
(Com1) と
ttyS1
(Com2) にある外付けデバイスだけに使います)isapnp
を用いる
I/O アドレスと IRQ は電源を入れる度に(PnP を使って)シリアルポートのレ ジスタに設定しなければなりません。というのも、PnP ハードウェアは電源が 切られたときの設定内容を覚えていないからです。これを行う簡単な方法は、 PnP OS を使っておらず、起動する度に BIOS が自動的に設定を行うことを PnP BIOS に教えてやることです。(PnP OS である)Windows が PnP OS でない と BIOS に設定して Windows を起動すると、問題が起こることがあります。 詳しくは Plug-and-Play-HOWTO をご覧ください。
[訳注 : JF プロジェクトによる日本語訳 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 をご覧ください。
[訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ]
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 オプションがあると思います。
[訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ]
新しい 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'' コマンドを実行する必要があります。 起動 時の設定 をご覧ください。
解説が
フロー制御 にあるので、そち
らもご覧ください。可能ならば常にハードウェアフロー制御を使う方がいいで
しょう。通信プログラムあるいは ``getty
'' にはフロー制御を設定する
オプションがあります(運が良ければ、デフォルトでハードウェアフロー制御
が有効になっているでしょう)。フロー制御は(初期化文字列あるいはデフォル
ト設定により)モデムとシリアルドライバの両方に設定しなければなりません。
(設定が正しければ)通信プログラムは両方の設定を行うはずです。
上記の設定によりハードウェアフロー制御を完全に有効にできない場合、自分 でその設定を行わなければいけません。モデムでは初期化文字列あるいはデフォ ルト設定により、ハードウェアフロー制御設定を行うことを確認してください。 デバイスドライバに設定を伝える必要がある場合、起動時に実行するファイル に書きこむのが良いでしょう。 起動時の設 定 をご覧ください。ハードウェアフロー制御を行いたい(例えば ttyS2 な どの)シリアルポートそれぞれについて、こういったファイルに以下の記述を 追加する必要があります。
stty crtscts < /dev/ttyS2
フロー制御が有効になっているかどうか見たいなら、以下のようにしてくださ
い: minicom (あるいは類似の)ソフトウェアで、モデムの設定を見る際には
AT&V
をタイプし、ハードウェアフロー制御を意味する
&K3
の出力を見てください。デバイスドライバがフロー制御の設定
を知っているかどうか、stty -a < /dev/ttyS2
をタイプし、(ハー
ドウェアフロー制御無効を示すマイナス符号がない) ``crtscts
'' を調
べてください。