USB電話機 P4Kでのキーの検出について調べました。
Linuxのドライバのソースを読んだところ、普通のマウスやキーボードとはずいぶんと使い方が異なっていることが判明しました。普通はインタラプト転送で、定期的にEPを読んでやれば、キーやマウスの状態を読み取ることができます。しかし、USB-P4Kでは、コントロール転送とインタラプト転送を組み合わせて使うようになっているようです。
まず最初にコントロール転送により、HIDインタフェースである3番のインタフェースに対して、動作指示内容をデータパケットとするクラス特有のSET CONFIGURATIONを送信してやります。その後、インタラプト転送で3番のインタフェースに割り当てられたEPである1番を読み出すと、その結果レポートが返るという仕組みになっています。動作指示データは、16バイト長であり、インタラプト転送で返されるレポートも同じフォーマットの16バイト長となっています。
![](https://blogimg.goo.ne.jp/user_image/4d/9b/e79907516b86d179bcb10d5bd0fef4ed.jpg)
キー検出については、キー状態変化検出と、スキャンコードへの変換の2段階の処理を経て、どのキーが押されたかを知ることができます。
したがい、キーを検出するためには、インタラプト転送の周期(20ms)に先立ち、コントロール転送でCMD_KEYPRESSとCMD_HOOKPRESSを交互に送信し、状態変化を見張るというのが、この電話機の使い方のようです。
LCDへの表示も、コントロール転送でコマンドパケットを送信してやることで実現しているようです。詳しくは、この次に調べることにします。
前回の記事でSPIのクロックについて言及するのを忘れていました。MAX3421EはSPIクロックとして26MHzまで使えるという仕様になっています。AT91SAM7S256ではMCKが48MHzになっているので、これを半分にした24MHzをSPIクロック(SCLK)としてMAX3421Eに供給してみたのですが、うまく動いてくれません。3分して16MHzにすると安定して動いてくれるようです。配線の引き廻しがまずくて波形が乱れちゃっているのかもしれません。
Linuxのドライバのソースを読んだところ、普通のマウスやキーボードとはずいぶんと使い方が異なっていることが判明しました。普通はインタラプト転送で、定期的にEPを読んでやれば、キーやマウスの状態を読み取ることができます。しかし、USB-P4Kでは、コントロール転送とインタラプト転送を組み合わせて使うようになっているようです。
まず最初にコントロール転送により、HIDインタフェースである3番のインタフェースに対して、動作指示内容をデータパケットとするクラス特有のSET CONFIGURATIONを送信してやります。その後、インタラプト転送で3番のインタフェースに割り当てられたEPである1番を読み出すと、その結果レポートが返るという仕組みになっています。動作指示データは、16バイト長であり、インタラプト転送で返されるレポートも同じフォーマットの16バイト長となっています。
![](https://blogimg.goo.ne.jp/user_image/4d/9b/e79907516b86d179bcb10d5bd0fef4ed.jpg)
キー検出については、キー状態変化検出と、スキャンコードへの変換の2段階の処理を経て、どのキーが押されたかを知ることができます。
- まずCMD_KEYPRESSをコントロール転送で送ると、次のインタラプト転送では、その結果としてキー状態のシーケンス番号が返ってきます。連続してCMD_KEYPRESSを送信し、シーケンス番号が変化したことによりキー状態に変化が生じたことを知ることができます。
- 次に、シーケンス番号を引数としてCMD_SCANCODEをコントロール転送で送ります。すると、インタラプト転送ではシーケンス番号をキーのスキャンコードに変換してものが返ってきます。これで、どのキーが押されたかがわかります。キーが離された場合には、スキャンコードとして0xFFが返ってきます。
したがい、キーを検出するためには、インタラプト転送の周期(20ms)に先立ち、コントロール転送でCMD_KEYPRESSとCMD_HOOKPRESSを交互に送信し、状態変化を見張るというのが、この電話機の使い方のようです。
LCDへの表示も、コントロール転送でコマンドパケットを送信してやることで実現しているようです。詳しくは、この次に調べることにします。
前回の記事でSPIのクロックについて言及するのを忘れていました。MAX3421EはSPIクロックとして26MHzまで使えるという仕様になっています。AT91SAM7S256ではMCKが48MHzになっているので、これを半分にした24MHzをSPIクロック(SCLK)としてMAX3421Eに供給してみたのですが、うまく動いてくれません。3分して16MHzにすると安定して動いてくれるようです。配線の引き廻しがまずくて波形が乱れちゃっているのかもしれません。