Forum: Mikrocontroller und Digitale Elektronik avrdude atmega1281 bootloader


von MintUser (Gast)


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?

von marixstorm (Gast)


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

von MintUser (Gast)


Lesenswert?

Danke erstmal fuer die Muehe.

Ich habe es fuer mich hiermit geloest:

Beitrag "avrdude: doofes 0xFF schreiben unterdrücken? (beim Bootloader brennen)"

von marixstorm (Gast)


Lesenswert?

Ah, Danke.
Die neue (SVN)Version vom avrdude scheint meinen "Hack" ueberfluessig zu 
machen. Sehr angenehm - Danke.

MfG Stephan

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.