Hallo,
vor einigen Tagen habe ich begonnen den AES Bootloader (Application Note
AVR231) für den avrgcc umzuschreiben.
Meinen bisherigen Erfolg könnt ihr im angehängten Dokument sehen.
Achtung, es wurde für einen Atmega128 geschrieben. Von daher kann es
vorkommen dass ihr beim kompilieren Fehler bekommt wegen unbekannten
Registern (UDR0 statt UDR & co.).
Die Übertragung (und CRC Berechnung) und Entschlüsselung klappt
mittlerweile wie gewünscht, allerdings werden nur die ersten 92 Bytes
des Hex Files richtig entschlüsselt. Danach werden nur noch vollkommen
falsche Daten aus dem verschlüsselten Stream erzeugt.
Daher meine Frage:
Hat schon jemand den AES Bootloader für den avrgcc fertig portiert und
kann mir hier weiterhelfen, bzw. den Source zur Verfügung stellen?
Grüße,
Patrick
P.s. An alle die den Bootloader mal ausprobieren wollen:
Uart0 (Datenempfang vom PC) ist auf 9600 8N1 eingestellt.
Die PC Software zur Datenübertragung gibt es hier:
http://www.atmel.com/dyn/resources/prod_documents/AVR231.zip
So, ich habe nun ganz einfach den (kostenlosen) IAR Kickstart Compiler
runtergeladen und damit kompiliert. Läuft zuverlässig.
Vielleicht habe ich ja irgendwann nochmal Zeit das Ganze avrgcc
kompatibel zu machen.
Hallo Patrick,
ich bin sehr neugierig, was Du anders gemacht hast, als ich.
Ich versuche den AES Bootloader für den ATMEL atmega2561 ans Laufen zu
bringen.
Aber auch wenn ich mit den Werten für den atmega128 arbeite, schmeißt
mein IAR beim linken eine Fehlermeldung raus.
Hast DU noch etwas verändert?
Der IAR Compiler kommt mit dem BOOTFLASH nicht klar (RANGE Error).
Ich wäre über eine kurze Antwort dankbar.
Gruß
Michael
Hallo zusammen ...
... ich sitze im Moment auch an einer Portierung des AES Bootloaders auf
den atmega1281.
Ich benutze ebenfalls die Kickstart Version des IAR Compilers.
Aber so wie es aussieht, wird die folgende Abfrage im Modul loader.c
[void loader(void)] mit dem else Zweig verlassen, weil die Abprüfung der
Signatur nicht funktioniert:
----------------------------------------
// Check that the signature is correct
if ((*p++ == (unsigned char)(SIGNATURE >> 24)) &&
(*p++ == (unsigned char)(SIGNATURE >> 16)) &&
(*p++ == (unsigned char)(SIGNATURE >> 8)) &&
(*p++ == (unsigned char)(SIGNATURE >> 0))){
...
}
else
busReplyByte(ERROR_CRC);
----------------------------------------
und deshhalb wird auch das FLASH des Controllers nicht beschrieben.
Auf dem atmega128 funktioniert alles einwandfrei.
Habt Ihr da vielleicht noch eine Idee??
Falls Ihr ein schon funktionierendes Projekt auf Basis des IAR Compiler
für den 1280/1281/2560/2561 habt, wäre ich über input sehr sehr
dankbar!!!
Danke und Grüße
Michael
>---------------------------------------->// Check that the signature is correct>if ((*p++ == (unsigned char)(SIGNATURE >> 24)) &&>(*p++ == (unsigned char)(SIGNATURE >> 16)) &&>(*p++ == (unsigned char)(SIGNATURE >> 8)) &&>(*p++ == (unsigned char)(SIGNATURE >> 0))){
Es könnte sein das der Compiler da etwas draus macht
was man nicht erwartet ! Das *p++ ist hier gefährlich.
----------------------------------------
// Check that the signature is correct
if ((p[0] == (unsigned char)(SIGNATURE >> 24)) &&
(p[1] == (unsigned char)(SIGNATURE >> 16)) &&
(p[2] == (unsigned char)(SIGNATURE >> 8)) &&
(p[3] == (unsigned char)(SIGNATURE >> 0))){
oder so ähnlich ist auf jeden Fall besser.
Hallo Michael,
in den Projekteinstellungen unter dem TAB des Linkers werden noch
Optionen eingestellt. Die Application Note des AES Bootloaders (findest
Du auf der Homepage von ATMEL) sagt, dass man bei den Einstellungen für
den Linker folgendes beachten muss:
Es müssen die Einstellungen für den Prozesser verändert werden.
Bei mir haben folgende #define Anweisungen funktioniert:
BOOT_SIZE=1000
FLASH_SIZE=40000
IVT_SIZE=CC
RAM_SIZE=2000
RAM_BASE=200
APP_SRAM_USAGE=41F
beim APP_SRAM_USAGE könnte Dir aber 41E reichen, wir haben den Code noch
für eigene Zwecke ergänzt und brauchten deswegen mehr Platz.
Ob Du bei der BOOT_SIZE mit weniger als 1000 auskommst, musst Du selbst
beurteilen. Dann aber die passenden Werte beim Flashen des ATMega2561
nicht vergessen.
Der Punkt, den Du aber vermutlich nicht gefunden hast, ist folgender:
Unter ASSEMBLER den Punkt Preprozessor aufrufen. Dort bei Include
directories folgendes eintragen (vermutlich): $TOOLKIT_DIR$\INC\
Und nun kommt es. bei Defined symbols musst Du die Anweisung / Option
_MEMSPM_ heraus löschen, da das entsprechende Register (siehe Atmel AN
AVR231 Seite 22) nicht oberhalb der Adresse 0x3F liegt.
Meine Einstellungen lauten dort also:
INCLUDE_FILE="iom2561.h"
SPMREG=SPMCSR
_RAMPZ_
so, das müsste Dir dann weiterhelfen.
Würde mich freuen hier kurz zu lesen, ob es Dein Problem war.
Grüße
Michael
... ich bin es noch einmal
... erst einmal vielen Dank für Deine Tips Michael.
Das mit dem Löschen des "__MEMSPM__" Eintrags wusste ich bereits.
Aber das was mir wirklich weitergoholfen hat war die Beschreibung:
----------------------------------------
BOOT_SIZE=1000
FLASH_SIZE=40000
IVT_SIZE=CC
RAM_SIZE=2000
RAM_BASE=200
APP_SRAM_USAGE=41F
----------------------------------------
.
Für den atmega1281 musste ich das ganze aber noch verändern:
----------------------------------------
BOOT_SIZE=1000
FLASH_SIZE=20000
IVT_SIZE=CC
RAM_SIZE=2000
RAM_BASE=200
APP_SRAM_USAGE=41E
----------------------------------------
... un damit hat es dann funktioniert.
Vielen Dank für Eure Mühe.
Viele Grüße
Michael
Hallo Michael,
dann bin ich ja froh, dass es nun funktioniert.
Ich hoffe mal, dass Du nicht ganz so lange nach dem Fehler gesucht hast,
wie ich. Ein paar Tage sind schon drauf gegangen, dafür ist mir aber nun
einiges klarer.
Das mit dem 1281 habe ich mal geschmeidig überlesen ...
Aber mit etwas Hirnschmalz hat es ja dann auch gepasst.
Viel Spaß noch ... :-/
Micha
Hi,
nun bin ich auch an diesem Punkt. Für mich und zukünftige Besucher wäre
es schön Eure fertig und funktionierende Endvariante auch hier zu
finden.
Vielen Dank und Gruß
Matthias
Hallo Matthias!
Nun, wir haben die normalen AES Quellen und den üblichen Bootloader von
der Atmel Homepage benutzt, die Du ohnehin als Quellen benötigst. Sonst
ist in dem Code nichts geändert worden.
Es ging hier schlicht und ergreifend nur um die Einstellungen im IAR
Compiler. Wenn diese nicht passen, läuft der Code einfach nicht.
Folge einfach noch mal dem Code, und wenn Du dann noch konkrete Fragen
hast, kannst Du diese ja noch stellen.
Ich hoffe ich habe Dir damit geholfen.
Grüße
Michael
Hallo zusammen,
ich bin es noch einmal ... die Protierung des Bootloaders ist so weit
fertig (Zielplattformem ATmega644 und ATmega1281).
Allerdings habe ich ein Problem wenn das verschlüsselte File
in den Controller gespielt wurde und danach der "Watchdog" zuschlägt.
Das passier ja in loader.c in der Fuktion "__C_task void loader(void)"
an der Stelle:
// Reset (let the Watchdog Timer expire)!
case TYPE_RESET:
busReplyByte(ERROR_OK);
for(;;);
Vorher wurde in der gleichen Funktion mit:
// Start the Watchdog Timer (sorry for the mess, there is a bug in
// iom8.h (in version 2.28A) which is informed to IAR).
#if 1
#if !defined(WDTCR) && !defined(__IOM8_H)
#define WDTCR WDTCSR
#endif
#if defined(__IOM16_H) || defined(__IOM32_H)
WDTCR = (7 << WDP0) | (1 << WDE);
#else
#if defined(__IOM8_H)
WDTCR = (1 << WDTOE) | (1 << WDE);
#else
WDTCR = (1 << WDCE) | (1 << WDE);
#endif
WDTCR = (7 << WDP0) | (1 << WDE);
#endif
#endif
der Watchdog initialisier. Er schlägt auch an der oben genannten
stelle zu, allerdings wird hier, entgegen meinen Erwartungen,
der Bootloader nicht erneut ausgeführt, sonder der Controller
landet irgendwo im "Nirwana".
Ich habe mir jetzt mit folgendem Konstrukt geholfen:
// Reset (let the Watchdog Timer expire)!
case TYPE_RESET:
busReplyByte(ERROR_OK);
wdt_off();
__asm("JMP 0xF000");
... allerdings habe ich mal gehört, dass so ein "JMP" nicht im
Bootloader
ausgeführt werden sollte.
Dieses konstrukt funktioniert im Übrigen nur auf dem 644. Hier landet
er über den JMP laut disassembler im ?RESET des Bootloaders und
überprüft anschließend den Speicher mit der Checksumme und startet dann
bei positivem Ergebnis die eigentliche Firmware.
Bei dem 1281 hingegen lautet der JMP befehl auf eine andere
Speicherstelle, die der disassembler ebenfalls mit dem ?RESET label
auflößt. Anschließend wird auch hier der Speicher überprüft.
Allerdings kommt hierbei immer eine negative Auswertung der Checksumme
heraus. Mache ich das Device anschließend Stromlos und starte es erneut,
erfolgt eine Checksummenberechnung mit positiver Bewertung, so dass
anschließend die Firmware gestartet wird.
Hat evtl. jemand eine Idee, warum durch den Watchdog der Bootloader
nicht erneut ausgeführt wird? Das wäre mit Sicherheit die eleganteste
Methode!!!
... Viele Dank für Eure Mühe ... bis denn
Michael
Hallo ...
... ich bin es noch einmal.
Es hat sich erledigt. Ein Kollege hat mich darauf gebracht!!!
Und zwar muss unmittelbar nach dem Systemstart (in den ersten Zeilen der
"main") das MCUSR register zu Null gesetzt, und anschließend der
WATCHDOG ausgeschaltet werden.
Das ist aber nur bei den neueren µC von Atmel notwendig.
Zu finden im Datenblatt des ATmega1281 auf S.65 in einer Fußnote:
Note: 1. The example code assumes that the part specific header file is
included.
2. If the Watchdog is accidentally enabled, for example by a runaway
pointer or brown-out condition,
the device will be reset and the Watchdog Timer will stay enabled. If
the code is not set up
to handle the Watchdog, this might lead to an eternal loop of time-out
resets. To avoid this situation,
the application software should always clear the Watchdog System Reset
Flag
(WDRF) and the WDE control bit in the initialisation routine, even if
the Watchdog is not in use.
... da gehört doch wohl so ein wichtiger Kommentar nicht hin, oder?!?
Sei es drum ... danke Trotzdem für Eure Hilfe
Michael
Hallo Michael,
deine Portierung, ist das nur die Portierung auf den Mega 644, oder hast
Du das ganze vom IAR hin zum AVR GCC portiert?
Das wäre sicher für viele Leute, einschließlich mir interessant.
Grüße
Michael
Hallo,
Ich habe mir mal deinen Quellcode angenommen.
Der Fehler dass er die verschlüsselte Daten falsch entschlüsselt und da
nach in den Flash schreibt. Ist ein andere Fehler.
Es ist der eintlich Bootloader den Du gesehn hast. Du must noch im
Makefile die Startadresse des Bootloader anpassen.
Ich habe jetzt ein anderes Problem. Der Bootloader erschreibt keine
Daten in das Flash.
Die Funktion "spmWriteWord" erhält auch Daten habe es geprüft. In dem
ich die Übergebne Daten auf einen Port ausgeben gelassen habe.
Hat hier jemand zufällig eine Lösung.
Gruß Marco
PS: Das geänderte Makefile ist im Anhang.
Hi guys,
first I wanna apologize, because I don't understand German language. I
hope someone understand English and will help me.
I've got some trouble using this AES code in
http://www.avrfreaks.net/index.php?module=Freaks%20Tools&func=viewItem&item_id=503
First, I try to using the the IAR source code to make a bootloader
application in ATMega 64 in IAR EW AVR compiler. For updating firmware
I use the application that have been given in the zip file with the
default configuration as said in AVR231 application note. And it is
successful.
And then, I develop the update firmware application using the source
code given by the Atmel by adding GUI interface using Visual Studio
2008. The result is failed, with the error message "Target is not
Responding" and "CRC error. File damaged".
After getting this touble, I try to compile the source code "update
firmware" given without GUI to check if there is any trouble with my
GUI and its interfacing. Unfortunately, the same trouble happen.
Is it any suggestion?
regards
Favian