www.mikrocontroller.net

AVR Bootloader FastBoot von Peter Dannegger

von Karsten Donat

Inhaltsverzeichnis

[bearbeiten] Was ist ein Bootloader?

Der Bootloader ist selbst ein kleines Programm. Es wird beim Start des Controllers zuerst ausgeführt. Damit das PC-Programm für das Firmware-Update sich melden kann, wartet der Bootloader eine gewisse Zeit (hier 0,33 Sekunden) auf ein Zeichen über die serielle Schnittstelle (UART  RS232, USB). Kommt dies Zeichen wird die neue Firmware gebrannt. Andernfalls wird das eigentliche Programm des Controllers ausgeführt.

Dem eigentlichen Anwendungsprogramm geht natürlich der Platz den der Bootloader benötigt verloren. Da Peters Bootloader jedoch in ein 512Bytes (256 Worte!) großes Segment passt, stört das nicht weiter.

Normalerweise wird der Programmcode des Microcontrollers mit einem ISP-Dongle in den Flash gebrannt. Aus verschiedenen Gründen kann dies jedoch nicht möglich/ gewünscht sein:

  • Speed: Der ISP-Dongle kann langsam sein (z.B. myAVR mit aktuellem AVRDude)
  • PINs: Man braucht die PINs und will ISP abschalten ( Fuses, aber Vorsicht!, danach kann man nur mit dem Bootloader oder einem STK-500 noch an den Flash)
  • Komfort: Man möchte dem Kunden/ Nutzer die Möglichkeit geben, eine neue Firmware selbst einzuspielen. In der Regel hat dieser jedoch keinen ISP-Dongle zur Hand. Eine Rs232/ USB ist aber oftmals vorhanden.
  • Sicherheit: Man möchte dem Kunden nicht die Firmware in deassemblierbarer Form geben (über geänderten Bootloader kann die Datei verschlüsselt sein)

[bearbeiten] Downloads

[bearbeiten] Bootloader anpassen

[bearbeiten] CPU-Frequenz, Wartezeit - FASTLOAD.H

Bei XTAL die benutzte Frequenz des Controllers einstellen (jungfräuliche AVRs haben oft intern 1MHz aktiviert!). Im Standard Makefile von WinAVR steht die Frequenz unter F_CPU

.equ	XTAL		= 3686400	; 8MHz, not critical 

Um die Wartezeit auf das Firmware-Update beim Booten anzupassen:

.equ	BootDelay	= XTAL / 3	; 0.33s 


[bearbeiten] UART Port/ Pins – M*.ASM

Da die verwendeten Pins für die Schnittstelle freiwählbar sind, müssen diese noch eingestellt werden. Für einige Controller liegen bereits Definitionsdateien bei. Für den ATMega 8 heißt die Datei beispielsweise M8.ASM.

STX_PORT: hier den Sende Port angeben. Für den Hardware-UART des M8 wäre das Port D. Es muss aber nicht der Hardware-UART sein! (wenn man den aber eh als Schnittstelle nutzt ist es sinnvoll)

.equ    STX_PORT        = PORTD
.equ    STX_DDR         = DDRD
.equ    STX             = PD1
 
.equ    SRX_PIN         = PIND
.equ    SRX_PORT        = PORTD
.equ    SRX             = PD0

Beispiel für Hardware-UART im ATMega 8, 48, 168


Wenn man einen neuen Controller hinzufügen möchte, muss noch die BufferSize angepasst werden.


[bearbeiten] Compilieren des Bootloaders

Da der Bootloader in Assembler geschrieben ist, kann WinAVR nicht so ohne weiteres damit umgehen. Das einfachste ist, sich das AVRStudio von Atmel herunterzuladen http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725

Im Unterverzeichnis AvrAssembler2 befindet sich der benötigte Assembler. Das Einfachste ist, sich die unter Appnotes benötigte Include Datei des jeweiligen Controllers (oder das komplette Verzeichnis) und die avrasm2.exe ins Verzeichnis des Bootloaders zu kopieren.

Danach wird der Assembler aufgerufen (m8.asm für ATMega 8)

avrasm2 -fI m8.asm

Bootloader compilieren

Das AVRStudio lässt sich unter Linux auch mit WINE installieren (die IDE des AVR Studio 4 geht allerdings nicht). Der Aufruf des Assemblers ist dann:

wine avrasm2.exe -fI M8.ASM

Bootloader mit Hilfe von WINE compilieren

[bearbeiten] Brennen des Bootloaders

Der nun erzeugte Bootloader wird mit dem vorhanden ISP Dongle in den AVR gebrannt (Intel Hex Format)

"avrdude" -p m8 -c avr910 -P com1 -U flash:w:"C:\Developing\AVR\Test\Bootloader Peter Dannegger\fastload_V14\m8 3686400.hex":i
 -U flash:v:"C:\Developing\AVR\Test\Bootloader Peter Dannegger\fastload_V14\m8 3686400.hex":i -y

