
SO: Ubuntu 18.04.3
Núcleo: 5.3.8
Hola chicos :)
Estoy intentando crear un montón de dispositivos HID usando configfs.
Tuvo éxito hasta que se configuró el cuarto gadget,
pero el kernel emite un mensaje de error durante la creación del quinto gadget.
El mensaje de error fue el siguiente.
# 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
Parece que ya no se puede crear la función HID.
Entonces mi pregunta es
"¿Es limitada la cantidad de dispositivos?" y
"Si el usuario puede ajustar el límite, ¿cómo podría ser?"
Según investigaciones adicionales,
descubrí que la función mass_storage se puede crear hasta 5,
la función midi se puede crear más de 10.
Por lo tanto, existe un límite específico para cada clase de USB.
Sin embargo, mi proyecto requiere más allá de la limitación de la clase HID.
¿Alguien sabe la manera de manipular esos límites?
Gracias por@mosvy!
Problema resuelto de esta manera.
- Cambiar un valor de
HIDG_MINORS
en/usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c
. - Recompilar el módulo del kernel
/usr/src/linux-$(uname -r)/drivers/usb/gadget
.
Los módulos del kernel que deben actualizarse son los siguientes.- udc_core
- libcompuesto
- usb_f_hid
Ahora puedes crear gadgets HID de hastaHIDG_MINORS
Respuesta1
Sí, solo puedes crear 4 dispositivos HID y es un límite codificado: la única forma de evitarlo es modificando el código y recompilando el usb_f_hid.ko
módulo.
Esta limitación tiene que ver con cómo Linux asigna números mayores/menores dinámicos para los /dev/hidg#
dispositivos.
Dedrivers/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");
Existen limitaciones similares para otros dispositivos que crean nodos de dispositivos ( /dev/g_printer#
= impresora, /dev/ttyGS#
= gser + obex + acm, etc.).