Forum: Mikrocontroller und Digitale Elektronik USB Updateprozess - welche Schritte


von Lars (Gast)


Lesenswert?

Hi,

bin gerade dabei mir einen Bootloader für meinen LPC1758 Prozessor zu 
schreiben, der die Applikation laden und über USB updaten kann. Momentan 
interessiert mich vor allem der Firmware-Update Vorgang über USB.

Wie überträgt man die Daten am Besten vom Rechner auf den LPC - über ein 
HID Interface oder mittels DFU (device firmware upgrade)? Falls DFU eine 
gute Möglichkeit darstellt, benötigt man für diesen einen eigenen 
Treiber unter Windows, Linux oder Macintosh oder werden diese Treiber 
bereits mit dem OS mitgeliefert?
Der Updatevorgang soll über eine entsprechende Rechnerapplikation vom 
Endanwender durchgeführt werden können; diese möchte ich gern in Qt 
programmieren, so dass ich sie für alle OS erzeugen kann.

Von meiner IDE erhalte ich den Sourcecode u. a. als Hex-File. Dieses 
beinhaltet ja den Code, der im Flash vom LPC gespeichert werden muss. Um 
sicherstellen zu können, dass beim Updateprozess auch die richtige Datei 
ausgewählt worden ist, wollte ich gerne in diesem Hexfile noch eine 
Prüfsumme sowie ein Codewort integrieren. Mit welcher Software kann man 
das ohne viel Aufwand hinzufügen, sowie eine Prüfsumme bilden? Bis jetzt 
hab ich nur einen Hexeditor. Ein Programm welches mir die Prüfsumme 
eines Hexfiles direkt angibt, wäre super.

Bei den meisten anderen USB-Produkten erhält man im Normalfall ein .exe 
oder .bin File für den Updateprozess und kein .hex File. Welche Schritte 
sind zusätzlich im µController notwendig, damit man aus einem .exe oder 
.bin File wieder den eigentlichen Code fürs Flash erhält?

Sollte während des Updatevorgangs ein Stromausfall etc. passieren, so 
dass zwar der Bootloader geladen werden kann aber nicht die Applikation, 
sollte diese auch nicht gestartet werden. Dies wollte ich über eine 
Variable erreichen, die im Bootloadercode bei jedem Start aus einem 
externen Eeprom ausgelesen wird. Diese gibt an, ob die Applikation 
erfolgreich gespeichert worden ist, ein Updateprozess im Gange ist bzw. 
keine bootbare Applikation
existiert. Ist das ein guter Ansatz oder gibt es bessere?

Welche Punkte sind bei einem Update der Applikation noch zu 
berücksichtigen? Hatte noch vor, nach dem kompletten Schreibvorgang vom 
RAM ins Flash einen Verify durchzuführen anhand der Prüfsumme die 
ebenfalls mit übertragen worden ist.

Gruß
Lars

von Stefan (Gast)


Lesenswert?

Ich kann nur einige der Fragen beantworten:

Prüfsummen von beliebigen Dateien erstellst du unter Linux mit dem 
Befehl md5sum oder cksum (je nach gewünschtem Algorithmus). Unter 
Windows kannst DU Cygwin instalieren, um diese Programme zu erhalten.

Diese Updates im exe Format enthalten sowohl das nötige PC-Programm, als 
auch das Programm für das Ziel-Gerät. Sie entpacken sich selbst beim 
Ausführen.

Die Dateien im bin Format enthalten Maschinencode des Ziel-Gerätes. 
Diese Dateien werden in der Regel 1:1 am Stück in den Programmspeicher 
übertragen. Dazu brauchst Du noch ein Hilfsprogramm, denn Windows kann 
weder mit dem Dateiformat umgehen, noch weiß es, wie mit diem Zielgerät 
zu kommunizieren ist.

Hex Dateien sind wiederum ein Container-Format für binäre Dateien. Sie 
bieten den Vorteil, Prüfsummen zu enthalten und man kann mehrere 
Speicherbereiche updaten.

> ...Ist das ein guter Ansatz oder gibt es bessere?
Ich würde sagen: ja. Oder du bettest die Prüfsumme in den Maschinencode 
ein und der Bootloader überprüft sie bei jedem Power-Up, bevor die 
Firmware ausgeführt wird.

von Lars (Gast)


Lesenswert?

Stefan schrieb:
> Ich würde sagen: ja. Oder du bettest die Prüfsumme in den Maschinencode
> ein und der Bootloader überprüft sie bei jedem Power-Up, bevor die
> Firmware ausgeführt wird.

das klingt sogar noch etwas besser. Vielleicht kann ich den Zugriff aufs 
Eeprom im Bootloader-Code ganz weglassen.
Der Bootloader-Code beinhaltet eine globale Variable, die sich fest an 
einer Stelle im Flash befindet (immer die gleiche, wenn das über die IDE 
- Keil in meinem Fall - möglich ist) und überschreibt diese mit dem 
aktuellen Stand der Applikation: ob diese gestartet werden kann oder 
nicht.

von Christian R. (supachris)


Lesenswert?

