setserial(8) Linux シリアルポート情報の設定と取得

書式

setserial [ -abqvVWz ] device [ parameter1 [ arg ] ] ...

setserial -g [ -abGv ] device1 ...

説明

setserial は、シリアルポートに関する設定情報を設定または 表示するプログラムです。この情報には、指定されたシリアルポートが 使用している I/O ポートアドレス や IRQ の情報、およびブレークキーを 受信接続通知キー(Secure Attention Key)として使用するかどうかなどの情報 が含まれます。

通常のブート処理中には、COM ポートの 1 〜 4 だけが、以下に示す デフォルトの I/O ポートアドレスと IRQ の値を使って初期化されます。 setserial は、追加されたシリアルポートを初期化したり、1 〜 4 の COM ポートを 標準でない設定にするために使用されます。 setserial は通常、 /etc/rc.local から起動される rc.serial スクリプトに登録しておきます。

引数 device には、設定したり表示したいシリアルポートのデバイスファイルを 指定します。通常、以下のような形式で指定します: /dev/cua[0-3]

パラメータが全く指定されなかった場合、 setserial は、ポートの種類 (例えば、8250, 16450, 16550, 16550A など)、 ハードウェアの I/O ポートアドレス、IRQ 番号、ボーレート、 操作可能なフラグのいくつかの内容を表示します。

-g オプションが指定されると、setserial への引数は全て、表示対象となるデバイス として解釈され、複数のデバイスの設定内容を表示させることができます。

-g オプションを指定しないと、setserial への最初の引数が、設定したり表示 したりするデバイスとして解釈されます。また、その他の引数は、 シリアルデバイスに与えるパラメータとして解釈されます。

ほとんどの場合、シリアルポートのパラメータの設定にはスーパーユーザーの 特権が必要です。しかし、少しだけ一般ユーザが設定できるパラメータがあります。 それらはこの man ページ中で説明します。

オプション

setserial には、以下のオプションを指定することができます:
-a
シリアルデバイスの設定内容を表示するとき、すべての情報を表示します。
-b
シリアルデバイスの設定内容を表示するとき、 ブート時に /etc/rc スクリプトで使用する時に適した形で デバイス情報のサマリを表示します。
-G
シリアルポートの設定情報を、setserial のコマンドラインオプションの形で 表示します。
-q
setserial の出力を抑制します。
-v
詳細モード。 いくつかのステータスが追加出力されます。
-V
setserial のバージョンを出力して終了します。
-W
割り込みの初期化を荒っぽく行い、終了します。 このオプションはバージョン 2.1 以降の Linux カーネルに対しては無効です。
-z
シリアルフラグをセットする前に全てのフラグをゼロクリアします。 これは -G オプションを使ったシリアルフラグの自動保存と関係があります。

パラメータ

シリアルポートに対して、以下のパラメータを設定することができます。

すべての値は、先頭に "0x" があれば 16 進数とみなされます。

port port_number
port パラメータは、先に述べたように I/O ポート番号の設定を行ないます。
irq irq_number
irq パラメータは、先に述べたようにハードウェアの IRQ の設定を行ないます。
uart uart_type
このオプションは、シリアルポートの UART の種類を設定するために使用されます。 指定できるタイプは、 none, 8250, 16450, 16550, 16550A, 16650, 16650V2, 16654, 16750, 16850, 16950, 16954 です。 UART タイプ none は、ポートを使用できないようにします。

内蔵モデムの中には、「1k のバッファを持った 16550A」を備えていると 書かれたものがあります。これは嘘です。実際には 16550A 互換の UART ではなく、(受信時のオーバーランを防ぐために) 1k の受信バッファのついた 16450 互換 UART が付いているのです。 これらには 送信 FIFO がないので、この違いは重要です。 そういう訳で、これらは 16550A UART と互換性がなく、 自動設定処理では 16450 として認識します。もし uart オプションを使ってこれを変更してしまうと、ファイル送信中にデータを 取りこぼすことになるでしょう。 これらの UART は普通他の問題も抱えています。 大抵の場合 skip_test オプションも指定しなくてはいけません。

