次のページ 前のページ 目次へ

9. 知っていると良いおもしろいプログラム

9.1 setserial とは何か?

はじめに

決してノート PC (PCMCIA) で setserial を使ってはいけません。 ハードウェアでシリアルポートの I/O アドレスおよび割込み (IRQ) がどの番 号に設定してあるのか、あるいは UART の型名などを、setserial を使っ てデバイスドライバに伝えることができます。また、現在のドライバの設定を 表示することもできます。更に、(特定のオプションを使えば)ハードウェアを 自動検出することもできます。

ひとつかふたつのシリアルポートしかないのなら、setserial を使わなくても たいてい正しく設定できます。そうでなければ(あるいはシリアルポートに何 か問題があったなら)、setserial を使う必要があるでしょう。 setserial のマニュアル以外にも、/usr/doc/setserial.../ などにある情報を調べてください。使用中の Linux のディストリビューショ ンがどのように setserial を扱っているのかわかるでしょう。

起動時にシェルスクリプトが setserial を自動的に動かすこともありま す。シリアルドライバモジュールが読み込まれている場合にのみ、setserial が動作するでしょう。何らかの理由により後でシリアルドライバモジュールを 外したなら、setserial で事前に行った変更は (/etc/serial.conf を除き)カーネルが消してしまいます。従って、 設定を回復させるために setserial を再び動かさなければいけません。 起動シェルスクリプトから動かすことに加えて、シリアルドライバモジュール が読み込まれた際には、setserial と類似した何らかのプログラムが動 きます。従って、画面上の起動時のメッセージを見ていると、setserial が 2 回動いたように見えるでしょうし、実際に動いたのです。

適切なオプションを使えば、setserial は(与えた I/O アドレスで) シ リアルポートを検出できますが、その I/O アドレスを推測しなければなりま せん。例えば /dev/ttyS2 を検出させたいなら、setserial が推測 した ttyS2 のアドレスでしか検出できないでしょう。もし setserial に ttyS2 が異なるアドレスにあることを伝えたなら、そのアドレスで検 出するでしょう。 検出 をご覧ください。

setserial はシリアルポートのハードウェアに IRQ も I/O アドレスも設定し ません。その値はジャンパあるいはプラグ&プレイでハードウェアに設定 されます。ハードウェアに設定したものと同一の値を setserial に伝えなけ ればなりません。あなたが使いやすいと思った数値を捏造したり、その数値を setserial に伝えることだけはやめてください。I/O アドレスを知っていて IRQ を知らない場合には、IRQ を見つけるために setserial を試してみるの も良いでしょう。

(通常トラブル解決の際に使用する、冗長出力の -v といった1 文字のオプショ ンを除き)引数なしで setserial とだけタイプすると、使えるコマンド の一覧を見れます。setserial は I/O アドレスを「ポート」と呼ぶことに注 意してください。以下のようにタイプすると、

setserial -g /dev/ttyS*

デバイスドライバがポートをどのように設定したか、若干の情報を見られるで しょう。更に情報を見たければ、``-g''オプションに ``v'' を追 加してください。しかし、ハードウェアの中にこれらの値が実際に設定されて いるかどうかは、このコマンドは教えてくれません。実際、全く嘘の I/O ア ドレスやいかなる IRQ でも、またあなたが手に入れたいどんな UART の型で も、setserial を動かして割り当てることができます。そして次に ``setserial ...'' をタイプしたとき、文句もなしにこの偽物の値を表 示するでしょう。setserial による割当ては PC の電源を切ると失われるので、 Linux が起動する度に、たいていどこかで自動的に setserial を動かします。

検出

シリアルポートのハードウェアを見つけ出すには、まず I/O アドレスを 知らなければなりません(あるいは推測しなければなりません)。またはデバイ スドライバがハードウェアのために setserial で事前に適切に設定した I/O アドレスを知っていなければなりません。物理的なハードウェアを見つけるた めには、setserial-v (verbose : 冗長出力)および autoconfig コマンドを使ってください。出力メッセージが UART の型名 を 16550A といったように示しているのなら、問題ありません。そうではなく、 UART の型名を ``unknown'' と示したなら、その I/O アドレスにはシリ アルポートがないと推定できます。いくつかの安いシリアルポートには自分の 名前を正しく名乗れないものもあるため、``unknown'' と出てもそこ にシリアルポートがある可能性があります。

