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
|