Xmega Bootapp PC-Anbindung

  • 1
  • 2
  • 3
  • Page 1 of 3
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Xmega Bootapp PC-Anbindung

 · 
Posted: 17.08.2014 - 11:52  ·  #1
Ich hatte schon einmal in der "Software"-Sektion geschrieben, ich schätze da schaut keiner hin, daher versuche ich es mal hier:

Ich setze in einem Xmega128A4U den Bootloader von Avrco ein, als Bootapp mit UART (nicht USB).

Die Demo habe ich testweise ausprobiert, funktioniert auch, aaaber...

In der Demo lauscht der Controller am seriellen Port und wartet auf ein "B", darauf hin löscht er die letzte Stelle des EEProms und führt einen Reset aus. Mit einem "B" kann ich also das Neuflashen über den Bootloader starten. Dummerweise muss man danach ein Programm flashen, da die letzte EEprom-Speicherstelle dann gelöscht wird, die Bootapp dann ja meint, es wäre kein Programm da, und lädt dann auch keins mehr. Das ist natürlich nicht so toll.

Das beiliegende Flashdownloader-Programm fängt auch einfach nur an zu flashen, solange ich nur den Bootloader drauf habe ist alles gut, sobald aber ein Programm geflasht wurde lauscht der Bootloader nicht mehr, der Flashdownloader kann so keine Verbindung mehr aufbauen. Ich muss erst "B" senden, und kann dann flashen.

Wie soll ich denn sinnigerweise eine Kontaktanfrage des Flashdownloaders im Hauptprogramm erkennen? Soweit ich das sehen kann geht das gar nicht.

Aus diesem Grund wäre es auch toll den Code des Downloaders für Delphi zu haben, dann könnte ich das dahingehend abändern, dass ich vorher einen Befehl sende der zur Bootapp wechselt.
Es gibt in der Softwareabteilung einen alten Codeschnipsel, der funktioniert aber leider nicht, bzw. es fehlt zu viel.

Benutzt jemand den Bootloader? Wie wird da die Bootapp aktiviert?
Gibt es eine Möglichkeit durch den Flashdownloader vom Hauptprogramm aus die Bootapp aufzurufen ohne die EEProm-Kennung zu löschen?

Louis
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 17.08.2014 - 16:42  ·  #2
Nachdem ich meinen Sonntag damit verbracht habe aus Verzweiflung das Protokoll des Flashdownloaders zu analysieren habe ich festgestellt, dass das in der Doku beschrieben Protokoll so anscheinend nicht mehr funktioniert, es wurde an einigen Stellen wohl erweitert.

So muss nach dem Kommando "D" anscheinend erst zwei Bytes folgen die die Menge der folgenden Daten kennzeichnen, so wie ich das verstanden habe sind das einmal die Anzahl Bytes und die Anzahl Pages, wenn eine ganze Page dann ist die Anzahl Bytes 0.
Leider ist das im weder im Handbuch noch im alten Codeschnipsel nicht berücksichtigt.

Im Codeschnipsel werden die Daten auch 2x geschickt, einmal Byte for Byte und einmal mit Blockwrite das ganze noch einmal. Das klappt natürlich nicht, neben diversen anderen Dingen die wohl aufgrund des Alters dieses Beispiels nicht mehr laufen.

Auch die im Handbuch beschriebene Adressierung mit "A" scheint anders zu laufen, im Handbuch steht, dass mit "A" die Page Adress in Word Darstellung übertragen wird, der Flashdownloader schickt da aber 3 Bytes, das erste ist immer 0, dann folgt das Low-Byte, dann das High-Byte
Laut Handbuch soll es sein: Low-Byte, High-Byte, Extend-Byte

Anscheinend gibt es auch einen Befehl "V", zumindest sendet den der Flashdownloader vor dem Beenden ("X"), steht nicht in der Doku.

Solche netten Dinge können einen den Tag wirklich verschönern....

Gibt es denn vielleicht eine aktuelle Protokollbeschreibung?

Louis
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 18.08.2014 - 17:10  ·  #3
Quote by Lschreyer

