Kugelsichere Firmware-Upgrades

16

Mit welchen Techniken kann ein Benutzer eine Gerätefirmware nach dem Verkauf sicher aktualisieren? Ich möchte dies mit einem Cortex M3 / 4-Mikrocontroller tun, aber ich denke, Techniken für jedes Mikro sollten dies tun.

Vorzugsweise mit der geringsten Menge an zusätzlichen Komponenten natürlich.

Imbrondir
quelle

Antworten:

16

Verwenden Sie einen Chip mit mehr als der doppelten Menge an Flash-Speicher, die Sie für Ihren Code benötigen. Auf diese Weise können Sie die neue Firmware in diesen Speicher laden, während Sie die alte behalten, falls etwas schief geht.

Nachdem Sie die Prüfsummen der neuen Firmware entschlüsselt und überprüft haben, kann ein Bootloader sie an ihren endgültigen Speicherort kopieren und die alte ersetzen. Wenn während dieses Teils etwas schief geht, sollte der Bootloader nach einem Hard-Reset feststellen, dass die neue Firmware ungültig ist (indem er die Prüfsumme erneut durchführt) und den Kopiervorgang wiederholen.

Dies ist der einfachste und narrensicherste Weg, den ich kenne. Es erfordert auch wenig Code im Bootloader und erfordert keine Duplizierung von Funktionen zwischen dem Hauptprogramm und dem Bootloader (Sie benötigen keine Kommunikationslogik im Bootloader).

jpc
quelle
10
Als Benutzer von Elektronik könnte ich hinzufügen, dass es schön wäre, einen Knopf zu haben, der beim Booten die alte Firmware bootet, falls die neue eine korrekte Prüfsumme hat, aber die Software selbst einen Fehler aufweist.
Zan Lynx
4
Das "Problem", das ich bei dieser Lösung sehe, ist, dass Sie eine Art Umzugstabelle oder vollständigen positionsunabhängigen Code benötigen. Andernfalls wird Ihr Code nicht ausgeführt.
Nico Erfurth
2
@Masta - Sie verstehen nicht, wo die Firmware an ihren endgültigen (normalen) Speicherort kopiert wird.
Kevin Vermeer
3
@jpc - Wir verwenden diese Technik mit einem externen seriellen Flash-Chip für einige interne Tools, die in Betrieb sind. Sie benötigen keinen Mikrocontroller mit mehr als dem doppelten Flash, wenn Sie Platz für ein 8-poliges SOIC- oder QFN-Teil haben. 1 MB serielle Flash-Speicher sind für weniger als einen Dollar erhältlich. In manchen Fällen ist es daher billiger, diesen Weg zu beschreiten, als den Mikrocontroller zu aktualisieren.
Kevin Vermeer
@zan - Yup, wir benutzen das auch. Ein Problem oder Vorteil ist, dass das Gerät beim erneuten Kopieren der alten Firmware auf die Standardeinstellungen zurückgesetzt wird (auf dem Mikro befindet sich kein EEPROM; Konfigurationsdaten wie die MAC-Adresse und die IP-Adresse werden in selbst geschriebenem Flash gespeichert). Für uns ist es so einfach, ein Board zu finden, wenn wir die IP-Adresse vergessen haben.
Kevin Vermeer
12

Verwenden Sie einen Bootloader und ein paar KB zusätzlichen Flash.

Ein Upgrade wird vom Bootloader ausgeführt, indem ein spezieller Befehl über UART, USB, I2C oder ein anderes Protokoll gesendet wird. Es wird immer nur der Hauptcode aktualisiert - der Bootloader-Code wird nur über einen externen Programmierer (z. B. JTAG / PICkit für PICs usw.) berührt.

Wenn das Update fehlschlägt (Stromausfall, ein Stolperfall oder ein anderer Grund), funktioniert das Widget nicht, der Bootloader ist jedoch weiterhin verfügbar, sodass das Upgrade erneut versucht werden kann.

Irgendwo in einem Byte könnte ein Flag gesetzt werden, das verhindert, dass der Hauptcode falsch ausgeführt wird, da er nicht vollständig aktualisiert wurde.

Thomas O.
quelle
Sie können den Bootloader auch zum Ausführen zwingen, wenn der Start aufgrund eines Startvorgangs erfolgt. Dies würde helfen, wenn Sie eine fehlerhafte Firmware laden, die sofort abstürzt. Der Bootloader benötigt eine Zeitüberschreitung, um die Anwendung nach X Sekunden auszuführen.
Robert
Es ist eine gute Idee, wenn Sie ein einfaches Protokoll verwenden können (z. B. eine asynchrone serielle Verbindung, TTL oder 485). Bei größeren Problemen (SD-Karten, GPRS, USB) würde ich den komplexen Support-Code nicht in den (nicht aktualisierbaren) Bootloader aufnehmen. Ethernet OTOH (Raw UDP oder TFTP) ist hierfür einfach genug.
JPC
3

