Existe um limite para o número de dispositivos USB que podem ser criados com configfs?

Existe um limite para o número de dispositivos USB que podem ser criados com configfs?

SO: Ubuntu 18.04.3
Kernel: 5.3.8


Olá pessoal :)
Estou tentando criar vários gadgets HID usando configfs.
Foi bem-sucedido até a configuração do quarto gadget,
mas o kernel emite uma mensagem de erro durante a criação do quinto gadget.
A mensagem de erro foi a seguinte.

# 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 a função HID não pode mais ser criada.
Portanto, minha pergunta é
"O número de gadgets é limitado?" e
"Se o usuário pode ajustar o limite, como poderia ser?"


De acordo com pesquisas adicionais,
descobri que a função mass_storage pode ser criada até 5,
a função midi pode ser criada mais de 10.
Portanto, existe um limite específico para cada classe USB.
No entanto, meu projeto exige além da limitação da classe HID.
Alguém sabe como manipular esses limites?


Obrigado por@mosvy!

Problema resolvido desta forma.

  1. Altere um valor de HIDG_MINORSin /usr/src/linux-$(uname -r)/drivers/usb/gadget/function/f_hid.c.
  2. Recompile o módulo do kernel /usr/src/linux-$(uname -r)/drivers/usb/gadget.
    Os módulos do kernel que precisam ser atualizados são os seguintes.
    • udc_core
    • libcomposto
    • usb_f_hid

Agora você pode criar gadgets HID atéHIDG_MINORS

Responder1

Sim, você só pode criar 4 gadgets HID, e é um limite embutido no código: a única maneira de contornar isso é modificando o código e recompilando o usb_f_hid.komódulo.

Essa limitação tem a ver com a forma como o Linux aloca números maiores/secundários dinâmicos para os /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");

Existem limitações semelhantes para outros gadgets que criam nós de dispositivos ( /dev/g_printer#= impressora, /dev/ttyGS#= gser + obex + acm, etc).

informação relacionada