PS/2キーボードインターフェース
各国キーボードとスキャンコード
Windowsは世界中で使用されているため、非常に多くの国のキーボードがあります。 Windowsパソコンでは、キーボードの各キーにスキャンコードと呼ばれる固有のIDをもっています。 キーコードは、キートップ表面に印刷された文字ではなく、キースイッチの位置に対して割り付けられています。 "A"と書かれたキートップのキーを押した場合でも、キーボードは"A"のコードを発行しているわけではありません。
キーボードは、キーを押した際、離した際にキーコードをパソコンへ送ります。 国やキーボードの種類によって、キー配置が異なります。 キーボードにはいくつかのモデルがありますが、スイッチ数と形状が同じであれば、キートップの印刷内容は異なっても、同じ位置のキースイッチは同じスキャンコードを持っています。 パソコンでは、キーボードから受け取ったスキャンコードからキー入力を組み立て、キーコードを作成します。 Windowsに設定された国コード及びキーボードタイプにより、どのスキャンコード(どこの位置のキー)を受け取った際に、どの文字(仮想キーコード)に変換するか決められています。 その為、その変換テーブルを切り替えることで各国のキーボードになることができます。 この作業はWindowsのキーボードドライバーが行っています。(DOS時代はBIOSが行っていました)
通常は、内部データであるスキャンコードを意識する必要は全くないのですが、特殊なアプリケーションを開発する場合、スキャンコードを調べる必要になる事があります。
具体的には、
- テンキーから入力を判別したい場合。
- シフトキーなど左右どちらが押されたか判別したい場合。
その他、キーボードの状態を直接サンプルすることでゲームなど特殊なアプリケーションを開発することができます。
キーボードインターフェースハードウェア
パソコンマザーボード上にはキーボードと通信を行う1ChipCPU(PC-ATの場合8042)が存在します。
このCPUはキーボードコントローラと呼ばれ、パソコンから見た場合、1つのインテリジェントI/Oとして動作します。
キーボードのキーが押された場合、キースキャンコードをパソコンへシリアル信号として送信します。 通信はクロックとデータが分離した2種類の信号線を用います。
データ信号線、クロック信号線ともに10kΩ(PC-ATの場合)で+5Vにプルアップされ、パソコン側、キーボード側両側からオープンコレクタのドライバ7407(PC-ATの場合)で駆動され
ています。 2本の信号線の信号をドライブするタイミングにより、1組の信号ラインを用いて双方向の通信を行います。 通信が行われていない場合、両信号線とも"High"レベル(両側ともドライブしていない状態)です。
WindowsのキーボードはMini-DIN6Pinのコネクタで接続されています。 以前はDIN5Pinでしたが、現在は全てMini-DIN6Pinのコネクタとなっています。
DIN(5Pin) |
Mini−DIN(6Pin) |
|
信号 |
2 |
1 |
Keyboard |
KB Data |
|
2 |
|
|
4 |
3 |
PWR |
GND |
5 |
4 |
PWR |
+5V |
1 |
5 |
Keyboard |
KB Clock |
|
6 |
|
|
キーボード信号の流れ
キースイッチが押された場合、キーボードはMake(キースキャン)コードをパソコンへ送ります。 離された場合、Breakコードをパソコンへ送ります。 キーを押されたときと離したときで異なった情報を送ることで、どのキーが押されているのかをパソコンへ知らせます。
押した際はMakeコードを発行し、離さされた時点でBreakコードを発行します。 そのままキースイッチが押し続けられた場合、Makeコードのみが連続して発行されます。 下記にEnterキーを押した際の実測波形を示します。
KB Data(上段) |
|
|
KB Clock(下段) |
|
EnterキーのMakeコード |
EnterキーのBreakコード |
|
|
|
KB Data(上段) |
|
|
KB Clock(下段) |
|
EnterキーのMakeコードの拡大1 |
EnterキーのMakeコードの拡大2 |
※測定用にかなり長い延長ケーブルをつけているため、大きなアンダーシュートが発生していますが、気にしないでください。(**;)
キーボードシリアルデータ構成
1つのデータは11ビットで構成されています。
流れ |
ビットストリーム |
信号 |
開始 |
1 |
Start Bit ”HIGH" |
|
2 |
D0(LSB) |
|
3 |
D1 |
|
4 |
D2 |
|
5 |
D3 |
|
6 |
D4 |
|
7 |
D5 |
|
8 |
D6 |
終了 |
9 |
D7(MSB) |
Mode1の信号の流れ |
流れ |
ビットストリーム |
信号 |
開始 |
1 |
Start Bit ”LOW" |
|
2 |
D0(LSB) |
|
3 |
D1 |
|
4 |
D2 |
|
5 |
D3 |
|
6 |
D4 |
|
7 |
D5 |
|
8 |
D6 |
|
9 |
D7(MSB) |
|
10 |
Parity(ODD) |
終了 |
11 |
Stop Bit "HIGH" |
通常の信号の流れ |
キーボードデータを取得する際、KBクロックの立下りでKBデータをフェッチします。 上記拡大2のスコープ写真でEnterキーのMakeコードを読んでみると、"00101101011"となり、通信中のMakeコードが01011010(5Ah)であることがわかります。5AhはEnterキーの位置のキーである事がわかります。
キーボードとの通信
MS-DOSの時代ですとキーボードコントローラをBIOSやI/O制御することで、キーボードと通信ができました。 Windows下ではBIOSではなくWindowsが直接I/Oを管理しているため、アプリケーションからキーボードとの直接の通信はできなくなりました。
参考までに、PC-AT時代のキーボードとキーボードコントローラの通信コマンドを掲載します。
パソコンがキーボードデータを受け取れない場合
パソコンがクロック線を"L"にします。 (その際、データ線は"H"でも"L"でもよい。)
パソコンがキーボードへデータを送る場合
クロック線が"H"の状態で、データ線を"L"にします。
キーボードデータをパソコンへ送る場合
上記要求がない場合、データビットを出力した後、キーボードがクロック線を"L"にします。
パソコンがキーボードへ発行するコマンドコード
コマンド |
コード(HEX) |
内容 |
応答 |
Set/Reset Mode Indicator |
ED |
キーボードのLEDの点灯/消灯要求。これに続くオプションバイトでLEDを指定する。
2Byte目 |
指定LED |
Bit2 |
Caps Lock LED |
Bit1 |
Numeric Lock LED |
Bit0 |
Scroll Lock LED |
|
ACK |
Echo |
EE |
キーボードが接続されている場合、キーボードはパソコンへ応答(ECHO
Responce)を返す。 |
ECHO |
NOP |
EF-F2, F7-FD |
|
|
Set Typematic Rate/Delay |
F3 |
ディレィの設定
Bit6 |
Bit5 |
ディレィ |
0 |
0 |
250mS |
0 |
1 |
500mS |
1 |
0 |
750mS |
1 |
1 |
1000mS |
リピートレートの設定
Rate=1 / ((8 + (bit2:0) ) * (2 ** (bit4:3)) * 0.00417 )
MakeCode/Sec
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
Rate |
0 |
0 |
0 |
0 |
0 |
30.0 |
0 |
0 |
0 |
0 |
1 |
26.7 |
0 |
0 |
0 |
1 |
0 |
24.0 |
0 |
0 |
0 |
1 |
1 |
21.8 |
0 |
0 |
1 |
0 |
0 |
20.0 |
0 |
0 |
1 |
0 |
1 |
18.5 |
0 |
0 |
1 |
1 |
0 |
17.1 |
0 |
0 |
1 |
1 |
1 |
16.0 |
0 |
1 |
0 |
0 |
0 |
15.0 |
0 |
1 |
0 |
0 |
1 |
13.3 |
0 |
1 |
0 |
1 |
0 |
12.0 |
0 |
1 |
0 |
1 |
1 |
10.9 |
0 |
1 |
1 |
0 |
0 |
10.0 |
0 |
1 |
1 |
0 |
1 |
9.2 |
0 |
1 |
1 |
1 |
0 |
8.6 |
0 |
1 |
1 |
1 |
1 |
8.0 |
|
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
Rate |
1 |
0 |
0 |
0 |
0 |
7.5 |
1 |
0 |
0 |
0 |
1 |
6.7 |
1 |
0 |
0 |
1 |
0 |
6.0 |
1 |
0 |
0 |
1 |
1 |
5.5 |
1 |
0 |
1 |
0 |
0 |
5.0 |
1 |
0 |
1 |
0 |
1 |
4.6 |
1 |
0 |
1 |
1 |
0 |
4.3 |
1 |
0 |
1 |
1 |
1 |
4.0 |
1 |
1 |
0 |
0 |
0 |
3.7 |
1 |
1 |
0 |
0 |
1 |
3.3 |
1 |
1 |
0 |
1 |
0 |
3.0 |
1 |
1 |
0 |
1 |
1 |
2.7 |
1 |
1 |
1 |
0 |
0 |
2.5 |
1 |
1 |
1 |
0 |
1 |
2.3 |
1 |
1 |
1 |
1 |
0 |
2.1 |
1 |
1 |
1 |
1 |
1 |
2.0 |
|
Default Rate=10Char/Sec, Delay=500mS |
ACK |
Enable |
F4 |
キースキャンを開始する |
ACK |
Default Disable |
F5 |
起動時の状態へ戻し、キースキャンを停止する |
|
Set Default |
F6 |
起動時の状態へ戻す |
ACK |
Resend |
FE |
再送要求 |
DATA |
Reset |
FF |
キーボードリセットコマンド。正しく受け取った場合ACKを返す。その後キーボードはセルフテストを実行する。 |
ACK |
キーボードがパソコンへ発行するコマンドコード
キースキャンコード以外にもキーボードから発行されるコマンドがあります。
システムバージョン等によって異なるようですが、PC-ATシステムでのキーボードコマンドコードの一覧を示します。
コマンド |
コード(HEX) |
内容 |
Overrun |
00 |
16バイトの受信バッファを超えた |
BAT Completion |
AA |
BAT(Basic Assurance Test)が正しく終了した |
ECHO Responce |
EE |
エコーコマンドへの応答を示す |
Break Code Prefix |
F0 |
Breakコードのプリフィックス |
Ack |
FA |
ECHO、RESEND以外のコマンドに対する正しく受け取られた応答メッセージ |
BAT Failed |
FC |
BATが正しく終了できなかった |
Disgnostic Failure |
FD |
セルフチェック時にエラー発生 |
Resend |
FE |
パソコンからの送信データ再送要求 |
参考文献:
- Technical Reference(Personal Computer Hardware Reference Library / IBM)
- PS/55ハードウェア
ハードウェア・インターフェース技術解説書(オーム社)
参考技術情報
主要販売製品
Last Update : 2011/09/09
|