【STM32】Custom Human interface Device Classを使う

僕の住んでいるウンコ・寮ではゲーム機の持ち込みはおろかゲームコントローラの持ち込みすら禁止されています。携帯ゲームがある今その寮則は機能しているのだろうか….

そんな中カービィ64がやりたくなってしまったのでどうしたもんかと考えた結果、自分で作ってゲームコントローラではなくただのマイコンとボタンだと言い張ろうということになりました(アホくさ)

使用するマイコンはもちろんSTM32です。使い慣れてるというのもありますがいつの間にか大量に買い込んだBluePillがあります…

 

まず、レポートディスクリプタを作成します。

これを作るためにはコントローラの仕様(軸とかボタン数とか)を決める必要があります。なので今のうちに仕様を固めておきましょう。

まあハードウェアを作っていないならいつでも変更は効きますが面倒です…

で、レポートディスクリプタを手で書くのは大変なので作ってくれるツールがUSB.orgよりリリースされています。

約20年前の古臭いツールでよく落ちるので気をつけてください。落ちる頻度は昔のOfficeぐらいです(

作り方はここでは触れませんが、完成したらSave asからHeader Fileで出力します。

参考まで、僕のカービィコントローラのディスクリプタは

こんな感じです。下の方のsize1,count2,INPUT(cnst,ary,abs)はパディングです。

レポートのサイズが8ビット区切りになっていないとうまく認識されないので注意してください。

 

できたらプロジェクトに流し込みます。

CubeMXで適当にFull-SpeedのUSBを設定し、MiddlewareからUSB_DEVICEを開きます。

Human Interface DeviceとかいうHIDデバイスになれそうな項目がありますが、それにするとマウスになってしまっていじるのが面倒です。

なのでプレーンなHIDデバイスになるCustom Human Interface Deviceを選択します。

そして忘れずにClass Parametersのレポートディスクリプタのサイズとレポートのサイズを変更します。

レポートのサイズは最大ぽいので大きめに取ればいいと思うのですが、現状16にしてても2バイト以上送ると失敗するのでよくわかりません…

 

いじり終わったらプロジェクトを生産して先程作ったディスクリプタを

usbd_custom_hid_if.cに書きます。

https://github.com/Haruroid/f1_kirby64/blob/master/Src/usbd_custom_hid_if.c#L95

みたいな感じに、

/* USER CODE END 0 */

のあとに

0xC0 /* END_COLLECTION */

があるので注意してください(消してもいいけど生産のたびに復活して面倒)

まあ大体のディスクリプタはC0で終わるのでそんなに問題はないと思います。

 

あとusbd_conf.cにmallocが定義されてなくてエラーになるのでmallocとついでにfreeを定義します。生産のたびに消えるので注意(バグやろ…)

https://github.com/Haruroid/f1_kirby64/blob/master/Src/usbd_conf.c#L585

 

ここまでくればUSBを刺したときにHIDデバイスとして表示されるはずです。

ディスクリプタ通りにボタンなどが認識されてるか確認してみてください。

 

認識されていたらあとは自分で書いたディスクリプタに従ってレポートを送るだけです。

https://github.com/Haruroid/f1_kirby64/blob/master/Src/main.c#L65

 

ただ、今の所何故か送るたびに2ms待たないとWindowsがエラーを吐くというのとレポートを2バイト以上送れないという問題があります。

これはバグなのか俺がミスってるのか…

 

というわけで、度々参照してましたが今回作ったプロジェクトは

https://github.com/Haruroid/f1_kirby64

にあります。

形はこんな感じになりました。カービィ64以外にもDSとかスーファミとかもできるような配置になっています😏

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です