In der Demo lauscht der Controller am seriellen Port und wartet auf ein "B", darauf hin löscht er die letzte Stelle des EEProms und führt einen Reset aus. Mit einem "B" kann ich also das Neuflashen über den Bootloader starten. Dummerweise muss man danach ein Programm flashen, da die letzte EEprom-Speicherstelle dann gelöscht wird, die Bootapp dann ja meint, es wäre kein Programm da, und lädt dann auch keins mehr. Das ist natürlich nicht so toll.

Also ich habe die Abfrage wie folgt gemacht:
-Mainapp erhält eine Anfrage für FlashDownload, dann wird die Funktion Hardwarereset ausgeführt

In der Bootapp:
prüfe ich 2 Punkte:
1. Wenn die letzte EEPROM Speicherstelle FF Ist wird immer der Flash-Vorgang gestartet,
da es kein Mainapp gibt.
2. Wenn die letzte EEPROM Speicherstelle 00 ist (gültige Mainapp) und nicht innerhalb 1s eine
Taste gedrückt wird, startet er die Mainapp
3. Wenn die Taste gedrückt wird, startet der Flash-Vorgang.

Ich weiß nicht, ob hier evtl. eine TimeOut Möglichkeit besteht, wenn kein Daten...dann starte wieder die Mainapp.

Quote by Lschreyer

Wie soll ich denn sinnigerweise eine Kontaktanfrage des Flashdownloaders im Hauptprogramm erkennen? Soweit ich das sehen kann geht das gar nicht.

Denke Dir einen Schlüssel aus, der höchst unwahrscheinlich in Deiner normalen Datenkommunikation vorkommt und führe den Hardwarereset aus. Wenn dann nicht innerhalb einer Zeit X Daten kommen, starte wieder die MainApp.

Auf meinen Geräten geht das Flashen nur beim Neustart und drücken einer Taste in einem Zeitfenster.

Quote by Lschreyer

Benutzt jemand den Bootloader? Wie wird da die Bootapp aktiviert?
Gibt es eine Möglichkeit durch den Flashdownloader vom Hauptprogramm aus die Bootapp aufzurufen ohne die EEProm-Kennung zu löschen?

Klar, wenn die richtigen FuseBits gesetzt sind, wird die Bootapp bei jedem Reset oder Neustart gestartet.

Warte doch in der Bootapp einfach eine Zeitlang auf eine Kennung die über Ser reinkommt und wenn nichts kommt starte einfach die Mainapp. Du musst ja nicht so wie in dem Beispiel vom ELAB die Speicherstelle löschen, mache ich ja auch nicht. Ich nutze diese Speicherstelle nur bei Geräten die NUR mit der BootApp geladen werden. Und wenn keine MainApp vorhanden, sieht das der Bootloader und startet den Flashvorgang und wartet auf die Daten.


Rolf hat in dem Topic FlashDownloader Basic functions for building an own Download mal den FlashDownloader als Delphi Projekt veröffentlicht, auf dieser Basis
habe ich meinen aufgebaut. Unter XMEGA läuft er noch nicht mit USB, aber beim ATMEGA geht's.

Gruss
Thorsten
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 18.08.2014 - 17:35  ·  #4
Hallo, vielen Dank für die Tipps, ich habe zwar keine Taste an der Hardware, aber mit der kurzen Wartezeit dürfte es gehen.

Die Pascal-Datei die Rolf dort angeboten hat ist veraltet, wie es scheint, das Protokoll hat sich offenbar geändert.
Ich habe durch Protokollanalyse einiges heraus finden können, aber bei größeren Programmen scheitert der Download noch.
Kleines geht, warum größere nicht laufen weiss ich nicht.

Ich warte da noch auf eine Reaktion, ich hoffe, dass mir jemand das aktuelle Protokoll zeigen kann, am schönsten wäre der Code des aktuellen Flashloaders.

Louis
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 18.08.2014 - 18:52  ·  #5
Es scheint jetzt zu laufen, ich hatte einen Fehler in der Berechnung der Länge des Programms.

