BTBOOTLOADER

=Qué es un Bootloader?=

Un Bootloader es un código que se programa en los microcontroladores y permite que se puedan programar ellos mismos sin necesidad de programadores ISP o paralelos. El archivo de programación puede pasarse al microcontrolador por USART, SPI, I2C, USB o cualquier periférico que sirva para transferencia de archivos.

=Dónde se guarda el bootloader?= Algunos microcontroladores AVR tienen un espacio especial de memoria para guardar el bootloader. este espacio es configurable mediante fusibles, y permite protección de escritura mediante fusibles también. Si no es necesario el uso de bootloader, este espacio puede ser utilizado para el programa principal.

=Para qué un Bootloader?= Un bootloader tiene varias funciones. Evita que sea necesario un programador externo. En dispositivos destinados a la venta, como mp3 o cámaras, el bootloader permite realizar actualizaciones de firmware. Dentro de los documentos de Atmel se encuentran estándares para encriptar estos firmwares, evitando que se les realice ingeniería inversa para saber el funcionamiento de los dispositivos. La motivación para realizar un Bootloader mediante Bluetooth fue la creación del robot ODIN para el grupo de robótica de la universidad Vitesse. Debido a que se tenía que recoger el robot de la pista para programarlo y devolverlo repetidas veces durante su desarrollo, se buscó una forma de programarlo remotamente.

=Cómo se utiliza un bootloader?= Cuando se está programando el Bootloader, se programan fusibles para que el micro no empiece desde el espacio de memoria 0, sino desde el espacio de memoria correspondiente al bootloader. El Bootloader pregunta por una condición (generalmente un pin específico con nivel lógico bajo) para ver si empieza el bootloader o si se redirige al espacio de memoria 0 donde está el programa principal. Si no hay nada programado, el micro recorre todas las posiciones de memoria hasta llegar otra vez al espacio del bootloader. Como esto se quería utilizar para el robot, ésta no era la solución óptima ya que se tenía que reiniciar manualmente para iniciar el bootloader. Por lo tanto se realizaron modificaciones en el código para que por bluetooth se pudiera entrar al bootloader y programar el micro sin necesidad de tocar el robot.

=Bootloaders estándar= En la documentación de Atmel, se encuentra el bootloader estándar AVR109. Este estándar sirve para definir la comunicación entre el computador y el microcontrolador, permitiendo que se pueda programar con el programa AVRPROG. Además se encuentran variaciones para encriptar la información, como el AES Bootloader que permite usar el algoritmo de encripción AES, y DES Bootloader que permite usar el algoritmo DES de encripción.

=Bootloader base= Para este proyecto no se utilizó directamente el bootloader AVR109 encontrado en la página de ATMEL, sino que se basó una variación encontrada en internet que está mas documentada y es más fácil de usar. En esta página se encuentra la explicación del proyecto y el archivo. [[Media:Bootloader_base.zip]]. Este proyecto está listo para usar en atmega 8, 16, 32, 128 y 169. Para usar estos archivos se deben realizar los siguientes pasos:


 * Abrir el Makefile y escoger el micro que se va a utilizar.


 * Seleccionar el tamaño que que se quiere usar para el bootloader (este valor tiene que ser los mismos que los utilizados en los fusibles).


 * Abrir el archivo main.c y modificar la frecuencia seleccionada para el microcontrolador y el baudrate para la comunicación por usart.


 * Definir con qué pin se quiere iniciar el bootloader al realizar reset y seleccionar uno de los modos (START_SIMPLE a menos que se desee una funcionalidad diferente).

=Bootloader Modificado=

=Programación por bluetooth= Para programar es necesario tener los programas avrdude y avrprog.

Desde linux: Ejecute en el shell: sudo apt-get install ddd avrdude avr-libc gdb-avr gdb gcc-avr simulavr avrprog Si ya se tiene avrdude y las herramientas necesarias para compilar, se puede correr solamente sudo apt-get install avrprog

Como se necesita vincular un puerto al bluetooth, se corren los siguientes comandos: hcitool scan Con este se buscan los dispositivos bluetooth al alcance. En este caso se está utilizando un Bluetooth Modem - BlueSMiRF Silver de Sparkfun. Después se ejecuta el comando sudo rfcomm bind 0 MAC 1 en donde MAC se reemplaza por la dirección mac del dispositivo bluetooth. Este comando lo que hace es crear un nodo en la carpeta /dev/ que se relaciona con el bluetooth. Generalmente se puede encontrar como /dev/rfcomm0, pero esto puede variar así que es mejor verificar. Desde la carpeta en donde está el proyecto se escribe en terminal el siguiente comando:

sudo avrdude -c butterfly -p m16 -P /dev/rfcomm0 -U flash:w:plantilla_bootloader.hex

Butterfly es una tarjeta que tiene un bootloader con el mismo estándar (avr109) por lo que la transferencia funciona.

En este link se puede descargar una plantilla para usar el bootloader [[Media:Plantilla_para_Bootloader.zip]]. El Makefile está modificado para poder programar a distancia utilizando el comando sudo make load

=Información adicional= Bootloader FAQ