Universal Serial Bus (USB) es ahora un marco común y amplio para la comunicación en serie. La interfaz no sólo permite la comunicación en serie, sino que también funciona como fuente de alimentación electrónica. Afortunadamente, los microcontroladores AVR populares tienen capacidad de interfaz USB y pueden programarse para construir dispositivos USB. La especificación USB es larga e intimidante. Puede resultar una tarea difícil escribir un controlador USB específico para un dispositivo.
Afortunadamente, Dean Camera tomó una iniciativa para la comunidad AVR y creó un marco USB de código abierto para Atmel AVR8 habilitado para USB y (algunos de) los microcontroladores AVR32. El marco se llama Marco USB ligero para AVR (LUFA) y hasta ahora se ha publicado la cuarta versión del marco. El marco fue lanzado bajo la licencia permisiva del MIT. La biblioteca de código abierto es compatible con todos los AVR USB y placas AVR USB de Atmel.
La interfaz USB permite la comunicación punto a punto. El dispositivo que controla la comunicación de datos USB se llama host y el otro dispositivo que se opera se llama esclavo o periférico. El host controla la comunicación de datos enviando solicitudes a las que el periférico responde con descriptores. La primera solicitud que envía el host para un evento periférico adjunto es de enumeración. Durante la enumeración, la solicitud de enumeración del host y el dispositivo periférico envía su propia descripción, después de lo cual el host asigna una dirección y un número de terminal al dispositivo periférico. Los dispositivos periféricos USB se clasifican por clases. A continuación se muestra la lista de clases según la especificación USB:
1. Audio
2. Comunicaciones y control de los CDC
3. Dispositivo de interfaz humana (HID)
4. Clase de dispositivo físico
5. Imágenes fijas
6. Impresora
7. Almacenamiento a granel
8. Centro
9. Datos de los CDC
10. Tarjeta inteligente
11. Seguridad del contenido
12. Vídeo
13. Cuidado de la salud personal
14. Dispositivos de audio/vídeo
15. Dispositivo exterior
16. Dispositivo puente USB tipo C
17. Dispositivo de diagnóstico
18. Controlador inalámbrico
19. Dispositivo varios
20. Dispositivo de aplicación específica
21. Dispositivo específico del proveedor
Las clases USB son un medio para definir dispositivos en función de su funcionalidad, de modo que se pueda definir específicamente el formato de datos para diferentes tipos de dispositivos. Cada clase de USB tiene subclases (tipos de dispositivos que se bifurcan aún más) y sigue especificaciones USB específicas dentro del protocolo USB. Al igual que el dispositivo de clase de audio, seguirá la especificación de clase de dispositivo de audio dentro del protocolo USB. Consulte el sitio web del Foro de implementadores de USB para obtener más información sobre las clases de USB y las especificaciones de protocolo asociadas con ellas. El marco LUFA actualmente tiene controladores escritos para las siguientes clases de USB.
1. Clase de dispositivo de interfaz humana (HID)
2. Comunicaciones y control de los CDC
3. Impresora
4. Almacenamiento a granel
5. Subclase de actualización de firmware del dispositivo (DFU) de la clase de dispositivo específica de la aplicación
Por lo tanto, el marco se puede utilizar para crear USB HID, CDC, impresoras y periféricos de almacenamiento masivo o para implementar un controlador de host para las clases USB mencionadas anteriormente. Estos son los periféricos más comunes que se utilizan con las computadoras personales. El marco también viene con una gran cantidad de proyectos de demostración, que incluyen proyectos de demostración de dispositivos USB HID como mouse, teclado y joystick, proyectos de demostración de dispositivos de clase CDC como entrada de audio, salida de audio, dispositivo Ethernet y serie virtual, etc. los controladores específicos de clase escritos en el marco para implementar la funcionalidad específica del dispositivo. Al igual que el proyecto de demostración del teclado, utiliza el controlador HID Class para funcionar como un teclado HID genérico. El marco está escrito de acuerdo con la especificación USB 2.0 y tiene controladores de dispositivo y host para las clases de dispositivos USB mencionadas anteriormente. Los controladores incluidos en el marco admiten modos USB de baja, máxima y alta velocidad.
En la capa de aplicación del protocolo USB, la comunicación de datos se realiza a través de informes de uso y datos (entrada o salida). El marco LUFA tiene API de alto nivel, es decir, funciones que gestionan de forma independiente el envío de informes de datos o informes de uso, así como API de bajo nivel que implementan el protocolo USB para una clase USB en el nivel de implementación más bajo del protocolo específico. .
Ahora bien, debe quedar claro que
1. LUFA debe usarse para construir dispositivos periféricos USB en microcontroladores AVR.
2. LUFA se puede utilizar para fabricar periféricos USB específicos para HID, CDC, almacenamiento masivo, impresoras y aplicaciones.
3. LUFA incluye controladores genéricos tanto para host como para periféricos, por lo que los controladores de host USB para las clases USB mencionadas anteriormente también se pueden implementar usando LUFA.
4. LUFA incluye proyectos de demostración que ilustran el uso de controladores de clase específica para construir periféricos USB específicos o implementar un controlador USB del lado del host.
Descarguemos el marco LUFA y comencemos a explorar los archivos de la biblioteca. Cuando descomprime la biblioteca, contiene los siguientes archivos y carpetas.

Fig. 1: Captura de pantalla de la carpeta LUFA
Carpeta del cargador de arranque: cualquier periférico USB está controlado por el host, por lo que el microcontrolador del periférico debe contener un cargador de arranque para arrancar con el host. La carpeta Bootloader contiene los archivos del cargador de arranque para dispositivos de clase USB HID, CDC, almacenamiento masivo, impresora y DFU en carpetas separadas.

