EZ-USBでUSB HID

再びEZ-USB、目標のUSB HIDだ(再び既視感・・・)

まず例題にあるサンプルにある"hid_kb"を"フラッシュ"できるようにしてみよう。


この開発キットに入っている参照実装はCY3684用のものだ。
このキットにはスイッチや7セグLEDがついているのだが、これらはI2Cで接続されているのだ。
これらを扱うものはコンパイルはできるが、今回使っているEZ-USB FX2LP基板に焼くとチップが動作しなくなってしまうのだ。
なので、今回はまずサンプルの"hid_kb"を基板に焼けるようにする。
つまりI2C周りのコードを全て削除してしまう。

サンプルプロジェクトを開く

  • (開発キットのルート)\Firmware\hid_kbの下の"hid_kb.Uv2"をダブルクリックして、Keil uVision 2を起動する

I2Cを使用する部分をコメントアウトする

	EZUSB_InitI2C();			// Initialize EZ-USB I2C controller
     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基板がマウスの右クリック、左クリックとして動作する。