マイクロコントローラのDFUモードを使用して現場でファームウェアを更新

著者 Jacob Beningo

DigiKeyの北米担当編集者の提供

ほとんどすべての組み込みシステムでは、現場でファームウェアを更新して新しい機能を追加したりバグを修正したりできる必要があります。しかし、現場でのファームウェアの更新は、開発者が独自のブートローダをプログラミングしたり、サードパーティのコンポーネントサプライヤからブートローダを購入したりする必要があるため、困難な場合があります。

実は、これを行う簡単な方法があります。この記事では、多くのマイクロコントローラに組み込まれていますが見落とされることの多い、デバイスファームウェア更新(DFU)機能の使用方法を説明します。

ファームウェア更新オプション

ブートローダを最初から開発するのは簡単なことではありません。開発者は、複数のアプリケーションが共存できるように、フラッシュスペースを解析する必要があります。その後、プログラミングツールを使用しないでコンパイル済みのバイナリをマイクロコントローラに転送する何らかの手段を開発する必要があります。それには、独自の通信プロトコルを開発するか、新しいイメージを格納するための外部メモリを追加することによってシステムをいっそう複雑なものにしなければなりません。マイクロコントローラが備える内部メモリの量を増やすことにもなります。

また、ブートローダはシステムの状態を設定して、アプリケーションのコードにジャンプしても安全かどうかを判断する必要があるため、ソフトウェア自体も複雑になる可能性があります。

カスタムブートローダを使うと、開発者が切望するアプリケーションに対する柔軟性は得られますが、多くのアプリケーションで使用できて開発者の作業を必要としないファームウェア更新規格があります。それがUSB規格の組み込みデバイスファームウェア更新(DFU)クラスです。この規格を使用すると、USBポートを使用して現場でマイクロコントローラのアプリケーションコードを更新することができ、ファームウェア更新プロセスと開発サイクルを劇的に短縮できます。

DFUが広く普及するようになったため、STMicroelectronicsなどの一部のマイクロコントローラベンダーは、ROMにハードコーディングされた更新を実行するために必要なソフトウェアさえ提供するようになっています。そのようなソフトウェアを用意していないベンダーの多くは、DFUのサポート方法についてのコード例を提供しています。

DFU対応のマイクロコントローラの選択

DFUをサポートする最も簡単な方法は、STMicroelectronicsのSTM32マイクロコントローラのような、DFUがROMに既に組み込まれているマイクロコントローラを選択することです。そのようなマイクロコントローラの中でも、最も開発者の興味を引くデバイスは、STM32 IoTディスカバリノードおよびSTM32F429ディスカバリキット上のデバイスです。

STMicroelectronicsのSTM32 IoTディスカバリノードの画像

図1:STMicroelectronics STM32 IoTディスカバリノードは、ファームウェア更新のためのDFUモード機能を含むSTM32L475 MCUを実行するARM® Cortex®-M4コアが基になっています。このデバイスは、IoTノードとして使用できるように設計されています。(画像提供:STMicroelectronics)

STM32 IoTディスカバリノードは、IoTセンサノードとして使用するように設計されている低コストの開発ボードです。このボードには、Wi-FiやBluetoothなどのボードを接続するための複数の異なるインターフェースが含まれます。興味深い点は、オンボードのSTM32L475ではインターネットに接続するように設計されているデバイスでDFU機能をテストおよび使用するための機能が開発者に適用されることです。 

スタンドアロンの通常のデバイスでDFUをテストすることだけが目的の開発者に対しては、STM32F429ディスカバリキットが、STM32F4シリーズ マイクロコントローラ用の低コストの開発キットとしてよく知られています。以下では、これらのマイクロコントローラでのDFUのテスト方法について説明します。

STMicroelectronicsのSTM32F429ディスカバリキットの画像

図2:STMicroelectronicsのSTM32F429ディスカバリキットは、ARM® Cortex®-M4コアが基になっています。この低コストの開発ボードのMCUには、ファームウェア更新用のDFUモード機能も含まれます。(画像提供:STMicroelectronics)

