防弾ファームウェアのアップグレード


16

ユーザーが販売後にデバイスファームウェアを安全にアップグレードできるようにするために、どのような手法が使用されていますか?Cortex M3 / 4マイクロコントローラーを使用してこれを実行したいのですが、どのマイクロでもテクニックを実行する必要があると思います。

もちろん、余分な成分の量を最小限に抑えてください。

回答:


16

コードに必要なフラッシュメモリの2倍以上の量のチップを使用してください。これにより、何かがうまくいかない場合に備えて古いファームウェアを残したまま、このメモリに新しいファームウェアを取得できます。

新しいファームウェアのチェックサムを復号化して検証した後、ブートローダーはそれを最終的な場所にコピーし、古いファームウェアを置き換えます。この部分で何か問題が発生した場合、ハードリセット後、ブートローダーは新しいファームウェアが無効であることを確認し(もう一度チェックサムを実行して)、コピーを再試行します。

これは、私が知っている最も簡単で確実な方法です。また、ブートローダーにコードをほとんど必要とせず、メインプログラムとブートローダーの間で機能を複製する必要もありません(ブートローダーに通信ロジックは必要ありません)。


10
エレクトロニクスのユーザーとして、新しいファームウェアには正しいチェックサムがあり、ソフトウェア自体にバグがある場合、古いファームウェアを起動するボタンを起動中に保持するのがいいと付け加えます。
ザンリンクス

4
このソリューションで見られる「問題」は、何らかの再配置テーブルまたは完全な位置独立コードが必要なことです。そうしないと、コードは実行されません。
ニコエルフルト

2
@Masta-ファームウェアが最終(通常)の場所にコピーされる部分を理解していません。
ケビンフェルメール

3
@jpc-社内のいくつかの社内ツールの外部シリアルフラッシュチップでこの手法を使用しています。8ピンSOICまたはQFN部品のスペースがある場合、2倍以上のフラッシュを備えたマイクロコントローラーは必要ありません。1MB未満のシリアルフラッシュメモリは1ドル未満で使用できるため、場合によっては、マイクロコントローラをアップグレードするよりもこのルートを使用する方が安くなる場合があります。
ケビンフェルメール

@zan-はい、これも使用します。1つの懸念または利点は、古いファームウェアを再コピーすると、デバイスがデフォルトにリセットされることです(マイクロにEEPROMはありません。MACアドレスやIPアドレスなどの構成データを自己書き込みフラッシュに保存します)。これにより、IPアドレスを忘れたときにボードを簡単に見つけることができます。
ケビンフェルメール

12

ブートローダーと数KBの追加フラッシュを使用します。

アップグレードは、UART、USB、I2C、または別のプロトコルを介していくつかの特別なコマンドを送信することにより、ブートローダーによって実行されます。メインコードのみが更新されます-ブートローダーコードは、外部プログラマー(PIC用のJTAG / PICkitなど)を介してのみ変更されません。

更新が失敗した場合(停電、誰かが電線をつまずいたなどの理由で)、ウィジェットは機能しませんが、ブートローダーはまだ存在するため、アップグレードを再試行できます。

フラグがどこかのバイトに設定されると、メインコードが完全に更新されていないため、メインコードが正しく実行されなくなります。


起動が電源投入のためである場合、ブートローダーを強制的に実行することもできます。これは、すぐにクラッシュする不正なファームウェアをロードする場合に役立ちます。ブートローダーは、X秒後にアプリケーションを実行するためにタイムアウトを必要とします。
ロバート

単純なプロトコル(非同期シリアル、TTL、485など)を使用できる場合は、良いアイデアです。より複雑なケース(SDカード、GPRS、USB)については、(アップグレード不可の)ブートローダーに複雑なサポートコードを含めません。イーサネットOTOH(raw UDPまたはTFTP)は、これには十分単純です。
jpc

3

お使いのデバイスが比較的高価であり、コストに余裕がある場合(そして、お客様はアップグレードを気にする場合)、これを行うことができます...

(一般的に、この手法では外部ストレージまたはjtagの不正な使用が必要です。.)

システムを停止して再プログラムできる固定プログラムマイクロ(小さなPICなど)を用意します。

「アップグレードプロセッサ」ファームウェアを変更できないため、問題が発生することはありません。

1)ユーザーはデバイスをアップグレードできます

2)アップグレードが失敗した場合、いつでも再試行できます。レンガにできない

3)ターゲットデバイスがブートローダーをサポートしていない場合(ブートローダーを実行したいだけの場合)でも、目的のデバイスを実行させることができます。

FPGA、DSP、およびその他のオッドボールターゲットで機能します。

本当にすてきなユーザーインターフェイスを持つことができます(PICでさえWebサーバーを実行できます。...)


2

製品に、ある種の単純なシリアルインターフェイス(できればEIA232)があることを確認してください。DB-9用のスペースがなければ、非標準のコネクタでも構いません。たとえば、TxD、RxD、およびグランドに必要なのはTRSコネクタだけです。

初めてデバイスをプログラミングするときは、ブートローダーを含めます。新しい機能が必要な場合は、遅かれ早かれブートローダー自体をアップグレードする必要があるため、これは可能な限り単純でなければなりません。(おそらくアップグレードすることさえできません

次に、TRSコネクタ。スイッチ付きのジャックを使用して、コネクタの存在を検出できるようにします。リセットをすぐに確認し、プラグが存在する場合はブートローダーを起動し、そうでない場合はアプリケーションを起動します。このように、ブートローダーとユーザーアプリケーションプログラムは十分に分離されたままです。(チェックは実際にはブートローダーの一部です。アプリケーションのバージョンに関係なく必要になります。そうしないとブートローダーに入ることができません!)


なぜブートローダーをアップグレードしたいのですか?アップグレードプロセスでデバイスがブロックされないようにするにはどうすればよいですか?可能であれば、アップグレードするのに苦労するほど魅力的な新機能は何ですか?
ケビンフェルメール

5
@Kevin-彼は、ブートローダーが非常にシンプルであるべきだと思ったので、あなたはそれを「アップグレード」することさえ考えないでしょう。
jpc

@jpc-ああ、あなたは正しい、それを間違って解釈した。同意しました!
ケビンフェルメール

1

「アップグレード」にはどのような機器が利用できますか?PC、USBスティック、マイクロSDカード?

1つの方法は、アプリケーションを取り外し可能なアイテム(USBスティック、SDカードなど)に入れることです。チップは、アイテムからアプリケーションをロードします。アップグレード担当者は、単にアイテムを交換して再起動します。

私が知っているARMおよびCortexマイクロコントローラーチップ(NXP、Atmel)にはすべて、シリアルブートローダーが組み込まれているため、アップデーターがPCとシリアルケーブル(およびCOMポートインターフェイスを用意している場合)更新。


それでは、UARTピンをポートに配線するだけで、COMポートとPCに接続しながら、mcuのコードなしでファームウェアをフラッシュできますか?いいヒント。
イムブロンディール

データシートのセクション「ブートローダー」を確認してください。これを本当に「ハンドオフ」するには、1。チップをリセットする方法が必要です。2.ブートローダーをアクティブにします(チップは特定のピンをチェックします)。これは、ジャンパーと(リセット)スイッチで行うことができますが、より便利な方法(特に机上)は、2つのハンドシェイクラインを使用して「ハンドオフ」のトリックを行うことです。ほとんどのPCダウンロードプログラム(たとえば、flashmagic、lpc21isp)は、ハンドシェイクマジックを実行できます(ハンドシェイクラインを正しく配線した場合)。
ウーターヴァンOoijen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.