無線でARMをアップグレードする


9

GSMモデムを搭載したARMボードを作成します。
ARMファームウェアを無線でアップグレードできるようにしたいと考えています。

そのための良い、信頼できる、オープンソースのソリューションはありますか?
そうでない場合、この機能を備えた有料OSはありますか?


2
ARMは非常に一般的です。ARMアーキテクチャを組み込んだ多くのメーカーがあり、それらの一部はその機能を提供している場合があります。
クラバッキオ

1
使用する予定のARMチップ/ファミリについてのより具体的な情報がいいでしょう。すべてではないにしても多くのCortex-Mマイクロコントローラーは、ユーザーコードからフラッシュへの書き込みをサポートしています。Mapleブートローダーleaflabs.com/docs/bootloader.htmlなどのオープンソース実装の例があり、一部のクワッドコプターでサポートされている無線リンクを介したファームウェアのアップグレードを見たことがあります。
ソーン

現在のところ、ARMデバイスは選択していません;)
ホットチップ

7
ファームウェアのアップグレードの大きな問題は、ファームウェアに問題がある場合にチップを強制的に更新モードにする方法です。チップにアクセスできる場合は、リセットしてブートロードピンを強制的にHighにできますが、無線でそれを行うにはどうしますか?私が想像できる唯一の信頼できるソリューションは、基本的な通信を処理し、メインチップを更新できる2番目のチップ(更新不可)を持つことです。その問題を解決した後、実際のブートローディングは、チップに組み込まれたブートローダー(たとえば、LPC uCはすべてシリアルブートローダーを持っていることがわかっています)を使用するのと同じくらい簡単です。
Wouter van Ooijen

2
@Hernanそれは、1つのチップ(どういうわけか間違ったコードを実行している)のように、他のチップをリセット状態に保つような、微妙な障害モードを可能にします。本当に信頼できる唯一のソリューションは、機能を1つのチップにシンプルに保つことで、更新する必要がありません。
Wouter van Ooijen

回答:


9

既成のソリューションについては知りませんが、1つのプロジェクトでどのように対処したかを説明します。完全に「ブリックできない」というわけではありませんが、何千ものアップグレードが失敗することは知りません。このアプリケーションでは、非常に低い故障率でも、ユニットにアクセスする必要がある場合よりも安くなります。

メインアプリケーションには、通常の通信プロトコルに3つの追加パケットタイプが追加されています。これには、エラー検出と再試行ステートが含まれます。

  1. begin firmware updateコマンドは、外部SPIフラッシュの予約済みメモリ領域をクリアします。ユニットがバックアップバッテリーから実行されている場合、または外部電源から実行されているがバッテリーの充電状態が25%未満の場合は、エラーを返します。

  2. ブロック書き込みコマンドは、外部フラッシュメモリに小さなチャンクで書き込まれるオフセットアドレスとデータを受け入れます。上位レベルのプロトコルは、エラー検出と再送信を処理します。各ブロックが書き込まれた後、コマンドが確認される前に読み戻されて検証されます。

  3. ファームウェア更新の終了コマンドには、受信したファームウェアがさらに検証するためにイメージ全体のCRC32と一緒に存在する必要がある長さが含まれています。それが外部フラッシュメモリの内容と一致し、電源状態がまだOKの場合、同じ長さでCRC32が「マジックナンバー」とともにEEPROM領域に転送され、ファームウェアの更新が保留中であることを示します。

  4. メインアプリケーションでハードループが実行され、ウォッチドッグが強制的に再起動されます。

  5. ブートローダー(ARMのフラッシュの書き込み保護された領域にあります)は、EEPROM内のマジックナンバーを確認し、イメージのCRC32をもう一度確認します。すべて問題なければ、外部フラッシュからARMのフラッシュのメインプログラム領域にイメージを転送します。

  6. 保留中のアップグレード情報がEEPROMから消去され、ハードループが再起動を強制します。今回は、ブートローダーが通常の方法でメインアプリケーションを起動します。

更新フェーズが失敗するのを見たことはありませんが、展開前に新しいファームウェアリリースをテストすることは、この方法を使用することが重要です。新しいリリースがGSMネットワークに接続できず、将来のアップデートコマンドを受け入れることができない場合、オンサイトファームウェアアップデートが必要になります。


1

LinuxまたはRTOS、またはベアメタルを実行していますか?Debianを使用している場合は、現在のファイルシステムのスナップショットを取得し、「apt-get」を介してアップグレードを実行してから、機能したかどうかに応じて変更を保持またはロールバックします。


アプリケーションに応じてLinuxとベアメタルがあります;-)
hotips

1
Linuxがあれば、そのインフラストラクチャの多くを活用できます。現在のプロジェクトの更新を処理する方法は、カスタムアプリケーションの.debファイルを作成し、apt-get updateを使用してシステムを更新することです。私もbtrfsを実験しています。そのファイルシステムでは、スナップショットを作成できます。したがって、私の計画は、目的のディレクトリのスナップショットを作成して、更新してみて、それが機能しない場合は、スナップショットを元に戻すことです。ベアメタルを使用している場合は、通常のデュアルメモリアプローチを使用する必要があります。1つは最新の動作コード用のイメージ、もう1つは新しくダウンロードしたコード用です。
フレッドバセット2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.