martes, 5 de noviembre de 2013

programacion bootloader arduino con avr jtag mk2

Hacía tiempo que no publicaba nada!

Me he visto en la encrucijada de tener que grabar un ATMEGA328p "virgen" con el bootloader de arduino. Todo sería coser y cantar con el programador adecuado, es decir, cualquiera que sea ICSP. Los programadores ICSP de Atmel permiten el grabado pero no la depuración de los programas. Vamos que no puedes parar la ejecución, ejecutar paso a paso... Así que cuando tuve que comprar un programador me hice con un JTAG.

Existen multitud de equipos que disponen de conector JTAG de programación/depuración: móviles, routers, etc. Yo particularmente lo utilizaba para la programación de ATMEGA1281 y ATMEGA32. Cualquiera que esté metido en el mundillo OpenWRT sabrá de qué estoy hablando.

La cuestión es que el 328P no dispone de puerto JTAG. Sin embargo, el programador AVR JTAG MK2 permite que sea utilizado para la programación ICSP. Lo único que hace falta es usar el cable apropiado para adaptar el JTAG al ICSP. Es un cable sin electrónica, en pocas palabras, son solo cables.

Así que vamos al grano:

1) localizamos el hex del bootloader en /arduino/Arduino/hardware/arduino/bootloaders

2) Vemos los fuses necesarios en el fichero boards.txt

atmega328.name=Arduino Duemilanove w/ ATmega328

atmega328.upload.protocol=arduino
atmega328.upload.maximum_size=30720
atmega328.upload.speed=57600

atmega328.bootloader.low_fuses=0xFF
atmega328.bootloader.high_fuses=0xDA
atmega328.bootloader.extended_fuses=0x05

atmega328.bootloader.path=atmega
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F

atmega328.build.mcu=atmega328p
atmega328.build.f_cpu=16000000L
atmega328.build.core=arduino
atmega328.build.variant=standard


3) Grabamos los fuses

avrdude -p m328p -c jtag2isp -P usb:2822 -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m -v

4) Grabamos el bootloader

avrdude -p m328p -c jtag2isp -P usb:2822 -U flash:w:ATmegaBOOT_168_atmega328.hex -v


Para más información acerca de avrdude visita la página
avrdude es el programa con el que se interactúa con los programadores de AVR y clones.
2822 es el número de serie de mi programador. Es la forma que tiene avrdude de saber por dónde va a programar.

La cuestión es que no debe ir todavía muy fino, y seguramente es algún tipo de emulación (bit-banging). A la hora de verificar los resultados me ha lanzado errores varias veces. A la tercera es la definitiva.

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.15s

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as 5
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "ATmegaBOOT_168_atmega328.hex"
avrdude: input file ATmegaBOOT_168_atmega328.hex auto detected as Intel Hex
avrdude: writing flash (32670 bytes):

Writing | ################################################## | 100% 1.20s

avrdude: 32670 bytes of flash written
avrdude: verifying flash memory against ATmegaBOOT_168_atmega328.hex:
avrdude: load data flash data from input file ATmegaBOOT_168_atmega328.hex:
avrdude: input file ATmegaBOOT_168_atmega328.hex auto detected as Intel Hex
avrdude: input file ATmegaBOOT_168_atmega328.hex contains 32670 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 11.31s

avrdude: verifying ...
avrdude: 32670 bytes of flash verified

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK

avrdude done. Thank you.