Este artículo de werwolv.net ofrece una introducción accesible a la programación de dispositivos USB para desarrolladores, incluso aquellos sin experiencia profunda en hardware. La idea central es que escribir drivers USB no es tan complicado como se cree, y se puede lograr sin necesidad de sumergirse en el kernel del sistema operativo.
¿Por qué es útil? El desarrollo de drivers USB a menudo se percibe como una tarea intimidante. Este artículo desmitifica el proceso, mostrando que se puede interactuar con dispositivos USB desde el espacio de usuario (userspace) utilizando bibliotecas como libusb. Esto simplifica el desarrollo, la depuración y evita la complejidad de la programación a nivel de kernel.
¿Cómo funciona? El proceso comienza con la enumeración del dispositivo USB. Esto implica que el host (la computadora) solicita información al dispositivo para identificarlo. En sistemas Linux, la herramienta lsusb es útil para esto, mostrando el Vendor ID (VID) y el Product ID (PID), que son identificadores únicos del dispositivo. En Windows, se puede usar el Administrador de Dispositivos o herramientas como USB Device Tree Viewer. libusb proporciona una capa de abstracción, permitiendo a las aplicaciones de userspace comunicarse con el dispositivo USB sin necesidad de un driver específico del kernel. libusb carga un driver genérico y permite el acceso directo al dispositivo. La comunicación con el dispositivo se realiza a través de endpoints, que son puertos de comunicación con números específicos. Un ejemplo práctico es el envío de una solicitud GET_STATUS al endpoint de control (ID 0x00) para obtener información básica sobre el dispositivo, como si está alimentado por sí mismo o soporta el despertar remoto.
Casos de uso: Este enfoque es ideal para desarrolladores que necesitan interactuar con dispositivos USB personalizados, como un teléfono Android en modo bootloader (usado como ejemplo en el artículo). Es útil para crear herramientas de diagnóstico, firmware custom, o cualquier aplicación que requiera comunicación directa con un dispositivo USB sin depender de los drivers estándar del sistema operativo. Permite la creación de herramientas de bajo nivel para la depuración y el análisis de dispositivos.
Consideraciones: Aunque libusb simplifica el proceso, es importante tener en cuenta que algunos dispositivos pueden requerir drivers específicos en Windows, que se pueden reemplazar con Winusb.sys usando herramientas como Zadig. El artículo también menciona que, aunque se enfoca en userspace, la programación de drivers a nivel de kernel es un tema relacionado pero más complejo. La documentación del estándar USB (disponible en el artículo) es necesaria para interpretar los datos recibidos del dispositivo.
