
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.
- Ändern Sie einen Wert von
HIDG_MINORS
in/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
. - 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.ko
Modul 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.).