chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

LCP1769でUSBサンプルを動かしてみる

最初何もマニュアルを読まずにLPCXpresso IDEを動かしたけど、デバイス1769を選んだ所でエラーになってワケが分からなくなった(この原因はまだ調べていない)。そこで、秋月から買った時に同梱されていたサンプルコードのビルドに沿ってUSBサンプルを動かした所、一応動いた。USBケーブルとボードとの接続は、黒→54pin 、白→36pin(USB-D-)、緑→37pin(SUB-D+)としました。電源はデバッグ用のUSBケーブルから供給しているので、USBケーブルの赤はLPCとは接続していません。

ボードのデバイスドライバの読み込みを含め、サンプルを動かすときのポイントは、以下

  • デモサンプルは、 LPC1000/LPC17xx/LPCXpresso1768.zipを選択、展開された中から、LPCXpresso1768_systick_twinkleを選択(完全に一致しているサンプルの一つ)
  • USBのサンプルはNXP_LPCXpresso1769_MCB1700_2011-02-11.zipに含まれる、USBHIDを使用(Keil MCB1700 board用らしいが、LPCXpressoでも動いた)
  • LPCXpressoのボードは刺しただけでは認識されず、デバッガを走らせるとドライバが読み込まれる。なんでこんな動きができるのか不明。

HIDとして認識されている。


HID USBヒューマンインターフェイスバイス
(LPC17xx USB HID)
USB\VID_1FC9&PID_8002\DEMO00000000

バイスディスクリプタとかPC側でツール使って解読したいけど、もうちょっと勉強が必要

■追記(2011/07/03)HIDを編集>デバッグ。。

ちゃんとHIDの仕様書を読まずに適当にGamePadに変えてみたら、正しく認識されなくなった。デバッグ用にUSBのデータをスヌープ(盗み見)するフリーツール(SnoopyPro)があって、それでちょっと見てみた。descriptorを端末からPCに送信する途中?で接続が異常になっているような。。これは端末がちゃんと返信処理をしていないから。。??それとも、読み込んだディスクリプタが間違っているからか。。??

ディスクリプション等の仕様書
http://www.usb.org/developers/docs/

USB開発についてまとめられているWiki(thaks)
http://mcn.oops.jp/wiki/index.php?USB%2FDevelop%2FUSB%20Protocol%20Analizer

Usb Sniffer for Windows(SnoopyPro)
http://sourceforge.net/projects/usbsnoop/

USB Noop tool商用版ソフト(でもよくできていそう)
http://www.usblyzer.com/download.htm

USB仕様書DLページ(OHCI)
http://h18000.www1.hp.com/productinfo/development/openhci.html

■追記 2011/7/7
やはり、HID Report Descriptorが間違っていた。最後のEND_COLLECTIONのコードを間違っていた。以下はボタン2つ付きのGamePadのディスクリプタサンプル


const uint8_t HID_ReportDescriptor[] = {
// HID_UsagePageVendor(0x00),
0x05, 0x01 , //USAGE_PAGE (Generic Desktop)
0x09, 0x05 , //USAGE (Gamepad)
0xA1, 0x01 , //COLLECTION (Application)
0x09, 0x01 , // USAGE (Pointer)
0xA1, 0x00 , // COLLECTION (Physical)
0x09, 0x30 , // USAGE (X)
0x09, 0x31 , // USAGE (Y)
0x15, 0x00 , // LOGICAL_MINIMUM (0)
0x26, 0xFF, 0x00 , // LOGICAL_MAXIMUM (255)
0x75, 0x08 , // REPORT_SIZE (8)
0x95, 0x02 , // REPORT_COUNT (2)
0x81, 0x02 , // INPUT (Data,Var,Abs)
0xC0 , // END_COLLECTION
0x05, 0x09 , // USAGE_PAGE (Button)
0x19, 0x01 , // USAGE_MINIMUM (Button 1)
0x29, 0x02 , // USAGE_MAXIMUM (Button 2)
0x15, 0x00 , // LOGICAL_MINIMUM (0)
0x25, 0x01 , // LOGICAL_MAXIMUM (1)
0x75, 0x01 , // REPORT_SIZE (1)
0x95, 0x02 , // REPORT_COUNT (2)
0x81, 0x02 , // INPUT (Data,Var,Abs)
0x95, 0x06 , // REPORT_COUNT (6)
0x81, 0x03 , // INPUT (Constant,Var,Abs)
0xC0 //END_COLLECTION
};

コンパネ>ゲームコントローラと辿ると、認識されたGamePadが表示され、プロパティで確認すると、確かにボタン2つになっている。今回の修正は、サンプルのUSBHIDプロジェクトの中のusbdesc.cの配列、HID_ReportDescriptorを変更した。なお、用意してくれているマクロは使わず、定数を直書きした。行儀悪い実装ですが。。

■補足

USB関連のサンプルを作ろうとしたとき、NXPのIDEがワケわからず、SH2に乗りかえを考えました。が!!SH2はUSB関連のサンプルがほとんど出ておらず(アプリケーションノートはあるけどソースコードが付いていない。ネット上にもほとんどUSBソースが上がっていない)、サンプルの多いARM系で作る事にしました。まだ手を入れていませんが、HID程度ならサンプルをコンパイルしただけで一発で動きましたからね。。