Aktualisieren Sie ARM drahtlos

Wir werden ein ARM-Board mit einem integrierten GSM-Modem erstellen.
Wir möchten in der Lage sein, die ARM-Firmware drahtlos zu aktualisieren.

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

ARM ist ziemlich generisch: Es gibt viele Hersteller, die ARM-Architekturen einbetten, und einige von ihnen bieten diese Funktion möglicherweise an.
Eine genauere Information darüber, welchen ARM-Chip / welche ARM-Familie Sie verwenden möchten, wäre nett. Viele, wenn nicht alle Cortex-M-Mikrocontroller unterstützen das Schreiben in Flash aus Benutzercode. Es gibt Beispiele für 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 Quadrocoptern unterstützt wird.
Wir haben uns im Moment nicht für das ARM-Gerät entschieden ;)
Das große Problem bei Firmware-Upgrades besteht darin, den Chip in den Update-Modus zu zwingen, sobald etwas mit der Firmware nicht stimmt. Wenn Sie Zugriff auf den Chip haben, können Sie ihn zurücksetzen und einen Bootload-Pin auf High setzen, aber wie wollen Sie das drahtlos machen? 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 der Lösung 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).
@WoutervanOoijen +1 Das ist natürlich eine gute Wahl, wenn "die grundlegende Kommunikation" das Upgrade-Ziel ist, dann gibt es ein Problem mit der "nicht aktualisierbaren", aber eine gute Wahl könnte sein, dass beide Mikrocontroller upgradefähig wären der andere durch Befehle von verschiedenen Kommunikationsschichten
@Hernan Das würde subtile Fehlermodi ermöglichen, wie z. B. ein Chip (der irgendwie den falschen Code ausführt), der den anderen zurückgesetzt hält. Die einzige wirklich zuverlässige Lösung besteht darin, die Funktionen in einem Chip so einfach zu halten, dass Sie ihn nie aktualisieren müssen.
Mit Firmware meinen wir nicht unbedingt alles, angefangen beim kleinsten Teil des Bootcodes. Es ist nützlich, Over-the-Air-Upgrades von beispielsweise Ihrem Betriebssystemkernel, Dateisystem-Image und Boot-Firmware auf höherer Ebene wie u-boot oder was auch immer durchzuführen. Over-the-Air-Upgrade ist nicht exklusiv; wenn das Gerät "bricked" ist, greift man auf ein anderes Upgrade zurück.

Antworten (2)

Mir sind keine vorgefertigten Lösungen bekannt, aber ich werde beschreiben, wie ich es in einem Projekt umgangen habe. Es ist nicht vollständig "unbrickable", aber ich bin mir nicht bewusst, dass es über Tausende von Upgrades fehlschlägt. Für diese Anwendung wäre eine sehr niedrige Ausfallrate immer noch billiger, als sich Zugang zu den Einheiten verschaffen zu müssen.

Die Hauptanwendung verfügt über drei zusätzliche Pakettypen, die zu ihrem normalen Kommunikationsprotokoll hinzugefügt wurden, das eine Fehlererkennung und eine Wiederholungsstrategie an der Spitze enthält:

  1. Ein Start-Firmware-Update-Befehl löscht einen reservierten Speicherbereich in einem externen SPI-Flash. Es gibt einen Fehler zurück, wenn das Gerät mit seiner Backup-Batterie oder mit externer Stromversorgung betrieben wird, der Ladezustand der Batterie jedoch unter 25 % liegt.

  2. Ein Write-Block-Befehl akzeptiert eine Offset-Adresse und Daten, die in kleinen Blöcken in den externen Flash-Speicher geschrieben werden. Das Protokoll der höheren Ebene kümmert sich um die Fehlererkennung und Neuübertragungen. Nachdem jeder Block geschrieben ist, wird er zurückgelesen und verifiziert, bevor der Befehl bestätigt wird.

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

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

  5. Der Bootloader (der sich in einem schreibgeschützten Bereich des ARM-Flash befindet) sieht die magische Zahl im EEPROM und überprüft erneut den CRC32 des Images. Wenn alles in Ordnung ist, überträgt es das Image vom externen Flash in den Hauptprogrammbereich des Flash des ARM.

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

Obwohl ich noch nie gesehen habe, dass die Update-Phase fehlgeschlagen ist, ist das Testen neuer Firmware-Versionen vor der Bereitstellung bei dieser Methode von entscheidender Bedeutung. Wenn eine neue Version nicht in der Lage ist, sich mit dem GSM-Netz zu verbinden und zukünftige Update-Befehle zu akzeptieren, ist ein Firmware-Update vor Ort erforderlich.

Verwenden Sie Linux oder ein RTOS oder Bare Metal? 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.

Je nach Anwendung haben wir Linux und Bare Metal ;-)
Wenn Sie Linux haben, können Sie einen Großteil dieser Infrastruktur nutzen. Die Art und Weise, wie ich Updates für mein aktuelles Projekt handhabe, besteht darin, .deb-Dateien für die benutzerdefinierten Anwendungen zu erstellen und dann apt-get update zu verwenden, um das System zu aktualisieren. Ich experimentiere auch mit btrfs. Mit diesem Dateisystem können Sie Schnappschüsse erstellen. Mein Plan ist es also, die gewünschten Verzeichnisse zu erstellen, zu versuchen und zu aktualisieren, und wenn es nicht funktioniert hat, den Schnappschuss zurückzusetzen. Wenn Sie Bare Metal verwenden, müssen Sie wahrscheinlich den üblichen Dual-Memory-Ansatz verwenden, ein Image für den neuesten Arbeitscode und ein anderes für den frisch heruntergeladenen Code.