SIO(4)

名称
sio - 高速割り込み駆動非同期シリアル通信インタフェース

書式
標準ポート用 : device sio0 at isa? port "IO_COM1" tty irq 4 device sio1 at isa? port "IO_COM2" tty irq 3 device sio2 at isa? port "IO_COM3" tty irq 5 device sio3 at isa? port "IO_COM4" tty irq 9

AST 互換 4ポートマルチポートカード用 : options "COM_MULTIPORT" device sio4 at isa? port 0x2a0 tty flags 0x701 device sio5 at isa? port 0x2a8 tty flags 0x701 device sio6 at isa? port 0x2b0 tty flags 0x701 device sio7 at isa? port 0x2b8 tty flags 0x701 irq 12

Boca Board 互換 8 ポートマルチポートカード用 : options "COM_MULTIPORT" device sio4 at isa? port 0x100 tty flags 0xb05 ... device sio11 at isa? port 0x138 tty flags 0xb05 irq 12

ヘイズ ESP カード用 : options "COM_ESP" ...

フラグ の意味 :
0x00001
    共有 IRQ
0x00002
    FIFO を無効にする
0x00004
    AST/4 互換の IRQ コントロールレジスタを使用しない
0x00008
    失われた出力割り込みから早く復旧する
0x00010
    デバイスはシステムコンソールになることができる
0x00020
    デバイスは強制的にシステムコンソールとなる
0x00040
    下位層の IO (例えば、リモートカーネルデバッグ) 用にデバイスを予約する
0x0??00
    マスタポートのマイナナンバ
0x20000
    デバイスが 16650A タイプ (拡張 FIFO) のチップを使用すると仮定する

マイナナンバリング :
0bOLIMMMMM
callOut
Lock
Initial
MMMMMMinor

解説
sio ドライバは、NS8250, NS16450, NS16550 そして NS16550A 互換の EIA RS-232C (CCITT V.24) 通信インタフェースをサポートします。NS8250 および NS16450 は 1 文字分のバッファを持っています。NS16550A は 16 文字の FIFO 入力 および出力バッファを持っています。

各ラインの入出力は、以下のボーレートのうちのいずれかに設定できます : 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200。ハードウェアによっては、 ボーレートの選択の幅が狭まるかもしれません。

