Sazanami Online

PS/2 インターフェイスの研究

Index に戻る
PS/2インターフェイス概要
PS/2インターフェイスの信号はDAT,CLK,Vcc,GNDの4つで、DATはシリアル化されたデータ、CLKはデータが有効であることを示す信号です。
DAT,CLKは双方向になっていて、キー入力された文字を送るだけでなく、LEDを点灯させるなどのコマンドを受信します。
キーボード側パソコン側ともに4.7kΩでプルアップされたオープンコレクタ出力で出力が衝突しても破壊されないように構成されています。

インターフェイス信号
スタートビット、データ8ビット、ODDパリティ、ストップの合計11ビットの、一般的な調歩同期。
送信速度は1ビットあたり60〜100μS

スタートビットD0D1D2D3D4D5D6D7ODDパリティストップビット
0xxxxxxxxp1

パソコン側では以下のI/Oポートで入出力を行う

PC/ATのキーボードI/O(8042)
アドレスBitR/W内容
060h7:0R/Wデータバッファ
064h7:0W(コマンドバイト)
0割り込み許可(キーボード) IRQ1 1=許可
1割り込み許可(マウス) IRQ2 1=許可
2システムフラグ
3(リザーブ)
4キーボード禁止 1=禁止
5マウス禁止 1=禁止
6キーボード・スキャン・モード
7(リザーブ)
064h7:0R(ステータスバイト)
0出力バッファ・フル
1入力バッファ・フル
2システムフラグ
3コマンド/データ
4スイッチ禁止
5転送タイムアウトまたは、マウスフル
6ジェネラル・タイムアウト
7パリティエラー

コマンド送受信
パソコンがキーボードへ発行するコマンドコード
コマンドコード(HEX)内容応答
Set/Reset Mode IndicatorED キーボードのLEDの点灯/消灯要求。
これに続くオプションバイトでLEDを指定する。
2Byte目指定LED
Bit2Caps Lock LED
Bit1Numeric Lock LED
Bit0Scroll Lock LED
ACK
EchoEEキーボードが接続されている場合、キーボードはパソコンへ応答(ECHO Responce)を返す。ECHO
Reset
(廃止?)
EFリセットと自己診断ACK
ID読み出しF2識別情報を要求ACK ('L') ('H')
スキャンコード選択
(廃止?)
F0F0h,ACK,[Opt],ACK
Opt=00 現在のスキャンコードを返す
01 コードセット1
02 コードセット2
03 コードセット4

ACK(Code)
ACK x ACK
ACK x ACK
ACK x ACK
セット・オールキー
(廃止?)
F7すべてのキーをタイプマティック(オートリピート)にセットするACK
F8すべてのキーをメイク/ブレークにセットするACK
F9すべてのキーをメイクにセットするACK
FAすべてのキーをタイプマティック/メイク/ブレークにセットするACK
セット・キータイプ
(廃止?)
FB個々のキーをタイプマティック(オートリピート)にセットする
FB, ACK, [Code],...[Code]
ACK
FCすべてのキーをメイク/ブレークにセットする
FC, ACK, [Code],...[Code]
ACK
FDすべてのキーをメイクにセットする
FD, ACK, [Code],...[Code]
ACK
Set Typematic Rate/DelayF3Default Rate=10Char/Sec, Delay=500mS

ディレィの設定
Bit6Bit5ディレィ
00250mS
01500mS
10750mS
111000mS


リピートレートの設定
Rate=1 / ((8 + (bit2:0) ) * (2 ** (bit4:3)) * 0.00417 )  MakeCode/Sec
BitRate
43210
0000030.0
0000126.7
0001024.0
0001121.8
0010020.0
0010118.5
0011017.1
0011116.0
0100015.0
0100113.3
0101012.0
0101110.9
0110010.0
01101 9.2
01110 8.6
01111 8.0
BitRate
43210
100007.5
100016.7
100106.0
100115.5
101005.0
101014.6
101104.3
101114.0
110003.7
110013.3
110103.0
110112.7
111002.5
111012.3
111102.1
111112.0
ACK
EnableF4キースキャンを開始するACK
Default DisableF5起動時の状態へ戻し、キースキャンを停止する 
Set DefaultF6起動時の状態へ戻すACK
ResendFE再送要求DATA
ResetFFキーボードリセットコマンド。
正しく受け取った場合ACKを返す。その後キーボードはセルフテストを実行する。
ACK

キーボードがパソコンへ発行するコマンドコード
コマンドコード(HEX)内容
Overrun0016バイトの受信バッファを超えた
BAT CompletionAABAT(Basic Assurance Test)が正しく終了した
ECHO ResponceEEエコーコマンドへの応答を示す
Break Code PrefixF0Breakコードのプリフィックス
AckFAECHO、RESEND以外のコマンドに対する正しく受け取られた応答メッセージ
BAT FailedFCBATが正しく終了できなかった
Disgnostic FailureFDセルフチェック時にエラー発生
ResendFEパソコンからの送信データ再送要求

