Impressum

Deutsch | English

foodloader Projektseite

Projektüberblick

Beschreibung

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.

Unterstützte Mikrocontroller

Diese Mikrocontroller werden von der aktuellen Version unterstützt:

In der Entwicklungsversion werden weiterhin unterstützt:

Installation

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.

Benutzen

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.

Downloads