- 前回までのあらすじ
- ノートパソコンのキーボードユニットにPICマイコンと少しの回路を付けてPS/2接続のキーボードを製作しました。
数種類のデスクトップ用マザーボードで実験していたのですが、ノートパソコンPanasonic AL-N2では認識しない事を発見し、タイミング調整によって起動時にキーボードを接続していれば動作するようになりました。
これでバッチリだと思ったのもつかの間、ちゃんとした製品のキーボードはノートパソコンで使用中に抜き差しするホットプラグに対応しているのに、自作キーボードは1度抜くと再び接続しても使えないのです。
キーボード製作は完成まであと一歩のところで停滞していました。
PICマイコンでロジックアナライザを製作したので、この新兵器で原因を解明していきます。
むしろこの為にロジアナが必要だったのです!
- ロジアナで起動時のパルス読み取り
- SZロジアナのch.0がトリガになっているので、ここにPS/2のキーボードの電源を接続し、通電と同時に計測開始できるようにしました。同様に、ch.1にCLK、ch.2にDATを接続して計測しました。
テストにはAMiTYキーボードを使いました。これは三菱製タブレットパソコンAMiTYのオプション品で知ってる人は知っている有名な小型キーボードです。
下の画像ちょっと大きいですけど、1/8に縮小表示してるので潰れて見えますが、本当はもっときれいに出てます。
赤い横線は長時間なので短縮表示になってる事を表しています。
この程度の遅い信号なら簡易ロジアナでも充分実用になりそうです♪
AMITYキーボード、起動時の信号
自作 SZ_key、起動時の信号
このままではよく解りません。ロジアナのプログラムに「CLKの立ち上がり時のDATをビット化し、長時間経過で改行する」テキスト化ルーチンを組み込みボタンを付けました。
ホスト側が一定間隔でCLKを上下させてキーボードからの送信を禁止しているようなので、1ビットのみの行がたくさんあります。下のテキストはこれを除去してあります。
↓CLKのUP-EdgeでDATを2進数表示させたもの
テキスト化
00101010111 00011011101010011111110 011111111110100101111111 10010101011 01000111101010011111110 01000111101010011111110 00100111101010010111111 10110101010 10110000010 10010011110101 0010111111 10110101010 10110000010 11
⇒これを手作業で分析
data ホスト キーボード 内容 0 0101 0101 11
s ---A ---A peAA 正常完了レスポンス 0 0011 0111 01 01
s ---C ---E pe ak0 0111 1111 0
s ---E ---F peEC FE マウスコマンド、異常レスポンス 0 1111 1111 11 01
s ---F ---F pe ak0 0101 1111 11
s ---A ---F peFF FA 初期化コマンド、ACK応答 1 0 0101 0101 1
s ---A ---A peAA 正常完了レスポンス 0 1000 1111 01 01
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE マウスコマンド、異常レスポンス 0 1000 1111 01 01
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE マウスコマンド、異常レスポンス 0 0100 1111 01 01
s ---2 ---F pe ak0 0101 1111 1
s ---A ---F peF2 FA 識別情報を要求、ACK応答 1 0 1101 0101 0
s ---B ---A peAB 識別情報の応答1 1 0 1100 0001 0
s ---3 ---8 pe83 識別情報の応答2 1 0 0100 1111 01 01
s ---2 ---F pe akF2 識別情報を要求 0 0101 1111 1
s ---A ---F peFA ACK応答 1 0 1101 0101 0
s ---B ---A peAB 識別情報の応答1 1 0 1100 0001 0
s ---3 ---8 pe83 識別情報の応答2
一定間隔でCLKがLowになっているのと、CLKをシュアしているためにCLKの立ち上がりでキーボードからホストのストップビットが取れていないようで、わかりにくかったのですが、FF初期化コマンド〜F2識別情報までのデータが取れました。
先頭でキーボードからAAを送っています!!
なるほど〜〜〜 キーボードは起動すると自己診断を行って、正常終了レスポンスをホストに送るのが正しい動作のようです。
- SZ_Keyのプログラムを修正
- さっそく起動時にAAを送るようSZ_Keyのプログラムを修正しました。
そしてテスト!!
ロジアナのおかげで原因も解り、ホットプラグに対応できました♪
が、しかし、喜びも束の間でした。
ちょっといじっていると、新たな不具合を発見してしまいました。
市販キーボードは、ホットプラグ後もCaps Lockの状態を再現するのに、自作キーボードはCapsのLEDが点灯しません。
原因を探るため再びロジアナを取り出しました。机周辺はノートのも含めてキーボードが5枚。。。
キーボードまみれ!!!
- ロジアナでホットプラグ時のパルス読み取り
- テストは以下の手順で行いました。
(1)まずノートパソコンを起動
(2)BIOS通過後にAMITYキーボードを接続します。
(3)Shift+CapsでCaps-LEDを点灯させ、AMITYキーボードを引き抜きます。
(3)ロジアナを接続し、再びAMITYキーボード接続してサンプリング開始
(4)Capsが点灯したのを確認してロジアナのサンプリングを中断
今回は分解能を1つ上げてRES=0.8μSで計測しました。パルス間が204μS以上だと改行が入ります。
繋がっていたコマンドがきちんと分離できました。
あいかわらず1ビットのみの行がたくさんあります。下のテキストはコード送信でない部分を除去してあります。
コマンドコードとオプションパラメータについては[ PS/2 インターフェイスの研究 ]をご覧下さい。
↓CLKのUP-EdgeでDATを2進数表示させたもの
テキスト化
1 0010101011 1 0001101110101 0011111110 0001011110101 0010111111 0010011110101 0010111111 10110101010 10110000010 0000011111101 0010111111 0010000000101 0010111111 0101101111101 0010111111 0001000000101 0010111111 0110011111101 0010111111 0000000001101 0010111111 1 0100011110101 0011111110 1
⇒これを手作業で分析
data ホスト キーボード 内容 0 0101 0101 1
s ---A ---A peAA 正常完了レスポンス 0 0011 0111 01 01
s ---C ---E pe akEC マウスコマンド 0 0111 1111 0
s ---E ---F peFE 異常レスポンス 0 0010 1111 01 01
s ---4 ---F pe akF4 キースキャンを開始 0 0101 1111 1
s ---A ---F peFA ACK応答 0 0100 1111 01 01
s ---2 ---F pe akF2 識別情報を要求 0 0101 1111 1
s ---A ---F peFA ACK応答 0 1101 0101 0
s ---B ---A peAB 識別情報の応答1 0 1100 0001 0
s ---3 ---8 pe83 識別情報の応答2 0 0000 1111 11 01
s ---0 ---F pe akF0 スキャンコード選択 0 0101 1111 1
s ---A ---F peFA ACK応答 0 0100 0000 01 01
s ---2 ---0 pe ak02 コードセット2の指定 0 0101 1111 1
s ---A ---F peFA ACK応答 0 1011 0111 11 01
s ---D ---E pe akED LEDの点灯/消灯要求 0 0101 1111 1
s ---A ---F peFA ACK応答 0 0010 0000 01 01
s ---4 ---0 pe ak04 Caps Lock LED点灯指定 0 0101 1111 1
s ---A ---F peFA ACK応答 0 1100 1111 11 01
s ---3 ---F pe akF3 Typematic Rate設定 0 0101 1111 1
s ---A ---F peFA ACK応答 0 0000 0000 11 01
s ---0 ---0 pe ak00 250mS,30MakeCode/Secを指定 0 0101 1111 1
s ---A ---F peFA ACK応答 0 1000 1111 01 01
s ---1 ---F pe akF1 不明コマンド 0 0111 1111 0
s ---E ---F peFE 送信データ再送要求
ホストから、LEDの点灯/消灯要求コマンドと、Capsのパラメータがちゃんと届いてますね
う〜ん、この通り動作するはずなのですが?!
次は自作キーボードの状態を見てみます。
NGな時の信号が取れました。AA送信しても、EDやF2、F4、F0の初期化コードが来ていませんね。
BとJのキーを押していますが、ホスト側でコードも受け取っているようだし、正常な動作のようです。
テキスト化
1 01000111101110011111110 10010101011 0100011110110011111110 0100011110110011111110 0100011110110011111110 0100011110110011111110 10010011000 0110111000 0000011111 10010011000 0000011111 10110111000 01000111101110011111110
⇒これを手作業で分析
data ホスト キーボード 内容 0 1000 1111 01 11
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE 不明コマンド、送信データ再送要求 1 0 0101 0101 1
s ---A ---A peAA 正常完了レスポンス 0 1000 1111 01 1
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE 不明コマンド、送信データ再送要求 0 1000 1111 01 1
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE 不明コマンド、送信データ再送要求 0 1000 1111 01 1
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE 不明コマンド、送信データ再送要求 0 1000 1111 01 1
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE 不明コマンド、送信データ再送要求 1 0 0100 1100 0
s ---2 ---3 pe32 make'B' キーを押した 0 1101 1100 0
s ---B ---3 pe3B make'J' キーを押した 0 0000 1111 1
s ---0 ---F peF0 break code プレフィクスコード 1 0 0100 1100 0
s ---2 ---3 pe32 break'B' キーを離した 0 0000 1111 1
s ---0 ---F peF0 break code プレフィクスコード 1 0 1101 1100 0
s ---B ---3 pe3B break'J' キーを離した 0 1000 1111 01 11
s ---1 ---F pe ak0 0111 1111 0
s ---E ---F peF1 FE 不明コマンド、送信データ再送要求
- 原因がわかりました!
- SZキーボードはPS/2からの電源を接続せず別電源になっているので、リセットボタンで接続/切断してテストしていました。
何度もリセットを繰り返していると、正常に動作する場合とまったく認識されなくなる場合があることに気が付きました。
しばらく操作して現象が掴めてきました!
SZキーボードのリセットを5秒くらい押して離すと確実にリセットが掛かり、CapsLockも使えるのです。
ノートパソコンは1.3秒ごとにF1(不明コード)を送出しキーボードの応答を監視しており、軽くリセットを押した状態ではF1コードの応答しない状態が発生しないので、キーボードが切断された事が検出できず、ノートパソコンは初期化の必要無しと判断するようです。
つまりテスト方法が悪く、SZキーボードは正常動作してのでした(汗)
とにかく解決♪