スキャンコード送信
キーボードのキーが押された時と、キーを離した時にスキャンコードを送信します。
キー・スキャンコードは3種類でデフォルトはスキャンコードセット2です。
これはASCIIいコードではなくキー番号(VFキーコード)です。
キーが押された時はMakeコードを、離した時にはBreakコードを送信します。
BreakコードはほとんどがMakeコードに0F0hを加えた2バイトコードで、オートリピートはMakeコードの送信です。

Exp:'A'を押すと'1Ch'送信、離すと'0F0h,1Ch'の2バイト送信

スキャンコードセット
キーScan Code Set 1Scan Code Set 2Scan Code Set 3Memo
MakeBreakMakeBreakMakeBreak
1(FullKey)028216F0 1616F0 16
1(TenKey)4FCF69F0 6969F0 69
End*1E0 4FE0 CFE0 69E0 F0 6965F0 65*1 (Base Case or Shift+NumLock)
*2E0 AA E0 4FE0 CF E0 2AE0 F0 12 E0 69E0 F0 69 E0 12*2 (Shift Case)
*3E0 2A E0 4FE0 CF E0 AAE0 12 E0 69E0 F0 69 E0 F0 12*3 (Num Lock on)

スキャンコードセット2を使用する

キーボードにはキー番号が定義されている。詳細は「OADGテクニカルリ・ファレンス」4章「キーボード」を参照のこと。→OADG

109キーボードのキー番号


シフト状態に影響されないスキャンコード群(Breakコードは先頭にF0を送る)
KeyMakeBreak
10EF0 0E
216F0 16
31EF0 1E
426F0 26
525F0 25
62EF0 2E
736F0 36
83DF0 3D
93EF0 3E
1046F0 46
1145F0 45
124EF0 4E
1355F0 55
146AF0 6A
1566F0 66
160DF0 0D
1715F0 15
181DF0 1D
1924F0 24
202DF0 2D
212CF0 2C
2235F0 35
233CF0 3C
2443F0 43
KeyMakeBreak
2544F0 44
264DF0 4D
2754F0 54
285BF0 5B
29(*)5DF0 5D
3058F0 58
311CF0 1C
321BF0 1B
3323F0 23
342BF0 2B
3534F0 34
3633F0 33
373BF0 3B
3842F0 42
394BF0 4B
404CF0 4C
4152F0 52
425DF0 5D
435AF0 5A
4412F0 12
45(*)61F0 61
461AF0 1A
4722F0 22
4821F0 21
KeyMakeBreak
492AF0 2A
5032F0 32
5131F0 31
523AF0 3A
5341F0 41
5449F0 49
554AF0 4A
5651F0 51
5759F0 59
5814F0 14
6011F0 11
6129F0 29
62E0 11E0 F0 11
64E0 14E0 F0 14
9077F0 77
916CF0 6C
926BF0 6B
9369F0 69
9675F0 75
9773F0 73
9872F0 72
9970F0 70
1007CF0 7C
1017DF0 7D
KeyMakeBreak
10274F0 74
1037AF0 7A
10471F0 71
1057BF0 7B
10679F0 79
108E0 5AE0 F0 5A
11076F0 76
11205F0 05
11306F0 06
11404F0 04
1150CF0 0C
11603F0 03
1170BF0 0B
11883F0 83
1190AF0 0A
12001F0 01
12109F0 09
12278F0 78
12307F0 07
1257EF0 7E
13167F0 67
13264F0 64
13313F0 13
*=Reserved

2バイト系コード
番号KeyMakeBreak
62Alt (R)E0 11E0 F0 11
64Ctrl (R)E0 14E0 F0 14
108Ten.EnterE0 5AE0 F0 5A

Shift、Numのキーコンビネーション
番号Key通常
Shift+NumLock
ShiftNumLock
MakeBreakMakeBreakMakeBreak
75Ins E0 70E0 F0 70E0 F0 12 E0 70E0 F0 70 E0 12E0 12 E0 70E0 F0 70 E0 F0 12
76Del E0 71E0 F0 71E0 F0 12 E0 71E0 F0 71 E0 12E0 12 E0 71E0 F0 71 E0 F0 12
79E0 6BE0 F0 6BE0 F0 12 E0 6BE0 F0 6B E0 12E0 12 E0 6BE0 F0 6B E0 F0 12
80Home E0 6CE0 F0 6CE0 F0 12 E0 6CE0 F0 6C E0 12E0 12 E0 6CE0 F0 6C E0 F0 12
81End E0 69E0 F0 69E0 F0 12 E0 69E0 F0 69 E0 12E0 12 E0 69E0 F0 69 E0 F0 12
83E0 75E0 F0 75E0 F0 12 E0 75E0 F0 75 E0 12E0 12 E0 75E0 F0 75 E0 F0 12
84E0 72E0 F0 72E0 F0 12 E0 72E0 F0 72 E0 12E0 12 E0 72E0 F0 72 E0 F0 12
85PgUp E0 7DE0 F0 7DE0 F0 12 E0 7DE0 F0 7D E0 12E0 12 E0 7DE0 F0 7D E0 F0 12
86PgDn E0 7AE0 F0 7AE0 F0 12 E0 7AE0 F0 7A E0 12E0 12 E0 7AE0 F0 7A E0 F0 12
89E0 74E0 F0 74E0 F0 12 E0 74E0 F0 74 E0 12E0 12 E0 74E0 F0 74 E0 F0 12
95Ten./E0 4AE0 F0 4AE0 F0 12 E0 4AE0 F0 4A E0 12

