SSブログ

今更PS/2マウス [電子工作]

今更PS/2マウスのエミュレーションをやっています。

過去のトラ技の記事とか、ネット上の情報を参照すれば楽勝か!と思いきや、結構難儀しています。
過去のトラ技で言えば1995年の10月号とか、12月号にPS/2を使った記事があり、まあ有る程度参考にはなるのですが、いずれも中途半端(10月号はマウス相手ではなく、キーボード相手な為)で、これ読んだだけでは動かせませんでした。
WEBではこの辺りでしょうか。
http://www.computer-engineering.org/ps2mouse/
http://www.oadg.or.jp/techref/oadghwd.pdf(追加資料)
http://www.nds-jpn.com/Products/SSK/Data%20manual/SSK840_R14.pdf(追加資料)

結局何を知りたかったのかと言えば、クロック同期で通信をしている関係上、データの取り込みを立ち下がりで取るべきか、立ち上がりで取るべきか?程度の事で躓いていたんですけれどね。なかなかこれが上記資料を見てもはっきりしない。

あともう一つ、マウス側がデータを送っている時、ホスト側が強制的に送信を中断できるんですけれど、その時の中断に入るタイミングと、データの再送に関する決まり事もイマイチ判りません。

左の画像は、マウスからデータを送っている時の波形です。黄色がクロック、青がデータ、ピンクはトリガを掛ける為のタイミングです。全部で3つのデータの送信を行っています。 送っているデータはカーソルを下方向に移動させている時の波形です。
先頭のデータを拡大してみました。先頭からスタートbit(0)、データ列(LSBから0x28)、奇数パリティ(1)、ストップbit(1)が続いています。

結局クロックとデータの関係は、まずデータをセットし、そこから5μs~25μs遅れて(画像は15μs位)クロックを立ち下げ、30μs~50μs間(画像は35μs位)クロックを0に保持した後、今度は30μs~50μs間(画像は35μs位)クロックを1に保持します。1bit辺り掛かる時間は50μs~100μsの間であれば良い様です。

第2byteの波形です。ここにはX軸方向のデータが入りますが、X軸(横)方向の移動が無い為、0が入っています。
第3byteの波形です。ここにはY軸方向のデータが入ります。Y軸(縦)の下方向への移動なので、負(2の補数表現)の値が入っています。

懸念の中断→再開手順ですが、例えばこの画像の様に3byte送信中に中断を受けた時、どの位置から再送すべきか?で悩みます。実際には

1.3byte全て送り直す。

2.中断を受けた所から送り直す。

のいずれかだと思いますが、実際には2.の方でした。

今度はホストからのデータ受信の波形です。最初のデータが受信データで、続くデータは、ACK応答、コマンドに対応する返信データとなっています。
やはり先頭から拡大してみました。受信したデータは0xE9です。ホストは、こちらから送ったクロックの立下りに同期してデータパターンを出力しますので、立ち上がりのタイミングでデータを取り込むと良いでしょう。クロックの幅等は送信時と同じで構いません。 一番最後にストップbit(0)をマウス側から送ると言う特殊な事をしている以外は、特に難しい所は有りません。ホストがデータを送ってくるので、中断は有り得ない訳ですし。
マウス側からACK応答(0xFA)を返しています。
0xE9に対する応答として、0x00、0x00、0x64を返しますが、画面が切れてしまったので先頭の0x00のみ表示しています。

コマンドに対するリザルトは、上記資料を参照して下さい。

さて何が大変だったかと言えば、家には既にデスクトップパソコンが存在せず、ホストとして動かしているのはノートパソコンと言う事になります。このノートパソコンは型が古いのでPS/2ポートが付いていますが、そのポートはキーボードとマウスが兼用のポートです。大概のデスクトップパソコンでは別々となっているので、あの苦労はしなくてもよいのですが、、、。

えー、まずマウスとホスト間の初期化時のやり取りについて、上記資料には掲載されていますが、実際にはその手順通りには進みませんでした。多分パソコン側からは、マウスのシーケンスだけではなく、キーボードの初期化シーケンスも行っており、そのシーケンスにパスしないとマウスが上手く動かない様です。

これが上手く行かなかった時のホストから受信したコマンドのダンプです。最後は0xF2で終了してしまっています。このままではマウスは動きません。
これは上手く動いた時のホストからの受信コマンドです。最後に0xF4を受信して、マウスはストリーミングモードキースキャンに入っています。
対策方法ですが、キーボード、マウス兼用ポートでの手順に関してはまだ解析が済んでおらず、ソフトウエア的に対応していません。何をしたかと言えば、パソコンとマウスの間に10キーパッドを入れて、キーボードの手順に関しては10キーパッドに肩代わりさせているのです。10キー使わなくても、付けざるを得ない状況です。

解析に関しては時間切れなので、後程余裕ができた時にゆっくりと。

まあ同期通信に関しても完全に出来上がった状態で無い時に、この手順で上手く動かなかった事から、2重にも、3重にも問題が重なり、かなーり悩みました。

今は何とか動いているので、まあ良かったとしましょう。現在は3ボタンマウスでしかないので、もう少し進めて、せめてスクロールマウス位にはしたいと思っております。 今時無線マウスだろうけどね。

BUFFALO 多機能無線マウス BOMU-W24A02/BL

BUFFALO 多機能無線マウス BOMU-W24A02/BL

  • 出版社/メーカー: バッファロー
  • 発売日: 2007/03/31
  • メディア: エレクトロニクス


nice!(0)  コメント(5)  トラックバック(0) 

nice! 0

コメント 5

アイン

私も5年位前にPICでマウスとキーボードの
エミュレーションを仕事でやりました。
もうずいぶん前のことなのであまり記憶が無いですが
参考に挙げてある1つめと2つめは私もお世話になりました。

一応、なんとか5つボタンマウスまでもってきました。

マウスって意外と複雑な初期化シーケンスやってるんですよね。
それもチップセットによって若干シーケンスが違ってたり。

ホスト側がエラーを含んだコマンドなんか投げてこないだろうと踏んで
全てACKを返すようにしていたんですが、中にはひどいのがいて
イレギュラーのコマンドを投げてきて、それにErrorで応答しないと
そこでシーケンスを止めて、マウスを使用不可にされたり
なんてこともありました。

あれには結構苦労させられました。
by アイン (2007-06-11 10:22) 

きぃたん@大阪

一応、貼っておきます。
http://www.wotsit.org/list.asp?search=mouse&button=GO%21
海外のサイトだとmiceで検索すると
違うサイトがヒットすると思います。
by きぃたん@大阪 (2007-06-11 11:52) 

hamayan

> 中にはひどいのがいてイレギュラーのコマンドを投げてきて、
> それにErrorで応答しないとそこでシーケンスを止めて、マウ
> スを使用不可にされたり

(ToT)
やっぱり、ホストとマウスの間の通信をモニタする冶具を作らないと駄目かな。

きぃたんさん、リンク先イマイチ判りません。
by hamayan (2007-06-11 13:08) 

Sim

以前、PS2のキーボードを使ってみたときも、CLKが1のときにDATAが変化しているので、CLKの立ち下がりでDATAを読んでいました。キーボードは特に初期設定とかしなくても動くので、読み込みだけでよくて楽でした。マウスはたいへんそうですね。
by Sim (2007-06-14 00:00) 

hamayan

おお、皆さん何気にPS/2キーボードとかマウスとかやっているんですね。
なんたってハードウエアは簡単なので、マイコンの入力装置にもピッタリと言えますからね。
by hamayan (2007-06-14 01:17) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。