このドライバは、`マルチポート' カードをサポートしています。 マルチポートカードとは、1 つないし複数のポートのグループを持って いるカードで、そのグループは、グループごとに割り込み要求 (IRQ) ラインを 共有しています。 別々のカードで同じ IRQ を共有することはサポートされていません。 多くの場合、4 ポートで IRQ を 1 つ共有しています。 したがって、 8 ポートのカードでは、4 ポートの組が 2 つあるので、IRQ を 2 つ 使用するものがあります。 カードによっては、最初の 2 つのシリアルポートが、ポートごとに別の IRQ を持つようにできるものがあります (DOS PC 標準に従って)。

カードによっては、各グループについて IRQ コントロールレジスタを 持つものがあります。また、このようなレジスタに関連する特別な 初期化が必要なカードもあります。 AST/4 互換の IRQ コントロールレジスタのみがサポートされています。 カードによっては、各グループに対して IRQ ステータスレジスタを 持っているものがあります。 本ドライバは、まだこうしたレジスタを必要とせず、使用してもいません。 グループに対するコントロールレジスタならびにステータスレジスタを ともかくも使用できるようにするには、そのグループ内のポートの スクラッチレジスタ (レジスタ 7) にマップしなくてはなりません。 こうしたポートは マスタ ポートと呼ばれています。

16550A UART 上の FIFO を無効にするために、 カーネル設定ファイル内の各 device sio 行で、 flags キーワードを使用できます (書式の項を参照)。 ほとんどの場合、FIFO を無効にする必要はありません。

IRQ を共有するグループの一部であるポートはすべて、 flags キーワードを使用 しなくてはなりません。 1 ビットで IRQ の共有を指定し、 もう 1 ビットでポートが AST/4 互換の初期化を 必要としない かどうかを指定します。 グループのマスタポートに対応する デバイスのマイナナンバは、高位バイトのビットフィールドとして 符号化されます。 1 つのグループに属するポート用には、 同一のマスタポートを指定しなくてはなりません。

マスタポートならびに IRQ 共有グループに属さないポート用には irq を指定してやらなくてはなりません。 それ以外のポートに対しては指定してはいけません。

書式の項で、 flags 0x701 とあるのは、8 番目のポート (sio7) が マスタポートであり、 またこのポートは 共有 IRQ ならびに AST/4 互換の IRQ コントロールレジスタを持ったマルチポートカード上にある という意味です。

flags 0xb05 は、12 番目のポート (sio11) が マスタポートであり、 共有 IRQ を持っているが、特に IRQ コントロールレジスタを持たない マルチポートカード上にこのポートがあるという意味です。

どちらのポートがマスタポートとなるかは、カードの種類に依存します。 お手持ちのカードのハードウェア説明書を調べてください。 IRQ ステータスレジスタが使われることは決してなく、 IRQ コントロールレジスタは AST/4 互換のカードでしか使われないこと、 また、コントロール / ステータスレジスタをグループ内の すべてのポートに対してマップするカードがあることから、 グループ内のどのポートでもマスタポートにして良いことがあります。 将来の互換性のために IRQ ステータスレジスタを含んだポートを 選択してください。 また、確実性を持たせるために、もっとも上位の番号のポートを選択して ください。

sio ドライバで制御されるシリアルポート は、「着呼」にも「発呼」にも使うことができます。 各ポートについて、着呼デバイスと発呼デバイスがあります。 発呼デバイスのマイナナンバは、対応する着呼デバイス用のものより 128 だけ大きいものになっています。 着呼デバイスは一般的な用途のものです。着呼デバイスをオープンするプロセスは、 通常キャリアを待ったり、発呼デバイスが使用停止の状態になるのを待ちます。 発呼デバイスは、着呼デバイス上でキャリアを待っているプロセスから ポートを奪うのに使われます。 発呼デバイスをオープンするプロセスはキャリアを待たず、着呼プロセス上で キャリア待ちをしている任意のプロセスをより深い休眠状態にします。 これにより、着呼デバイス上でキャリアを待っているプロセスは 発呼セッションと競合しなくなります。 発呼デバイスは、一般的なポートで動き、かつポートをキャリア待ちをせずに オープンする必要があると仮定された制御プログラムで誤用されていますが、 そのような使い方をするのは全く馬鹿げています。

sio ドライバは、初期状態およびロック状態をコントロールする、 各着呼および発呼 "データ" デバイス用の制御デバイスもサポートします。 初期状態制御デバイスのマイナナンバは、 対応するデータデバイスのマイナナンバよりも 32 だけ大きいものです。 また、ロック状態を制御するデバイスのマイナナンバは、 対応するデータデバイスのマイナナンバよりも 64 だけ大きいものです。 データデバイスの termios の設定は、 初めてオープンした初期状態制御デバイスに対応したものがコピーされます。 過去にオープンしたときのものは継承されません。 termios の初期状態をあなたが望むようにプログラムしたいのであれば、 初期状態制御デバイス上で通常の方法で stty(1) を使用してください。

termios のロック状態は、termios の状態変更を無効にするフラグのような 振舞いをします。 たとえば、CRTSCTS のような flag 変数をロックするには、 ロック制御デバイスで stty crtscts を使用してください。 通信速度やスペシャルキャラクタをロックするには、 ロック状態制御デバイス内の対応する値に 0 以外の値を設定します。

正しく接続された外部デバイスと通信するプログラムは、 誤りがなければほとんどどのような初期状態でもロックせずに動作しますが、 他のセットアップを用いた方がデフォルトの初期状態をいくつか 変更したり、状態をロックしたりするのに便利なことがあります。 特に、接続されたデバイスを適切なものにするためには、 POSIX 標準でないフラグの初期状態を設定すべきです。 また、場合によってはバグのありそうなプログラムが POSIX 標準でない フラグを書き換えてしまわないように初期状態をロックする必要が あるかもしれません。 例えば、CRTSCTS フラグは、 RTS/CTS ハンドシェークをいつでもサポートする デバイスではロックすべきですし、 RTS/CTS ハンドシェークを一切サポートしないデバイスではロックすべきでは ありません。 CLOCAL フラグはキャリアをサポートしないデバイスではロックすべきです。 HUPCL フラグは、何らかの理由でハングアップさせたくないのなら ロックすべきではありません。 一般的に、適切でない状態で何かをロックすると非常に良くないことが 起こります。また、2 つ以上の設定をサポートするデバイスはロック すべきではありません。 着呼ポートの CLOCAL フラグは、logins プログラムがある種の セキュリティホールを作ってしまうのを防ぐために、 ロックしないでおくべきです。 ただし、着呼ポートが他の用途に使用されている場合に、 着呼ポートがロックされないようにするには、getty を用いる必要があります。

関連ファイル
/dev/ttyd?
    着呼ポート用
/dev/ttyid?
/dev/ttyld?
    対応する着呼初期状態制御デバイスおよびロック状態制御デバイス

/dev/cuaa?
    発呼ポート用
/dev/cuaia?
/dev/cuala?
    対応する発呼初期状態制御デバイスおよびロック状態制御デバイス

/etc/rc.serial
    初期状態制御デバイスおよびロック状態制御デバイスの設定例

デバイス番号は、[0-9a-v] という 集合からなっているので、10 ポート以上の場合もサポートできます。

診断

sio%d: silo overflow. 割り込みハンドラ内で問題がありました。

sio%d: interrupt-level buffer overflow. ドライバのボトムハーフでの問題です。

sio%d: tty-level buffer overflow. アプリケーション側での問題です。 与えられたモジュールの処理速度よりも速く入力が到着してしまい、 いくつかデータを失ってしまいました。

関連項目
stty(1), termios(4), tty(4), comcontrol(8)

歴史
sio ドライバは、 HP9000/300 dca(4) ドライバから生まれており、 現在、開発中 です。

バグ
遅いシステムでボーレートを高くしたり、ポートが多すぎたり、 あるいは負荷の高いシステムで crtsct が使えないときには、 データが失われることがあります。 NS16550A のものを使うと、システムの負荷を下げ、データが失われる のを防ぐことができます。

ただの NS16550 を使わないでください。これは初期のチップ実装であり、 機能しない FIFO ハードウェアを搭載しています。

さまざまなシリアルポートの場所を定義する定数値は、 DOS から引き継いだものです。 御覧のとおり、16 進数表記のアドレスを替わりに使用することができますし、 また、分かりやすさから言ってもそうすべきでしょう。

注意として、AST/4 を使用するときには、ディップスイッチを割り込み共有を 使用するようには設定 しないで ください。 AST/4 のような割り込み共有が使用できるのは、 複数の AST/4 カードが同じシステムに設置されているときだけです。 sio ドライバは、ひとつの IRQ に 複数の AST/4 カードが設置されているような場合はサポートしていません。

書式の項の例はかなりベンダに依存したものです。