特殊のキーコンビネーション
番号Key通常Ctrl,Shift時Alt時
MakeBreakMakeBreakMakeBreak
124PrintScreenE0 12 E0 7CE0 F0 7C E0 12E0 7CE0 F0 7C84F0 84

特殊のキーコンビネーション(Makeのみ)
番号Key通常Ctrl時
126PauseE1 14 77 E1 14 F0 77E0 7E E0 F0 7E

キーボードからシステムへの送信
(1) キーボードがCLKを調べてインアクティブ('L')なら出力禁止(キーボード禁止)
(2) キーボードがDATを調べてインアクティブ('L')ならシステムがデータを持っているので受信する(システム送信要求)
(3) CLK,DATともにアクティブ('H')ならデータ送信開始。
CLKはインアクティブの時に有効。送信中は60μS以内でCLKを調べて、システムがインアクティブにしている場合(回線競合)なら送信中止する。
システム側はCLKが10ビット目開始エッジ以前であれば、CLKをインアクティブにしてキーボードの送信を中断できる。このときシステム側はCLK,DATをアクティブに戻す。
(4) 10ビット目出力後、?以内に送信が完了しているか(回線競合がなかったか)調べる。
正常ならストップビットを出力して送信終了。 (5) データ出力後、システム側でCLKをインアクティブに保つことで。次のキーボードからの送信を禁止でる。
(6) システムがキーボードにデータを送りたい場合は、DATをインアクティブ('L')にし、CLKをアクティブ('H')にする。

システムからキーボードへの送信
(1) キーボードからデータが送信中で、10ビット目以降を送っている場合には、その送信が終わるまで待つ。
(2) キーボード側ではCLKが、インアクティブなら出力できない。
(3) キーボード側はDATがインアクティブならCLKをインアクティブにする。するとシステム側は最初のスタートビットを送信できる。
(4) キーボードはスタートビットを確認したら、CLKをインアクティブにする。次にシステムはDATに最初のDataBitを乗せる。キーボードがCLKをインアクティブにするたびに、システムはDATに次のDataBitを乗せ、すべてのビットを送り終わるまで続ける。
(5) CLKがアクティブにある間、キーボードはDATを調べてDataBitを取り込む。DATはCLKの立ち上がりから1μS以内に安定する。
(6) 10番目のCLKのあとで、キーボード側はDATを調べ、アクティブならばインアクティブにして、CLKを1ビットカウントする。この動作によりキーボードがデータ受信を完了したことをシステム側に通知する。システム側では通知後にレディ状態に戻るか、準備が整うまでCLKをインアクティブにしてキーボード禁止にする。
10番目のCLKの後のDATがインアクティブならフレーミングエラーが発生したことになり、アクティブになるまでCLKをカウントし、DATをインアクティブにして再送信コマンドをシステムに送信する。
(7) キーボードがDATをインアクティブにして回線制御ビットを生成

キーボードはCLKを10mS以下の間隔で監視しシステムからのコマンドに応答する。
キーボードはシステムからのコマンドに20mS以内に応答する。
システムはキーボードの応答が無効またはエラーなら再送信する。

PC/AT起動時の応答
PC/AT起動時に搬送されるコマンドは、
0FFh,0F2h,0EDh,00h,0F2hだった
実験環境:シャトル製i810マザー ME-17
BIOS設定:タイプマティックRate設定なし、NumLockなし

PC/ATの初期化コマンドと応答
PC/AT側コマンドキーボード側応答
1FFReset
キーボードリセットコマンド。
キーボードはセルフテストを実行する。
FAAck
コマンドに対する正しく受け取られた応答
AABAT Completion
BAT(Basic Assurance Test)が正しく終了した
2F2ID Read
識別情報を要求
FAAck
コマンドに対する正しく受け取られた応答
ABID(L)
識別IDのLowバイト
83ID(H)
識別IDのHighバイト
3EDSet/Reset Mode Indicator
キーボードのLEDの点灯/消灯要求
00オプションバイト
Bit2:0がLEDに対応する
FAAck
コマンドに対する正しく受け取られた応答
4F2ID Read
識別情報を要求
FAAck
コマンドに対する正しく受け取られた応答
ABID(L)
識別IDのLowバイト
83ID(H)
識別IDのHighバイト

↑PageTop

E-mail : saza00@mail.goo.ne.jp Index に戻る