Aktualisieren Sie ARM über Funk

9

Wir werden eine ARM-Karte mit einem integrierten GSM-Modem erstellen.
Wir möchten die ARM-Firmware drahtlos aktualisieren können.

Gibt es dafür eine gute, zuverlässige Open Source-Lösung?
Wenn nicht, gibt es ein kostenpflichtiges Betriebssystem mit dieser Funktion?

Hotips
quelle
2
ARM ist recht allgemein gehalten: Es gibt viele Hersteller, die ARM-Architekturen einbetten, und einige von ihnen bieten diese Funktion möglicherweise an.
Clabacchio
1
Eine genauere Information darüber, welchen ARM-Chip / welche ARM-Familie Sie verwenden möchten, wäre hilfreich. Viele, wenn nicht alle Cortex-M-Mikrocontroller unterstützen das Schreiben zum Flashen aus dem Benutzercode. Es gibt beispielhafte Open-Source-Implementierungen wie den Maple-Bootloader leaflabs.com/docs/bootloader.html , und ich glaube, ich habe ein Firmware-Upgrade über eine Funkverbindung gesehen, die in einigen Quadcoptern unterstützt wird.
Dorn
Wir haben das ARM-Gerät im Moment nicht ausgewählt;)
Hotips
7
Das große Problem bei Firmware-Upgrades besteht darin, den Chip in den Update-Modus zu zwingen, sobald ein Fehler mit der Firmware vorliegt. Wenn Sie Zugriff auf den Chip haben, können Sie ihn zurücksetzen und einen Bootload-Pin hoch drücken. Aber wie machen Sie das drahtlos? Die einzige zuverlässige Lösung, die ich mir vorstellen kann, ist ein zweiter Chip (nicht aktualisierbar), der die grundlegende Kommunikation übernimmt und den Hauptchip aktualisieren kann. Nach dem Lösen dieses Problems kann das eigentliche Bootloading so einfach sein wie die Verwendung (zum Beispiel) des im Chip integrierten Bootloaders (zum Beispiel haben die LPC-uCs, von denen ich weiß, dass sie alle einen seriellen Bootloader haben).
Wouter van Ooijen
2
@ Hernan Das würde subtile Fehlermodi ermöglichen, wie zum Beispiel, dass ein Chip (der irgendwie den falschen Code ausführt) den anderen zurücksetzt. Die einzig wirklich zuverlässige Lösung besteht darin, die Funktionen in einem Chip so einfach zu halten, dass Sie ihn niemals aktualisieren müssen.
Wouter van Ooijen

Antworten:

9

Mir sind keine vorgefertigten Lösungen bekannt, aber ich werde beschreiben, wie ich sie in einem Projekt umgangen habe. Es ist nicht völlig "unbrickable", aber ich bin mir nicht bewusst, dass es bei Tausenden von Upgrades fehlschlägt. Für diese Anwendung wäre eine sehr niedrige Ausfallrate immer noch billiger als der Zugriff auf die Einheiten.

Die Hauptanwendung verfügt über drei zusätzliche Pakettypen, die dem normalen Kommunikationsprotokoll hinzugefügt wurden. Dazu gehören die Fehlererkennung und eine Wiederholungsstrategie:

  1. Ein Befehl zum Starten der Firmware-Aktualisierung löscht einen reservierten Speicherbereich in einem externen SPI-Flash. Es wird ein Fehler zurückgegeben, wenn das Gerät mit seiner Pufferbatterie betrieben wird oder wenn es mit externer Stromversorgung betrieben wird, der Ladezustand der Batterie jedoch unter 25% liegt.

  2. Ein Schreibblockbefehl akzeptiert eine Offset-Adresse und Daten, die in kleinen Blöcken in den externen Flash-Speicher geschrieben werden. Das übergeordnete Protokoll sorgt für die Fehlererkennung und Neuübertragung. Nachdem jeder Block geschrieben wurde, wird er zurückgelesen und überprüft, bevor der Befehl bestätigt wird.

  3. Ein Befehl zum Beenden der Firmware-Aktualisierung enthält die Länge, die die empfangene Firmware zusammen mit einem CRC32 des gesamten Images zur weiteren Überprüfung haben sollte. Wenn dies mit dem Inhalt des externen Flash-Speichers übereinstimmt und die Energiebedingungen immer noch in Ordnung sind, wird CRC32 zusammen mit einer „magischen Nummer“ in einen EEPROM-Bereich übertragen, um anzuzeigen, dass ein Firmware-Update aussteht.

  4. In der Hauptanwendung wird eine harte Schleife ausgeführt, um einen Neustart des Watchdogs zu erzwingen.

  5. Der Bootloader (der sich in einem schreibgeschützten Bereich des ARM-Flash befindet) erkennt die magische Nummer im EEPROM und überprüft erneut den CRC32 des Images. Wenn alles in Ordnung ist, wird das Bild von externem Flash in den Hauptprogrammbereich des ARM-Flash übertragen.

  6. Die ausstehenden Upgrade-Informationen werden aus dem EEPROM gelöscht und eine harte Schleife erzwingt einen weiteren Neustart. Diesmal startet der Bootloader die Hauptanwendung normal.

Obwohl ich noch nie gesehen habe, dass die Update-Phase beim Testen neuer Firmware-Versionen vor der Bereitstellung fehlschlägt, ist die Verwendung dieser Methode von entscheidender Bedeutung. Wenn eine neue Version keine Verbindung zum GSM-Netz herstellen und zukünftige Update-Befehle akzeptieren kann, ist ein Firmware-Update vor Ort erforderlich.

PeterJ
quelle
1

Führen Sie Linux oder ein RTOS oder Bare Metal aus? Wenn Sie Debian verwenden, können Sie einen Snapshot des aktuellen Dateisystems erstellen, ein Upgrade über "apt-get" durchführen und die Änderungen beibehalten oder rückgängig machen, je nachdem, ob es funktioniert hat oder nicht.

Fred Basset
quelle
Wir haben Linux und Bare Metal je nach Anwendung ;-)
Hotips
1
Wenn Sie Linux haben, können Sie einen Großteil dieser Infrastruktur nutzen. Ich verarbeite Updates für mein aktuelles Projekt, indem ich .deb-Dateien für die benutzerdefinierten Anwendungen erstelle und dann apt-get update verwende, um das System zu aktualisieren. Ich experimentiere auch mit btrfs. Mit diesem Dateisystem können Sie Schnappschüsse machen. Mein Plan ist es also, die gewünschten Verzeichnisse als Snapshot zu erstellen, zu versuchen und zu aktualisieren. Wenn dies nicht funktioniert hat, wird der Snapshot zurückgesetzt. Wenn Sie auf Bare-Metal-Basis arbeiten, müssen Sie wahrscheinlich den üblichen Dual-Memory-Ansatz wählen, ein Bild für den neuesten Arbeitscode und ein anderes für den frisch heruntergeladenen Code.
Fred Basset