Foodloader ist ein kleiner serieller Bootloader für Atmel ATmega Mikrocontroller. Nach Installation können Flashrom und EEPROM über eine serielle Schnittstelle programmiert werden. Das Programm passt in eine 512-words (1024 byte) Bootloader-Section. Diese Größe wurde durch weglassen der Funktionen zum Lesen und Schreiben von Lock- und Fusebits, die in einem Bootloader auch nicht verändert werden sollten.
Diese Mikrocontroller werden von der aktuellen Version unterstützt:
In der Entwicklungsversion werden weiterhin unterstützt:
Zunächst muss das Archiv in ein Verzeichnis entpackt werden. Ist eine andere Baudrate als 115200 Baud bei 16MHz gewünscht, muss der Wert für das Register UBRR im Datenblatt des Controllers nachgeschlagen und die Datei "uart.h" entsprechend editiert werden (Kommentare in der Datei beachten). Die Standardeinstellung ist, den Bootloader in der 512-Words (1024 Byte) Section zu installieren. Bei den meisten Controllern bedeutet dies, dass die BOOTSZ fusebits programmiert werden müssen, so dass BOOTSZ0 auf 1 und BOOTSZ1 auf 0 gesetzt ist (dies sollte im Datenblatt verifiziert werden). Wenn die 1024-Words Bootloader Section benutzt werden soll, kann im Makefile die genaue Adresse für den Bootloader eingestellt werden. Um den foodloader ordentlich benutzen zu können sollte zudem das BOOTRST fusebit aktiviert werden, damit nach dem Start des Controllers zunächst der Bootloader gestartet wird. So funktioniert der Bootloader auch wenn kein oder ein nicht funktionierendes Hauptprogramm installiert ist.
Vor dem Kompilieren sollte die Architektur und die CPU-Frequenz ausgewählt werden. Dies kann entweder durch Übergabe auf der Kommandozeile von 'make' oder durch Anlegen einer Datei 'config.mk', welche vom Makefile gelesen wird, passieren
Beispiel: ATmega8, 16MHz Takt:
$ make MCU=atmega8 F_CPU=16000000 avr-gcc -g -Os -finline-limit=800 -mmcu=atmega8 -DF_CPU=16000000 -std=gnu99 -DBOOT_SECTION_START=0x1c00 -Werror -c -o foodloader.o foodloader.c avr-gcc -mmcu=atmega8 -Wl,--section-start=.text=0x1c00 -L/usr/local/avr/avr/lib foodloader.o -o foodloader avr-objcopy -O ihex -R .eeprom foodloader foodloader.hex avr-objdump -h -S foodloader > foodloader.lss =============================== compiled for: atmega8 bootloader size is: 836 ===============================
Anmerkung: Alle Variablen, die im Makefile verwendet werden, können in der Datei 'config.mk' gesetzt werden. Beispiel:
SERIAL_DEV=/dev/ttyUSB0 ISP_DEV=/dev/ttyUSB1 ISP_PROG=avr109 AVRDUDE_BAUDRATE=115200 MCU=atmega644 F_CPU=20000000 DEBUG=1 CFLAGS += -DBOOTLOADER_DDR=DDRD CFLAGS += -DBOOTLOADER_PORT=PORTD CFLAGS += -DBOOTLOADER_PIN=PIND CFLAGS += -DBOOTLOADER_PINNUM=PIND7 CFLAGS += -DSEND_BOOT_MESSAGE=1
Jetzt kann die Datei "foodloader.hex" mit einer beliebigen Programmiersoftware installiert werden. Alternativ kann das eingebaute make-Target 'install' benutzt werden. Dabei wird dann avrdude zum Programmieren genutzt, die Programmierhardware und andere Parameter können im Makefile eingestellt werden.
Um den Bootloader zu starten ist in der Default-Konfiguration ein Pulldown-Jumper an PINC0 vorgesehen. Dies kann in der Datei config.h verändert werden.
Dieser Bootloader implementiert das von Atmel vorgeschlagene Protokoll aus der Application Note AVR109. Wenn SENDBOOTMESSAGE auf 1 gesetzt ist, scheibt der Bootloader beim Starten ein "ba" (wenn das Hauptprogramm gestartet wird) oder "bp" (wenn der Bootloader gestartet wird) auf die serielle Schnittstelle. Durch Senden eines "X" wird der Bootloader dazu veranlasst, direkt das Hauptprogramm zu starten.
Um diesen Bootloader mit avrdude verwenden zu können, muss das Protokoll auf "avr109" gesetzt und die Baudrate (mit -b) auf 115200 Baud eingestellt werden. Um beispielsweise die Datei "test.hex" in einen ATmega32 zu flashen, kann die Kommandozeile so aussehen:
$ avrdude -p m32 -b 115200 -u -c avr109 -P /dev/ttyUSB0 -U f:w:test.hex
Um diesen Bootloader mit einem ATmega88 oder ATmega168 zu benutzen, muss eventuell die avrdude Konfigurationsdatei angepasst und "avr910_devcode" auf 0x33 (ATmega88) oder 0x35 (ATmega168) gesetzt werden, da diese Controller (soweit ich weiss) noch einen offiziellen Devicecode haben. Diese Werte werden beim Kompilieren durch die Datei "config.h" in den Bootloader eingebaut. Eine funktionierende ~/.avrduderc kann hier heruntergeladen werden.