Você está na página 1de 6

V-USB Firmware driver para AVR.

Aplicaciones en Comunicaciones.
Jacobi Diego
diego@jacobi.com.ar
Universidad Tecnológica Nacional Facultad Regional Paraná
Argentina – Entre Ríos - Paraná

keywords: usb, comunicaciones, protocolo, implementacion, avr


Resumen: Abstract:
Con este documento se explica y This document explains and illustrates a
ejemplifica un método de programación programming method used to connect an
utilizado para conectar una circuito electronic circuit that includes any AVR
electrónico que incluya cualquier microcontroller with a user interface on a
microcontrolador AVR con una interfaz de computer using the USB protocol.
usuario en una computadora mediante el
protocolo USB.

Son muchas las formas de poder establecer una comunicación USB con una
computadora. Algunas familias de microcontroladores de diferentes marcas ya poseen
módulos internos por hardware capaces de funcionar como esclavo haciendo mínimo uso
de código del programa. Otras familias van mas allá e implementan USB On-The-Go
capaz de comunicarse como Host con otro dispositivo, como lo hace celulares y PDAs por
ejemplo. Existen también otras soluciones externas al microcontrolador como la
ampliamente usada interfaz USB a UART de FTDI, el FT2232H, que permite a cualquier
microcontrolador con un puerto UART poseer una comunicación USB, o incluso por JTAG,
I2C, SPI o paralelo. O finalmente la solución en la que este texto se concentra.
La solución por software tiene una serie de muy baja velocidad es casi forzado para obtener
ventajas únicas que los métodos anteriores no el mejor rendimiento, y nunca es buena idea.
poseen, así como también una serie de
limitaciones. Ventaja: Puede ser completamente desconectado
por software, evitando así que consuma energía
Ventajas y desventajas de un driver USB: cuando no es usado, a diferencia de las demás
soluciones que requieren de una señal de clock
Ventaja: Un driver bien programado podrá ser adicional ya sea por cristal externo o por PLL,
usado en todas las familias de hace que el modo idle o de bajo consumo sea
microcontroladores de una marca o incluso de mas difícil de lograr.
varias marcas. La interfaz con el driver (o API)
puede ser constante entre marcas, permitiendo al Desventaja: Se puede usar solo un conjunto
programador portar fácilmente su firmware a finito de frecuencias de clock para poder
otra familia, posiblemente, muy diferente. mantener la sincronización, y ésta de vez en
cuando puede que se pierda, pero el driver se
Desventaja: No existe actualmente un driver encarga de recuperarla.
multimarca. En cambio los modulos externos
como el FT2232H si puede ser usado en Ventaja: Un driver tiene costo de producción
cualquier familia o marca. nulo.

Ventaja: Al no estar conformado por transistores, Desventaja: Las licencias y el par VID/PID para
un driver no ocupa tamaño físico en la aplicaciones comerciales no son siempre
electrónica interna del microcontrolador, gratuitos.
permitiendo que éste posea otros módulos en su
lugar. Ventaja: Un driver no se puede quemar y no se
suelda.
Desventaja: En cambio, un driver ocupa tiempo
de procesamiento. Aunque mientras no hay Ventaja: Puede ser usado en familias con
transferencias, el tiempo es un 5% o menos, y encapsulado DIP, ideal para pruebas en
mientras hay transferencias puede ser mucho protoboards.
mayor, pero el driver no detiene el firmware.
Ventaja: Puede ser usado junto con otro modulo
Ventaja: Los pines utilizados no están fijos y interno de USB y con otro externo como el
pueden ser cambiados por software a FT2232H pudiendo tener mas de una interfaz
conveniencia, por lo que usar comunicación USB. Por ejemplo, un modulo interno On-The-
USB no te quitará ese valioso pin de ADC o Go para comunicar con otro dispositivo como
PWM que te serviría de mucho usar. host y el driver como esclavo.

Desventaja: Una interrupción de alta prioridad Ventaja: No usa el puerto UART, por lo cual el
debe ser usada. mismo puede ser usado con otros propósitos,
como para conectar con otro dispositivo, como
Ventaja: Un driver puede no implementar interfaz de debugueado mandando caracteres a
completamente el protocolo haciendo uso una PC, como interfaz de bootloader por puerto
solamente de lo que necesita, puede incluso serie, etc.
violar algunas de las especificaciones, como por
ejemplo realizar una transmisión en masa en un Ventaja: Puede programarse para funcionar
dispositivo de baja velocidad. como bootloader por USB. Esto presenta una
ventaja adicional. Se puede programar para
Desventaja: Violar especificaciones cuando se simular ser un grabador ISP por USB como el
implementa USB por software en dispositivos de USBasp y usar el mismo software de grabación.
Hardware: de tensión con la corriente que circula.

El hardware adicional requerido por un driver 3.6[V ] Vcc


