Gibt es eine Begrenzung für die Anzahl der USB-Geräte, die mit Configfs erstellt werden können?

Gibt es eine Begrenzung für die Anzahl der USB-Geräte, die mit Configfs erstellt werden können?

Betriebssystem: Ubuntu 18.04.3
Kernel: 5.3.8


Hallo Leute :)
Ich versuche, mithilfe von Configfs eine Reihe von HID-Geräten zu erstellen.
Bis zur Einrichtung des vierten Gadgets war alles erfolgreich,
aber beim Erstellen des fünften Gadgets gibt der Kernel eine Fehlermeldung aus.
Die Fehlermeldung lautete wie folgt.

# 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

Es scheint, als ob die HID-Funktion nicht mehr erstellt werden kann.
Meine Frage ist also
: „Ist die Anzahl der Gadgets begrenzt?“ und
„Wenn der Benutzer die Begrenzung anpassen kann, wie kann das sein?“


Bei weiteren Recherchen
habe ich herausgefunden, dass bis zu 5 Massenspeicherfunktionen und
mehr als 10 MIDI-Funktionen erstellt werden können
. Für jede USB-Klasse gibt es also eine bestimmte Grenze.
Mein Projekt erfordert jedoch mehr als die HID-Klassenbeschränkung.
Kennt jemand eine Möglichkeit, diese Grenzen zu manipulieren?


Danke für@mosvy!

Problem auf diese Weise gelöst.

  1. Ändern Sie einen Wert von HIDG_MINORSin /usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c.
  2. Kernelmodul neu kompilieren /usr/src/linux-$(uname -r)/drivers/usb/gadget.
    Die folgenden Kernelmodule müssen aktualisiert werden.
    • udc_kern
    • libcomposite
    • usb_f_hid

Jetzt können Sie HID-Gadgets erstellen bis zuHIDG_MINORS

Antwort1

Ja, Sie können nur 4 HID-Geräte erstellen und dies ist eine fest codierte Beschränkung: Sie lässt sich nur umgehen, indem Sie den Code ändern und das usb_f_hid.koModul neu kompilieren.

Diese Einschränkung hängt damit zusammen, wie Linux dynamische Haupt-/Nebennummern für die /dev/hidg#Geräte zuweist.

Ausdrivers/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");

Ähnliche Einschränkungen bestehen für andere Gadgets, die Geräteknoten erstellen ( /dev/g_printer#= Drucker, /dev/ttyGS#= gser + obex + acm usw.).

verwandte Informationen