pcvt ドライバを使用するには atkbd キーボードドライバがカーネルで設定されていることが必要です。
できないこと:
PCVT_FREEBSD = 102
のように定義しなければなりません。
NetBSD では、NetBSD 0.9 の場合、このバージョン番号は 9 と表現されなければならず、 NetBSD-current (1.0 以前) の場合は 9 より大きい任意の値になります。 NetBSD 1.0の場合は ( FreeBSD と同様に) 100 を、NetBSD-current では 999 を使うことが推奨されます。 例えば Nx 1.0 release の場合、
PCVT_NETBSD = 100
と定義すべきです。
pcvt ドライバは、すべての人の要求を満足させるため、高度に設定可能であるように 設計されてきました。望ましい設定方法は、おそらくデフォルト値を 上書きするような形で、設定ファイルに適切な options 行を書き込むことです。こうすることで、それぞれ異なる振る舞いをする ドライバを持つ別個のカーネルを 1 台のマシン上で コンパイルすることが可能です。
利用可能な設定オプションの通覧を次のリストに示します。 詳細はカーネルソースツリーの i386/isa/pcvt/pcvt_hdr.h を参照してください。
ノート: すべてのブール値オプションについて、次のような約束をします。 もしあるオプションが値なしで与えられた場合、1 という値 (有効) になります。 オプション値として 0 が与えられた場合、そのオプションは 無効になります。それ以外の値では 1 になります。 オプションが省略された場合、デフォルトの動作が仮定されます。
主にデバッグやハードウェアの問題に対処するために、さらにオプションが 用意されています。 i386/isa/pcvt/pcvt_hdr.h に説明があります。
#include <machine/pcvt_ioctl.h>
以下に引用されたパラメータの定義は、このファイルの中に 見つけることができるでしょう。
キーボードに関連する機能
基本的なキーボードのハードウェアに関係する機能が 3 つあります。
適切な定数を表すシンボル値が利用できます。 キーリピート遅延時間の初期値を指定するのは、 250 ミリ秒を表す KBD_TPD250 から、1000 ミリ秒を表す KBD_TPD1000 までの 250 ミリ秒刻みの値です。 キーリピート速度は、 毎秒 30.0 文字を表す KBD_TPM300 から、 毎秒 2.0 文字を表す KBD_TPM20 までの値があります。 中間値は、毎秒 30.0, 26.7, 24.0, 21.8, 20.0, 18.5, 17.1, 16.0, 15.0, 13.3, 12.0, 10.9, 10.0, 9.2, 8.6, 8.0, 7.5, 6.7, 6.0, 5.5, 5.0, 4.6, 4.3, 4.0, 3.7, 3.3, 3.0, 2.7, 2.5, 2.3, 2.1, 2.0 文字が指定できます。
これらも値を格納する int 型変数へのポインタをパラメータとして 受け取り、ドライバ内部のキーリピートフラグを操作します。 可能な値は KBD_REPEATOFF あるいは KBD_REPEATON です。
引数であるポインタの指す int 型変数は KBD_SCROLLLOCK, KBD_NUMLOCK, KBD_CAPSLOCK という値をとり、これらは論理和の組み合わせの形で使われるでしょう。
これらも、ドライバが持つ LED フラグの状態を 設定したり取得したりするのと同じ方法で使われるべきです。
キーボードの再マップ
pcvt ドライバの重要な機能の一つとして、 内蔵のキー定義を再定義できる機能があります。
これらがその機能を構成します。これらは次に述べる struct kbd_ovlkey へのポインタを引数として受け取ります。 加えて、次のような関数があります。
struct kbd_ovlkey /* キーの完全な定義 */ { u_short keynum; /* キーそのもの */ u_short type; /* キーのタイプ。以下を参照。 */ u_char subu; /* サブタイプ。書き込み時には無視される。 */ char unshift[KBDMAXOVLKEYSIZE+1]; /* 非 shift 時に生成される文字列。 */ u_char subs; /* サブタイプ。書き込み時には無視される。 */ char shift[KBDMAXOVLKEYSIZE+1]; /* shift 時に生成される文字列。 */ u_char subc; /* サブタイプ。書き込み時には無視される。 */ char ctrl[KBDMAXOVLKEYSIZE+1]; /* control 時に生成される文字列。 */ u_char suba; /* サブタイプ。書き込み時には無視される。 */ char altgr[KBDMAXOVLKEYSIZE+1]; /* altgr 時に生成される文字列。 */ };
type フィールドの適切な値は次の通りです。
サブタイプ フィールドは次のうちの どれか 1 つの値を保持します。
マウスエミュレーション
マウスエミュレータは (もし設定されていれば) Mouse Systems プロトコルを使って 3 ボタンマウスの振りをします。 仮想スクリーンによって使われていない、最初の pcvt デバイスノードがマウスデバイスです。 例えば、デフォルト値である 8 つの仮想スクリーンの場合、 /dev/ttyv0 から /dev/ttyv7 までが仮想スクリーンを表わし、 /dev/ttyv8 がマウスエミュレータデバイスとなるでしょう。 マウスエミュレーションは Aq Em NumLock キーを押すことによりオンになります。 マウスポインタは数字キーパッドにより、そのキーが示す方向へ動きます。 始めは 1 ステップずつ動き、調整可能な時間 (デフォルトは 500 ミリ秒 ) の後、約 6 倍まで加速します。 マウスボタンは 3 つの通常のキーにより エミュレートされ、デフォルトではこれらは Aq Em F1 , Aq Em F2 , および Aq Em F3 のファンクションキーに割り当てられています。 ここで 2 種類の動作が選択できます: 通常ボタンと、 ``stickey'' ボタンです。 通常ボタンは、期待通りの振舞いをします。 ``stickey'' ボタンは、最初の押下のときに、押されていることが 通知され、そのキーがもう一度押されるか、 他のボタンをエミュレートしているキーが押されるまで、 ``押されたまま'' の状態になっています。ボタンの押下と離しは、PC 内蔵スピーカにより、それぞれ ``ピリッ'' とか ``ピロッ'' という音でユーザに通知されます。
次のコマンドにより、エミュレーションを制御します。
どちらも mousedefs 構造体へのポインタを ioctl 呼び出し時の 3 番目の引数として受け取ります:
struct mousedefs { int leftbutton; /* "左ボタン" のキーに対応する (PC) スキャンコード */ int middlebutton; /* "中ボタン" のキーに対応する (PC) スキャンコード */ int rightbutton; /* "右ボタン" のキーに対応する (PC) スキャンコード */ int stickybuttons; /* 真ならば "sticky" である。 */ int acceltime; /* マウスポインタが加速し始めるまでのマイクロ秒単位の時間 */ /* デフォルト値: scan(F1), scan(F2), scan(F3), 偽, 500000 */ };
ダウンロード可能な文字集合のインタフェース
EGA および VGA ビデオアダプタは、ダウンロード可能なソフトウェアフォントを 扱うことができます。どの IBM 互換 PC ビデオボードの `ネイティブな文字集合' も、DEC 多国籍文字集合や ISO Latin-1 (ISO 8859-1) の完全な表現は不可能なので、これは U**X 環境にとって有用です。
これらはダウンロードフォントに関する情報を扱います。 struct vgafontattr へのポインタを引数としてとります:
struct vgafontattr { int character_set; /* VGA 文字集合 */ int font_loaded; /* フォントがロードされているかされていないかのマーク */ int screen_size; /* スクリーン当たりの行数 */ int character_scanlines; /* 文字当たりのスキャンライン数 - 1 */ int screen_scanlines; /* スクリーン当たりのスキャンライン数 - 1 バイト */ };
それぞれのフォントのそれぞれの文字は、次の関数によりダウンロードされます。
struct vgaloadchar へのポインタを引数としてとります:
struct vgaloadchar { int character_set; /* ロードする VGA 文字集合 */ int character; /* ロードする文字 */ int character_scanlines; /* 文字のスキャンライン数 */ u_char char_table[32]; /* VGA 文字の形のテーブル */ };
EGA あるいは VGA において、 character_set フィールドは CH_SET0, CH_SET1, CH_SET2, CH_SET3 という値を とります。VGA では、最大 8 つのフォントをロードして持つことが できますので、CH_SET4, CH_SET5, CH_SET6, CH_SET7 という値も とることができます。
フォントサイズと、表示可能なスクリーンの (行単位の) 高さの関係は、使われるビデオカードに依存することに注意してください:
スクリーンの大きさ (行の数) EGA VGA フォントサイズ 8 x 8 43 50 8 x 10 35 40 8 x 14 25 28 8 x 16 利用不可 25
一般的なスクリーン操作コマンド
以下の構造体へのポインタを引数としてとります:
struct cursorshape { int screen_no; /* 設定するスクリーン番号。 */ /* -1 は現在のアクティブなスクリーン。 */ int start; /* トップスキャンライン。0 から 文字の高さ -1 の範囲 */ int end; /* エンドスキャンライン。0 から 文字の高さ -1 の範囲 */ };
これらは、いくつかの一般的なドライバ内部変数へのインタフェースを提供します。 それらの内部変数は、スクリーンの振舞いを変更したり、 単にドライバをある一つのスクリーンへ強制的に切り替えたりするものです。 以下の構造体へのポインタを引数としてとります:
struct screeninfo { int adaptor_type; /* インストールされているビデオアダプタの */ /* タイプ。 */ /* 読み取り専用。書き込み時は (未だ!) 無 */ /* 視されます。 */ int totalfonts; /* ダウンロード可能なフォントの数。 */ /* 読み取り専用。書き込み時は無視されま */ /* す。 */ int totalscreens; /* 仮想スクリーンの数。 */ /* 読み取り専用。書き込み時は無視されま */ /* す。 */ int screen_no; /* 構造体の情報を取得したスクリーン番号。 */ /* 書き込み時に -1 ならば pure_vt_mode */ /* または/かつ screen_size を現在のスク */ /* リーンに適用し、それ以外ならば与えられ */ /* た screen_no のスクリーンに適用します。*/ int current_screen; /* 現在表示されているスクリーン番号。 */ /* 書き込み時に -1 ならば現在表示されてい */ /* るスクリーンをカレントスクリーンとし、 */ /* それ以外なら現在表示されているスクリー */ /* ンをパラメータのスクリーンに切り替えま */ /* す。 */ int pure_vt_mode; /* 純粋な VT モードか HP/VT モードかを表 */ /* すフラグ。 */ /* 書き込み時に -1 ならば変更しません。 */ int screen_size; /* スクリーンサイズ。 */ /* 書き込み時に -1 ならば変更しません。 */ int force_24lines; /* 純粋な VT220 のスクリーンサイズを得る */ /* ために 25 ライン VT モードか、 */ /* 28 ライン HP モードの場合に 24 ライン */ /* を強制します。 */ /* 書き込み時に -1 ならば変更ません。 */ int vga_family; /* adaptor_type が VGA ならば、読み取り後 */ /* チップセットファミリを反映しています。 */ /* 書き込み時には何も起こりません... */ int vga_type; /* adaptor_type が VGA ならば、読み取り後 */ /* チップセットを反映しています。 */ /* 書き込み時には何も起こりません... */ int vga_132; /* ドライバが 132 カラムをサポートしてい */ /* る場合、1 が設定されます。 */ /* 現在、書き込み時には無視されます。 */ };
pure_vt_mode フィールドは、ファンクションキーラベルとステータスラインを伴う VTxxx と HP Mode の混成に対しては M_HPVT という値を取り、 ラベルを伴わない VTxxx シーケンスのみが認識されるものに対しては M_PUREVT を取ります。
これのパラメータは、80 あるいは 132 のどちらかの値を保持する int 型変数へのポインタです。 カラム数 132 がサポートされるのは VGA アダプタ使用時のみです。 サポートされないカラム数では ioctl は失敗し、 errno (intro(2)を参照 ) に EINVAL が設定されます。
VGA カラーパレットインタフェース
VGA アダプタにおいてのみ、出力にカラーパレットレジスタが存在します。 256 種類の内部カラーコードのそれぞれに対する 赤、緑、青の出力電圧を 保持し、0 から 63 までの値を取ります (63 はベースカラーについて もっとも明くなる値です)。 すなわち、これらのアダプタはそれぞれのカラーコードを、 262144 色の中から取り出した ``パレット'' の色へマップします。
これらのコマンドは、パレットレジスタに対するインタフェースを 確立します。引数は以下の構造体へのポインタです:
struct vgapel { unsigned idx; /* パレットへのインデックス。0 から 255 が有効。 */ unsigned r, g, b; /* RGB の値。VGA_PMASK (63) でマスクされる。 */ };
ドライバの判別
struct pcvtid { #define PCVTIDNAMELN 16 /* ドライバ ID - 文字列の長さ */ char name[PCVTIDNAMELN]; /* ドライバの名前 == PCVTIDSTR */ #define PCVTIDNAME "pcvt" /* ドライバ ID - 文字列 */ int rmajor; /* メジャーリビジョン番号 */ #define PCVTIDMAJOR 3 int rminor; /* マイナーリビジョン番号 */ #define PCVTIDMINOR 00 };
struct pcvtinfo { u_int opsys; /* PCVT_xxx(x)BSD */ #define CONF_UNKNOWNOPSYS 0 #define CONF_386BSD 1 /* サポートされていません !!! */ #define CONF_NETBSD 2 #define CONF_FREEBSD 3 u_int opsysrel; /* NetBSD/FreeBSD に対するリリース */ u_int nscreens; /* PCVT_NSCREENS */ u_int scanset; /* PCVT_SCANSET */ u_int updatefast; /* PCVT_UPDATEFAST */ u_int updateslow; /* PCVT_UPDATESLOW */ u_int sysbeepf; /* PCVT_SYSBEEPF */ u_int pcburst; /* PCVT_PCBURST */ u_int kbd_fifo_sz; /* PCVT_KBD_FIFO_SZ */ /* 設定ブール値 */ u_long compile_opts; /* PCVT_xxxxxxxxxxxxxxx */ };
スクリーンセーバ
pcvt の設定によっては、シンプルなスクリーンセーバが利用できるかもしれません。 これは次のコマンドにより制御します。
これは整数へのポインタを引数としてとります。コマンドの名前とは関係なく、 config(8) の ``PCVT_SCREENSAVER'' オプションにより設定されていれば、 どのような 種類のアダプタでも利用できます。
USL スタイル VT のための互換コマンド
この pcvt ドライバのリリース 3.00 では、仮想端末インタフェースを制御するのに使われる USL スタイルのコマンドのサブセットをサポートします。 この機能は、主に XFree86 のリリース 2.0 以降で、X サーバが動いている時でも 仮想スクリーンを切り替えることができるようにと意図されています。 それらは、暗黙のセマンティクスに関して醜く (つまり、Berkeley セマンティクスを破っています) 、したがって一般的な利用については推奨されません。 それらのドキュメンテーションについては、 i386/include/pcvt_ioctl.h を参照してください。
製造者 チップセット モニタ 2theMax (?) ET4000 VGA Color Video7 Inc. Video 7 VGA Color Diamond Stealth VRAM S3 NEC 3FGx Trident TVGA 8800CS NEC 3D Data General C&T P82C604 VGA Color NoName Hercules W86855AF Mono Kyocera (Mainboard) WD90C11 Sony Color unknown ET3000 NEC 3D
製造者 タイプ レイアウト Cherry MF II US Cherry/Tandon MF II German Hewlett-Packard MF II US Hewlett-Packard MF II German Tatung AT German
古い PC キーボードは全くサポートされておりません (それらは 83 個のキーがあります) 。
F9 から F12 までは機能の制御のためにエミュレータが必要としているので、 AT キーボード (84 個のキーとそれとは別の数字キーパッドがあり、F11 と F12 はありません) に対するサポートは制限されています。 また現在のキーボードドライバの設計のゆえに ALtGr キーを持たない各国のキーボードに対する (完全な) サポートはありません。
MF キーボードは、101 キーおよび 102 キーのバージョンに ついて完全にサポートされております。