Bei uns besteht das Update File aus einem zip, welches neben dem 
eigentlichen bin/hex noch eine XML beinhaltet. Darin sind z.B. die Hash 
vom bin/hex sowie Informationen für welche Zielhardware das Update ist. 
Dieses XML ist mit unserer Code Signing Signatur signiert und wird vom 
Update Programm gegen den im Updater gespeicherten  public key getestet.

von Alexander B. (leuchte)


Lesenswert?

Hast du dir schon die AN10866 von NXP angeschaut?

Das ist ein Beispiel für einen USB-Bootloader, welcher sich am PC als 
Massenspeichergerät anmeldet. Firmware-Updates sind dann so einfach wie 
das Verschieben einer Datei von einem Ordner in den anderen. Die Methode 
mit dem Massenspeicher mag vielleicht nicht sehr Praxisnah sein, ist 
aber dennoch ein sehr schönes Beispiel und beantwortet möglicherweise 
viele deiner Fragen.

http://www.lpcware.com/content/nxpfile/an10866-lpc1700-secondary-usb-bootloader

von Lars (Gast)


Lesenswert?

Christian R. schrieb:
> Bei uns besteht das Update File aus einem zip, welches neben dem
> eigentlichen bin/hex noch eine XML beinhaltet.

wie schickt ihr den Code über USB? Via HID Interface und Bulktransfer 
oder verwendet ihr das DFU Protokoll?

Alexander B. schrieb:
> mit dem Massenspeicher mag vielleicht nicht sehr Praxisnah sein

Einen Massenspeicher möchte ich während des Updatevorgangs nicht 
angezeigt bekommen. Das Beispiel von NXP hab ich mir bereits angeschaut; 
allerdings ist die Anwendung eine völlig andere, so dass mir der Code 
keine großen Erkenntnisse bringt, wie man sinnvollerweise ein 
Firmwareupdate durchführt.

von Alexander B. (leuchte)


Lesenswert?

Lars schrieb:
> Einen Massenspeicher möchte ich während des Updatevorgangs nicht
> angezeigt bekommen. Das Beispiel von NXP hab ich mir bereits angeschaut;
> allerdings ist die Anwendung eine völlig andere, so dass mir der Code
> keine großen Erkenntnisse bringt, wie man sinnvollerweise ein
> Firmwareupdate durchführt.

Okay.

Das Ding ist, dass es schwierig wird den Update-Vorgang zur Laufzeit 
durchzuführen. Der LPC hat nämlich nicht gerade viel RAM. D.h. du 
müsstest die Firmware scheibchenweise übertragen und in den Flash 
schreiben. Wenn da dabei die Verbindung abreist oder ein Paket 
korrumpiert ist ... naja.

Die Alternative wäre die Firmware erst komplett in einen Bereich zu 
schreiben, der von der aktuellen Firmware definitiv nicht genutzt wird. 
Dann könntest die diese validieren und im Anschluss an die richtige 
Position im Flash kopieren bzw. extrahieren. Nachteil ist dann, dass du 
ein Teil des Flashes für Firmware-Updates immer frei halten musst.

Ein Secondary-Bootloader, wie in der AN, hat den zuletzt genannten 
Nachteil nicht.

Oder dein Gerät hat noch externen RAM/Flash für diesen Zweck. Das kannst 
uns nur du sagen ^^.

Was die USB-Klasse angeht ist DFU doch eine schöne Sache. Immerhin soll 
es dafür standarisierte Programme bzw. Treiber auf PC-Seite geben. Da 
müsstest du keinen Aufwand investieren. Ein Vendor-Specific-Protocol 
wäre (zumindest aus meiner Sicht) auch eine Option, der hat dann aber 
doch mehr Aufwand zur Folge. Aber du kannst darüber auch noch andere 
Kommunikation abwickeln.

von Thomas (Gast)


Lesenswert?

DFU ist vom Prinzip her eine feine Sache aber Win bis Vista hat keine 
Treiber ob es einen bei W7 oder W8 gibt kann ich nicht sagen.
Das beteutet Treiber schreiben (mit allen Konzequenzen wie WHQL 
Zertifizierung und so weiter. Versuche das Ganze mit einem HID zu lösen 
und du bist das Treiberthema los. WinUSB wäre wohl auch noch eine 
Option.
Ich habe damals mein eigenes Protokoll gebastelt und Update FW und 
Runtime FW strikt getrennt. Update und Firmware lagen dann in 
verschiedenen Flashpages. Ich konnte deshalb die FW Page jederzeit 
löschen un neubeschreiben wenn die Update software aktiv war. Etwas 
aufpassen muss man halt bei den Interupts.

Thomas

von Christian R. (supachris)


Lesenswert?

Lars schrieb:
>> Bei uns besteht das Update File aus einem zip, welches neben dem
>> eigentlichen bin/hex noch eine XML beinhaltet.
>
> wie schickt ihr den Code über USB? Via HID Interface und Bulktransfer
> oder verwendet ihr das DFU Protokoll?

Über die normale USB Kommunikation. Das Gerät ist ohnehin über USB als 
Frontend angebunden. Ohne USB wäre es ein teurer Briefbeschwerer. Läuft 
bei uns mit WinUSB und BULK Modus, eigenes Protokoll. Der FPGA kann 
seinen SPI Flash selber updaten. Mit Multiboot und FallBack geht das 
auch risikoarm.

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.