UART の型名を検出するほかにも、setserial は IRQ を自動検出できますが、 常に正しくは動作しません。setserial のバージョンが 2.15 以上なら、最後 の検出結果を、Linux が次回の起動時に使用する設定ファイル /etc/serial.conf へ格納するでしょう。起動時に setserial を動かすスクリプトは通常ポートを検出しないものの、検出するように変更で きます。次節をご覧ください。

Linux は自動的にシリアルデバイスを設定できますか?

はい、しかし... 使用しているディストリビューションが起動時に既に設 定しているかもしれません。ですが、カスタマイズしたくなるかもしれません。 それは setserial の 2.15 未満を使えば簡単です。起動時に setserial を動 かすファイルへ、数行を追加してください。 古典的な設定手法: スクリプト編集 をご覧ください。例えば、 ttyS3 に関しては、起動時に setserial を動かすファイルへ以下のよう に追加しましょう:

/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig

自動的に初期化したいすべてのシリアルポートに関して、同様にしてください。 コンピュータ上に実際に存在するデバイス名を与えているか、確かめてくださ い。いくつかのケースでは、ハードウェアが原因で正常に動作せず、IRQ ある いは UART のタイプを指定した方が良いかもしれません。例えば、

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test 

(使用中のディストリビューションがこの変更を行っているなら) バージョン 2.15 以上では、起動時に setserial を動かす /etc/init.d/setserial などのファイルをユーザが編集することは 想定していないので、自動検出の設定はもっと難しくなります。以前のバージョ ンにはあったような役立つコメントがなくなっているかもしれません。

起動時の設定

カーネルがシリアルモジュールを読み込むと(あるいは「モジュール」が カーネルに組み込まれていると)、ttyS{0-3} のみを自動的に検出し、 (ハードウェアが実際にどう設定されているかに関わらず) ドライバは IRQ を 4 そして 3 に設定します。あなたはこれを、あたかも setserial の起 動メッセージだと考えてしまいす。もし、3 つ以上のポートを使うなら、この シリアルモジュールによる自動設定は IRQ の衝突を引き起こします。

setserial に本当の IRQ を伝えて、このような衝突(あるいは他の理由による 衝突) を解決できるような、setserial を再び動かすスクリプトがある かもしれません。この現象は他のプロセスがシリアルポートを使用する前の、 起動時の初期に発生します。実際、起動時の初期化スクリプトが自動的に setserial プログラムを動かすので、ディストリビューションが既にこの設定 を行っているでしょう。この現象をどう扱うのか、 /usr/doc/setserial.../ などに追加情報があります。

/etc/serial.conf を用いた新しい設定手法

バージョン 2.15 (1999年) 以前では、setserial の設定方法は起動時に setserial を動かすシェルスクリプトを手動で編集することでした。 setserial のバージョン 2.15 (1999年) 以降では、シェルスクリプトを 編集せず、設定ファイル /etc/serial.conf から設定情報を得ます。 しかし、serial.conf は通常は編集しません。その代わりに、 setserial をコマンドラインで使用します。

setserial で変更したものは、通常シャットダウンあるいはリブート時に設定 ファイル (serial.conf) へ保存されます。serial.conf の最初の 行で ``###AUTOSAVE###'' などが on になっているときのみ動作します。 もし setserial を試しに使用して正常に動作しなかったなら、その試験 的な設定が誤って保存されないよう、忘れずに設定をやり直してください。 (設定に従って)起動時に setserial を動かすために一般的に使用するファイ ルは、/etc/init.d/setserial (Debian) あるいは /etc/init.d/serial (Redhat) などです。しかし、通常はこのファ イルも編集すべきでありません。