autoconfig
このパラメータが設定されると、 setserial はカーネルにシリアルポートを自動的に設定するよう要求します。 I/O ポートは、正しく設定しなければいけません。 その後カーネルは UART の種類を決定し、 auto_irq オプションが設定されていれば、IRQ を自動的に設定しようとします。 autoconfig オプションは、 portauto_irqskip_test オプションの後に指定すべきです。
auto_irq
自動設定を行なう際、IRQ を自動決定しようとします。 この機能は、いつも正しい結果をもたらすとは限りません。 ハードウェアの設定によっては、Linux のカーネルはだまされてしまいます。 一般に auto_irq の機能を使うよりも、 irq パラメータを使って、使用される IRQ を明示的に指定した方が信頼性があります。
^auto_irq
自動設定の際、IRQ の自動決定を行ないません。
skip_test
自動設定の際、UART のテストをスキップします。 内蔵モデムの中には、National Semiconductor 互換の UART を持っておらず、 代わりに安い偽物を持っているものがあります。これらの偽物 UART では、 カーネルが設定する前に指定されたアドレスに本当に UART があることを確認するために使用する、ループバック検出モードを 完全にはサポートしていません。 このような内蔵モデムでは、 このオプションを指定して Linux が正しく UART を初期化できるようにしなければなりません。
^skip_test
自動設定の際、UART のテストをスキップしません。
baud_base baud_base
基本となるボーレートを設定します。 ボーレートは、クロック周波数を 16 で割った値です。 通常この値は 115,200 に設定されています。これは UART がサポートできる最も速いボーレートです。
spd_hi
アプリケーションが 38.4 Kbps を要求した場合に、57.6 Kbps を使用します。 このオプションは一般ユーザーでも指定できます。
spd_vhi
アプリケーションが 38.4 Kbps を要求した場合に、115 Kbps を使用します。 このオプションは一般ユーザーでも指定できます。
spd_shi
アプリケーションが 38.4 Kbps を要求した場合に、230 Kbps を使用します。 このオプションは一般ユーザーでも指定できます。
spd_warp
アプリケーションが 38.4 Kbps を要求した場合に、460 Kbps を使用します。 このオプションは一般ユーザーでも指定できます。
spd_cust
アプリケーションが 38.4 Kbps を要求した場合に、スピードを設定するため に特別な除数を使用します。この場合のボーレートは、 baud_base除数 で割った値になります。 このオプションは一般ユーザーでも指定できます。
spd_normal
アプリケーションが 38.4 Kbps を要求した場合に、38.4 Kbps を使用します。 このオプションは一般ユーザーでも指定できます。
divisor divisor
除数を設定します。この除数は、 spd_cust オプションが指定されていて、アプリケーションがシリアルポートに 38.4 Kbps を 設定した場合に使用されます。 このオプションは一般ユーザーでも指定できます。
sak
ブレークキーを受信接続通知キー(Secure Attention Key)に指定します。
^sak
受信接続通知キー(Secure Attention Key)を無効にします。
fourport
ポートを AST Fourport カードとして設定します。
^fourport
AST Forport の設定を行ないません。
close_delay delay
発信デバイスがクローズされたあと、ブロックされた着信デバイスの DTR が 再び立ち上がるまでの間、シリアルライン上の DTR を LOW に維持しておく 時間を指定します。この値の単位は、10ms です。 デフォルトでは、この値は 50、 すなわち 500 ms (0.5 秒)です。
closing_wait delay
シリアルポートを閉じようとするとき、 ポートへデータを送信するためにカーネルが待つ時間を指定します。 この値の単位は 10ms です。 "none" が指定されると、待ち時間は発生しません。 "infinite" が指定されると、バッファリングされたデータが送信し終わるまで 無限に待ち続けます。 デフォルト設定は 3000 (30 秒待つ) です。 通常これは、ほとんどのデバイスに対して適切な値です。 もし長過ぎる待ち時間を設定すると、 未接続のシリアルポートに送信待ちのデータがある状態でクローズされた場合に シリアルポートが長い間ハングアップしてしまうかもしれません。 もし短すぎる待ち時間を設定すると、 送信するべきデータを送信しきれない可能性があります。 もしデバイスがプロッタプリンタのように極めて低速な場合は、 closing_wait の値を大きくする必要があるかもしれません。
session_lockout
複数のセッションで同一の発信ポート(/dev/cuaXX)を使用できないようにします。 つまり、あるプロセスが一旦ポートをオープンすると、そのプロセスが ポートをクローズするまで、別のセッション ID を持つプロセスは、 そのポートをオープンできなくなります。
^session_lockout
複数のセッションで同一の発信ポート(/dev/cuaXX)を使用できるようにします。
pgrp_lockout
複数のプロセスグループで同一の発信ポート(/dev/cuaXX)を使用できないようにします。 つまり、あるプロセスが一旦ポートをオープンすると、 そのプロセスがポートをクローズするまで、 別のプロセスグループのプロセスはそのポートをオープンできなくなります。
^pgrp_lockout
複数のプロセスグループで同一の発信ポート(/dev/cuaXX)を使用できるようにします。
hup_notify
別のプロセスによる発信ラインの使用が終了した(ポートをクローズしたか、 シリアルラインがハングアップした)ことを、着信ラインをオープンしようと しているプロセスに EAGAIN を返すことで通知します。

