USB é assimétrico: existem mestres USB (seu PC) e escravos USB (os dispositivos). É por isso que existem dois tipos diferentes de conectores USB, tipo A para mestres e tipo B para escravos, embora a distinção esteja ficando borrada por designers de hardware usando o tipo A em todos os lugares, e o USB OTG pode fazer as duas coisas.
Dispositivos de dispositivo USB Linux são módulos do kernel que representam um dispositivo USB em um controlador escravo USB. Eles precisam de um controlador host (escravo) para se conectar; em um sistema Linux embarcado representando o dispositivo, esse seria o driver para o controlador USB. Em um PC não há hardware.
Mas há outro módulo do kernel que pode simular um controlador USB: dummy_hcd
. Este módulo fornecerá um controlador de host virtual (escravo) para os dispositivos se conectarem e um controlador de host virtual (mestre) que fornece um barramento USB adicional onde esses dispositivos são exibidos.
Exemplo:
# modprobe dummy_hcd
# lsusb
...
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# modprobe g_serial
# lsusb
...
Bus 005 Device 002: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
E você recebe dois novos nós de dispositivo, /dev/ttyGS0
de g_serial
para o gadget e /dev/ttyACM0
do módulo cdc_serial
carregado automaticamente que representa o dispositivo. Você pode testar se eles se comunicam escrevendo em um e lendo do outro.
Há também g_webcam
a um driver UVC de gadget. Ele cria um novo dispositivo /dev/video*
e, assim como /dev/ttyGS0
acima, você pode transmitir vídeo para este dispositivo para usar o gadget. E é isso que o programa de espaço de usuário uvc-gadget
faz: ele usa uma imagem estática ou outro dispositivo UVC "real" existente e o transmite para o recém-criado /dev/video*
, para que você possa alimentar seus dados reais do dispositivo USB e veja se ele sai corretamente no mestre USB que usa este dispositivo.
No entanto, parece que não funciona com o barramento dummy_hcd
(tentei agora): assim como acima, um dispositivo segundo /dev/video*
deve ser criado pelo módulo do kernel USB no lado mestre que usa a webcam. Isso não acontece; em vez disso, o sistema USB fica tão confuso depois de pouco tempo que não consigo mais usar meu teclado e mouse.
Portanto, g_webcam
tem bugs, ou possivelmente o subsistema de vídeo tenta criar os dois dispositivos com o mesmo identificador e, em seguida, quebra ou talvez outra coisa. Não sei.
Portanto, ele pode funcionar apenas em um sistema embarcado real com um controlador de host real (escravo).
Então, sim, existem ferramentas disponíveis que podem fazer isso, mas infelizmente a simulação é problemática se você quiser que o dispositivo simulado apareça no mesmo computador (um PC comum). Pode ainda funcionar em um sistema embarcado (você não disse onde e como deseja usar o dispositivo emulado).