Forum: Mikrocontroller und Digitale Elektronik ATxmega256A3 Problem mit avrdude (avrosp.exe funktioniert)


von Stephan S. (tozzi)


Lesenswert?

Hallo zusammen,

ich bin noch recht unerfahren in dieser Thematik, verzeiht mir wenn ich 
hier gleich mit dem ersten Post mit einer Frage reinplatze.

Ich bin momentan dabei, einen Windows basierten Firmware Updater auf Mac 
OS X zu portieren.
Das Original verwendet AVROSP.exe zum Flashen, was auch problemlos 
funktioniert.

Da dieses Tool aber leider nie auf andere Systeme portiert wurde, möchte 
ich auf avrdude zurückgreifen, was ja an sich kein Problem sein 
sollte(?).

Ich versuche nun aber schon seit einigen Tagen erfolglos, die .hex Datei 
auf das Gerät zu flashen.

Das xml File für avrosp.exe enthält folgende Geräteparameter:
1
<PROG_FLASH>270336</PROG_FLASH>
2
<EEPROM>4096</EEPROM>
3
<PAGESIZE>512</PAGESIZE>
4
<SIGNATURE><ADDR000>$1E</ADDR000><ADDR001>$98</ADDR001><ADDR002>$42</ADDR002></SIGNATURE>

Aufgerufen so:
1
mode COM5 Data=8 Parity=n Baud=38400 DTR=OFF RTS=OFF
2
AVROSP -dATxmega256A3 -e -if"updatefile.hex" -pf

avdrude zeigt mit -v exakt dieselben Werte an.
Die Signatur stimmt auch überein.
1
./avrdude -p x256a3 -C ./avrdude.conf -c avr911 -P /dev/cu.usbserial-A504ZISZ -b 38400 -U flash:w:updatefile.hex -e -v
1
Connecting to programmer: .
2
Found programmer: Id = "AVRBOOT"; type = S
3
    Software Version = 1.7; No Hardware Version given.
4
Programmer supports auto addr increment.
5
Programmer supports buffered memory access with buffersize=128 bytes.
6
7
Programmer supports the following devices:
8
    Device code: 0xfa
9
10
avrdude: devcode selected: 0xfffffffa
11
avrdude: AVR device initialized and ready to accept instructions
12
13
Reading | ################################################## | 100% 0.01s
14
15
avrdude: Device signature = 0x1e9842 (probably x256a3u)
16
avrdude: erasing chip
17
avrdude: reading input file "updatefile.hex"
18
avrdude: input file updatefile.hex auto detected as Intel Hex
19
avrdude: writing flash (142442 bytes):
20
21
Writing | ################################################## | 100% 57.92s
22
23
avrdude: 142442 bytes of flash written

Verify schlägt fehl beim ersten Byte (tut es aber auch mit avrosp.exe; 
Auslesen ist wohl nicht vorgesehen).

Nach dem Flashen startet nun das Gerät nicht mehr.

Erneutes Aufspielen mit avrosp.exe funktioniet, und anschließend startet 
das Gerät auch wieder ganz normal.

Ich bin momentan mit meinem Latein am Ende, 4 Tage Trial & Error.

Angeschlossen ist das Gerät über ein separates WiFi Modul (ohne dieses 
ist kein Firmware Update möglich); dies ist über USB angeschlossen 
(FT232R).

//Nachtrag:
Interessant ist auch, dass das erfolgreiche Flashen mit avrosp.exe fast 
6 Minuten dauert, avrdude aber nach 59 Sekunden damit durch ist.

Hat jemand eine Idee, was ich noch probieren kann?

von Stephan S. (tozzi)


Lesenswert?

OK, ich habe den Fehler selbst gefunden, in avrdude's butterfly.c.

butterfly_set_extaddr wird nicht aufgerufen, somit wird ab 128K der 
Beginn des Speichers überschrieben (Statt "H" 0x010000 wird "A" 0x0000 
als Adresse geschickt).

