DGB(4)

名称
dgb - DigiBoard インテリジェントシリアルカードドライバ

書式
options "NDGBPORTS=8" device dgb0 at isa? tty port 0x220 iomem 0xfc0000 iosiz ? flags 0x0 値は全部ただの例です。

NDGBPORTS オプションは、システムにインストールされている 全てのカード上のポート数の合計を定義します。 数が定義されていない場合は計算によって求められます:
デフォルトの NDGBPORTS = 記述された DigiBoard カードの数 * 16 もしこの数字が実際のポート数よりも小さかった場合、 システムは先頭から NDGBPORTS 番目のポートまでしか 使うことができません。 もしこの数字が実際のポート数よりも大きかった場合、 全てのポートを使用できますが、若干のメモリが無駄になります。

flags の意味:
0x0001 結線交換 (DCD と DSR の線を交換) を使用します。
0x0002 PC/Xe の 8K ウィンドウモードを使用しません。

デバイス番号:
0bCCmmmmmmmmOLIPPPPP
CCard number
mmmmmmmmajor number
callOut
Lock
Initial
PPPPPort number

解説
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 で行なうべきです。

関連ファイル
/dev/ttyD??
    着呼ポート
/dev/ttyiD??
/dev/ttylD??
    対応する着呼初期状態デバイスとロック状態デバイス

/dev/cuaD??
    発呼ポート
/dev/cuaiD??
/dev/cualD??
    対応する発呼初期状態デバイスとロック状態デバイス

/etc/rc.serial
    初期状態とロック状態デバイス設定の例

これらのデバイス名の 1 つめの疑問符はカード番号 (0 から 65535 まで 10 進数。0 および 65535 を含みます) の略です。 2 つめの疑問符はポート番号 ([0-9a-v]の間の文字) の略です。

診断
ソースファイル dgb.c の先頭にある DEBUG を定義することにより、 拡張された診断を得ることができます。

dgbX: warning: address N truncated to M PC/Xe 用の 8K ウィンドウのメモリアドレスが正しく配置されていないか (8K 境界に配置されるべきです)、最初の 1 メガバイトの範囲外です。

dgbX: 1st reset failed カードの I/O ポートへのアクセスに問題があります。おそらく カーネル設定ファイルにおいて、間違った port 値が指定されています。

dgbX: 2nd reset failed ハードウェアに問題があります。

dgbX: N[st,nd,rd,th] memory test failed カードのメモリへのアクセスに問題があります。おそらく カーネル設定ファイルにおいて、間違った iomem 値が指定されています。

dgbX: BIOS start failed オンボード BIOS の起動に問題があります。おそらく DigiBoard の メモリアドレスが、何か他のデバイスあるいは RAM と重なっています。

dgbX: BIOS download failed オンボード BIOS に問題があります。おそらく DigiBoard の メモリアドレスが、何か他のデバイスあるいは RAM と重なっています。

dgbX: FEP code download failed フロントエンドプロセッサのマイクロ OS のダウンロードに問題があります。 おそらく DigiBoard の メモリアドレスが、何か他のデバイスあるいは RAM と重なっています。

dgbX: FEP/OS start failed フロントエンドプロセッサのマイクロ OS の起動に問題があります。 おそらく DigiBoard の メモリアドレスが、何か他のデバイスあるいは RAM と重なっています。

dgbX: too many ports この DigiBoard は、自分が 32 より多くのポートを持っていると報告してきました。 おそらくハードウェアの問題があるか、 DigiBoard の メモリアドレスが、何か他のデバイスあるいは RAM と重なっています。

dgbX: only N ports are usable NDGBPORTS パラメータが小さすぎるため、このカードには N ポート 分の空間しか割り当てられません。

dgbX: port Y is broken オンボードの診断プログラムが、指定されたポートにハードウェア上の問題が あると報告しました。

dgbX: polling of disabled board stopped ドライバのポーリングロジックに内部的な問題が生じました。

dgbX: event queue's head or tail is wrong! ドライバかハードウェアに内部的な問題が生じました。

dgbX: port Y: got event on nonexisting port 物理的に存在するポートの状態に何らかの変化がありましたが、 設定が正しくないため使用できません。

dgbX: port Y: event N mstat M lstat K ドライバはカードから得体の知れないイベントを受けとりました。 おそらくイベントリストが拡張された新しいカードを使用しているか、 それ以外の何かハードウェア上の問題です。

dgbX: port Y: overrun 入力バッファが一杯になりました。 ドライバのポーリングロジックに問題があります。

dgbX: port Y: FEP command on disabled port ドライバに内部的な問題が生じました。

dgbX: port Y: timeout on FEP command ハードウェアに問題があります。

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

歴史
dgb ドライバは sio(4) ドライバと Linux の DigiBoard ドライバに由来しており、現在開発継続中です。

バグ
BREAK 送信の実装は完全ではありません。 どのような場合でも 1/4 秒の固定長で BREAK を送信します。

select(2) の実装にバグがありました。 この問題は現在は修正されていますが、まだ広範囲なテストはされていません。

ditty コマンドはありません。その機能の多く (結線交換、 115200 ボーへの速度向上など) はドライバ自身に実装されています。 それ以外のいくつかの機能は欠けています。