STM32のUSB OTG HOST機能を使って MSX/FM TOWNS でメガドラミニのUSBゲームパッドが使えたので、今度は手持ちのUSBゲームパッドも使えるようにしてみます。
その前に、Wiresharkで手持ちのUSBゲームパッドのレポートデスクリプタを収集します。
実はSTM32のライブラリにはレポートデスクリプタの処理があるにもかかわらず、使用していません。
仕方がないので、デバイスデスクリプタにレポートデスクリプタが入っていたのでこれを使います。
但し、厳密にレポートデスクリプタを解析するのは面倒なので、SizeとCount、Usageだけでバイト位置とビット位置を特定する解析機能を作りました。
動作確認は、起動してすぐ使えるMSXのカセットで行います。
まずはメガドライブミニです。
入力はX-Y、ボタンだけです。
それほど複雑なデスクリプタではないので、対応できました。
次はPCエンジンminiです。
入力はHATSW、ボタンです。
HATSWのニュートラル状態の検出で苦労しましたが、対応できました。
レトロビットジェネレーションズです。
これもHATSW、ボタンです。
対応できました。
次はBUFFALOのスーファミ風USBゲームパッドです。
途中でCollection Endが入っておりうまく認識できません。
おかげで解析コードをほとんど作り直す羽目になりました。
横着してUsageが出た時点で設定したのですが、きちんとUsageをPUSHしておいてInputで設定する必要があるようです。
工数がかかってしまいましたが、対応できました。
次はElecomのスーファミ風USBゲームパッドです。
なななんと、メガドライブミニとレポートデスクリプタが全く同じでした。
使いまわししているのか、標準化しているのでしょうか。
メガドライブミニで動いているので、当然対応できました。
LogicoolのUSBゲームパッドは専用ドライバを使うのか、複雑なHID記述になっていたため、対応できませんでした。
NEOGEO miniもWindows/Linuxでレポートデスクリプタが異なる(NEOGEO mini本体はLinux側)変わった仕様のため、対応できませんでした。