Forum: Compiler & IDEs Portierung des Atmel AES Bootloaders auf avrgcc


von Patrick (Gast)


Lesenswert?

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

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Anhang vergessen ...

von Patrick (Gast)


Lesenswert?

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.

von Michael D. (micheagle)


Lesenswert?

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

von Michael Wleklinski (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>----------------------------------------
>// 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.

von Michael D. (micheagle)


Lesenswert?

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

von Michael Wleklinski (Gast)


Lesenswert?

... 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

von Michael D. (micheagle)


Lesenswert?

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

von Matthias W. (mawi)


Lesenswert?

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

von Marco S. (masterof)


Lesenswert?

Warum holt ihr euch nicht die IAR-Kickstart version mit der könnt ihr 
den Bootloader verwenden?
Und die normale Programme mit dem GGC erstellen.

von Michael D. (micheagle)


Lesenswert?

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

von Michael Wleklinski (Gast)


Lesenswert?

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

von Michael Wleklinski (Gast)


Lesenswert?

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

von Michael D. (micheagle)


Lesenswert?

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

von Marco S. (masterof)


Angehängte Dateien:

Lesenswert?

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.

von Fabian B. (fabbraun)


Lesenswert?

hallo allerseits

ich versuche erfolglos diese AVR231 appnote auf gcc zu portieren.
dieses beispiel 
(http://www.avrfreaks.net/index.php?module=Freaks%20Files&func=viewFile&id=3330&showinfo=1) 
stürzt bei 96% immer ab und zerstört mir die bootloader section :-/

hat jemand ein funktionierenden code?
ich benutze den atmega2560!

danke und gruss
fabian

von Favian D. (Firma: vsilicon) (ikhwan_h17f)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.