|
次のページ
前のページ
目次へ
6. シリアルポートの設定6.1 PCI バスはまだサポートされていませんカーネル 2.2 のシリアルドライバは PCI バスをサポートしていません。 しかし、カーネル 2.3 と 2.4 では、ついに一部の PCI シリアルボード(およ びモデムボード)に対応します。ほとんどの PCI ボードは、ドライバによる特 殊なサポートが必要です。ドライバはボードにデジタル的に格納されている ID を読み込み、そのボードにどうやって対応するか(あるいはサポートするか どうか)を決めます。確実にソフトウェアモデムではないのに動作しない PCI ボードをお持ちであれば、そのボード用のドライバを作る手助けができます。 そのためには、シリアルドライバのメンテナである Theodore (Ted) Y. Ts'o さんに連絡する必要があります。 この際には、`` PCI モデムはあまり標準化されていません。一部のボードは PC との I/O に メインメモリを使います(ISA ボードはこういった場合には I/O アドレス空間 を使います)。一部のボードは、特殊な方法を使わないと IRQ が有効になりま せん。``lspci'' の出力を見れば、ボードがサポートされているかどうかを調 べる役に立つでしょう。細かい話があまり難しくなければ、筆者がこの方法に ついて調べ、この文書の将来のバージョンで説明するかもしれません。 6.2 設定の概要多くの場合、設定は自動的に行われるので、ユーザがすることは何もあり ません。しかし場合によっては設定を行う必要があります(単に設定を確かめ るだけのこともあるでしょう)。こういった場合に最初にすべきことは、Linux におけるシリアルポートの設定の 2 つの部分を知ることです。 最初の部分(低レベル設定)は、I/O アドレス、IRQ、名前 ( 2 番目の部分(高レベルの設定)は速度(38.4K ビット/秒など)の設定やフロー
制御の選択などです。これはときには PPP や minicom といった通信プログラ
ムや、
バージョン 2.2 以降のカーネルでは、割込みの共有を使えば低レベルの設定 を行わなくても 3 つ以上のシリアルポートを使えます。この共有はシリアル ポートのハードウェアが対応している場合にのみ動作しますが、低レベルの設 定より簡単とはいえません。 2.2 以降のカー ネルと割込みの共有 をご覧ください。 低レベルの設定(IRQ と I/O アドレスの設定)は、(高レベルの設定と比べると) 比較的問題を起こしやすいようです。多くの場合は完全に自動で、何も設定す ることがないのにです。そこで、この章の大部分はその話題を扱います。シリ アルドライバが正しい IRQ と I/O アドレスを知るまでは、ポートは全く動作 しないでしょう。Linux では検出さえされないでしょう。検出されたとしても、 IRQ が間違っていれば、動作は極めて遅いかもしれません。 この上なく遅い: テキストがすごく遅れてゆっくり画面に表示されます を見てください。 Wintel の世界では、I/O アドレスと IRQ は「リソース」と呼ばれます。従っ て、我々は特定のリソースを設定していることになります。しかし、「リソー ス」には多くの種類があるので、この単語には他にも色々な意味があります。 復習になりますが、低レベルの設定は 2 つの値(IRQ 番号と I/O )アドレスを 2 つの場所に設定することです:
起動(= ブート時)メッセージを見てください。これは通常は正しいです。しか し問題が起きている場合には、これらのメッセージの一部がハードウェアの正 しい設定を示していない(そして正しくないと思われる)可能性が高いです。 I/O アドレスと IRQ: 起動時のメッセージ を ご覧ください。 6.3 ありふれた間違いで起きた低レベル設定のやり直し多くの人がやってしまう一般的な間違いを示します:
6.4 I/O アドレスと IRQ: 起動時のメッセージ 多くの場合、ポートの低レベルの設定は起動時に自動的に行われます(し
かし常に正しいとは限りません)。何が起きているか調べるには、画面上の起
動メッセージを見ましょう。Linux がロードされる前に BIOS が出すメッセー
ジ(例は挙げません)の確認も怠らないでください。BIOS のメッセージは
Pause キーを押せば一旦止まります。スクロールして流れてしまったメッセー
ジを見るには、Shift-PageUp を使います。Shift-PageDown では下向きにスク
ロールします。
ちょっとした不一致がある点に注意してください。最初のメッセージでは
IRQ=4 に 2 番目のメッセージは、起動時に実行される 最初のメッセージは、Linux がシリアルポートの探査を行った結果ですが、
IRQ を検出できていません。ポートがここに現われた場合、そのポートは存在
しますが、IRQ は間違っていることがあります。Linux は IRQ のチェックは
行いません。なぜなら、チェックをしてもフールプルーフにならないからです。
Linux は IRQ が先に示した値であることを仮定します。なぜなら、これらが
「標準的」な値だからです。 BIOS のメッセージに表示されるデータ(最初に表示される)はハードウェアに
設定されている値です。シリアルポートがプラグ&プレイならば、
また、プラグ&プレイのシリアルポートをお使いの場合には、プラグ& プレイのソフトウェアがハードウェア内部の IRQ と I/O を設定しなければ、 Linux はこれらを検出しません。これは、物理的に存在するシリアルポートが 起動メッセージで表示されない一般的な理由です。PC のハードウェア(PnP BIOS) はこのようなシリアルポートの低レベルな設定を自動的に行います。 PnP の設定は後で説明します。 6.5 シリアルポートの現在の I/O アドレスと IRQ の設定は?前の節では、起動メッセージを見て設定を調べる方法を説明しました。起 動メッセージで十分な情報が得られれば、この節を読む必要はありません。情 報が十分でなければ、これを調べる方法がいくつかあります。 「I/O と IRQ の設定はどうなっているの?」という問への答えは実際には 2 通りあります。
両者は同じ値でなければなりません。そうなっていないと、ドライバが持って いる物理的なシリアルポートに関する情報が間違っているので、問題を引き起 こします。間違った I/O アドレスがドライバに設定されていると、ドライバ は存在しないポートにデータを送ろうとします。あるいはもっと悪いケースと しては、シリアルポートでない実在のポートにデータを送ろうとします。間違っ た IRQ がドライバに設定されていると、ドライバがシリアルポートからの割 込みサービス要求を受け取れずに、シリアルポートのバッファが溢れたり反応 が非常に遅くなる可能性があります。 この上なく遅 い: テキストがすごく遅れてゆっくり画面に表示されます をご覧ください。 ドライバに設定されている UART のモデルが間違っている場合にも問題が起き やすいです。I/O - IRQ の組がドライバとハードウェアで同じかどうかを確か めるには、ドライバとハードウェアの双方がどのように設定されたか確かめる 必要があります。 デバイスドライバの設定は? これを調べるのは簡単です。単に起動メッセージを見るか、
``
シリアルポートのハードウェアの設定は?デバイスのハードウェアに実際にどの I/O アドレスと IRQ が設定されて いるのかを調べるにはどうすればいいのでしょうか? Linux が起動を始める前 に、多分 BIOS のメッセージがある程度の情報を教えてくれるでしょう。 Shift-PageUp キーを使って起動メッセージの表示を戻し、BIOS が出した一番 最初のメッセージを見ましょう。これは Linux が起動する前の設定です。 setserial はこの設定を変えることはできませんが、isapnp や pciutils は 設定を変えることができます。 大雑把な方法の一つとして、`` ジャンパで設定したポートの場合は、これはジャンパで設定した内容です。ポー トがプラグ&プレイ(PnP)ではないけれど DOS プログラムを使って設定さ れている場合には、そのプログラムを実行した人が設定したように設定されて います。 PnP シリアルポートのハードウェアの設定は? PnP シリアルポートは、電源を切ったときに設定をハードウェアに保存し
ません。これは、電源を切っても設定が変わらないジャンパ(非 PnP)と対照的
です。ISA PnP シリアルポートをお使いであれば、シリアルポートが全く I/O
アドレスや IRQ を持たず、事実上使えない状態になる可能性があります。こ
の場合でもまだ、 ISA バスでのプラグ&プレイの場合、 PnP ポートを調べるに当たっては、DOS/Windows での設定内容はあまり役に立 ちません。Windows は設定情報をレジストリに保存しますが、これは Linux では使われません。これは何らかの情報付きで BIOS の不揮発性メモリに設定 されることもありますが、レジストリ内にある Windows の現在の設定とは同 期が取れていないことがあります。Linux の起動時に PnP BIOS に自動設定を させているのならば(そして Linux を起動する際には、PnP オペレーティング システムでないと BIOS を設定しているならば)、Linux は BIOS の不揮発性 メモリ内の設定を使うはずです。 6.6 シリアルの IRQ の選択OS か PnP BIOS が全てのデバイスを設定するという本物のプラグ&プ レイ設定を行っているならば、IRQ を選ぶことはありません。PnP は最も良い と思われる割り当てを選んでこれを設定します。しかし、Linux でプラグ &プレイ用のツール (isapnp と pcitools) を使っている場合には、IRQ の選択を行う必要があります。使いたい IRQ を既に知っている場合には、こ の節を飛ばしてもかまいませんが、IRQ 0 の使い方が特殊であることだけは知っ ておいてください(次の段落を読んでください)。 IRQ 0 は IRQ ではないIRQ 0 は実際には(ハードウェアでは)タイマですが、setserial を使った シリアルポートの設定においては特殊な意味を持っています。この指定は、そ のポートには割込みがないことをドライバに伝え、ドライバはポーリングを使っ た動作を行います。ポーリングは非常に効率が悪いのですが、割込みが衝突し た場合や、割込みの設定ミスがあった場合には試すとよいでしょう。 IRQ 0 を設定する利点は、ハードウェアに設定されている割込み番号を知る必要がな い点です。IRQ 0 は、実際に使える割込みが見つかるまでの急場をしのぐため だけに使うべきです。 割込みの共有とバージョン 2.2 以降のカーネル一般的な規則では、全てのデバイスが固有の IRQ を持ち、IRQ の共有を 行わないことになっています。しかし大抵のマルチポートを使う場合のように、 IRQ の共有が許されている場合もあります。ただし、共有が許されているとし ても、効率は良くないかもしれません。というのも、共有されている割込みが 与えられる度に、どこで割込みが発行されたのかを調べなければならないから です。したがって、可能であれば、全てのデバイスに固有の割込みを与えると いいでしょう。 バージョン 2.2 より前のカーネルでは、IRQ はほとんどのマルチポートボー
ド同士だけでしか共有できませんでした。バージョン 2.2 のカーネル以降は、
場合によっては全てのシリアルポートで IRQ を共有できます。バージョン
2.2 のカーネルで共有を動作させるには、 どの IRQ を選ぶか? シリアルポートのハードウェアには、限られた IRQ しか設定できないこ
とがよくあります。しかし IRQ が衝突するも嫌でしょう。したがって、選択
の余地はあまりありません。PC では普通、 以下に、Greg (Serial-HOWTO の元々の著者)がどのように
標準の 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 を取り上げると、とても悲
しいことになります。設定が終わったら、割込みを使うプログラムを実行す
るときに 6.7 アドレスの選択 --ttyS3 と衝突するビデオボード IBM 8514 ビデオボード(とその類似品)の I/O アドレスは、聞くところで
は ほとんどの場合は、可能であればデフォルトのアドレスを使うべきです。ここ
で言うアドレスは、8 バイトの範囲の最初のアドレスを表しています。例えば、
6.8 I/O と IRQ のハードウェアへの設定 (ほぼ PnP 向け) これをハードウェアに設定した後には、
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 向けに書かれていないからです。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] PnP BIOS を使った I/O アドレスと IRQ の設定 PnP OS や isapnp を使って IO と IRQ の設定を行う方法の説明がそれら
のソフトウェアに付いてくるにもかかわらず、PnP BIOS にそういった設定を
させようと思っていたらそれは間違いです。全ての PnP BIOS がこれを行える
わけではありません。BIOS には普通、最初の 2 つのシリアルポートを設定す
るための CMOS メニューがあります。このメニューは見つけにくいかもしれま
せんが、Award 製の BIOS ならば `` 好むと好まざるとに関わらず、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 自身もある程度の情報を出し ます。これは設定メニューや、コンピュータの起動時に画面に現われるメッセー ジを通じて得られます。 シリアルポートのハー ドウェアの設定は? をご覧ください。 6.9 IRQ と I/O アドレスを setserial に与えるハードウェアの IRQ と I/O アドレスをいったん設定すると(あるいは PnP で割り当てられるようにすると)、Linux を起動する度に ``setserial'' コマンドを実行する必要があります。 起動 時の設定 をご覧ください。 6.10 その他の設定ハードウェアフロー制御 (RTS/CTS) の設定 解説が
フロー制御 にあるので、そち
らもご覧ください。可能ならば常にハードウェアフロー制御を使う方がいいで
しょう。通信プログラムあるいは `` 上記の設定によりハードウェアフロー制御を完全に有効にできない場合、自分 でその設定を行わなければいけません。モデムでは初期化文字列あるいはデフォ ルト設定により、ハードウェアフロー制御設定を行うことを確認してください。 デバイスドライバに設定を伝える必要がある場合、起動時に実行するファイル に書きこむのが良いでしょう。 起動時の設 定 をご覧ください。ハードウェアフロー制御を行いたい(例えば ttyS2 な どの)シリアルポートそれぞれについて、こういったファイルに以下の記述を 追加する必要があります。
フロー制御が有効になっているかどうか見たいなら、以下のようにしてくださ
い: minicom (あるいは類似の)ソフトウェアで、モデムの設定を見る際には
次のページ 前のページ 目次へ |
[ |