簡単なDFUの例

DFUへのアクセスはマイクロコントローラごとに異なります。簡単な例として、STM32L475 MCUを実行するデバイスでのファームウェアの更新方法を見てみます。

前に説明したように、STM32マイクロコントローラのROMにはDFUブートローダが組み込まれています。このブートローダにアクセスするには、MCUの起動中にBOOTピンの1つをアースに接続する必要があります。BOOTピンが、MCUが起動するモード(フラッシュ、RAM、またはここで推奨しているDFU USBモード)を制御します。

DFUを使用してダウンロードされるようにアプリケーションを準備するとき、開発者に求められる追加作業はありません。GNUコンパイラコレクション(GCC)および他の多くのツールチェーンでは、アプリケーションをコンパイルするときにDFUファイルを生成できます。ここでの開発者に対する唯一のヒントは、そのファイルが保存される場所の特定です。他の一般的なアプリケーションと同じように、デバッガフォルダまたはオブジェクトフォルダを探せば.dfuファイルが見つかります。

DFUファイルは、バイナリファイル、Sレコードファイル、16進ファイルなどの他のアプリケーションレコード形式とよく似ています。ファイル形式にはアドレスとデータ情報が含まれ、それらはUSBに渡されて、処理された後、フラッシュ内の指定されている場所に書き込まれます。プロセスは極めてシームレスなので、開発者が使用されているプロトコルを調べる必要があるのは(あったとしても)ごくわずかです。すべては表から見えないように抽象化されており、ファームウェアの更新プロセスと開発作業の複雑さの軽減に役立っています。

開発者がDFUを使用するマイクロコントローラにアプリケーションを転送するために使用できるツールは何種類かあります。使用できる一般的なコマンドラインツールはdfu-utilです。このツールは、LinuxとWindows® の両方でオープンソースソフトウェアパッケージとして利用できます。STMツールチェーンを使用している開発者の場合は、STMicroelectronicsのアプリケーションDfuSeを利用できます(図3)。

STMicroelectronicsのDfuSeツールの画像

図3:STMicroelectronicsのDfuSeツールを使用すると、GCCなどのコンパイラによって生成されてDFU対応のマイクロコントローラにロードされるDFUファイルをプログラミングできます。(イメージ提供:Beningo Embedded Group)

DfuSeはWindows GUIユーティリティであり、DFUモードで起動されてUSB経由でコンピュータに接続されているSTM32デバイスを検出します。開発者は、プログラミングされたベンダーや製品IDなどの情報を取得できます。フラッシュスペースが適切に保護されていない場合、[Upload Action]ボックスを使用することにより、MCUのメモリの内容をコピーして、コンピュータに保存することもできます。

開発者がDfuSeを使用するときは、通常、[Upgrade or Verify Action]セクションだけを使用します。この領域では、DFUアプリケーションファイルを選択してから、[Upgrade]ボタンを選択できます。選択すると、DfuSeが自動的に、ファームウェア更新プロセスを調整し、ファイル全体がMCUに正常にロードされるまで処理します。その後、イメージが正常に受け取られたことを[Verify]を選択して確認できます。確認が終了したら、BOOTピンをデフォルトの構成(フラッシュでブートなど)に戻した後、[Leave DFU]モードを選択し、更新されたファームウェアをロードして実行できます。

DFUをサポートしていないデバイスでのDFUの使用

マイクロコントローラがDFUブートローダをROM内に格納していないからといって、開発者がDFU機能を利用できないわけではありません。DFUはUSBクラスであり、多くのUSBスタックでサポートされてます。つまり、開発者は簡単にDFU機能をアプリケーションフレームワークに追加して、DFUの更新を実行できます。

