Christians Webseite        << zurück        vor >>

Der OWL Bootloader

Bei meiner Suche nach einem "guten" Bootloader für Atmel-Prozessoren bin ich auf dieser Webseite gelandet.
Der Autor, Julien Thomas, stellt dort seinen "One-Way-Loader" vor:

OWL

Die Bezeichnung exzellent trifft es am besten! Das Konzept und die Umsetzung finde ich hervorragend. Meinen grössten Respekt vor dieser grossen Arbeit.


Dieser Bootloader ist für alle gängigen Controller der TinyAVR und MegaAVR Familie geeignet und sehr flexibel konfigurierbar. Als Programmierschnittstelle kann praktisch alles, was an einem Port, hängt verwendet werden. Eine kryptographische Absicherung ist direkt mit implementiert.

(Die von mir verwendeten Begriffe wie "Kodierung" oder "Verschlüsselung" sind vermutlich wissenschaftlich nicht ganz sauber..)

Die Vorgehensweise

Das Programmpaket enthält ein (Windows-)Programm (OWL.exe) und diverse Binär-Dateien mit Bootloader-Templates für jeden Prozessortyp. Das ZIP muss nur entpackt und abgespeichert werden. Die Ordnerstruktur darf nicht verändert werden.

Mit dem OWL-Programm generiert man einen individuell zugeschnittenen Bootloader. Als Basis werden dabei die mitgelieferten Templates benutzt, der Code wird automatisch passend gepatcht. Der Bootloader wird danach, ganz klassisch per ISP-Programmer, in den Prozessor geschrieben.

Die zu ladende Firmware wird mit dem Programm kodiert bzw encrypted (mit "Firmware" ist hier das eigentliche Haupt-Programm für den Atmel gemeint).

Das Laden der kodierten Firmware auf den Prozessor erfolgt über die bei der Bootloader-Erstellung konfigurierte Methode, im üblichen Fall über eine UART-Schnittstelle.

Besonderheiten

Über die Kodierung der Firmware wird eine effektive Methode implementiert um eine robuste Übertragung zu erreichen und Fehler zu vermeiden. Nebenbei wird auch die Firmware verschlüsselt. Das ist für einfache Anwendungen nicht wirklich nötig, schadet aber auch nicht.

Für die Kodierung einer Firmware muss immer auch die zugehörige Bootloader-Datei vorliegen. Sie enthält die individuellen Schlüssel.

Das OWL-Programm ist eine Kommandozeilen-Anwendung mit vielen möglichen Parametern. Besonders für Einsteiger, oder bei nur gelegentlicher Nutzung, ist das etwas lästig und verwirrend. Man sollte sich daher ein paar vordefinierte Batch-Dateien anlegen.
Zur bequemeren Bedienung habe ich mir deshalb eine Windows-GUI gebaut die alle Aktionen bündelt.
Atmel

Der Bootloader bringt seine eigene Software-UART Implementierung mit. Er kann daher auf jeden Port-Pin konfiguriert werden. Ein Rück-Kanal zur Synchronisierug ist nicht zwingend notwendig (daher der Name: One-Way-Loader). Das richtige Timing wird automatisch erkannt und eingestellt.

Beim Flashen des Bootloaders muss auf die korrekten Fuse- und Lock-Bits geachtet werden.

  • Die Fuse-Bits müssen passend zur späteren Firmware konfiguriert werden, z.B. Clock, Brown-Out und Watch-Dog
  • Der Bootloader hat einen Speicherbedarf von 512 Byte, BOOTSZ muss auf einen Wert >= gesetzt werden
  • Der Boot-Reset-Vector (BOOTRST) muss aktiviert werden
  • Die Lock-Bits können ungesetzt bleiben. Bei erhöhten Sicherheitsanforderungen sollte man den Bootloader-Bereich sperren

Sequenzen

Das Arbeiten mit OWL lässt sich in 3 Phasen einteilen:

  • Bootloader erstellen
  • Bootloader ins Target laden mit AVRdude
  • Firmware kodieren und übertragen
Einige Beispiele:

Bootloader erstellen owl.exe --device=m168P --rxport=D0 --txport=D1 --clock=8000 --timeout=255 --targetname=owl_loader_m168pb_d0.hex"
Bootloader ins Target laden mit AVRdude
Dieser Schritt wird nicht mit OWL.EXE gemacht sondern direkt mit AVRdude.
avrdude.exe -p m168PB -P COM3 -b 115200 -B 20 -c stk500v2 -e -U lfuse:w:0xE2:m -U hfuse:w:0xDF:m -U efuse:w:0xFD:m -B 1.1 -U flash:w:"C:\OWL_Bootloader\targets\owl_loader_m168pb_d0.hex":i
Firmware kodieren und übertragen
owl.exe --targetname=owl_loader_m168pb_d0.hex --flashfile=Test_1.hex --serialport=COM8 --baud=9600