シリアルポートを無効にするには、setserial を用いて ``uart none'' に設定してください。``setserial'' のあとに置く各ポートに対する コマンドラインの 1 行パラメータに、/etc/serial.conf は似てい ます。自動保存を使わないなら、/etc/serial.conf を手で編集する のも良いでしょう。バージョン 2.15 に関しては、Debian は自動保存を有効 にしてシステムをインストールしますが、RedHat 6.0 は /usr/doc/setserial-2.15/rc.serial があるだけで、それを /etc/init.d/ へ移動しなければなりません。

バグ : 1999 年 6 月現在では、次のようなバグおよび問題があります。 ``setserial -G /dev/ttyS?'' (ここで ? = 0, 1, 2, ...) に より表示される setserial のパラメータは ###AUTOSAVE### を用いて保 存できますが、それ以外のパラメータは保存できません。このパラメータはど んな場合でもほとんど使用しないため、このバグはごく少数のユーザにしか影 響を与えません。このことはバグとして報告されていますが、今はもう修正済 みかもしれません。

setserial でセットした現在の設定を、シャットダウンせずに設定ファイル (serial.conf) へ保存するには、シャットダウンの際に通常動作することを行 えば良いのです : シェルスクリプトを動かしてください。 /etc/init.d/{set}serial stop。``stop'' コマンドはシリア ルポートを正常に動作させたまま、現在の設定を保存します。

いくつかのケースでは、古典的な設定手法と新しい手法の双方を使えるように してあるかもしれませんが、起動時にそのうちひとつのみを動かすことが望ま しいです。Debian では ``...pre-2.15'' はすでに旧式だとしています。

古典的な設定手法 : スクリプトの編集

2.15 (1999年) より前は、setserial の設定ファイル /etc/serial.conf がありませんでした。従って、起動時に setserial を動かしているファイルを探す必要があります。そのファイルが存 在しなかったら、それを作らなければなりません。(あるいは起動時の早い時 期に動くファイルへ追加する必要があります。) このようなファイルを現在使 用しているなら、多分 /etc ディレクトリのどこかにあります。し かし、Redhat 6.0 より前ではそのファイルは /usr/doc/setserial/ にあり、使う前に /etc へ移動しなければなりません。こういった ファイルを探すために ``locate'' を使うと良いでしょう。例えば、次 のようにタイプしてください : locate "*serial*"

あなたが探しているものは rc.serial あるいは 0setserial (Debian) という名前です。こういったファイルが提供されているなら、多く のコメントアウトされた例が載っているでしょう。このコメントを外したり変 更することにより、正しく設定できるはずです。setserial の正しいパ ス、そして正しいデバイス名を使用するよう、確かめてください。正常に動作 するかどうか確かめるため、手動でこのファイルを実行してテストできます (スーパーユーザでファイル名をタイプするだけです)。正常に動作させるため にリブートを繰り返すよりも、このようなテストはずっと高速です。もちろん、 コマンドラインからタイプして単独の setserial コマンドをテストする こともできます。

昔は、/etc/rc.d/rc.serial を一般的に使用していました。Debian は /etc/rc.boot/0setserial を使います。かつて、 /etc/rc.d/rc.local を使用していました。しかし、充分に早い段階 で動かないので、これを使うことは良い方法ではありません。rc.local が動く前にシリアルポートを開こうとする他のプロセスが、シリアル通信の失 敗に終わるという報告があります。

割込み (IRQ)

デフォルトでは ttyS0 および ttyS2 は IRQ 4 を共有し、 ttyS1 および ttyS3 は IRQ 3 を共有します。しかし、シリアルの 割込みを共有することは、以下の条件を満たさなければ可能となりません。

[訳注 : 原文は "ttyS0 and ttyS3 share IRQ 3" ですが、誤りでしょう か。]

  1. カーネル 2.2 あるいはそれ以上
  2. IRQ 共有をサポートするようカーネルをコンパイルする
  3. シリアルのハードウェアが共有をサポートしている

