オペレーティングシステム:Ubuntu 18.04.3
カーネル:5.3.8
こんにちは :)
私はconfigfsを使用して複数のHIDガジェットを作成しようとしています。
4番目のガジェットを設定するまでは成功しましたが、
カーネルは5番目のガジェットの作成中にエラーメッセージを表示します。
エラーメッセージは次のとおりです。
# 4 successive gadget creation
g_mouse1 : /dev/hidg0
g_mouse2 : /dev/hidg1
g_mouse3 : /dev/hidg2
g_kbd1 : /dev/hidg3
# error occured
mkdir: cannot create directory ‘/config/usb_gadget/g_kbd2/functions/hid.usb0’: No such device
これ以上HID機能を生成できないようです。
だから私が気になるのは、
「ウィジェットの数に制限がありますか?」、
「ユーザーが制限を調整できる場合はどうなりますか?」です。
さらなる調査の結果、
Mass_storage関数は最大5個まで生成が可能で、
midi関数は10個以上生成が可能であることが確認されました。
したがって、各USBクラスには特定の制限があります。
しかし、私のプロジェクト要件はHIDクラスの制限を超えています。
これらの制限を操作する方法を知っている人はいますか?
ありがとう@モスビー!
問題が解決しました。
HIDG_MINORS
値を変更します/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
。- カーネルモジュールを再コンパイルします
/usr/src/linux-$(uname -r)/drivers/usb/gadget
。
アップデートが必要なカーネルモジュールは次のとおりです。- udc_core
- 複合ライブラリ
- usb_f_hid
これで最大HIDガジェットを作成できます。HIDG_MINORS
答え1
はい、HIDガジェットは4つしか作成できません。これはハードコードされた制限です。この問題を解決する唯一の方法は、コードを修正してモジュールを再コンパイルすることですusb_f_hid.ko
。
この制限は、Linuxがデバイスに動的州/マイナー番号を割り当てる方法に関連しています/dev/hidg#
。
~からdrivers/usb/gadget/function/f_hid.c
:
#define HIDG_MINORS 4
static inline int hidg_get_minor(void)
{
...
if (ret >= HIDG_MINORS) {
ida_simple_remove(&hidg_ida, ret);
ret = -ENODEV;
static struct usb_function_instance *hidg_alloc_inst(void)
{
...
status = ghid_setup(NULL, HIDG_MINORS);
int ghid_setup(struct usb_gadget *g, int count)
{
...
status = alloc_chrdev_region(&dev, 0, count, "hidg");
/dev/g_printer#
デバイスノード(=プリンタ、= gser + obex + acmなど)を作成する他のガジェットにも/dev/ttyGS#
同様の制限があります。