Brennen mit AVRDude auf COM 1 und einem AVR910 kompatiblen Dongle (z.B. myAVR USB)


[bearbeiten] Einstellen der Fuses

Damit der Bootloader zu Beginn gestartet wird, müssen die entsprechenden Fuses gesetzt werden. Möglich ist dies u.a. mit der AVRDude GUI.

  • BOOTRST muss auf 0 gestellt werden (aktiviert den Bootloader)
  • BOOTSZ muss auf 10 gestellt werden für 256 Worte

Bei einigen Controllern wie z.B. dem ATMega 48 wird das Flag

  • Selfprogramming enabled gesetzt.

[bearbeiten] Fuses mit myAVR ändern

Der myAVR Dongle unterstützt leider keine Fuses mit AVRDude. Abhilfe liefert hier jedoch das myAVR Worpad Plus. Die Demo-Version (reicht hierfür) kann unter

http://www.myavr.de/download/myAVR_WorkpadPLUS_Demo.exe - myAVR Workpad Plus Demoversion

heruntergeladen werden. Nach dem Installieren und starten im Menü Extras – Fuse- und Lock-Bits wählen. Das Programm ermittelt automatisch den aktuellen Status. Je nach Controller steht der Bootloader Support unter High oder Extended Fuses.

[bearbeiten] Brennen des eigentlichen Programmes

Damit das Programm mit Peters Tool in den Controller geladen werden kann, muss im Intel HEX Format vorliegen. Im makefile Template von WinAVR (und auch der ATMegaIDE) ist dies standardmäßig eingestellt.

# Output format. (can be srec, ihex, binary)
FORMAT = ihex

Danach wird Peters Firmware-Update Tool aufgerufen (hier COM 2)

fboot /C2 /Pmain.hex

hier wird die main.hex als Hauptprogramm gebrannt

Wichtig hierbei ist, dass der Dateiname der alten DOS Konvention entspricht. Also keine langen Dateinamen.

Wenn noch keine Firmware im Controller ist (direkt nach Installieren des Bootloaders) startet der Brennvorgang automatisch. Andernfalls wartet das Programm auf den Reset des Controllers. Peters Tool arbeitet nur mit COM1 bis COM4 zusammen. Also ggf. den USB Adapter im Gerätemanager umstellen.

Die Ausgabe sieht dann wie folgt aus:

C:\DOCUME~1\zzzzzz\Desktop\avr\_soft\fboot18>fboot18 /Ptest.hex /b9600 /c1
COM 1 at 9600 Baud: Connected (One wire)
Bootloader V1.8
Target: 1E9108
Buffer: 32 Byte
Size available: 1534 Byte
Program test.hex: 00000 - 00073 successful
CRC: o.k.
Elapsed time: 1.43 seconds

[bearbeiten] Bootloader-Support in ATMegaIDE 2007

Die IDE kann wahlweise mit AVRDude und einem entsprechenden ISP-Dongle oder mit dem Bootloader das Programm in den Flash brennen.


[bearbeiten] Anpassen des Programms

Um das Firmware Update komfortabler zu gestalten kann ein Software-Reset eingebaut werden, der per RS232/ USB Schnittstelle oder Tastendruck ausgelöst wird.

[bearbeiten] Tastendruck

In der mitgelieferten Standard.h gibt es den Befehl void Reset();. Er löst mit Hilfe des Watchdog-Timers einen Hardwarereset aus. Man kann jetzt z.B. auf einen bestimmten Tastendruck (-kombination) hin diesen Reset ausführen.

[bearbeiten] RS232/ USB

Alternativ kann ein entsprechender Befehl über die RS232 gesendet werden. Standardmäßig ist dies 0xFF ‚R‘.


[bearbeiten] Einstellungen in der IDE

Der Bootloader Support kann bei den Projekt-Eigenschaften eingestellt werden. Beim Brennen wird er dann automatisch benutzt.


[bearbeiten] ToDo

[bearbeiten] Support großer ATMegas

Peter und andere arbeiten momentan noch an der Anpassung für größere Controller wie den ATMega 128.


[bearbeiten] Komfortables Stand-Alone Firmware-Update

Basierend auf dem Code der IDE wird es im September noch ein Standalone Programm für das Firmware-Update geben. Es wird auch ein entsprechendes Protokoll zur Versionskontrollle haben. (bisherige Soft- und viel wichtiger Hardwareversion wird gechecked). Eine Verschlüsselung der Firmware-Datei ist in Planung.


[bearbeiten] Automatisches erzeugen des Booloaders

Sobald ich Zeit habe kommt in die IDE auch die Möglichkeit, die Anpassungen des Bootloaders von der IDE durchführen zu lassen.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net