スポンサーリンク

SIO(4) FreeBSD/i386 カーネルインタフェースマニュアル 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
L
ock
I
nitial
MMMMMM
inor

解説

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 カードが設置されているよ うな場合はサポートしていません。

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

FreeBSD October 10, 1995 FreeBSD

スポンサーリンク