割込みの共有とバージョン 2.2 以降のカーネル をご覧ください。シリアルポートが ttyS0ttyS1 の 2 つしか ないなら、存在しないデバイスでは IRQ 共有の競合は発生しないので、問題 はありません。

内蔵モデムを追加した上で ttyS0ttyS1 を残しておいたのなら、 未使用の IRQ を見つけてシリアルポート(およびモデムボード)にその IRQ を 設定し、setserial を用いドライバに対して IRQ を知らせるべきです。サウ ンドカードが IRQ5 を使用していないならば、モデムのために使える IRQ に なるかもしれません。ハードウェアに IRQ を設定するには isapnp, PnP BIOS を用いるか、あるいは Linux を PnP 対応にするパッチを当てる必要がありま す。余っている IRQ の節約を決心するためには、``man setserial'' を タイプし ``IRQ 11'' の記述を探してください。

9.2 isapnp とは何でしょう?

isapnp は内蔵モデムを含む ISA バス上のプラグ&プレイ (PnP) デバイスを設定するプログラムです。isapnp は ``isapnptools'' というパッ ケージに入っています。そして、すべての ISA プラグ&プレイデバイスを 探し、PnP 設定ファイル /etc/isapnp.conf に追加できるフォーマッ トでデバイスの設定を出力する ``pnpdump'' などの、他のプログラムも入っ ています。モデム内部にあるシリアルポートの IO アドレスと IRQ を表示す るために、--dumpregs オプションとともに pnpdump を使うこともある でしょう。コンピュータを起動するごとに isapnp コマンドを動かすために、 isapnp を初期化ファイルに追加し、そして ISA PnP デバイスを設定すること になります。BIOS が PnP をサポートしていなくても、この動作は可能です。

9.3 wvdialconf とは?

wvdialconf はどのシリアルポートにモデムがつながっているかを探 します。そして、wvdial のために、設定プログラムを作ります。wvdial は PPP プロトコルを用いて ISP へ簡単に電話をかけるために用います。しか し、wvdialconf を使うために PPP をインストールする必要はありませ ん。wvdialconf は未使用のモデムを探し出すだけです。また、自動的に「適 切な」初期化文字列を考え出すものの、ときどき間違えます。このコマンドに はオプションがないため簡単に使えますが、初期化文字列(および他のデータ) を納めるファイル名を指定しなければなりません。例えば、次のように : my_config_file_name

9.4 stty とは何でしょう?

stty は setserial に似ていますが、シリアルポートのボーレート および他のパラメータを設定します。``stty -a < /dev/ttyS2'' と タイプすると、ttyS2 の設定を表示するでしょう。設定の大部分は (1970 年代の古い端末でしか使わないような) モデムと一緒には用いる必要の ないものです。通信プログラムはモデムを自動的に正しく設定するでしょう。 しかし、stty はトラブル解決のために場合によっては役に立ちます。

stty は以下の 2 つの項目を設定します :

  1. crtscts によるハードウェアフロー制御
  2. モデムからの DCD 信号 ``clocal'' を無効にする

モデムが DCD 信号を送らず clocal が無効(つまり stty が -clocal を表示 する)ならば、プログラムはシリアルポートを開けません。ポートを開けない と、プログラムはモデムからの DCD 信号を(ときには無駄に)待ち、動かなく なってしまうかもしれません。

minicom を動かすと自動的に clocal を設定するので、何も問題はありません。 しかし、-clocal で回線の設定をしようとすると、Kermit バージョン 6.0.192 は動かなくなりました。-clocal を設定すると DCD 信号がなくなり、 ``stty'' コマンドさえも動かず、表面上は clocal を設定する手段が( minicom を動かすことを除き)なくなります。しかし、minicom は -clocal が 設定してあっても、それを元に戻します。-clocal が設定してある状態から脱 出するひとつの方法は、minicom を使って (DCD 信号を受け取るために) モデ ムへ ``AT&C'' を送ることです。リセットせずに minicom を終了す ると、DCD 信号が残ります。そして、再び stty を使えるようになるでしょう。


次のページ 前のページ 目次へ