Sazanami Online

小型キーボードの製作 その2

[その1] [その2] Index に戻る
前回までのあらすじ
ノートパソコンのキーボードユニットに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 pe
AA 正常完了レスポンス
0 0011 0111 01 01
s ---C ---E pe ak
0 0111 1111 0
s ---E ---F pe
EC FE マウスコマンド、異常レスポンス
0 1111 1111 11 01
s ---F ---F pe ak
0 0101 1111 11
s ---A ---F pe
FF FA 初期化コマンド、ACK応答
1 0 0101 0101 1
 s ---A ---A pe
AA 正常完了レスポンス
0 1000 1111 01 01
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1 FE マウスコマンド、異常レスポンス
0 1000 1111 01 01
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1 FE マウスコマンド、異常レスポンス
0 0100 1111 01 01
s ---2 ---F pe ak
0 0101 1111 1
s ---A ---F pe
F2 FA 識別情報を要求、ACK応答
1 0 1101 0101 0
 s ---B ---A pe
AB 識別情報の応答1
1 0 1100 0001 0
 s ---3 ---8 pe
83 識別情報の応答2
1 0 0100 1111 01 01
 s ---2 ---F pe ak
F2 識別情報を要求
0 0101 1111 1
s ---A ---F pe
FA ACK応答
1 0 1101 0101 0
 s ---B ---A pe
AB 識別情報の応答1
1 0 1100 0001 0
 s ---3 ---8 pe
83 識別情報の応答2

一定間隔でCLKがLowになっているのと、CLKをシュアしているためにCLKの立ち上がりでキーボードからホストのストップビットが取れていないようで、わかりにくかったのですが、FF初期化コマンド〜F2識別情報までのデータが取れました。

先頭でキーボードからAAを送っています!!

なるほど〜〜〜 キーボードは起動すると自己診断を行って、正常終了レスポンスをホストに送るのが正しい動作のようです。

↑PageTop

SZ_Keyのプログラムを修正
さっそく起動時にAAを送るようSZ_Keyのプログラムを修正しました。

そしてテスト!!

ロジアナのおかげで原因も解り、ホットプラグに対応できました♪

が、しかし、喜びも束の間でした。

ちょっといじっていると、新たな不具合を発見してしまいました。
市販キーボードは、ホットプラグ後もCaps Lockの状態を再現するのに、自作キーボードはCapsのLEDが点灯しません。

原因を探るため再びロジアナを取り出しました。机周辺はノートのも含めてキーボードが5枚。。。

キーボードまみれ!!!

↑PageTop

ロジアナでホットプラグ時のパルス読み取り
テストは以下の手順で行いました。

(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 pe
AA正常完了レスポンス
0 0011 0111 01 01
s ---C ---E pe ak
ECマウスコマンド
0 0111 1111 0
s ---E ---F pe
FE異常レスポンス
0 0010 1111 01 01
s ---4 ---F pe ak
F4キースキャンを開始
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 0100 1111 01 01
s ---2 ---F pe ak
F2識別情報を要求
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 1101 0101 0
s ---B ---A pe
AB識別情報の応答1
0 1100 0001 0
s ---3 ---8 pe
83識別情報の応答2
0 0000 1111 11 01
s ---0 ---F pe ak
F0スキャンコード選択
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 0100 0000 01 01
s ---2 ---0 pe ak
02コードセット2の指定
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 1011 0111 11 01
s ---D ---E pe ak
EDLEDの点灯/消灯要求
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 0010 0000 01 01
s ---4 ---0 pe ak
04Caps Lock LED点灯指定
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 1100 1111 11 01
s ---3 ---F pe ak
F3Typematic Rate設定
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 0000 0000 11 01
s ---0 ---0 pe ak
00250mS,30MakeCode/Secを指定
0 0101 1111 1
s ---A ---F pe
FAACK応答
0 1000 1111 01 01
s ---1 ---F pe ak
F1不明コマンド
0 0111 1111 0
s ---E ---F pe
FE送信データ再送要求

ホストから、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 ak
0 0111 1111 0
s ---E ---F pe
F1FE不明コマンド、送信データ再送要求
1 0 0101 0101 1
s ---A ---A pe
AA正常完了レスポンス
0 1000 1111 01 1
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1FE不明コマンド、送信データ再送要求
0 1000 1111 01 1
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1FE不明コマンド、送信データ再送要求
0 1000 1111 01 1
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1FE不明コマンド、送信データ再送要求
0 1000 1111 01 1
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1FE不明コマンド、送信データ再送要求
1 0 0100 1100 0
s ---2 ---3 pe
32make'B' キーを押した
0 1101 1100 0
s ---B ---3 pe
3Bmake'J' キーを押した
0 0000 1111 1
s ---0 ---F pe
F0break code プレフィクスコード
1 0 0100 1100 0
s ---2 ---3 pe
32break'B' キーを離した
0 0000 1111 1
s ---0 ---F pe
F0break code プレフィクスコード
1 0 1101 1100 0
s ---B ---3 pe
3Bbreak'J' キーを離した
0 1000 1111 01 11
s ---1 ---F pe ak
0 0111 1111 0
s ---E ---F pe
F1FE不明コマンド、送信データ再送要求


原因がわかりました!
SZキーボードはPS/2からの電源を接続せず別電源になっているので、リセットボタンで接続/切断してテストしていました。
何度もリセットを繰り返していると、正常に動作する場合とまったく認識されなくなる場合があることに気が付きました。
しばらく操作して現象が掴めてきました!
SZキーボードのリセットを5秒くらい押して離すと確実にリセットが掛かり、CapsLockも使えるのです。

ノートパソコンは1.3秒ごとにF1(不明コード)を送出しキーボードの応答を監視しており、軽くリセットを押した状態ではF1コードの応答しない状態が発生しないので、キーボードが切断された事が検出できず、ノートパソコンは初期化の必要無しと判断するようです。

つまりテスト方法が悪く、SZキーボードは正常動作してのでした(汗)

とにかく解決♪

↑PageTop

E-mail : saza00@mail.goo.ne.jp [その1] [その2] Index に戻る