EspUsbDeviceのUSBスタックをTinyUSBから自作に変更

概要

ESP32系でUSBデバイス用のライブラリを作成していましたが、TinyUSBから自作スタックに変更しました。TinyUSB自体は非常に便利なのですがこの手の中間ライブラリで最終APIを提供しないものは今後はどんどん利用されなくなっていく方向かもしれません。

EspUsbDeviceとは?

GitHub – tanakamasayuki/EspUsbDevice
Contribute to tanakamasayuki/EspUsbDevice development by creating an account on GitHub.

上記のライブラリとなります。もともとはUSB HostのEspUsbHostライブラリがあり、対になるライブラリとして開発をしています。

バージョン0系 Arduino内蔵USBクラス

最初はArduinoの標準ライブラリを利用して試作をしていました。しかしながらキーボードとかで日本語対応するのが難しい作りであり、早々に諦めました。

バージョン1系 Arduino内蔵TinyUSB

内蔵USBクラスは自由度が無かったので、直接TinyUSBを呼ぶようになりました。キーボードなども自由に作成することができ、機能的にはある程度充実したのですが何個かの壁がありました。

TinyUSBはビルドオプションで機能を指定して、固定メモリを確保する作りになっています。多くの組み込み系だと妥当な作りなのですが、ESP32系のArduinoコアだとプリコンパイルされている状態で同梱されているので設定が一切変更できません。

バージョン2系 ビルドインTinyUSB

ライブラリの中にTinyUSBを取り込むことにより、ライブラリからビルドオプションを変更できるようになりました。メモリに関することや、転送速度に関係するパラメーターなどを触れるようになったので基本的には完成したつもりでした。。。

ただし、どうしてもビルド時の設定はArduinoとの相性が悪かったです。一応ESP32系の場合にはbuild_opt.hというファイルをプロジェクトの中に入れておくとビルド時に-Dで取り込んでくれます。しかしながら-Dオプションを自分で書くのは結構面倒ですし、ハイスピードのUSBデバイスで速度を出そうとすると毎回固定のオプションが必要になります。

バージョン3系 自前USBスタック

もともとはWCH社のCH32V系のArduinoコアを作成しているときに、USBスタックにTinyUSBを使おうとしたのですが、結構対応していないチップがあったのでTinyUSBを拡張するより、スタックごと自作した経験がありました。

ESP32系も同じ用にユーザーが利用するAPIは極力触らずに、中間のUSBスタックを全部入れ替えることでTinyUSBを利用しない構成になりました。これによりメモリ確保なども固定ではなく、利用時に利用した分だけ確保する構成に変更になっています。

まとめ

いろいろライブラリを作成しているのですが、AIを使うことによって安定したライブラリの上に開発をするようになるのかなと思っていたら、最近はライブラリも利用せずにスクラッチでAIが実装することが増えているように思えます。

とはいえ、動作検証が重い機能はまだまだライブラリの出番があると思いますし、MITとかのゆるいライセンスでライブラリを公開するとAIが学習する教材になるので意味はあるのかなと思っています。

ただTinyUSBのような中間層で、ユーザーが直接利用する便利なAPI層を提供しないライブラリは徐々になくなるかもしれません。いまのところ、TCPとかTLSとかのアルゴリズムとか暗号化関連はスクラッチよりは安定したライブラリが選択されがちです。

コメント