DFUに関して

備忘録的な内容なのですごく基礎的なことを書きます.

最近,仕事でDFUを触る必要性が出てきたので,とりあえずお勉強.
当たり前ですが,組み込みシステムは一度製品を出荷してしまうと
中々ファームウェアのアップデートはできません.

無論,それでもやらなきゃならないことはあるので,
そのために弄する手段の一つがDFU(Device Firmware Update)

通常,マイコンJTAGやSWDといった専用のインターフェースを用いて
書き込み・デバッグをします.
しかし,こんなものは製品にとっては無用の長物であるばかりか
CPUの中身を覗き放題なので出来る限り潰したいわけです.
しかし,先に書いたようにファームウェアのアップデートだってやりたい・・・

そのため,UARTやCAN・I2Cなど,そもそも別の用途に使っている
(つまり引き出している)インターフェースから書き込めるようにしようと
考えるのは自然の摂理と言えるでしょう.

マイコンにプログラムを書き込むという行為は,
極論してしまえば「メモリのプログラム領域にコンパイルしたデータを書き込む」
行為に他ならないわけで.

ぶっちゃけて言えば,
「母艦から好きなインターフェースでデータを受け取り,プログラム領域に書き込むプログラム」
マイコンのどこかにあれば,それを起動して話は解決というわけです.

多くのマイコンでは,「マイコンどこか」をDFU機能のための領域として確保しています.
ここに先に書いたようなプログラムを開発・書き込んでおけば問題ないというわけですね.

さて,このDFUという機能,一番わかり易いのがArduinoだと考えられます.
通常,Arduinoに使われるAVRマイコンにプログラムを書き込むには,
ICP(In Circuit Programmer)端子を利用して書き込む必要があります.
まぁ,その正体はただのSPIではあるのですが.

しかし,実際のArduinoはUSB,回路でUARTに変換したものを使って書き込んでいますね.
要は,ArduinoのAVRマイコン内部には,UARTからのデータを使ってマイコン
プログラムを書き込む機能(プログラム)が備わっているというわけです.

Arduinoにおいては,これをブートローダーと読んでいますが,
機能的にはDFUに近いものとして考えることが出来るでしょう.