Ich habe eine kurze Wartezeit eingebaut, ich starte meine Downloadsoftware und schalte dann ein, dann erwischt er gleich beim Start die Anfrage und sendet sein "FD".

Dennoch wäre eine Info inwieweit das Protokoll jetzt noch mit der aktuellen Doku übereinstimmt nützlich.

Ich kann mich ja irren, aber ich sende die Adresse der Page in der Form
A
aa1 = immer 0
aa2= lowbyte
aa3= highbyte

Laut Doku soll es aber
A
aa1 page adr loByte
aa2 page adr hiByte
aa3 wenn die CPU mehr als 128kBytes Flash hat muss noch dieses Page Extend Byte folgen

Das funktioniert definitiv nicht.

Louis
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 18.08.2014 - 21:27  ·  #6
Hallo Louis,

bei XMegas ist die Adresse immer 3 bytes:
1. lo byte
2. high byte
3. ext byte

Bei AVRs wird die Adresse immer durch 2 geteilt
bei <=128kB
1. lo byte
2. high byte

bei > 128kB
1. lo byte
2. high byte
3. ext byte

rolf
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 19.08.2014 - 08:32  ·  #7
Oh, danke, das klärt einiges auf. Das Code-Beispiel teilt die Adressen durch 2.

Wenn ich mir aber den Datenverkehr des Flashdownloaders mit einem Xmega128A4U anschaue sendet er an erster Stelle immer ein 0x00.
Nur das High Byte und das Ext Byte werden benutzt.
Page 1 wird als
0x00 0x01 0x00 gesendet

Nach deiner Erklärung müsste es aber
0x01 0x00 0x00 sein. Geht aber nicht, habe ich probiert.



Auch sendet der Loader vor dem beendenden "X" noch ein "V".
Wozu dient das V?



Eine Frage noch zur EEPROM-Programmierung.
Beim EEPROM steht in der Doku, dass dies mit B programmiert wird:

Quote

B Host schickt EEprom adr in byte Darstellung und EEprom Data (byte).
aa1 EEprom adr loByte
aa2 EEprom adr hiByte
data 1 Byte ins EEprom
Loader programmiert dieses Byte in das EEprom und antwortet mit
CR Befehl akzeptiert


Das soll also Byteweise gehen.

Der Flashdownloader macht das aber ganz anders:
- Erst sendet er die Adrese mit
A xx xx xx (in meinem Fall war es "A 0x00 0x00 0x00"
- Dann folgen Daten mit D xxxxxxxxxxxxxxxxx usw.
- Nachdem mit 0x13 geantwortet wurde sendet er ein "B" (zum Programmieren der Daten ins EEPROM?).

Liege ich da richtig? Oder habe ich da etwas falsch interpretiert?




Louis
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: Xmega Bootapp PC-Anbindung

 · 
Posted: 19.08.2014 - 10:33  ·  #8
Hallo Louis,
im Log unten sieht man wie die Adresse immer um 512 bytes(Page) erhöht wird.

gesendet als:

Code
  
       COMdlg.SendChar('A');           // Address
        if CPUtyp = PDI then            // XMEGA
        begin
          bb := (idx and $ff);          // lo byte
          COMdlg.SendChar(char(bb));    // lo byte
          bb := (idx shr 8);            //
          COMdlg.SendChar(char(bb));    // hi byte
          bb := (idx shr 16);
          COMdlg.SendChar(char(bb));    // ext byte
        end
        else
        begin    // only Mega
          bb := (idx shr 1);            // div 2
          COMdlg.SendChar(char(bb));    // lo byte
          bb := (idx shr 9);            // div 2
          COMdlg.SendChar(char(bb));    // hi byte
          if (OrgFlashEnd > $20000)  then
          begin // flash > 128kb  
            bb := (idx shr 17);
            COMdlg.SendChar(char(bb)); // ext byte
          end;
        end;


Leider bleibt der Flashloader bei ca. 117kB stehen.
Wir suchen noch.

miparo
  • 1
  • 2
  • 3
  • Page 1 of 3
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   140   154 · Page-Gen-Time: 0.030991s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI