Pi Zero como HID: ¿Cómo controlar el mouse de PC desde Pi Zero a través de USB?

10

Lo pregunto porque no he encontrado nada claro sobre este tema después de buscar durante días. Entonces, lo siento si la pregunta ya existe.

Estoy trabajando en un proyecto, solo por diversión, donde quiero controlar el mouse de la PC desde la Raspberry Pi. La entrada del usuario sería realizada por cualquier tipo de hardware conectado al RP, mi principal duda es sobre cómo controlar para enviar las instrucciones de movimiento a la PC desde el RP a través de USB.

Sé que tengo que habilitar el modo OTG para que la PC lo reconozca como un dispositivo usb, pero no tengo idea de cómo enviar los movimientos del mouse a la PC a través del USB y hacer que Windows / Linux lo entienda. Descubrí que existe el "Marco de API de gadget Linux-USB", pero no hay ningún ejemplo sobre su uso, y en realidad no sé si es el mejor enfoque.

¿Podría darme algunas pistas o recursos para ayudarme?

Muchas gracias.

Desproposito
fuente
Aquí hay un lugar para comenzar, creo: kernel.org/doc/Documentation/usb/gadget_hid.txt Hay un hid_gadget_testprograma mencionado allí, no tengo un pi a la mano, pero puede verificarlo apt-file search hid_gadget_test(y apt install apt-fileprimero si es necesario).
Ricitos de oro
@goldilocks No, su enlace se ve bastante perfecto, definitivamente es el lado derecho de la cerca. Por otro lado, viven los conductores HID habituales comousbkbd.ko
Dmitry Grigoryev
@goldilocks nah, en Linux, "gadget" siempre significa ejecutarse como esclavo, no como host.
hobbs
@hobbs Tienes razón: lo adiviné allí porque no podía recordar de qué extremo g_etherse usa cuando se une el cero como un dispositivo de Ethernet (pero es el lado esclavo, el controlador del lado del host es el más genérico usbnet).
Ricitos de oro

Respuestas:

6

Intente usar el g_hidmódulo mencionado por @goldilocks:

  1. Agregue una línea dtoverlay=dwc2a su config.txty reinicie
  2. Inserte el controlador con modprobe g_hid
  3. Ejecutar hid_gadget_test /dev/hidg0 keyboard. Es posible que primero necesite compilar el programa, utilizando el código de muestra proporcionado aquí .

Otra forma más flexible de lograr lo que desea (sin escribir controladores personalizados) es usar gadgetfs . Conozco al menos un proyecto que convirtió una pequeña computadora ARM en un teclado / mouse / gamepad USB / Bluetooth usando este enfoque.

Desafortunadamente, el estado de gadgetfs en Rapsberry Pi es incierto. Este hilo sugiere que no funciona, pero no está claro lo que el autor intentó hacer exactamente. Sin embargo, sugiero probarlo:

  1. Agregue una línea dtoverlay=dwc2a su config.txty reinicie
  2. Inserte el controlador FS del gadget con modprobe gadgetfs
  3. Montar el sistema de archivos del espacio de usuario con mkdir /dev/gadget; mount -t gadgetfs none /dev/gadget/

Si no obtiene errores en este punto, podrá utilizar bibliotecas de gadget como esta para programar sus dispositivos USB personalizados.

Dmitry Grigoryev
fuente
1
¡Muchas gracias por su respuesta! Lo intentaré en ambos sentidos y te lo haré saber tan pronto como pueda.
Desproposito
1
@Desproposito ¿Alguna vez funcionó esto? Me encantaría una actualización
Sirens
@ Sirenas, lo siento, compre No pude hacerlo funcionar :( Pero intentaré otro enfoque tan pronto como tenga tiempo para probar otras formas.
Desproposito
@Desproposito ¿Podría decir qué es exactamente lo que no pudo hacer funcionar? ¿Pudiste a modprobelos conductores? ¿Podrías montar gadgetfs? ¿Podrías construir y correr hid_gadget_test?
Dmitry Grigoryev