configfsを使用して作成できるUSBガジェットの数に制限はありますか?

configfsを使用して作成できるUSBガジェットの数に制限はありますか?

オペレーティングシステム: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クラスの制限を超えています。
これらの制限を操作する方法を知っている人はいますか?


ありがとう@モスビー

問題が解決しました。

  1. HIDG_MINORS値を変更します/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
  2. カーネルモジュールを再コンパイルします/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#同様の制限があります。

おすすめ記事