概要
ここは現在作成中です.
概要
このページの目的は,NEC 製の PC-98 配列キーボードである PK-KB002 の使用法を提示することです.
環境は FreeBSD 4.11 + XFree86 4.4.0 です. FreeBSD 6.2 + X.Org 6.9.0, FreeBSD 7.2 + X.Org 7.4 にも触れます.
3.5 節にて配布する patch ができたら,3.2, 3.3, 3.4 節の具体的な修正法を書いた所はもっと簡潔にした方が読み易いですね.
目次
PC-98 配列キーボード PK-KB002 には次のような特徴があります.
FreeBSD においては,すべてのキーを PC-98 と同じに使えるようにするためには,FreeBSD の USB driver や X Window System のソース等を変更する必要があります.[2]
なお,私は所持しておりませんが PK-KB002 の Mouse のコネクタを PS/2 から USB (バスパワードハブ) に変えた PK-KB011 や,さらにそれを文豪配列にした PK-KB017 もあります.[3][4][5]
おそらくここに記したことは同様に適用できると思います.
FreeBSD 7 系 + X.Org 7 系の環境でも試したいのですが,別のトラブルが多くて遅々として進みません.
[1] PK-KB011 ですが,PC-98 にて使用した情報は公開されています.
[2] Mac OS X では PK-KB011 用の driver が公式に配布されているようです.
(PK-KB002 も動くでしょう.)
[3] 製品の発表は PK-KB002 が 1997.10.23,PK-KB011 が 1998.7.15, PK-KB017 が 1998.11.2 であり,既にすべてが出荷停止です.
現時点での入手は容易ではありません.
[4] (2012.3.10) PK-KB017 を入手しました.
基本的な寸法は PK-KB002 と同一です.
キーの感触は少し柔らかくなった気がします.
修飾キーのキートップの刻印は独特の日本語になっていますが,キーの側面に馴染みの名前が刻印されているので迷う事はありません.
キー配置は最下段を除いて PC-98 配列と同じです.
最下段は,jp106 特有の [全角/半角], [ひらがな], [カタカナ] のキーが加わって [Space] がかなり小さいことと,[かな] と [Grph] の配置が逆であることとが異なります.
PK-KB002 に挿し換えても,新規に追加された三つのキーか効かないこと以外は問題なく使えます.
[5] (2012.10.27) PK-KB002 をもう一台入手したので,PK-KB017 とニコイチすれば PK-KB011 になるのかと思い分解してみたのですが,コネクタの形状が違うのでダメでした.
ここでは,kbdmux が off の場合を考えます.
PC に PS/2 K/B と PS/2 Mouse とが接続されている場合,それらは次のように log に出力されます.
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0 atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0 kbd0 at atkbd0 psm0: <PS/2 Mouse> irq 12 on atkbdc0 psm0: model Generic PS/2 mouse, device ID 0
PK-KB002 の PS/2 コネクタに Mouse を繋げ,それを PC の USB コネクターに接続すると,次のように log に出力されます. 番号付けは PS/2 K/B が優先なので,接続するのが OS の起動前でも後でも結果は同じです.
ukbd0: NEC PC98KEY USB KBD/M, rev 1.00/1.00, addr 2, iclass 3/1 kbd1 at ukbd0 ums0: NEC PC98KEY USB KBD/M, rev 1.00/1.00, addr 2, iclass 3/1 ums0: 3 buttons
PS/2 K/B を接続しない場合には,当然ですが USB K/B が kbd0 になります.
(注意) PK-KB002 に PS/2 Mouse を挿していなくても,USB Mouse があると認識されます.
これを抜くと,次のように表示されます.
ukbd0: at uhub0 port 1 (addr 2) disconnected ukbd0: detached ums0: at uhub0 port 1 (addr 2) disconnected ums0: detached
usbdevs を実行すると次のように出力されます.
# usbdevs -v Controller /dev/usb0: addr 1: full speed, self powered, config 1, OHCI root hub(0x0000), NEC(0x0000), rev 1.00 port 1 addr 2: low speed, power 100 mA, config 1, PC98KEY USB KBD/M(0x0011), NEC(0x0409), rev 1.00
console でも X Window System でも,その各々に標準で用意されている AT 互換機用の jp106 の設定を選択すれば,「とりあえず」使うことができます. ただし,そのままでは PC-98 と細かい部分で差異があります. それらは原因別に三つに分類されます. すなわち,
1. PC-98 K/B と jp106 K/B との仕様の違いに起因する差異.
これらは console, X Window System の各々に対して設定ファイルを書き換える際に知っておけば済む問題です.
2. jp106 K/B と PK-KB002 の仕様の違いに起因する差異.
上の二つは,使い分けをしないならば問題ありません. 下の二つは,当然ですが FreeBSD やその ukbd driver,および X Window System において動作に必要な諸設定がなされておらず,次のようになります.
これらには,各々の source を修正するレベルの対応が必要です. 以下では,その修正法を具体的に解説します. (記述の一部が未完成ですが,修正そのものには成功しています.)
3. FreeBSD の PC-98 と AT 互換機との仕様の違いに起因する差異.
AT 互換機の console 環境で scancode 128-255 を使うようなキーマップを使う場合,CAPS の LED が本来の機能を失い,ALGR に対応した LED になります. PC-98 には ALGR に対応した LED があるので,そのような振り分けは行なわれません.
この差異は,上述の [かな] の LED を点灯させるための修正と同時に対応することができます.
[1] 厳密には,ここで "jp106" と総称している K/B には jp106, jp109, jp109A という種類があります. ここで問題にしたキーにのみ注目するならば,jp106, jp109 の [0,~(tilde)], [^,~(overbar)] のキーは jp109A では [0], [^,~(tilde)] です. FreeBSD や X Window System は,overbar は tilde を入力するようにし,かつ jp109A K/B にて [SHIFT] + [0] で '~' (tilde) が入力されてしまうことを許容することにより,これらの K/B の設定を区別せずに済ませています.
この節の目的は,設定ファイルの修正だけで対応が可能な問題に対し,その修正法を示すことです.
PK-KB002 を使う PC にて,PS/2, USB を問わず (PK-KB002 のような亜種でない) jp106 K/B と併用するか否かで,修正に必要な知識や労力が違ってきます. すなわち,
もちろん,併用しない場合にも後者を選んでもかまいません. 以下 (3.3, 3.4 節も含む) では,前者の場合について例示します.
先ず console ですが,/usr/share/syscons/keymaps/jp.106.kbd の
071 fkey49 '7' '7' '7' '7' '7' '7' '7' N 072 fkey50 '8' '8' '8' '8' '8' '8' '8' N 073 fkey51 '9' '9' '9' '9' '9' '9' '9' N 074 fkey52 '-' '-' '-' '-' '-' '-' '-' N 075 fkey53 '4' '4' '4' '4' '4' '4' '4' N 076 fkey54 '5' '5' '5' '5' '5' '5' '5' N 077 fkey55 '6' '6' '6' '6' '6' '6' '6' N 078 fkey56 '+' '+' '+' '+' '+' '+' '+' N 079 fkey57 '1' '1' '1' '1' '1' '1' '1' N 080 fkey58 '2' '2' '2' '2' '2' '2' '2' N 081 fkey59 '3' '3' '3' '3' '3' '3' '3' N 082 fkey60 '0' '0' '0' '0' '0' '0' '0' N 083 del '.' '.' '.' '.' '.' boot boot N
の部分を /usr/share/syscons/keymaps/jp.pc98.kbd に倣って次のように変更します.
071 '7' '7' '7' '7' '7' '7' '7' '7' N 072 '8' '8' '8' '8' '8' '8' '8' '8' N 073 '9' '9' '9' '9' '9' '9' '9' '9' N 074 '-' '-' '-' '-' '-' '-' '-' '-' N 075 '4' '4' '4' '4' '4' '4' '4' '4' N 076 '5' '5' '5' '5' '5' '5' '5' '5' N 077 '6' '6' '6' '6' '6' '6' '6' '6' N 078 '+' '+' '+' '+' '+' '+' '+' '+' N 079 '1' '1' '1' '1' '1' '1' '1' '1' N 080 '2' '2' '2' '2' '2' '2' '2' '2' N 081 '3' '3' '3' '3' '3' '3' '3' '3' N 082 '0' '0' '0' '0' '0' '0' '0' '0' N 083 '.' '.' '.' '.' '.' '.' '.' '.' N
さらに,
105 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 O 106 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 O 107 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 O 115 '\' '_' fs us '\' '_' fs us O
の部分を次のように変更します.
105 nop nop nop nop nop nop nop nop O 106 nop nop nop nop nop nop nop nop O 107 nop nop nop nop nop nop nop nop O 115 nop '_' fs us nop '_' fs us O
次に X Window System ですが,/usr/X11R6/lib/X11/xkb/symbols/jp の
(X.Org 6.9.0 では /usr/X11R6/lib/X11/xkb/symbols/pc/jp,X.Org 7.4 では /usr/local/share/X11/xkb/symbols/jp です.)
key <KP7> { [ KP_Home, KP_7 ] }; key <KP8> { [ KP_Up, KP_8 ] }; key <KP9> { [ KP_Prior, KP_9 ] }; key <KP4> { [ KP_Left, KP_4 ] }; key <KP5> { [ KP_Begin, KP_5 ] }; key <KP6> { [ KP_Right, KP_6 ] }; key <KP1> { [ KP_End, KP_1 ] }; key <KP2> { [ KP_Down, KP_2 ] }; key <KP3> { [ KP_Next, KP_3 ] }; key <KP0> { [ KP_Insert, KP_0 ] }; key <KPDL> { [ KP_Delete, KP_Decimal ] };
を /usr/X11R6/lib/X11/xkb/symbols/nec/jp に倣って次のように変更します.
(X.Org 7.4 では /usr/local/share/X11/xkb/symbols/nec_vndr/jp です.)
key <KP7> { [ KP_7 ] }; key <KP8> { [ KP_8 ] }; key <KP9> { [ KP_9 ] }; key <KP4> { [ KP_4 ] }; key <KP5> { [ KP_5 ] }; key <KP6> { [ KP_6 ] }; key <KP1> { [ KP_1 ] }; key <KP2> { [ KP_2 ] }; key <KP3> { [ KP_3 ] }; key <KP0> { [ KP_0 ] }; key <KPDC> { [ KP_Decimal ] };
さらに,
key <AB11> { [ backslash, underscore ] };
を次のように変更します.
key <AB11> { [ NoSymbol, underscore ] };
なお,<LWIN>, <RWIN>, <MENU> は設定されていないので対応は不要です.
この節の目的は,Key Pad の '=' と ',' を使えるようにすることです. key codes も参照して下さい.
先ず console ですが,
(1) /usr/src/sys/dev/usb/ukbd.c を修正する.
これらのキーをを検知するようにし,それらに未使用の scancode 126, 127 を充てる.
(未使用ならばどこに充てても良いのですが,少なくとも 126, 127 は kbdmux が通してくれます.)
以下は source の抜粋ですが,
/* * Translate USB keycodes to AT keyboard scancodes. */ Static u_int8_t ukbd_trtab[256] = { 72, 73, 82, 83, 86, 107, 122, NN, /* 60 - 67 */ 112, 125, 121, 123, NN, NN, NN, NN, /* 88 - 8F */ };
ここを次のように変更します.
72, 73, 82, 83, 86, 107, 122, 126, /* 60 - 67 */ ← ここが Key Pad '=' 112, 125, 121, 123, 127, NN, NN, NN, /* 88 - 8F */ ← ここが Key Pad ','
参考までに,この近辺の usbcode は次表のようになっています.
usbcode (hexa) | PC-98 配列 | jp106 |
---|---|---|
135 (87) | '_' | '\', '_' |
136 (88) | かな | カタカナひらがな |
137 (89) | '\', '|' | '\', '|' |
138 (8a) | XFER | 変換 |
139 (8b) | NFER | 無変換 |
140 (8c) | Key Pad ',' | (なし) |
103 (67) | Key Pad '=' | (なし) |
(2) /usr/share/syscons/keymaps/jp.106.kbd を修正し,scancode 126, 127 に '=' と ',' を充てる.
126 '=' '=' '=' '=' '=' '=' '=' '=' N 127 ',' ',' ',' ',' ',' ',' ',' ',' N
(3) kernel 再構築を行なう.
次に X Window System ですが,上述の (1),(3) が済んでいれば,設定ファイルの変更だけで対処できます.
/usr/X11R6/lib/X11/xkb/keycodes/xfree86 の jp106 のところに以下の二行を加えます.
(X.Org 7.4 では /usr/local/share/X11/xkb/keycodes/xfree86 です.)
<KPEQ> = 134; <KPSP> = 135;
また /usr/X11R6/lib/X11/xkb/symbols/jp にも以下の二行を加えます.
(X.Org 6.9.0 では /usr/X11R6/lib/X11/xkb/symbols/pc/jp,X.Org 7.4 では /usr/local/share/X11/xkb/symbols/jp です.)
key <KPEQ> { [ KP_Equal ] }; key <KPSP> { [ KP_Separator ] };
この節の目的は,[かな] キーを押したとき,LED が点灯/消灯するようにすることです.
先ず console ですが,
(1) /usr/src/sys/sys/kbio.h を修正し Lock に ALGR を加える.
(2) /usr/src/sys/dev/usb/ukbd.c を修正し,ALGR に [かな] の LED を対応させる.
(3) kernel 再構築を行なう.
X Window System においては,上述の修正がなされていることを前提に,さらに source を修正して X Window System を make World し直す必要があります.
3.2, 3.3, 3.4 節の修正のための patch は,配布物としての点検を行なった後,ここに up します.
なお,この patch ですが,あまりにもこのキーボードに限定した話なので,FreeBSD や XFree86, X.Org に送れないでいます.