たとえば、Microchip TechnologyAT32UC3A3には、組み込みのDFUモードはありません(図4)。開発者は、簡単なアプリケーションノートに従って作業を行うことができます。このノートには、DFUの動作方法の説明と、DFUを適切にサポートするためのマイクロコントローラの構成方法が記載されています。

Atmel AT32UC3A3 UC3-A3 XPLD AVR® 32 MCU 32-Bit AVR組み込み評価ボードの画像

図4:AT32UC3A3 UC3-A3 XPLD AVR® 32 MCU 32-Bit AVR組み込み評価ボードにはオンチップのDFUは含まれませんが、DFUファームウェア更新機能を有効にするフレームワークのUSBコードを追加できます。(画像提供:Microchip Technology)

フレームワーク更新の実行に関するヒントとコツ

現場でのファームウェアの更新は、必ずしもDFU対応のマイクロコントローラからのみ行わなければならないわけではありません。開発者は、他のファームウェア更新方法が必要である、またはいっそう実際的であると判断することもできます。このような状況では、ファームウェア更新プロセスに関して開発者が留意すべきヒントがいくつかあります。これらには、次の事項が含まれます。

  • チェックサムまたはハッシュを使用して、マイクロコントローラのメモリに書き込まれるアプリケーションを検証します。
  • 十分なメモリを備えたマイクロコントローラを選択し、問題が発生した場合にファームウェアのバージョンをロールバックできるように、ファームウェアのバックアップコピーを保存します。
  • マイクロコントローラにフラッシュローダが組み込まれているかどうか、およびエンドユーザがそれを誤ってトリガできないようになっているかどうかを確認します。
  • ソフトウェアのブートローダがコンパイルされ、サイズを最適化されていることを確認します。
  • アプリケーションをメモリから読み取られてリバースエンジニアリングできないように、フラッシュ周辺機器をロックします。
  • 常に、スタックポインタ、ベクタテーブル、プログラムカウンタの各レジスタが適切なアプリケーション値に設定されていることを確認します。
  • 代わりの更新方法の使用を検討します(KL46Z Freedomボード(図5)で示されているようなUSB MSDを使用するドラッグアンドドロップ更新など)。

NXP SemiconductorのKL46Z Freedomボードの画像

図5:NXP SemiconductorのKL46Z Freedomボードは低コストの開発ボードであり、デフォルトではDFUをサポートしていません。開発者は、新しいファームウェアイメージを内部メモリにドラッグアンドドロップするUSB MSDなどの代わりの更新方法を使用できます。(画像提供:NXP Semiconductor

結論

ほとんどすべての組み込みシステムには、リコールを防ぐため、現場でアプリケーションコードを更新する方法が必要です。ブートローダを最初から作成したり、既存のブートローダを変更したりすると、開発サイクルに複雑さや統合の問題が発生する可能性があります。

代わりに、開発者は、USBに組み込まれている十分に実証されたDFU機能を利用して、非常にすばやく効率的に、ほとんど、またはまったく労力を費やさずに、現場でアップグレードを実行できます。これを円滑に行うには、マイクロコントローラを慎重に検討し、DFUがマイクロコントローラに組み込まれているかどうか、またはDFU機能を有効にするソフトウェアスタックを含める必要があるかどうかを、判断する必要があります。
DigiKey logo

免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。

著者について

Image of Jacob Beningo

Jacob Beningo

Jacob Beningo氏は組み込みソフトウェアコンサルタントで、現在、製品の品質、コスト、市場投入までの時間を改善することで、ビジネスを劇的に変革するために数十か国以上のお客様と作業しています。同氏は、組み込みソフトウェア開発技術に関する200以上の記事を発表しており、引っ張りだこのスピーカーでありテクニカルトレーナです。ミシガン大学のエンジニアリングマスターを含む3つの学位を取得しています。気楽にjacob@beningo.comにメールするか、彼のウェブサイトwww.beningo.comから連絡してみてください。そして毎月のEmbedded Bytes Newsletterにサインアップしましょう。

出版者について

DigiKeyの北米担当編集者