再びEZ-USB、目標のUSB HIDだ(再び既視感・・・)
DingDong EZ-USB FX2LP CY7C68013A USBコアボード13A-56 EZ-USB FX2LP USB開発モジュールロジックアナライザEEPROM
- 出版社/メーカー: CY7C68013A-Module
- メディア:
- この商品を含むブログを見る
この開発キットに入っている参照実装はCY3684用のものだ。
このキットにはスイッチや7セグLEDがついているのだが、これらはI2Cで接続されているのだ。
これらを扱うものはコンパイルはできるが、今回使っているEZ-USB FX2LP基板に焼くとチップが動作しなくなってしまうのだ。
なので、今回はまずサンプルの"hid_kb"を基板に焼けるようにする。
つまりI2C周りのコードを全て削除してしまう。
サンプルプロジェクトを開く
- (開発キットのルート)\Firmware\hid_kbの下の"hid_kb.Uv2"をダブルクリックして、Keil uVision 2を起動する
I2Cを使用する部分をコメントアウトする
- "periph.c"の"TD_Init()"の以下の表をコメントアウトする
EZUSB_InitI2C(); // Initialize EZ-USB I2C controller
- "periph.c"の"TD_Poll()"の以下の表をコメントアウトする
EZUSB_ReadI2C(BTN_ADDR,0x01,&buttons); // Read button states EZUSB_WriteI2C(LED_ADDR, 0x01, &leds); EZUSB_WaitForEEPROMWrite(LED_ADDR);
こりだけ。
ビルドして、EZ-USB FX2LPの基板に焼いてみる。
デバイスマネージャーでVIDが"0x04B4"、PIDが"0x1005"のキーボードがいれば、そいつです。
さて、これではあまりにも面白くない。
動作も確認できない。
そうだ、思い切ってマウスにしてやろう。
USBデバイスでスクリプターを書き換える
- Keil uVsion 2で"dscr.a51を開く
これはUSBデバイスでスクリプターが8051のアセンブラで書かれたものだ。
下の方にスクロールしていくと、"HIDReportDscr"という、HIDデバイスのでスクリプターがある。
これを以下のように書き換える。
HIDReportDscr: db 05h, 01h ; Usage Page (Generic Desktop), db 09h, 02h ; Usage (Mouse), db 0A1h, 01h ; Collection (Application), db 09h, 01h ; Usage (Pointer), db 0A1h, 00h ; Collection (Physical), db 95h, 03h ; Report Count (3), db 75h, 01h ; Report Size (1), db 05h, 09h ; Usage Page (Buttons), db 19h, 01h ; Usage minimum (1) db 29h, 03h ; Usage maximum (3) db 15h, 00h ; Logical minimum (0), db 25h, 01h ; Logical maximum (1), db 81h, 02h ; Input (Data, Variable, Absolute), (3 button bits) db 95h, 01h ; Report Count (1), db 75h, 05h ; Report Size (5), db 81h, 01h ; Input (Constant) db 75h, 08h ; Report Size (8) db 95h, 02h ; Report Count (2) db 05h, 01h ; Usage Page (Generic Desktop), db 09h, 30h ; Usage (X), db 09h, 31h ; Usage (Y), db 16h, 01h,80h ; Logical Minimum (-127), db 26h, 0ffh,7Fh ; Logical Maximum (+127), db 81h, 06h ; Input (Data, Variable, Relative), (2 position bytes - X & Y) db 0C0h ; End Collection db 0C0h ; End Collection HIDReportDscrEnd:
これでなんとマウスになってしまう。
嘘だと思うなら、ビルドしてフラッシュしてみるがよい。
さっきと同じVID、PIDのマウスがデバイスマネージャーにあるはずだ!
これだけでは面白くないので、右クリックと左クリックも実装しよう。
ボタンを読み出す関数を実装する
- "periph.c"に以下のread_buttonを実装する
BYTE read_buttons (void) { BYTE PortA, Buttons; PortA = IOA; switch (PortA) { case 0xFE: //PA0 is "L" Buttons = 0x01; break; case 0xFD: //PA1 is "L" Buttons = 0x02; break; default: Buttons = 0x00; break; } return Buttons; }
PA0を左クリックに、PA1を右クリックにマッピングした。
どちらのピンもGNDに下げられると、そのボタンを押したと検出するようにする。
ボタンの値をレポートするようにTD_Pollを変更する
- "periph.c"の"TD_Poll()"を以下のように変更する
void TD_Poll(void) // Called repeatedly while the device is idle { if( !(EP1INCS & 0x02) ) // Is the EP1INBUF available, { buttons = read_buttons(); if ((oldbuttons - buttons) != 0) //Change in button state { EP1INBUF[0] = buttons; EP1INBUF[1] = 0x00; // X is 0 EP1INBUF[2] = 0x00; // Y is 0 EP1INBC = 3; } oldbuttons = buttons; } }
後はビルドしてフラッシュすればEZ-USB FX2LP基板がマウスの右クリック、左クリックとして動作する。