LibIris
Contenido
Introducción
LibIris es la librería en python para descarga de programas en la tarjeta Skypic. Implementa el protocolo del PIC_Bootloader. Es necesario, por tanto, que el PIC_Bootloader haya sido grabado previamente en la Skypic. Además, permite cargar directamente los servidores del Proyecto Stargate.
Con esta libreria es muy fácil implementar aplicaciones de usuario en las que sea necesario descargar programas en la Skypic.
El nombre Iris viene de la película Stargate, donde se colocaba el Iris como 'interfaz' con la puerta Stargate.
Características
- Descarga de programas en la Skypic a través del PIC_Bootloader
- Descarga de los servidores del proyecto Stargate
- Lenguaje: Python
- Multiplataforma: Linux y Windows
- Licencia: GPL
Autores
- Rafael Treviño, (c) 2007 : Creación de la librería.
- Juan González, (c) 2007. Versión 1.2
Agradecimientos
Muchas gracias por las pruebas realizadas en Plataformas Windows a:
Muchas gracias a David, el autor de este estupendo artículo sobre cómo empaquetar un script python para Debian. En su blog sólo figura el nombre de David, no sé sus apellidos :-(
- A Ignacio González por probar la librería en un NSLU2 (arquitectura arm) y crear el paquete binario. Muchas gracias ;-)
Módulos
La libIris está formada por tres módulos:
- InteHex: Lectura y análisis de ficheros en formato .hex de Intel.
- Pic16_Bootloader: Implementación de los servicios ofrecidos por el Bootloader. Es el empleado para descargar ficheros .hex o Firmware en la Skypic.
- Pic16_Firmware: Este módulo contiene programas en código máquina listos para descargarse en la Skypic. Contiene lo siguiente:
- Monitor (Servidor genérico). Permite acceder a todos los registros internos del PIC a traves de los servicios de Load/Store
- Servos8. Posicionamiento de hasta 8 servos del tipo Futaba 3003 o compatibles.
- Picp. Grabación a bajo nivel de microcontroladores PIC
- Eco. Servidor de "Eco" para hacer pruebas. Se hace "eco" de todo lo recibido por el puerto serie
- ledp1. Clásico programa del led parpadeante
- ledp2. Led parpadeante pero a mayor frecuencia que ledp1.
- ledon. Simplemente enciende el led
Utilidades
Además de los módulos anteriores, la libIris viene con tres utilidades para consola, que también sirven de ejemplo de utilización:
- hex-view: Visualización de ficheros .hex. Permite ver el contenido de los ficheros .hex en diferentes formatos
- hex2python: Convierte un fichero .hex a un script en python que contiene el código máquina en forma de una lista
- skypic-test: Pruebas rápidas de la Skypic. Descarga el firmware ledp para hacer que el led de la skypic parpadee y comprobar de manera rápida si está funcionando.
Ejemplos de utilización
Lectura de un fichero .hex
El código para analizar un fichero .hex es muy sencillo. Basta con crear un objeto de la clase HexReader del módulo IntelHex, pasando como parámetro el nombre del fichero .hex. Si ocurre un error se produce una excepción. Este ejemplo abre y analiza el fichero ledp.hex:
import libIris.IntelHex
try: hr = libIris.IntelHex.HexReader ("ledp.hex") except libIris.IntelHex.ReaderError,msg: print "Error: %s" % msg sys.exit(-1)
El objeto hr contiene el código máquina. Se puede acceder a él mediante listas que pueden estar en tres formatos. Para generarlas se invocan los siguientes métodos:
- memory(): Devuelve una lista en la que cada elemento es la dirección y su contendido. El contenido es una tupla con el byte alto y luego el bajo.
- dataBlocks(): Devuelve una lista de bloques. Cada bloque es a su vez una lista en la que el primer elemento indica la dirección de comienzo y los siguientes son las palabras
- dataBlocks16(): Devuelve una lista de bloques en la que cada bloque tiene un tamaño no mayor de 16 palabras
Descarga de firmware
Este es un ejemplo de código que descarga el firmware ledp que se encuentra en el módulo Pic16_Firmware. No es necesario leer ningún fichero. El usuario puede incluir su propio firmware en sus programas utilizando la herramienta hex2python.
import libIris.Pic16_Bootloader import libIris.IntelHex import libIris.Pic16_Firmware
#-- Abrir puerto serie try: iris = libIris.Pic16_Bootloader.Iris("/dev/ttyUSB0") except libIris.Pic16_Bootloader.IrisError,msg: print msg sys.exit(-1)
#-- Obtener firmware a descargar. program = libIris.Pic16_Firmware.ledp2
#-- Realizar la descarga try: iris.download(program) except libIris.Pic16_Bootloader.IrisError,msg: print "\nError: %s" % msg sys.exit(-1)
Primero se crea un objeto de la clase Iris. Con ello se abre el puerto serie. Hay que especifica el nombre del dispositivo serie a emplear. En el caso de plataformas Windows se deben poner los nombres adecuados: COM1, COM2, etc.
A continuación se descarga el firmware usando el método download(). Si aparece un error se genera una excepción. En este ejemplo el firmware a descargar es el ledp2, obtenido de la librería PIC16_Firmware. Pero se podría utilizar uno del usuario.
Descarga de un fichero .hex
Este ejemplo es muy parecido al anterior, pero ahora el programa a descargar se obtiene a partir de un fichero .hex. Primero se abre el fichero. Luego se transforma al formato adecuado para su descarga. Se abre el puerto serie y finalmente se descarga:
import libIris.Pic16_Bootloader import libIris.IntelHex import libIris.Pic16_Firmware
try: hr = libIris.IntelHex.HexReader ("ledp.hex") except libIris.IntelHex.ReaderError,msg: print "Error: %s" % msg sys.exit(-1)
#-- Obtener el programa en el formato adecuado para su descarga program = hr.dataBlocks16()
#-- Abrir puerto serie try: iris = libIris.Pic16_Bootloader.Iris("/dev/ttyUSB0") except libIris.Pic16_Bootloader.IrisError,msg: print msg sys.exit(-1)
#-- Realizar la descarga try: iris.download(program) except libIris.Pic16_Bootloader.IrisError,msg: print "\nError: %s" % msg sys.exit(-1)
Prueba rápida en modo interactivo
También se pueden hacer pruebas directamente usando el modo interactivo de python. Con muy pocos comandos se pueden hacer pruebas de descarga. En este ejemplo se descargará el Firmware ledp2 que se encuentra en el módulo libIris.Pic16_Firmware y que hace que el led se ponga a parpadear.
El usuario debe sustituir el nombre del dispositivo serie por el correspondiente. En este ejemplo se usa el /dev/ttyUSB0 en Linux. En el caso de Windows habría que poner COM1, COM2, etc.
Los comandos tecleados por el usuario se han puesto en negrita
Python 2.4.4 (#2, Apr 5 2007, 20:11:18) [GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
>>> from libIris.Pic16_Bootloader import * >>> from libIris.Pic16_Firmware import * >>> iris = Iris("/dev/ttyUSB0") Serial port /dev/ttyUSB0 opened. >>> iris.download(ledp2) Reset Skypic Esperando Bootloader Bootloader OK
Descargando: *** OK Ejecutando programa >>>
Descargas
Última versión: 1.2
Fichero | Descripción |
---|---|
Libiris-1.2.zip | Fuentes |
python-libiris_1.2-5_i386-ubuntu-10.04.deb | Paquete para Ubuntu 10.04 |
python-libiris_1.2-5_i386-ubuntu-9-04.deb | Paquete para Ubuntu 9.04 (Jaunty Jackalope) |
Python-libiris_1.2-5_i386.deb | Paquete para Debian/Etch y Ubuntu 7.04 |
Python-libiris_1.2-5_arm.deb | Paquete para arquitectura arm. Probado en un NSLU2 |
libIris-1.2.win32.exe | Windows XP. Autoinstalable. |
Versiones anteriores
Fichero | Descripción |
---|---|
libIris-1.0.tgz | Versión 1.0. Acceso a su página: libiris-1.0 |
Cambios
- 13/Jun/2010: Añadido paquete para Ubuntu 9.10
- 29/Jul/2009: Añadido paquete para Ubuntu 9.04
- 26/Nov/2007: Añadido paquete binario para arquitecturas arm (probado en NSLU2). Por Ignacio González.
- 18/Sep/2007: Liberada versión 1.2!
- 16/Sep/2007: Publicada Version 1.2 RC1
- Paquete .tgz con las fuentes
- Paquete .deb para Debian
- 2/Sep/2007: La versión 1.0 está obsoleta. Se ha llevado a esta página: Libiris-1.0
- Junio/2007. Publicación de la version 1.0
Acceso al repositorio
- SVN del proyecto: http://svn.iearobotics.com/libIris/
- El arbol completo, incluyendo todas las versiones, se puede obtener así
svn co http://svn.iearobotics.com/libIris/
- La versión 1.2 se puede bajar así:
svn co http://svn.iearobotics.com/libIris/libiris-1.2
Historia
Versión 1.2
Los cambios con respecto a la versión 1.0 son:
- División de la librería en los tres módulos: IntelHex, PIC16_Bootloader y PIC16_Firmware. Cada uno resuelve un problema distinto. IntelHex para el parseo de ficheros .hex, PIC16_Bootloader para hacer clientes que descarguen firmware en la skypic y PIC16_Firmware donde está el código máquina de diferentes programas para el PIC, entre ellos todos los servidores del proyecto Stargate.
- La descarga del firwmare vía web se ha sustituido por la utilización del módulo PIC16_Firmware. De esta manera se puede utilizar en ordenadores sin conexión a internet. La funcionalidad de descarga web se incluirá nuevamente en siguientes versiones.
- Creadas las aplicaciones hex-view, hex2python y skypic-test que se distribuyen junto con la LibIris
- Creados scripts para su instalación mediante python setup.py install.
- Probado en plataformas Windows
- Probado en una NSLU2 (arquitectura arm) y creado paquete binario. (Por Ignacio González)
- Empaquetado para Debian y Ubuntu
- Autoinstalable para Windows
- Creada página man
- Creados programas de pruebas para la detección de errores
- BUGs corregidos
Versión 1.0
La versión inicial fue la libiris-1.0, creada por Rafael Treviño. Estaba constituida por un único módulo con toda la funcionalidad. Además incluía la posibilidad de descargar automáticamente el firmware del proyecto Stargate a través de la web.