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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.