このパラメータは、例えばシリアルポートの 着信ラインをブロックされている getty 向けに用います。 用いると、getty は再びそのポートをオープンしてブロックする前に、 モデムをリセットできるようになります (そのモデムを発信デバイスとして使用したアプリケーションによって、 ポートの設定が変更されたかもしれませんから)。

^hup_notify
発信デバイスがハングアップしたことを、着信回線をオープンしようと しているプロセスに通知しません。
split_termios
発信デバイスによって使用される termios の設定と、 着信デバイスによって使用される termios の設定とを別々に扱います。
^split_termios
発信ポートと着信ポートの両方で同じ termios 構造体を使用します。 これはデフォルトの設定です。
callout_nohup
指定されたシリアルポートが発信デバイスとしてオープンされた場合、 キャリア検出(CD)信号が落ちても tty をハングアップしません。
^callout_nohup
シリアルポートが発信デバイスとしてオープンされているとき、 tty をハングアップする処理をスキップしません。 もちろん、ハングアップをさせるには termios の HUPCL フラグが有効になっていなければなりません。
low_latency
シリアルデバイスの受信遅延を最小にします。ただし CPU の利用度は増加します (通常はオーバーヘッドを最小限にするために、 受信キャラクタを扱う前に 5-10ms の遅延があります)。 これはデフォルトではオフですが、リアルタイム処理をするアプリケーションの中には このオプションが有効なものがあるかもしれません。
^low_latency
CPU がシリアルキャラクタを処理する効率を最適化します。 ただしキャラクタを処理する前に 5-10ms の遅延が発生します。 これがデフォルトです。

シリアルポートの設定上の注意事項

注意して欲しいのですが、 setserial が行うのは、 指定されたシリアルポートの I/O ポートと IRQ とがどこそこで見つかるはずだ、 という情報を Linux カーネルに教えることだけなのです。 setserial は、実際のシリアルボードが指定された I/O ポートを使用するように、 ハードウェアを設定するわけではありません。 これを行なうには、ジャンパーの設定や、DIP スイッチの切替えによって シリアルボードを物理的に設定する必要があります。

本章では、自分のシリアルポートをどのように設定したいかを決定する 手助けになるポインターを提供します。

標準的な "MS-DOS" のポート割り付けは、次のようになっています:

/dev/ttyS0 (COM1), port 0x3f8, irq 4 /dev/ttyS1 (COM2), port 0x2f8, irq 3 /dev/ttyS2 (COM3), port 0x3e8, irq 4 /dev/ttyS3 (COM4), port 0x2e8, irq 3

AT/ISA バスアーキテクチャーの設計上の制限のため、通常 IRQ は 2 つあるいは それ以上のシリアルポートで共有することはできません。これを行なうと、 両方を同時に使おうとした時に一方あるいは両方のシリアルポートが不安定に なるでしょう。この制約は単一の IRQ を複数のシリアルポートで共有できる ように設計された特殊なマルチポートシリアルカードを使うことで克服する ことができます。Linux でサポートされているマルチポートシリアルカードには、 AST Fourport, Accent Async board, Usenet Serial II board, Bocaboard BB-1004, BB-1008, BB-2016 boards, HUB-6 serial board があります。

別の IRQ を用いるのも困難です (それらは大抵使用されていますから)。 以下の表は、標準的な "MS-DOS" で割り付けられている 使用可能な IRQ の一覧です:

IRQ 3: COM2 IRQ 4: COM1 IRQ 5: LPT2 IRQ 7: LPT1

コンピュータにパラレルポートが一つしかなければ、 IRQ 5 が良い選択であることにほとんどの人が気づくと思います。 その他の選択としては IRQ 2 (別名: IRQ 9) があります。ただしこの IRQ はネットワークカードで使われる ことがあります。また非常に稀ですが、VGA カードが垂直同期信号割り込みのために IRQ 2 を使うように設定されていることがあります。 自分の VGA カードがこのように設定されている場合は、 それを使用しないようにして見てください。 そうすれば、その IRQ を他のカードが使えるようになります。 Linux やその他のほとんどの OS では、 IRQ 2 を垂直同期信号割り込みのために使用する必要はありません。

他に使用できる IRQ が、3, 4, 7 だけですが、これらもおそらく 他のシリアルポートやパラレルポートで使用されているでしょう。 (もしお使いのシリアルカードに 16 bit カードエッジコネクタが付いていて、 より上位の割り込み番号をサポートしているなら、 IRQ 10, 11, 12, 15 も使用できるでしょう。)

