dgb
ドライバは
EIA
RS-232C
(
CCITT
V.24)
標準に準拠し、非同期インタフェースを備えた
DigiBoard PC/Xe シリーズと PC/Xi シリーズの
インテリジェントシリアルマルチポートカードをサポートします。
各ラインの入出力は以下のボーレートのどれか一つに設定できます;
50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2400, 4800, 9600,
19200, 38400, 57600, 更に新しいカードのバージョンでは 115200。
ドライバは割り込みを使わず、``ポーリングベース''で動きます。
このことはドライバが DigiBoard カードの生成する割り込みでなく、
クロック割り込みを使用することを意味しており、
カードの状態を 1 秒あたり 25 回チェックします。
この方法は実用的です。なぜなら、
DigiBoard カードは大きな入出力バッファ (ポートあたり 1 KByte 以上) と、
注意の必要なポートを効率良く見つけられるハードウェアを
持っているからです。
このポリシを用いることでみられる問題点は、SLIP や PPP のレスポンスが
遅くなるということだけです。
カーネル設定ファイルの各行には
sio(4)
ドライバのようにポートを記述するのではなく、カードを記述します。
flags
キーワードをカーネル設定ファイルの各
device dgb
行で用いると、インタフェースの結線を変更したり、PC/Xe カードで
8 K メモリウィンドウ互換モード (64K メモリウィンドウ) を使用したり
できます。8K メモリウィンドウを使用すると、入出力バッファが小さくなる
というわけではないことに注意してください。ただ、全てのバッファが
同じメモリアドレスにマップされ、必要に応じて切り替わるというだけの
ことです。
port
値はカードのジャンパで設定された
port
値と同じでなければなりません。
PC/Xi カードでは
iomem
値についても同じことがいえます。この値は、カードのジャンパで
設定されたメモリアドレスと同じでなければなりません。
PC/Xe カードではジャンパをこの目的で使う必要はありません。
実のところ、そのような機能を持ったジャンパは存在しません。
カーネル設定ファイルの
iomem
に使用したいアドレスを書くだけで良いのです。カードは、そのアドレスを
使うようにプログラムされます。
インストールされた DigiBoard はみな、
同じメモリアドレス範囲 (他のカードのためのメモリや物理メモリを除く) を
使用します。大容量メモリ (256K や 512K またおそらく 128K でも) を
持った DigiBoard は最初の 1 メガバイト以外のメモリアドレスにマップ
されなければなりません。
コンピュータが 15 メガバイト以上のメモリを持っていた場合、
最初の 1 メガバイトのアドレス空間以外には、DigiBoard をマップできる
空間は存在しません。
この場合コンピュータの総メモリ量を減らす必要があるかもしれません。
しかし多くのマシンではより良い方法を提供しています。
そうしたマシンでは、BIOS 設定を用いて、16 番目のメガバイト
(アドレス 0xF00000 - 0xFFFFFF) を ``無効'' にすることができます。
この設定により、DigiBoard のアドレス空間をこの ``穴'' に設定することが
できるようになります。
dgb
ドライバによって制御されるシリアルポートは `着呼' と `発呼' のどちらにでも
使用できます。
それぞれのポートに対し、着呼デバイスと発呼デバイスが存在します。
発呼デバイスのマイナ番号には、対応する着呼ポートのものより 128 だけ
大きい番号がついています。
一般的な用途には、着呼デバイスを使います。
着呼デバイスをオープン途中のプロセスは、通常はキャリアを待ち、また
発呼デバイスが活動状態でなくなるまで待ちます。
発呼デバイスを使用することで、着呼デバイスでキャリア待ちしている
プロセスの隙をついてポートを使用することができます。
発呼デバイスをオープンしようとするプロセスはキャリア待ちをしません。
かつ、発呼デバイスをオープンしようとするプロセスは、着呼デバイス上でキャリア待ち
している他のプロセスをより深いスリープ状態にします。これにより、
発呼セッションで両プロセスが衝突することはなくなります。
発呼デバイスを一般的なポートと同じだがキャリア待ちをせずにオー
プンする必要がある、と考えて操作するプログラムがありますが、
そのような発呼デバイスの使い方は誤用であり、全く馬鹿げています。
また
dgb
ドライバは、発呼と着呼それぞれのデータデバイスに対する
初期状態制御デバイスとロック状態制御デバイスをサポートします。
初期状態デバイスのマイナ番号には、対応するデータデバイスより 32 だけ大きい番号が
ついています。
ロック状態デバイスのマイナ番号には、対応するデータデバイスより 64 だけ大きい番号が
ついています。
データデバイスにおける termios の設定は、初めてオープンする際に対応する
初期状態デバイスより複製され、直前にオープンされていたときの状態からは
継承されません。
初期状態デバイスに対して普段通りの方法で
stty(1)
を
使用することで、
あなたの望む設定に適した初期 termios 状態をプログラムできます。
ロック termios の状態は、データデバイスの termios 状態の変更を
不可能にするフラグとして
振舞います。例えば CRTSCTS のようなフラグ変数をロックするには、
ロック状態デバイスで
stty crtscts
を実行します。
速度や特殊文字の設定をロックするには、
ロック状態デバイス上の対応する値を 0 でない値に設定するとよいです。
外部デバイスを正しく結線して正しいプログラムで通信している限りは、
ほぼどのような初期状態であっても、ロックなしで動作します。
そうでない場合は、デフォルトの初期状態を変更し、その状態にロックを掛ける
ことで、うまく動くようになることもあるかもしれません。
特に、(POSIX) 標準でないフラグの初期状態は、
接続されたデバイスに合うように設定すべきであり、
バグのあるプログラムがこれらのフラグを変更しないように、
ロックする必要があるかもしれません。
例えば、常時 RTS/CTS ハンドシェイクをサポートするデバイスでは、CRTSCTS は
オンの状態でロックしておく必要があります。また、全くサポートしないデバイスに
対しては、オフの状態でロックしておくべきです。
CLOCAL は、キャリアをサポートしないデバイスに対してはオンの状態でロックするべきです。
HUPCL は、何らかの理由で切断したくない場合にはオフの状態でロックするべきです。
一般的に、何かが間違った状態でロックすると、とても悪いことが起こります。
また、複数の設定をサポートするデバイスに対してはロックを行なうべきではありません。
着呼ポートでの CLOCAL フラグは、login のある種のセキュリティホールを
避けるためにオフの状態にロックしておくべきですが、着呼ポートを何か他の用途に
使う場合には、この設定を getty で行なうべきです。