Interface 誌 5月号 富士通 FR60 基板に USB キーボードをつないでみた。
同誌 6 月号の記事「FR マイコン基板を使って『ブロック崩し』と『オセロ』を作ろう」では USB マウスを使用する例が紹介されている。このプログラムを動かしてキーボードをつないでも OSD 上のカーソル等は動かない。デバイスの認識ができていないのかと言うと、そうではない。オセロ(reverse)プログラムにはデバッグプリントが仕込まれており、user_main 関数のメインループ前で止めてみるとデバイスのエニュメレーションが終わって OSD に各デスクリプタの内容が表示されるのが判る。つまり、その後のインタラプト転送ができていないらしい。ソースコードを眺めて見ても同じ HID デバイスであるマウスとキーボードで異なる筈の部分がよく判らない。それ以前にインターフェースクラスやプロトコルの確認もしていない。もしや、と思って転送用エンドポイント・デスクリプタの設定をいじってみるとキーボードのデータ(REPORT)が取得できたが、これが妥当な方法かどうかは未確認だ。
具体的には usbho_interrupt.c 内で以下のよう ED1 の MPS (Maximum Packet Size) を 4 から 8 にするだけ。ここで設定しているのは OHCI におけるエンドポイント・デスクリプタの Dword0 になる。データバッファである intr_in_buf は 16 バイト確保されているから、そのままで良い。USB_debug コンパイルオプションを設定しておくと入力データが OSD に表示される。 get_mouse_data 内で 4 byte 表示しているのを 8 byte 表示にすれば全部表示される。なお、このように変更するとマウスのデータは取得できなくなるから、インターフェース・デスクリプタ内のプロトコルコード(1:Keyboard,2:Mouse)を見て判別すれば良いだろう。
void usb_init_interrupt(void)
{
:
intr_ed->hwINFO = 0x00082082; /* MFS=8,F=0,S=1(LowSpeed),EndPoint=1,DevAdr=2 */
:
}
void usb_set_interrupt(void)
{
:
intr_rd->hwBE = (unsigned long)usbho_adr_conv((unsigned int*)(intr_in_buf + 7);
:
もちろん、これだけではキーボードの CapsLock などの LED を制御することはできていないし(*1)、何よりも入力データを ASCII コード等のデータ列に変換する処理が必要だ。
HID キーボードの IN レポートの内容等、詳細については hamayan さんの「HIDでHello World」にある Tsuneo さんのコメントとリンク先を参照されたし。OHCI に関しては Interface 誌 2007/1 号に詳しい。キーコードの変換テーブルはここで作成しているので、宜しければ。
http://hamayan.blog.so-net.ne.jp/2008-03-29
キーボードから送られて来たデータ列の、1byte目(シフト)と3byte目(コード)から、アスキーや矢印キーに変換できます。
おそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。