USB no es mas que una adaptación niveles de 1
4u7 1k5
tensión e impedancias entre el microcontrolador 68 C
y el bus. USB 2 D- D-
3 D+ D+
4
El host envía 0 [V] para un nivel bajo y 3.3 [V] GND 68
para un nivel alto. Por suerte aquí no tenemos
mucho problema ya que los AVR, incluso en 5V La tercera solución es convertir los niveles a la
de alimentación, reconocen estas tensiones como salida de cada pin y operar con el
nivel alto. microcontrolador en 5[V].

El único problema se encuentra en los datos 5[V ] Vcc


enviados por el dispositivo, ya que el host espera 1
2k2
un nivel bajo de entre 0 y 0.8 [V] y un nivel alto 68 C
de entre 2 y 3.6 [V]. USB 2 D- D-
3 D+ D+
4 68
Hay dos soluciones para este problema. GND
1M Z 3.6V
Una solución es alimentar el microcontrolador
con 3.3 a 3.6 [V], de esta forma las salidas Se puede usar Zenners de 3.6 V o de 3.3 V, pero
tendrán un nivel compatible con USB, mejor puede ocurrir que con estos últimos el Host no
inmunidad a ruido, transiciones rápidas de detecte la señal correctamente.
niveles, y si el circuito se alimenta con batería La ventaja de usar Zenners es que todo el
recargable, entonces podría ser recargado desde circuito puede funcionar a 5 V, se tienen una alta
el mismo bus del USB. velocidad de subida y bajada de los niveles, son
de bajo costo y fáciles de obtener.
Las desventajas es que los zenners no son todos
iguales y no son lineales y consumen mas
corriente en los niveles altos.

Frecuencia de clock:

