avrdude atmega1281 bootloader

Gast #3095484
Lesenswert?

Hallo,

wenn ich einen Bootloader mit avrdude in den atmega1281 flashe dauert es 
immer lange, weil ich es bislang nicht geschafft habe, avrdude 
mitzuteilen, dass es nur den benutzten Bereich loeschen und flashen 
soll.

Mein BL liegt in den oberen 4k und der Befehl

avrdude -c usbasp -p m1281 -U flash:w:bootloader.hex

flasht den gesamten Chip also 128k in etwa 50s.

Kann ich dem avrdude irgendwie mitteilen, das nur die im hex file 
angegebenen 4k geflasht werden sollen?
Gast #3115308
Lesenswert?

Hallo  MintUser.

Normalerweise macht avrdude vor jeder Programmierung ein Chiperase, 
welches alle Seiten auf 0xff ruecksetzt. Dieses erase muss durchgefuehrt 
werden, da der eigentliche ISP-Vorgang nur 1->0 setzten kann. (0->1 kann 
nicht programmiert werden --> Aus diesem Grund faellt die AVRDUDE Option 
"-D" schoneinmal aus.)

Im Zusammenhang mit USBaspLoader 
(https://github.com/baerwolf/USBaspLoader) entfaellt die Notwendigkeit 
des Chiperase (da der bootloader sich kuemmert etwaige Seiten ggf. 
vorher zu loesen).
Somit werden immer nur die Seiten geloescht (und "verschleissen" daher), 
welche tatsaechlich von AVRDUDE angefasst werden.

Um bei meinen MCUs die Flashlebensdauer zu verlaengern schreibe ich 
meist eine default-firmware 
(http://matrixstorm.com/avr/tinyusbboard/examples/empty.hex) an den 
Anfang des Speichers, welche per RJUMPS die Interrupts spaeterer 
Speicherstellen "verschiebt".
Nun muss ich nur noch verhindern, das bei "gewoehnlichen" 
Programmiervorgaengen AVRDUDE "die zu schonenden Flashstellen" benutzt, 
sondern stattdessen "ueberspringt".

Dies bringt mich schliesslich zum gleichen Problem, was du hast:
AVRDUDE muss gepatcht werden. Da ich nicht zu oft die Sprunggroesse 
anendern muss ist demzufolge meine Loesung ein uebler HACK:

Ich hinterlege zuerst in der Datei ac_cfg.h das Makro "#define 
STEPHAN_SKIPBYTES  0xC00" und patche, da ich USBasp als Protokoll 
verwende, usbasp.c:

--- ../build/usbasp.c   2011-09-15 16:37:05.000000000 +0200
+++ usbasp.c    2012-07-24 17:21:23.318096473 +0200
@@ -676,6 +676,13 @@

   if (strcmp(m->desc, "flash") == 0) {
     function = USBASP_FUNC_WRITEFLASH;
+    // Stephan Patch
+    wbytes  -= STEPHAN_SKIPBYTES;
+    buffer  += STEPHAN_SKIPBYTES;
+    address += STEPHAN_SKIPBYTES;
+    fprintf(stderr,"\n\n               SKIPPING %i bytes, only writing 
%i bytes\n\n\n",(int)STEPHAN_SKIPBYTES,(int)wbytes);
+    fflush(stderr);
+    sleep(1);
   } else if (strcmp(m->desc, "eeprom") == 0) {
     function = USBASP_FUNC_WRITEEEPROM;
   } else {

Der verify Prozess muesste theoretisch auch angepasst werden,
aber fuer den eigentlichen Zweck reicht das bereits.

Ich hoffe ich konnte helfen,
  mfG Stephan

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren