USB/HIDが使えるようになった

140124a0PIC32MXでmicrochipのライブラリを使用せずUSBの機能を使えるように作業していたのだが、苦労の末、使えるようになった。

USB共通の処理、enunerationへの対応はスムーズにできたのだけど、そこから先はPC側のプログラムも必要になる。CDCクラスでシリアルデバイスのふりをすればPC側はputty等の端末ソフトで実験できるのでCDCクラスの機能の機能を実装してみると、これも比較的スムーズにできた。しかし、CDCクラスでは、PC側でCOMポートを選択してやる必要がある。HID(Human Interface Device)クラスならその必要がないので、HIDクラスで通信できるようになりたい。

HIDクラスでは、レポートデスクリプタというものをPC側に送ってやらなければならない。これで、PCとの通信内容を細かく記述できるのだが、PC側のドライバーが、このドライバーをどの程度利用しているかよくわからない。レポートデスクリプタの書き方を覚えるのが面倒なので、実験してみることにした。

HIDを操作するプログラムのやり方を調べるとHIDAPIというライブラリがあることを知る。Linux/Windows/Macに対応しており便利そうだ。添付のサンプルプログラムをWindowsで走らせるとHIDデバイスの列挙までは、すぐに動いた。Vendor_id/Product_idを設定し、その先の機能を試みると、デバイスをオープンでき、文字列等の取得はできるが、send_feature, get_feature, write, readが全て動かない。

Windows側のAPIでエラーになっており、USB上の通信は全く発生していない。

レポートデスクリプタのせいなのか、何のせいなのかわからない。サンプルプログラムはMicrochip社提供のサンプルプログラム「HID Custum Demos」が書き込まれたデバイスを対象としているように見える。

ここで、Microchip社のサンプルが、そのまま動く環境が欲しくなりPIC32 USB Starter Kitを購入したわけだ。ところが、USB Starter KitにHID Custom Demosを書き込んで試しても状況が変わらない。ここで解決策がみつからず、長いこと悩む。HIDAPIを疑い、いろんなversionを試したりしていた。

ある時、サンプルプログラムがreport1の読み書きを行っていることに気が付き、これを0に変更してみたところ writeとreadが動くようになった。

レポートデスクリプタに書かれたレポート番号とデータの長さが合っていないとWindowsのAPIのレベルでエラーになるらしい。このころにはレポートデスクリプタの内容が、なんとなくわかるようになったので、featureに関してもレポートデスクリプタに追加してやったところ send_feature, get_featureも動作するようになった。

Leave a Reply

メールアドレスが公開されることはありません。