- PS/2インターフェイス概要
- PS/2インターフェイスの信号はDAT,CLK,Vcc,GNDの4つで、DATはシリアル化されたデータ、CLKはデータが有効であることを示す信号です。
DAT,CLKは双方向になっていて、キー入力された文字を送るだけでなく、LEDを点灯させるなどのコマンドを受信します。
キーボード側パソコン側ともに4.7kΩでプルアップされたオープンコレクタ出力で出力が衝突しても破壊されないように構成されています。
- インターフェイス信号
- スタートビット、データ8ビット、ODDパリティ、ストップの合計11ビットの、一般的な調歩同期。
送信速度は1ビットあたり60〜100μS
スタートビット D0 D1 D2 D3 D4 D5 D6 D7 ODDパリティ ストップビット 0 x x x x x x x x p 1
パソコン側では以下のI/Oポートで入出力を行う
PC/ATのキーボードI/O(8042)
アドレス Bit R/W 内容 060h 7:0 R/W データバッファ 064h 7:0 W (コマンドバイト) 0 割り込み許可(キーボード) IRQ1 1=許可 1 割り込み許可(マウス) IRQ2 1=許可 2 システムフラグ 3 (リザーブ) 4 キーボード禁止 1=禁止 5 マウス禁止 1=禁止 6 キーボード・スキャン・モード 7 (リザーブ) 064h 7:0 R (ステータスバイト) 0 出力バッファ・フル 1 入力バッファ・フル 2 システムフラグ 3 コマンド/データ 4 スイッチ禁止 5 転送タイムアウトまたは、マウスフル 6 ジェネラル・タイムアウト 7 パリティエラー
- コマンド送受信
- パソコンがキーボードへ発行するコマンドコード
コマンド コード(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 Reset
(廃止?)EF リセットと自己診断 ACK ID読み出し F2 識別情報を要求 ACK ('L') ('H') スキャンコード選択
(廃止?)F0 F0h,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/Delay F3 Default Rate=10Char/Sec, Delay=500mS
ディレィの設定
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
Bit Rate 4 3 2 1 0 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
Bit Rate 4 3 2 1 0 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 ACK Enable F4 キースキャンを開始する ACK Default Disable F5 起動時の状態へ戻し、キースキャンを停止する Set Default F6 起動時の状態へ戻す ACK Resend FE 再送要求 DATA Reset FF キーボードリセットコマンド。
正しく受け取った場合ACKを返す。その後キーボードはセルフテストを実行する。ACK
キーボードがパソコンへ発行するコマンドコード
コマンド コード(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 パソコンからの送信データ再送要求
- スキャンコード送信
- キーボードのキーが押された時と、キーを離した時にスキャンコードを送信します。
キー・スキャンコードは3種類でデフォルトはスキャンコードセット2です。
これはASCIIいコードではなくキー番号(VFキーコード)です。
キーが押された時はMakeコードを、離した時にはBreakコードを送信します。
BreakコードはほとんどがMakeコードに0F0hを加えた2バイトコードで、オートリピートはMakeコードの送信です。
Exp:'A'を押すと'1Ch'送信、離すと'0F0h,1Ch'の2バイト送信
スキャンコードセット
キー Scan Code Set 1 Scan Code Set 2 Scan Code Set 3 Memo Make Break Make Break Make Break 1(FullKey) 02 82 16 F0 16 16 F0 16 1(TenKey) 4F CF 69 F0 69 69 F0 69 End *1 E0 4F E0 CF E0 69 E0 F0 69 65 F0 65 *1 (Base Case or Shift+NumLock) *2 E0 AA E0 4F E0 CF E0 2A E0 F0 12 E0 69 E0 F0 69 E0 12 *2 (Shift Case) *3 E0 2A E0 4F E0 CF E0 AA E0 12 E0 69 E0 F0 69 E0 F0 12 *3 (Num Lock on)
スキャンコードセット2を使用する
キーボードにはキー番号が定義されている。詳細は「OADGテクニカルリ・ファレンス」4章「キーボード」を参照のこと。→OADG
109キーボードのキー番号
シフト状態に影響されないスキャンコード群(Breakコードは先頭にF0を送る)
*=Reserved
Key Make Break 1 0E F0 0E 2 16 F0 16 3 1E F0 1E 4 26 F0 26 5 25 F0 25 6 2E F0 2E 7 36 F0 36 8 3D F0 3D 9 3E F0 3E 10 46 F0 46 11 45 F0 45 12 4E F0 4E 13 55 F0 55 14 6A F0 6A 15 66 F0 66 16 0D F0 0D 17 15 F0 15 18 1D F0 1D 19 24 F0 24 20 2D F0 2D 21 2C F0 2C 22 35 F0 35 23 3C F0 3C 24 43 F0 43
Key Make Break 25 44 F0 44 26 4D F0 4D 27 54 F0 54 28 5B F0 5B 29(*) 5D F0 5D 30 58 F0 58 31 1C F0 1C 32 1B F0 1B 33 23 F0 23 34 2B F0 2B 35 34 F0 34 36 33 F0 33 37 3B F0 3B 38 42 F0 42 39 4B F0 4B 40 4C F0 4C 41 52 F0 52 42 5D F0 5D 43 5A F0 5A 44 12 F0 12 45(*) 61 F0 61 46 1A F0 1A 47 22 F0 22 48 21 F0 21
Key Make Break 49 2A F0 2A 50 32 F0 32 51 31 F0 31 52 3A F0 3A 53 41 F0 41 54 49 F0 49 55 4A F0 4A 56 51 F0 51 57 59 F0 59 58 14 F0 14 60 11 F0 11 61 29 F0 29 62 E0 11 E0 F0 11 64 E0 14 E0 F0 14 90 77 F0 77 91 6C F0 6C 92 6B F0 6B 93 69 F0 69 96 75 F0 75 97 73 F0 73 98 72 F0 72 99 70 F0 70 100 7C F0 7C 101 7D F0 7D
Key Make Break 102 74 F0 74 103 7A F0 7A 104 71 F0 71 105 7B F0 7B 106 79 F0 79 108 E0 5A E0 F0 5A 110 76 F0 76 112 05 F0 05 113 06 F0 06 114 04 F0 04 115 0C F0 0C 116 03 F0 03 117 0B F0 0B 118 83 F0 83 119 0A F0 0A 120 01 F0 01 121 09 F0 09 122 78 F0 78 123 07 F0 07 125 7E F0 7E 131 67 F0 67 132 64 F0 64 133 13 F0 13
2バイト系コード
番号 Key Make Break 62 Alt (R) E0 11 E0 F0 11 64 Ctrl (R) E0 14 E0 F0 14 108 Ten.Enter E0 5A E0 F0 5A
Shift、Numのキーコンビネーション
番号 Key 通常
Shift+NumLockShift NumLock Make Break Make Break Make Break 75 Ins E0 70 E0 F0 70 E0 F0 12 E0 70 E0 F0 70 E0 12 E0 12 E0 70 E0 F0 70 E0 F0 12 76 Del E0 71 E0 F0 71 E0 F0 12 E0 71 E0 F0 71 E0 12 E0 12 E0 71 E0 F0 71 E0 F0 12 79 ← E0 6B E0 F0 6B E0 F0 12 E0 6B E0 F0 6B E0 12 E0 12 E0 6B E0 F0 6B E0 F0 12 80 Home E0 6C E0 F0 6C E0 F0 12 E0 6C E0 F0 6C E0 12 E0 12 E0 6C E0 F0 6C E0 F0 12 81 End E0 69 E0 F0 69 E0 F0 12 E0 69 E0 F0 69 E0 12 E0 12 E0 69 E0 F0 69 E0 F0 12 83 ↑ E0 75 E0 F0 75 E0 F0 12 E0 75 E0 F0 75 E0 12 E0 12 E0 75 E0 F0 75 E0 F0 12 84 ↓ E0 72 E0 F0 72 E0 F0 12 E0 72 E0 F0 72 E0 12 E0 12 E0 72 E0 F0 72 E0 F0 12 85 PgUp E0 7D E0 F0 7D E0 F0 12 E0 7D E0 F0 7D E0 12 E0 12 E0 7D E0 F0 7D E0 F0 12 86 PgDn E0 7A E0 F0 7A E0 F0 12 E0 7A E0 F0 7A E0 12 E0 12 E0 7A E0 F0 7A E0 F0 12 89 → E0 74 E0 F0 74 E0 F0 12 E0 74 E0 F0 74 E0 12 E0 12 E0 74 E0 F0 74 E0 F0 12 95 Ten./ E0 4A E0 F0 4A E0 F0 12 E0 4A E0 F0 4A E0 12
特殊のキーコンビネーション
番号 Key 通常 Ctrl,Shift時 Alt時 Make Break Make Break Make Break 124 PrintScreen E0 12 E0 7C E0 F0 7C E0 12 E0 7C E0 F0 7C 84 F0 84
特殊のキーコンビネーション(Makeのみ)
番号 Key 通常 Ctrl時 126 Pause E1 14 77 E1 14 F0 77 E0 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側コマンド キーボード側応答 1 FF Reset
キーボードリセットコマンド。
キーボードはセルフテストを実行する。FA Ack
コマンドに対する正しく受け取られた応答AA BAT Completion
BAT(Basic Assurance Test)が正しく終了した2 F2 ID Read
識別情報を要求FA Ack
コマンドに対する正しく受け取られた応答AB ID(L)
識別IDのLowバイト83 ID(H)
識別IDのHighバイト3 ED Set/Reset Mode Indicator
キーボードのLEDの点灯/消灯要求00 オプションバイト
Bit2:0がLEDに対応するFA Ack
コマンドに対する正しく受け取られた応答4 F2 ID Read
識別情報を要求FA Ack
コマンドに対する正しく受け取られた応答AB ID(L)
識別IDのLowバイト83 ID(H)
識別IDのHighバイト