Wenn Ihr Gerät vergleichsweise teuer ist und Sie sich die Kosten leisten können (und Ihre Kunden sich für Upgrades interessieren), können Sie dies tun ...

(Im Allgemeinen erfordert diese Technik entweder externe Speicherung oder den umständlichen Einsatz von jtag.)

Habe ein festes Programm-Mikro (wie ein kleines PIC), das das System anhalten und neu programmieren kann.

Da Sie die Firmware des "Upgrade-Prozessors" nicht ändern können, kann niemals ein Fehler auftreten.

1) Der Benutzer kann das Gerät aktualisieren

2) Wenn ein Upgrade fehlschlägt, können sie es immer noch einmal versuchen. Es kann nicht gemauert werden

3) Auch wenn Ihr Zielgerät keinen Bootloader unterstützt (es will nur booten und laufen), können Sie es trotzdem dazu bringen, das zu tun, was Sie wollen.

Funktioniert für FPGA, DSP und andere Oddball-Ziele.

Kann eine sehr ordentliche Benutzeroberfläche haben (sogar ein PIC kann einen Webserver betreiben ...)

Tim Williscroft
quelle
2

Stellen Sie sicher, dass Ihr Produkt eine einfache serielle Schnittstelle hat, vorzugsweise EIA232. Ein nicht standardmäßiger Anschluss ist in Ordnung, wenn Sie keinen Platz für einen DB-9 haben. Zum Beispiel ist ein Klinkenstecker alles, was Sie für TxD, RxD und Masse benötigen.

Schließen Sie beim ersten Programmieren des Geräts einen Bootloader ein . Dies sollte so einfach wie möglich sein , da Sie früher oder später den Bootloader selbst aktualisieren möchten, wenn er neue Funktionen benötigt. (Sie können es wahrscheinlich nicht einmal aktualisieren)

Dann der Klinkenstecker. Verwenden Sie eine Buchse mit einem Schalter, damit Sie erkennen können, wenn ein Stecker vorhanden ist. Überprüfen Sie einfach den Reset und starten Sie den Bootloader, wenn der Stecker vorhanden ist. Starten Sie andernfalls die Anwendung. Auf diese Weise bleiben Bootloader und Benutzeranwendungsprogramm gut getrennt. (Die Prüfung ist tatsächlich Teil des Bootloaders. Sie wird unabhängig von der Version der Anwendung benötigt, sonst können wir den Bootloader nicht aufrufen!)

stevenvh
quelle
Warum sollten Sie jemals den Bootloader aktualisieren? Wie stellen Sie sicher, dass der Upgrade-Prozess das Gerät nicht blockiert? Wenn ja, welche neuen Funktionen wären so überzeugend, dass Sie ein Upgrade riskieren würden?
Kevin Vermeer
5
@ Kevin - Ich denke, er meinte, dass der Bootloader so einfach sein sollte, dass man nie daran denken wird, ihn zu "upgraden".
JPC
@jpc - Ah, du hast recht, das falsch interpretiert. Wir sind uns einig!
Kevin Vermeer
1

Welche Ausrüstung wird der "Upgrade" zur Verfügung haben? Ein PC, ein USB-Stick, eine Micro-SD-Karte?

Eine Möglichkeit wäre, die Anwendung in einem entfernbaren Objekt (USB-Stick, SD-Karte usw.) zu haben. Der Chip lädt seine Applikation vom Artikel. Ihr Upgrade-Programm tauscht den Artikel einfach aus und startet neu.

Die mir bekannten ARM- und Cortex-Mikrocontroller-Chips (NXP, Atmel) verfügen alle über einen eingebauten seriellen Bootloader. Wenn Ihr Updater also mit einem PC und einem seriellen Kabel ankommt (und Sie eine COM-Port-Schnittstelle eingerichtet haben), kann er einfach Ihren herunterladen aktualisieren.

Wouter van Ooijen
quelle
So einfach durch Verdrahtung der UART-Pins an einen Port, während an einen COM-Port und einen PC angeschlossen, können Sie die Firmware ohne Code auf der MCU überhaupt flashen? Netter Tipp.
Imbrondir
Überprüfen Sie das Datenblatt im Abschnitt 'Bootloader'. Um dies wirklich zu erledigen, müssen Sie 1. den Chip zurücksetzen; 2. den bootloader aktivieren (der chip überprüft einen ceratin pin). Dies kann durch einen Jumper und einen (Reset-) Schalter erfolgen. Eine bequemere Möglichkeit (insbesondere auf Ihrem Schreibtisch) besteht jedoch darin, zwei Handshake-Leitungen zu verwenden, um den Trick „hands-off“ auszuführen. Die meisten PC-Download-Programme (z. B. flashmagic, lpc21isp) können die Handshake-Magie für Sie ausführen (wenn Sie die Handshake-Leitungen korrekt verkabeln).
Wouter van Ooijen