AT 互換機では、IRQ 2 は IRQ 9 のように見えます。Linux でも、この流儀に したがって解釈します。

2 (9), 3, 4, 5, 7, 10, 11, 12, 15 以外の IRQ は 他のハードウェアに割り付けられており、普通変更できないので、 使うべきではありません。 「標準的な」割り付けは、次のようになっています。

IRQ 0 Timer channel 0 IRQ 1 Keyboard IRQ 2 Cascade for controller 2 IRQ 3 Serial port 2 IRQ 4 Serial port 1 IRQ 5 Parallel port 2 (Reserved in PS/2) IRQ 6 Floppy diskette IRQ 7 Parallel port 1 IRQ 8 Real-time clock IRQ 9 Redirected to IRQ2 IRQ 10 Reserved IRQ 11 Reserved IRQ 12 Reserved (Auxillary device in PS/2) IRQ 13 Math coprocessor IRQ 14 Hard disk controller IRQ 15 Reserved

マルチポート設定

複数のポートで一つの IRQ を共有するようなタイプの マルチポートシリアルボードには、 作業が必要な待ち状態のポートがあるかどうかを示すために、 ひとつまたは複数のポートを使うものがあります。 使っているマルチポートボードがこのようなポートをサポートしているなら、 これらのポートを使えば、 割り込みがロスト時でもシステムが固まらないようにできます。

これらのポートを設定するためには、 set_multiport パラメータを指定し、その後ろにマルチポートパラメータを指定します。 マルチポートパラメータは、チェックするべき port、 レジスタのどのビットが有効かを指定する mask、 するべき作業がなくなった時にレジスタの有効ビットが 一致しなければならない値を指定する match からなります。

このような port/mask/match の組は 4 つまで指定できます。 一つ目の組は port1, mask1, match1 で指定し、二つ目は port2, mask2, match2 で指定します。以下同様です。 マルチポートのチェックを無効にするためには、 port1 に 0 を指定してください。

現在のマルチポート設定を見るためには、コマンドラインから get_multiport パラメータを指定してください。

以下にいくつかの一般的なシリアルボードのためのマルチポート設定を示します。

AST FourPort port1 0x1BF mask1 0xf match1 0xf Boca BB-1004/8 port1 0x107 mask1 0xff match1 0 Boca BB-2016 port1 0x107 mask1 0xff match1 0 port2 0x147 mask2 0xff match2 0

Hayes ESP 設定

setserial は Hayes ESP シリアルボードのポートを設定することもできます。

ESP ポートを設定するには以下のパラメータを使います。

rx_trigger
受信 FIFO のトリガレベル (バイト単位) です。 大きい値を設定すると割り込み回数が減り、性能が向上します。 しかし、値を大きくしすぎるとデータを失うことになるかもしれません。 有効な値は 1 から 1023 です。
tx_trigger
送信 FIFO のトリガレベル (バイト単位) です。 大きい値を設定すると割り込み回数が減り、性能が向上します。 しかし、値を大きくしすぎると送信効率を落とすことになるかもしれません。 有効な値は 1 から 1023 です。
flow_off
ESP ポートが相手の送信側に対して「フローオフ」を伝える (これ以上データを送信しないように伝える)レベル(バイト単位)です。 有効な値は 1 から 1023 です。 この値は受信トリガレベルとフローオンレベルより大きい値にするべきです。
flow_on
ESP ポートが相手の送信側に対してフローオフを伝えた後に、 「フローオン」を伝える (これ以上データ送信を再開するように伝える)レベル(バイト単位)です。 有効な値は 1 から 1023 です。 この値はフローオフレベルより小さく、受信トリガレベルより大きい値にするべきです。
rx_timeout
最後のキャラクタを受信してから、割り込みを発生させるまでに ESP ポートが待つ時間です。 有効な値は 0 から 255 です。 値が大きすぎると遅延が大きくなり、 値が小さすぎると不必要な割り込みが発生することになります。

警告

警告: シリアルポートが使用する I/O ポートの設定を間違えると、 マシンがハングアップしてしまうかもしれません。

ファイル

/etc/rc.local /etc/rc.serial

著者

setserial のオリジナルバージョンは Rick Sladkey ([email protected]) によって書かれ、 Michael K. Johnson ([email protected]) によって 変更されました。

このバージョンは、1993 年 1 月 1 日 に Theodore Ts'o ([email protected]) によって最初から書き直されたものです。 バグおよび問題点は、彼のみの責任です。