FPGA & Verilog入門本『TANG PriMERで始める FPGA & Verilog入門』頒布中!

マイコンのDFUモードとは

スポンサーリンク
Arduino

今回は、マイコンのプログラム書き込みに使う「DFUモード」について調べたことをまとめます。

スポンサーリンク

Arduino UNOのMIDIデバイス化で使用したDFUモード

MocoによるUNOのMIDIデバイス化

【永久保証付き】Arduino Uno
スイッチサイエンス
売り上げランキング: 948

過去にArduino UNOをUSB MIDIデバイス化してレーザーハープを作りました。

レーザーハープを自作する。(Part 4 : Moco導入編)

Arduino UNOでUSB MIDIデバイスを作ろうとした際に、Arduino UNOのスケッチ、つまりATmega328Pに書き込まれるプログラムだけでは対応できません。
このため、Arduino UNOのボード上にあるATmega16U2というマイコンのファームウェアを変更しました。

この時使用したのが、ATmega16U2をUSB MIDIデバイスとして認識させるファームウェア「Moco」です。

UNO上にあるATmega16U2は、デフォルトではUSB-シリアル変換の役割を担っています。このファームウェアをMocoに変更することで、USB MIDIデバイスになります。

ATmega16U2にはDFUモードで書き込む

ATmega16U2へのファームウェアの書き込みを行う場合、いつものようにArduinoのIDEでは書き込みを行えません。
このため、Arduino UNOをDFUモードというモードにして、専用の書き込みソフトを使用してプログラムを書き込みました。

しかし、この方法を使えばプログラムを書き込めることはわかりましたが、DFUモードというものがわからなかたっため、調べてみました。

DFUモードとは何か

まずは、DFUモードについてGoogleでそのまま検索しました。

SWITCH SCIENCEさんのATmega32U4ブレークアウトボードのWikiにDFUについての記述がありました。

ATmega32U4の乗った単純なボードです。 ATmega32U4には、工場出荷時からブートローダが書きこまれていて、DFU機能を実現しています。 DFUというのは、USB経由でファームウェアを書き込むことを可能にする機能です。 AVR ISP mkIIのような書き込み装置が要らないのが魅力的です。

引用元:SWITCH SCIENCE – ATmega32U4ブレークアウトボード
https://trac.switch-science.com/wiki/32u4bb

つまり単純には、DFUはプログラムを書き込む機能です。そして、それがUSB経由で行えるということだそうです。

DFUに関する日本語の記述は、思ったよりも少なかったため、英語の記述を探してみました。

まずはおなじみのWikipedia

Device Firmware Upgrade

Device Firmware Upgrade (DFU) is a vendor- and device-independent mechanism for upgrading the firmware of USB devices with improved versions provided by their manufacturers, offering (for example) a way for firmware bugfixes to be deployed. During the firmware upgrade operation, USB devices change their operating mode effectively becoming a PROM programmer. Any class of USB device can implement this capability by following the official DFU specifications.

引用元:Wikipedia – USB
https://en.wikipedia.org/wiki/USB

DFUは、ベンダー及びデバイスに依存しないメカニズムで、USBデバイスのファームウェアアップデートを行う方法等を提供すると書かれています。

また、openmokowikiというサイトから。

USB Device Firmware Upgrade (DFU) is an official USB device class specification of the USB Implementers Forum.

It specifies a vendor and device independent way of updating the firmware of a USB device. The idea is to have only one vendor-independent firmware update tool as part of the operating system, which can then (given a particular firmware image) be downloaded into the device.

In addition to firmware download, it also specifies firmware upload, i.e. loading the currently installed device firmware to the USB Host.

(中略)

Despite its clear architecture and DFU being an official USB standard, very few companies are known to have implemented it in their products. In the Free Software / Hardware area, most notably the OpenPCD project has used it for their Free RFID readers.

引用元:openmokowiki – USB DFU – The USB Device Firmware Upgrade standard
http://wiki.openmoko.org/wiki/USB_DFU_-_The_USB_Device_Firmware_Upgrade_standard

公式USBデバイスクラスであること、そして公式なUSB規格であるにもかかわらず、あまり使われていないということも書かれています。

DFUモードとArduinoの関係

DFUモードがUSB経由でマイコンにプログラムを書き込む方法ということがわかりましたが、次にArduinoとの関係を考えます。

USB機能をもつマイコン

ATmega32U4はArduino Leonardoで、ATmega16U2はArduino UNOで使われています。
これら2つのマイコンの特徴はUSBと接続する機能をもっていることです。

Arduino UNOのAtmega328Pには、USBと接続する機能はありません。
このため、USB MIDIデバイスにするためにATmega16U2を変更しました。

USB対応ArduinoはDFUモードで書き込み可能

上記の2種類のマイコンの場合、USB機能をもっていることから、これらにプログラムを書く場合はUSBによるプログラム書き込み、つまりDFUモードを使えることになります。

DFUではブートローダは書き換え不可

上でご紹介したSWITCH SCIENCEさんの製品はATmega32U4です。
これはArduino Leonardoのマイコンです。

この製品のwikiでは、

ただし、DFUではブートローダ自体を書き換えることはできません。 Arduino Leonardo互換にしたい場合は、LeonardoのブートローダをAVR ISP mkIIなどで書き込んでください。

引用元:SWITCH SCIENCE – ATmega32U4ブレークアウトボード
https://trac.switch-science.com/wiki/32u4bb

と書かれています。

ということは、DFUモードはブートローダによって読み込まれるプログラムを書き込む方法ということですね。
Arduinoでいうスケッチを書き込むようなもの。

そして、ブートローダそのものを書き込む場合は、AVR ISP mkII等でISPモードで書き込むということになります。

ISPモードは、単品で買ってきたAVRマイコンをArduino化するために、ブートローダを書き込む際に使いました。

Arduinoへのプログラム書き込み方法の整理

最後に、先程ISPモードという言葉も出てきましたので、DFUモードを含め、Arduinoへのプログラム書き込み方法を整理します

ATmega328PはUARTで書き込み

ATmega328PとはArduino UNOのマイコンですが、ここで言うUARTでの書き込みとは、マイコン単体でArduinoとして使用する場合のことです。

前述しました様に、UNOのボードにはATmega16U2がのっていて、これがUSB – UARTの変換を担い、328Pへとスケッチを書き込んだり、各種通信を行ったりしています。

よって、328P単体で使う場合(16U2がない場合)のプログラムの書き込みはUARTで行えます

各社からUSBシリアル変換モジュールが販売されていますので、こちらで書き込み可能です。

[スイッチサイエンス] FTDI USBシリアル変換アダプター Rev.2
スイッチサイエンス
売り上げランキング: 15,303

USB対応マイコンはDFUモードで書き込み

USB対応マイコンとは、Arduino LeonardoのATmega32U4やArduino UNO上のATmega16U2です。

Arduino Micro

Arduino Micro

posted with amazlet at 17.06.23
Arduino
売り上げランキング: 54,187

 

 

これらのマイコンの場合、今回調べたDFUモードでの書き込みが可能です。

Arduino UNOでUSB MIDIデバイスを作った際には、ATmega16U2にDFUモードでMocoを書き込みました。

ブートローダはISPモードで書き込み

こちらは、USB機能の有無によらず、AVRマイコンをArduinoにする場合です。

USB機能をもつ32U4や16U2、またはUSB機能をもたない328Pでも、これらをArduinoにするためにブートローダを書き込む際にはISPモードを使用して書き込みます。


 

以上、DFUモードについて調べたことをまとめました。

コメント

タイトルとURLをコピーしました