DFUとは何か
July 29, 2026 · – 訪問者
組み込みボードをPCに接続したとき、ドライバのない奇妙なUSBデバイスとして認識されるのを見たことがあるなら、それはおそらく DFUモード(Device Firmware Update)に入っていたのだろう。
DFUの正体
DFUはUSB Implementers Forumによって定義されたUSBデバイスクラスであり、もともとは製品固有のツールを一切使わずにUSB周辺機器のファームウェアを更新するために作られた。DFUをサポートするデバイスは、小さく標準化されたインターフェースを公開する。ホスト側のツールはそれに問い合わせを行い、新しいファームウェアイメージを送信し、新しいコードへの再起動をトリガーできる——それらすべてが、他のあらゆる用途に使われているのと同じUSBケーブル一本で行われる。
組み込みボードにおいて「DFUモード」とは、通常、ブートローダー自体(例えばU-Boot)がLinuxを起動する代わりに最小限のDFUスタックを実行している状態を指す。ボードはホスト上でDFUクラスのUSBデバイスとして現れ、dfu-utilのようなツールを使えば、書き込み可能なターゲット(パーティション、メモリ領域など、ブートローダーが公開することを選んだもの)を一覧表示し、そこに直接書き込むことができる。
なぜ重要なのか
DFUが組み込み開発と量産の現場で真に有用である理由はいくつかある。
- 追加のハードウェアが不要。 JTAGプローブもUARTアダプタも要らない——ボードにすでに備わっているUSBポートだけで済む。
- 復旧可能性。 ボードが文鎮化していたり、フラッシュに有効なOSが存在しない場合、DFUモード(多くの場合ストラップピンやboot ROMのフォールバックによってトリガーされる)は、そのボードを再び書き込み可能な状態に戻すための最後の砦になることが多い。
- 標準化。 実在するUSBクラスであり、実在するドライバを持つため、ベンダー固有のカーネルドライバを必要とせず、どのOS上でも同じように動作する。
同じボード上で出会うことになる隣接した仕組みとDFUを対比しておく価値がある。fastboot(Androidのプロトコルで、目的は似ているが伝送形式が異なる)や、swupdateやRAUCのような完全なシステムイメージツール——これらはLinuxがすでに動作している状態で更新の配信とロールバックを扱う——であり、DFUは通常それより一段下、ブートローダーに近い層で動作する。
大まかなワークフロー
ホスト側から見た典型的なDFUセッションは、次のようになる。
# see what the board exposes in DFU mode
dfu-util -l
# flash an image to a specific alt-setting/partition
dfu-util -a 0 -D firmware.bin
ボードはリセットされてブートローダーのDFUハンドラに入り、ホスト側のツールが転送をネゴシエートし、イメージはブートローダーがそのalt-settingにマッピングした場所に書き込まれる——多くの場合、特定のeMMC/NANDパーティションか、次回起動時にブートローダーが本書き込みを行うステージング領域である。
結びに
DFUは、うまく機能しているときには存在を意識させない類のインフラの一つだ。ケーブルを挿し、コマンドを一つ実行するだけで、1分前まで起動できなかったボードが復活する。興味深いエンジニアリングのほとんどは、ブートローダー側を正しく作り込むことにある——何を公開するか、それが実際のストレージにどうマッピングされるか、そして転送が途中で中断されたときにどう安全に失敗するか、といった点だ。
今回は短めの記事だった——具体的な実装(とそれらが厄介になる部分)については、また今後の記事で掘り下げていきたい。
関連記事
- 組み込みLinuxのブートチェーン — ブートローダがカーネルへ制御を渡す仕組み
- デバイスツリーとは何か — ハードウェアをカーネルにどう伝えるか
参考文献
- Universal Serial Bus Device Class Specification for Device Firmware Upgrade, Revision 1.1 — DFUのベースとなっている公式のUSB-IF仕様書。
- dfu-util — 上記の例で使用したホスト側ツール。
- U-Boot: Device Firmware Upgrade (DFU) — 多くの組み込みLinuxボードが使用するブートローダーにおけるDFUの実装方法。
コメント