Algunos reguladores pueden por si mismos La limitación que aquí tenemos es que en low
consumir mas de 500 uA, lo que viola el limite speed el bus trabaja a 1.5 Mbps, por lo tanto el
de bajo consumo del protocolo. 200 uA son clock debe ser un múltiplo de esta frecuencia
consumidos por la resistencia pull up de 1k5 que para máximo sincronismo.
determina la conexión low speed del protocolo, Un microcontrolador requerirá como mínimo de
quedando un máximo de 299 uA para el resto del 12 Mhz de clock para leer y guardar los datos del
dispositivo en modo bajo consumo. Un AVR de bus.
la familia ATmega requiere un mínimo de 1 uA Una conexión en full speed es de 12 Mbps y
en su mas bajo modo de bajo consumo. requiere de un clock de 48 Mhz, el cual es
frecuentemente generado con un PLL usando un
Otro circuito opcional es no usar regulador y cristal externo de 12 Mhz.
usar 2 diodos en serie desde la alimentación de Es por eso que la mayoría de los dispositivos
5V. Esto genera una caída de tensión entre 1.2 y USB poseen un cristal oscilador de 12 Mhz, sin
1.4 [V], pero puede generar muchos problemas embargo, gracias a que se trata de una
para usar con ADCs, ya que estos necesitan de implementación por software, podemos usar
una fuente estable, y los diodos varían la caída otras frecuencias de clock haciendo trucos
especiales para mantener el sincronismo. código portable entre distintas plataformas,
El driver V-USB para AVR posee un segmento permitiéndonos llegar a un más amplio mercado.
de código para cada frecuencia soportada. Entre
ellas 12, 15, 16, 16.5 y 20 Mhz. Por ello En el futuro se prevee que libusb-1.0 sea portado
dependiendo de la frecuencia de clock usada a Windows, esto significa que formarían parte
puede variar el tamaño compilado del driver. El del mismo proyecto, pero ese futuro aún no ha
menor tamaño es para las frecuencias de 16 y 20 comenzado y mientras tanto el API mas portable
Mhz. es el de la serie 0.1.
Los valores se consideran precisos. Esto
significa que un cristal de 11.9 Mhz no serviría. Clases de dispositivos:
Algunas de las frecuencias listadas, como la de
20 Mhz, solo están disponibles como osciladores Cuando diseñas un dispositivo, debes decidir
RC internos. Estos osciladores deben ser cómo debe presentarse ante el Host.
calibrados automáticamente por el driver. USB es un protocolo mucho mas complicado
Hay ejemplos sobre ellos en la página oficial delque RS232. No solo define los parámetros
driver. eléctricos o como viaja la información, si no
también como obtener información y como
Comunicación con la computadora: trabajar con un dispositivo determinado
agrupándolos en clases.
La comunicación con la computadora se Mientras que el protocolo básico está manejado
establece siempre a través del API del sistema por el driver, la comunicación y la
operativo. implementación de la clase respectiva es tarea
Esto agrega limitaciones en el mercado de del programador. Así, este puede elegir
nuestro producto, por lo que si queremos abarcar implementar entre varios tipos de clases:
todo el mercado tendremos que programar el – Custom Class Devices
software para cada uno. – Standard HID Class Devices
– Custom HID Class Devices
LibUSB es un proyecto de código abierto nacido – Other Devices
en linux que posee actualmente 2 versiones
mayores del API que define. Ambas Custom Class Devices:
incompatibles. La serie libusb-0.1 y la serie
libusb-1.0. Es la forma mas directa de implementar un
La serie libusb-0.1 está actualmente soportada dispositivo que no puede ser clasificado en
por una capa de compatibilidad (libusb-compat- ninguna otra clase. Cualquier dispositivo que no
0.1) en los sistemas Unix debido a que gran planee trabajar bajo el standard puede ser
cantidad de software aun lo usa, pero para implementado de esta forma.
software nuevo y drivers no es aconsejable su Ventajas: Fácil de implementar. Fácil de crear
uso. software en sistemas Unix.
Por esa razón en los ejemplos se incluyen Desventajas: En windows, se requiere crear un
códigos para ambas versiones. driver e instalarlo en cada computadora que se
La serie libusb-1.0 define un API mucho mas quiera el software. Si o si, un software debe ser
simple, limpio y completo que su predecesor, programado solo para dicho dispositivo.
pero lamentablemente aun no es posible su uso
en sistemas Windows. Como código de ejemplo se incluye el firmware
Actualmente solo la serie 0.1 es funcional en y software en el anexo USB_HelloWorld.
Windows.
libusb-0.1 y libusb-win32-0.1 son proyectos Standard HID Class Device:
independientes que implementan el mismo API
en todo aspecto posible, de forma que podemos Puedes diseñar tu dispositivo para que se
programar bajo el API 0.1 y hacer nuestro comunique como si fuera un dispositivo
estandard, como un mouse, teclado, joystick, una otros tipos de dispositivos del estandard.
fuente, etc.
Como para el host tu dispositivo es un HID, Ejemplos:
entonces ya sabe como comunicarse con él.
Ventajas: No se requiere drivers. Con este documento se proveen 4 paquetes de
Desventaja: Solo puede implementarse HIDs. Se ejemplos.
debe crear un HID Report Descriptor. Todos están explicados usando comentarios y
pensados para que el lector estudie el programa
Hay muchos ejemplos de implementaciones en en un orden dado, ya que los ejemplos mas
la página oficial del driver V-USB. avanzados no explican detalles explicados en
ejemplos menos avanzados.
Custom HID class device:
Cada ejemplo se compone de al menos 2 partes,
Es posible “mal usar” transacciones de datos el Firmware y el Software. El Hardware es para
definidas por la clase HID (originalmente todos el mismo.
diseñadas para describir el tipo de información Las herramientas utilizadas para el firmware y
que contiene un dato) de forma que podamos software son las siguientes:
enviar y recibir datos arbitrarios. – Codeblocks,
Con esta técnica se puede evitar los – V-USB,
inconvenientes con Microsoft Windows de – libusb / libusb-win32
forma que éste asigne el driver para dispositivos – WinAVR
HID automáticamente, y no necesites instalar tu
propio driver. En algunos ejemplos se provee en forma
Ventajas: No se necesita drivers. duplicada el software, para la versión 0.1 de
Desventajas: El largo de los bloques de datos libusb, la cual se encuentra disponible tanto para
esta definido en el Report Descriptor. Algunos Windows como para Unix, y la versión 1.0 que
sistemas operativos (como BSD) limitan el aún no se encuentra disponible para Windows.
acceso de libusb cuando el driver hid se ha El código está hecho para ser sencillo,
cargado. Es ligeramente mas complejo que el multiplataforma y mostrar las características de
primer caso. la comunicación y no persigue ninguna
aplicación especial.
Como código de ejemplo se incluye el firmware
y software en el anexo USB_HID_HelloWorld y El lector debe estudiar el código antes de obtener
ligeramente mas avanzado en el anexo conclusiones con el software ejecutado, y se
USB_HID_BufferTransfers. recomienda al lector en cada caso que realice
modificaciones a gusto sobre cada ejemplo para
Otra forma es implementar peticiones de tipo obtener una experiencia de aprendizaje mas
Vendor en un dispositivo HID tonto. rápida y rica.
Esto significa que el dispositivo se presenta
como HID pero no cumple la función como tal.
Esto ayuda a evitar las ventanas emergentes de
Windows cada vez que detecta el dispositivo y USB_ListDevices:
permite que sea accedido por libusb, pero Se trata de un programa de introducción a la
requiere de la instalación del driver de todas programación con libUSB. No posee firmware.
formas. Su única función es listar algunas de las
propiedades de los dispositivos USB que se
Other Devices: encuentran conectado al sistema.
No se llevan a cabo transacciones.
Una vez entendidas las cualidades del driver,
queda a capacidad del programador implementar USB_HelloWorld:
Es el primer ejemplo con Firmware que muestra
la implementación mas simple de un Custom
Class Device.
Se llevan a cabo las transacciones mas simples.

USB_HID_HelloWorld:
Este segundo ejemplo implementa el mismo
anterior pero en forma de un Custom HID Class
Device, por lo tanto no requiere instalar drivers.

USB_HID_BufferTransfers:
Este ejemplo implementa un Custom HID Class
Device y agrega un conjunto mas avanzado de
transacciones de datos, incluyendo transferencias
de buffers.

Referencias:
Especificaciones USB
Objective Development V-USB
FTDI Published Articles
WinAVR
Code::Blocks
LibUsb
LibUsb-Win32

Você também pode gostar