Fig. 2: Captura de pantalla de la carpeta Bootloader en LUFA
Carpeta BuildTests: la carpeta contiene las plantillas del controlador de la tarjeta y los módulos de prueba de compilación para el gestor de arranque.

Fig. 3: Captura de pantalla de la carpeta BuildTests en LUFA
Carpeta Demos: la carpeta contiene los proyectos de demostración que ilustran el uso de controladores específicos de clase para construir periféricos USB específicos o implementar el controlador host.

Fig. 4: Captura de pantalla de la carpeta Demos en LUFA
La carpeta contiene tres carpetas:
Dispositivo: proyectos de demostración para dispositivos que funcionan sólo como periféricos USB.
Doble función: proyectos de demostración para dispositivos que funcionan como periféricos y hosts.
Host: proyectos de demostración que ilustran la implementación de controladores de host específicos del dispositivo.
Hay proyectos de demostración que utilizan el controlador de clase USB de la biblioteca (dentro de la carpeta ClassDriver) y también API de bajo nivel (dentro de la carpeta LowLevel). El proyecto de demostración dentro de las carpetas ClassDriver accede a los controladores de biblioteca específicos de una clase USB (como HID, CDC, impresora, etc.) a través de las API disponibles para que el código de bajo nivel específico del dispositivo sea abstraído por las funciones que manipulan el propio informes de datos. Los proyectos de demostración dentro de la carpeta LowLevel acceden a los controladores de la biblioteca a través de funciones que manejan directamente la comunicación USB para la clase de dispositivo específica.
Carpeta LUFA: esta carpeta contiene los módulos de controlador reales utilizados para implementar el protocolo USB para diferentes clases de USB. La carpeta contiene los archivos de plantilla, los archivos de configuración y el paquete de desoxigenación.

Fig. 5: Captura de pantalla de la carpeta LUFA
Los módulos de controladores se encuentran específicamente en la carpeta Controladores. La carpeta contiene las siguientes carpetas.

Fig. 6: Captura de pantalla de la carpeta Controladores en LUFA
La carpeta Board contiene los controladores de la placa para los microcontroladores USB AVR. La carpeta Misc contiene varios controladores. La carpeta Peripheral tiene controladores para implementar código específico de AVR para interfaces ADC, SPI, TWI, Rs-232 y Serial SPI. Los módulos de controlador USB genéricos que realmente implementan el protocolo USB en el marco LUFA se encuentran en la carpeta USB. La carpeta USB contiene módulos de controlador específicos de clase USB (como HID, CDC, impresora, etc.) dentro de la carpeta Clase y tiene módulos USB de bajo nivel en la carpeta Core. Tiene un archivo USB.h que se importa a todos los proyectos de demostración y debe importarse a cualquier proyecto creado con LUFA. El archivo de encabezado USB.h importa además módulos de controladores específicos de clase USB (como HID, CDC, impresora, etc.) con capacidad para importar módulos de controladores del extremo del dispositivo o del host.
Carpeta de plataforma: la carpeta de plataforma contiene los controladores de plataforma de hardware específicos de la arquitectura.
Cómo utilizar LUFA
LUFA viene con una gran cantidad de proyectos de demostración. Los proyectos de demostración están preconfigurados para construirse y ejecutarse correctamente en el microcontrolador AVR AT90USB1287, montado en la placa Atmel USBKEY y funcionando a un reloj maestro de 8MHz. Los proyectos de demostración vienen en variedades ClassDriver y LowLevel.
Será recomendable comenzar con proyectos de demostración en la carpeta ClassDriver, ya que utilizan controladores de clase USB prefabricados para simplificar el uso de clases USB estándar (como HID, CDC, etc.) en aplicaciones de usuario. En estos proyectos de demostración, el módulo específico del proyecto y el archivo de encabezado se pueden modificar o reescribir para implementar un nuevo proyecto. De manera similar, el proyecto de demostración de teclado en la carpeta LUFA-Source-FolderDemosDeviceClassDriverKeyboard contiene los módulos Keyboard.c y Keyboard.h que se pueden modificar para crear un dispositivo de teclado HID personalizado. Los módulos de estos proyectos de demostración utilizan funciones que pertenecen a API de alto nivel que se ocupan directamente del uso o notificación de datos específicos de la clase de dispositivo USB.
Al igual que en Keyboard.c, la función CALLBACK_HID_Device_CreateHIDReport maneja los informes de entrada de datos y la función CALLBACK_HID_Device_ProcessHIDReport maneja los informes de salida de datos. Los informes de uso y datos son características de la capa de aplicación del protocolo USB.
Si utiliza otro microcontrolador que no sea AT90USB1287, se debe modificar el Makefile en la misma carpeta para configurar el código para el controlador AVR específico y su velocidad de reloj. Sólo se pueden utilizar controladores AVR cuyos controladores de tarjeta estén escritos e incluidos en el marco.
Para un control absoluto sobre la implementación de clases USB específicas (como HID, CDC, impresora, etc.), se pueden modificar proyectos de demostración de bajo nivel. En proyectos de demostración de bajo nivel, la clase USB requerida se implementa directamente mediante API de nivel inferior. Para modificar estos diseños, necesitará un conocimiento sólido del protocolo USB y su implementación para la clase USB específica (como HID, CDC, etc.). Si el trabajo en estos proyectos de demostración requiere que el ingeniero integrado piense en las especificaciones de clase USB, no será una sorpresa. Por lo tanto, a medida que avance en estos proyectos de demostración, descubrirá cómo se implementa realmente un dispositivo o controlador de host específico para una clase USB.
Además, el marco es de código abierto y un ingeniero integrado puede tener dificultades para escribir un controlador de placa (no disponible en el marco en este momento) o escribir un código de controlador (host y dispositivo) para una clase USB adicional.