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

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

OS: 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
    • libコンポジット
    • 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#= プリンター、/dev/ttyGS#= gser + obex + acm など)。

関連情報