Weitere Sequenzen

Das Kodieren und Übertragen der Firmware wird im Beispiel in einem Schritt zusammengefasst. Es kann aber Situationen geben in denen man diese beiden Schritte trennen möchte oder muss, z.B. wenn eine neue, kodierte Firmware zum Updaten weitergegeben wird. Die Bootloader-Datei ist in diesem Fall nicht verfügbar.

Das OWL-Programm erzeugt beim Kodieren automatisch im Hintergrund eine Datei die alle Übertragungdaten enthält. Sie wird im Transmissions-Verzeichnis unter dem zusammengesetzten Namen <target_filename>_<bootloader_filename>.owl abgelegt (im Beispiel: Test_1_owl_loader_m168pb_d0.owl). Diese Datei ist für die Weitergabe gedacht.

Firmware kodieren
owl.exe --targetname=owl_loader_m168pb_d0.hex --flashfile=Test_1.hex --transfile=Test_1.hex
Kodierte Firmware übertragen
owl.exe --transfile=Test_1_owl_loader_m168pb_d0.owl --serialport=COM8 --baud=9600 Diese Übertragung ist ein simples binäres Verschicken über eine COM-Schnittstelle. In einer Windows-Umgebung könnte man auch eine Batch-Sequenz verwenden:
mode COM1 9600,n,8,1
copy /b Test_1_owl_loader_m168pb_d0.owl COM1

Ebenso ist jedes Windows-Terminal-Programm dafür geeignet.

Optionen

Die möglichen Parameter-Optionen für das Programm sind sehr umfangreich. Eine Hilfsseite kann mit "owl.exe -h" aufgerufen werden. Detailliertere Bescheibungen finden sich im Quelltext. Die Parameter können in Lang- oder Kurzform benutzt werden (z.B.: -h oder --help).

Single Commands die nur Informationen ausgeben: --help
--license
--supported
--ownloaders
--transmissions
--version
--key

Basic Setup, single command für Spezialisten:
--randpool
Flags:
--verbose
--eepromerase
--flasherase

Parameter mit Zahlenangaben oder Dateinamen:
--device= das Kürzel für den Atmel-Prozessortyp, z.B. "m328p"
--baud= Baudrate für die Übertragung, z.B. "2400"
--clock= Die Taktfrequenz des Prozessor in kHz, z.B. "8000"
--timeout= Zeitspanne nach dem Booten innerhalb der auf eine Übertragung geprüft wird (8-Bit Wert, 100 entspricht 1.00 Sekunden, max 2.55 Sekunden)
--number= Anzahl der Bootloader die erstellt werden sollen, für Serienerstellung
--rxport= Port des Atmels auf dem Daten empfangen werden, z.B. "D0"
--txport= Port des Atemls auf dem Daten gesendet werden, z.B. "D1" (optional)
--targetname= Dateiname des neu generierten Bootloaders
--serialport= Serieller Port des PC für die Firmware Übertragung, z.B. "COM1"
--audiofile= Dateiname um die kodierte Firmware als WAV abzuspeichern
--remark= Anmerkungen die als Kommentar an den Binärcode des Bootloaders angehängt werden
--intpreamble= Länge der Präambel für die seriellen Übertragung, default 1.00 Sekunden
--outpreamble= Länge der zusätzlich angehängten Dummy-Sequenz nach der Übertragung, default 0.10 Sekunden
--eepromfile= Datei die in den Eeprom-Bereich geladen werden soll
--flashfile= Datei die in den Flash-Bereich geladen werden soll (die neue Firmware)
--transfile= Dateiname der kodierten Firmware
--encrypt= Dateiname für Test der Verschlüsselung
--decrypt= Dateiname für Test der Entschlüsselung


Probleme

OWL machte alles richtig, aber meine PC-Umgebung nicht.

Mit der Übertragung der .owl-Dateien hatte ich anfangs massive Probleme. Kleine Dateien wurden problemlos übertragen, grössere nicht. Die Ursache war der verwendete USB-UART Umsetzer. Das Modul mit einem CP1202 Chipsatz von Silicon Labs (oder dessen Treiber) funktioniert nicht sauber unter Windows 10. Alle Versuche mit Konfigurationsvariationen und Treiberversionen blieben erfolglos.

Die Probleme verschwanden mit dem Wechsel auf ein FTDI basiertes Modul.