Außerdem bestimmt avrdude die Buffergröße falsch (128 Byte statt 512).

Mit diesem (groben) Patch funktioniert es, ich werde das an die 
Entwickler weiterleiten, aber vorher noch dem buffersize Problem auf den 
Grund gehen.
Diese wird ja abgefragt und von avrosp.exe auch richtig verstanden.
1
--- butterfly.c.orig  2014-07-16 22:14:58.000000000 +0200
2
+++ butterfly.c  2017-05-23 22:49:20.000000000 +0200
3
@@ -321,6 +321,10 @@
4
   PDATA(pgm)->buffersize = (unsigned int)(unsigned char)c<<8;
5
   butterfly_recv(pgm, &c, 1);
6
   PDATA(pgm)->buffersize += (unsigned int)(unsigned char)c;
7
+
8
+  // overriding it for now
9
+  PDATA(pgm)->buffersize = 512;
10
+
11
   avrdude_message(MSG_INFO, "Programmer supports buffered memory access with buffersize=%i bytes.\n",
12
                   PDATA(pgm)->buffersize);
13
14
@@ -424,6 +428,7 @@
15
16
 static void butterfly_set_addr(PROGRAMMER * pgm, unsigned long addr)
17
 {
18
+if( addr < 0x10000 ) {
19
   char cmd[3];
20
21
   cmd[0] = 'A';
22
@@ -432,6 +437,19 @@
23
24
   butterfly_send(pgm, cmd, sizeof(cmd));
25
   butterfly_vfy_cmd_sent(pgm, "set addr");
26
+
27
+  } else {
28
+
29
+  char cmd[4];
30
+
31
+  cmd[0] = 'H';
32
+  cmd[1] = (addr >> 16) & 0xff;
33
+  cmd[2] = (addr >> 8) & 0xff;
34
+  cmd[3] = addr & 0xff;
35
+
36
+  butterfly_send(pgm, cmd, sizeof(cmd));
37
+  butterfly_vfy_cmd_sent(pgm, "set extaddr");
38
+  }
39
}

Leider werde ich avrdude aber aufgrund der GPL sowieso nicht verwenden 
können/dürfen...

//EDIT:
Würde den Faden gerne als "gelöst" markieren, das geht aber offenbar 
nicht.

von Rolf (Gast)


Lesenswert?

Stephan S. schrieb:
> Leider werde ich avrdude aber aufgrund der GPL sowieso nicht verwenden
> können/dürfen...

Besser ist es.
Wenn man von Problemen mit der MC-Programmierung hört hat meistens 
dieses dämliche avrdude seine Hand im Spiel.

von Stephan S. (tozzi)


Lesenswert?

Ja, ist schon erstaunlich, dass das avrosp.exe Tool von 2004 bereits die 
erweiterte Adressierung beherrscht, avrdude hingegen nicht...
Gut, Letzteres deckt halt auch einen viel größeren Bereich ab und ich 
will das gar nicht schlecht reden. Für die meisten funktioniert es ja.

Aber wenn ich schon "in die Matrix eintauche" und das Protokoll auf Bit 
und Byte Ebene durchgehen muss, kann ich auch gleich meine eigene, 
"monolithische" Lösung durchziehen und das vernünftig in den Installer 
einbauen, grafischer Fortschrittsbalken und Lokalisierung inklusive...

Wenn ich da jetzt noch den Source Code, meinen Patch und einen 
No-Warranty Disclaimer dazupacke, wird mein Auftraggeber nicht 
sonderlich begeistert sein.
Soviel zum Thema GPL...

Immerhin kann ich jetzt als Nebenprodukt eine Source Code basierte Linux 
Version für die Kommandozeile obendrein geben, halt dann mit den ganzen 
GPL Spezialitäten im README.

Die low-level Lösung hätte ich mal gleich angehen sollen, anstatt 5 Tage 
mit Trial/Error zuzubringen. Wollte es einfach nicht glauben...

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.