|
|
AVR Bootloader FastBoot von Peter Danneggervon Karsten Donat
[Bearbeiten] Was ist ein Bootloader?Der Bootloader ist selbst ein kleines Programm. Es wird beim Start des Controllers zuerst ausgeführt. Damit sich das PC-Programm für das Firmware-Update 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 verloren, den der Bootloader benötigt. Da Peters Bootloader jedoch in ein 512Bytes (256 Worte!) großes Segment passt, stört das nicht weiter. Normalerweise wird der Programmcode des Mikrocontrollers mit einem ISP-Dongle in den Flash gebrannt. Aus verschiedenen Gründen kann dies jedoch nicht möglich/ gewünscht sein:
[Bearbeiten] Features
[Bearbeiten] Anforderungen an das zu ladende ProgrammBei AVRs ohne "boot reset vector fuse" (BOOTRST) wie beispielsweise ATtinys und kleinen ATmegas (ATmega48) muß der erste Befehl ein RJMP sein. Für C-Programme ist das automatisch sichergestellt (und für Assembler-Programme leicht selbst sicherzustellen). [Bearbeiten] Downloads
[Bearbeiten] Bootloader anpassen[Bearbeiten] CPU auswählen – BOOTLOAD.ASMDie CPU (der Atmel auf dem der Bootloader laufen soll) wird durch Einkommentieren der zugehörigen Include-Files ausgewählt. Im Beispiel für einen ATtiny45.
Dabei nicht vergessen, die bisher (per Default) ausgewählte CPU ATmega168 auszukommentieren:
[Bearbeiten] UART Port und Pins festlegen – BOOTLOAD.ASMDa die verwendeten Pins für die Schnittstelle frei wählbar sind, müssen diese noch eingestellt werden. STX_PORT: Hier den Sendeport angeben. Für die Pins des Hardware-UARTs des M8 wäre das Port D. Es müssen zwar nicht dieselben Pins sein, wenn man sie aber ohnehin als Schnittstelle nutzt, ist es sinnvoll, sie auszuwählen. Verwendet wird immer ein im Bootloader integrierter Software-UART, der auf beliebigen I/O-Pins lauschen kann.
Beispiel für gleiche Bepinnung wie Hardware-UART im ATMega 8, 48, 168 Für One-Wire-Betrieb muß für TX und RX zweimal der gleiche Pin angeben werden. Beim Assemblieren wird das erkannt und One-Wire aktiviert - es ist keine weitere Änderung nötig. [Bearbeiten] CPU-Frequenz und Wartezeit festlegen - FASTLOAD.HBei 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
Um die Wartezeit auf das Firmware-Update beim Booten anzupassen:
[Bearbeiten] Assemblieren des BootloadersDa 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) und der Bootloader kompiliert: avrasm2 -fI BOOTLOAD.ASM Es ist wichtig, dass die Includes des avrasm2 und nicht die der alten Version verwendet werden, da es sonst beim Assemblieren zu dem Fehler "fastload.h(112): error: Use of undefined or forward referenced symbol 'SRAM_START' in .org" kommt. Das AVRStudio lässt sich unter Linux auch mit WINE installieren (die IDE des AVR Studio 4 geht allerdings nur mit ein paar Tricks aus der AppDB - ist für das Assemblieren des Bootloaders aber nicht nötig). Wenn "avrasm2.exe" und die zum AVR passende Include-Datei (beispielsweise "tn45def.inc" für ATtiny45) im gleichen Verzeichnis wie die restlichen Dateien des Bootloaders liegen, kann der Bootloader mit folgendem Befehl assembliert werden: wine avrasm2.exe -fI BOOTLOAD.ASM [Bearbeiten] Brennen des BootloadersDer 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:\Test\m8 3686400.hex":i -U flash:v:"C:\Test\m8 3686400.hex":i -y Brennen mit AVRDude auf COM 1 und einem AVR910 kompatiblen Dongle (z. B. myAVR USB) [Bearbeiten] Einstellen der FusesDamit der Bootloader zu Beginn gestartet wird, müssen die entsprechenden Fuses gesetzt werden. Möglich ist dies u.a. mit der AVRDude GUI.
Bei einigen Controllern wie z. B. dem ATMega 48 wird das Flag
Auf dieser Website (Fusecalc) kann man sich die Fuses elegant zusammenstellen und erhält gleich die Parameter für avrdude. Eine schnelle und *sichere* Alternative zum fehlerträchtigen "Kaputtflashen" von Atmels. [Bearbeiten] Fuses mit myAVR ändernDer myAVR Dongle unterstützt mit AVRDude leider keine Fuses. Abhilfe liefert hier jedoch das myAVR Workpad Plus. Die Demo-Version (reicht hierfür) kann unter http://www.myavr.info/download/myAVR_WorkpadPLUS_Demo.exe 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 ProgrammesDamit das Programm mit Peters Tool in den Controller geladen werden kann, muss es im Intel HEX Format vorliegen. Im makefile Template von WinAVR (und auch der ATMegaIDE) ist dies standardmäßig eingestellt.
Danach wird Peters Firmware-Update Tool aufgerufen (hier COM2) 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. Peters Firmware-Update Tool lässt sich unter Linux leider nicht mit WINE starten, dafür aber mit DOSBOX. Der Aufruf ist dann der gleiche wie unter Windows. Wenn noch keine Firmware im Controller ist (direkt nach dem 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 Für Linux steht ebenfalls ein Programmiertool (aus diesem Beitrag) für die aktuelle Version 2.1 des Bootloaders für die Kommandozeile zur Verfügung, das auch den One-Wire-Betrieb unterstützt. Es lässt sich nach dem Entpacken durch ein simples "make" übersetzen. Die Verwendung ist analog zum DOS-Tool: ./bootloader -d /dev/ttyS0 -b 115200 -p tiny45test.hex ================================================= | BOOTLOADER, Target: V2.1 | ================================================= Port : /dev/ttyS0 Baudrate: 115200 File : tiny45test.hex Reading : tiny45test.hex... File read. Size : 2717 Bytes Program device. ------------------------------------------------- Waiting for device... connected (one wire)! Bootloader : V2.1 Target : 1E9206 ATtiny45 Buffer : 64 Byte Size available: 3582 Byte CRC enabled and OK. Programming : 00000 - 00A9D Writing | ##################################### | 100% Elapsed time: 0.79 seconds, 3439 Bytes/sec. ++++++++++ Device successfully programmed! ++++++++++ ...starting application [Bearbeiten] Bootloader-Support in ATMegaIDE 2007Die IDE kann wahlweise mit AVRDude und einem entsprechenden ISP-Dongle oder mit dem Bootloader das Programm in den Flash brennen.
[Bearbeiten] Anpassen des ProgrammsUm das Firmware Update komfortabler zu gestalten, kann ein Software-Reset eingebaut werden, der per RS232- bzw. USB-Schnittstelle oder Tastendruck ausgelöst wird. [Bearbeiten] TastendruckIn 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/USBAlternativ kann ein entsprechender Befehl über die RS232 gesendet werden. Standardmäßig ist dies 0xFF ‚R‘. [Bearbeiten] Einstellungen in der IDEDer Bootloader Support kann bei den Projekt-Eigenschaften eingestellt werden. Beim Brennen wird er dann automatisch benutzt. [Bearbeiten] ToDo[Bearbeiten] Komfortables Stand-Alone Firmware-UpdateBasierend 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 Versionskontrolle haben (die bisherige Soft- und viel wichtiger Hardwareversion wird überprüft). Eine Verschlüsselung der Firmware-Datei ist in Planung. [Bearbeiten] Automatisches Erzeugen des BootloadersSobald ich Zeit habe kommt in die IDE auch die Möglichkeit, die Anpassungen des Bootloaders von der IDE durchführen zu lassen. |