Repository navigation
USB_ATML_FLIP_DFU
- AVR DU 系列の USB 周辺機能実装
- USB 2.0 制御エニュメレーション
- USB 記述子
- USBクラス別詳細
この項の記述は、以下の参考文献を読解して要点を抜き出したものだ。主に前項 Atmel USB DFU Bootloader との相違に着目する。
"Atmel USB DFU Bootloader"(以下 前規約) は、USB協会 : DFU規約 が Revision 1.0 の時期に策定されたもので、後の Revison 1.1 で厳密化された規約や、詳細な状態遷移を備えてはいない。そして Atmel は 前規約 を更改するのではなく、新たに "Atmel FLIP USB DFU"(以下 AVR4023)を策定した。この新しい(そして簡素化された)DFUローダーは、主に以下の系統の工場出荷時に、Flash 領域末尾の bootloader セグメントにプリインストールされて出荷されている。(どれも ISP形式の classicAVR 発展系である)
- Atmel AVR XMEGA 系統
- Atmel AVR UC3 系統
"FLIP" というのは、ホスト側応用アプリケーションでの実装規約名称である。装置側は相変わらず "DFUローダー" と呼ばれる。"FLIP version 1.x" は、旧来の "USB DFU" のみを、"FLIP version 2.x" は、本項の新しい "FLIP 対応 DFU" も包括して扱うことができると捉えて良い。
もはや Atmel 製品ではない AVR DU 系統への公式移植(および専用の Product ID 公式割当)はされていない。実のところ現状のまま移植しても、拡張されたメモリセグメント(単位部)をどう扱えば良いかの迷いが残るし、Product ID の割付もなく、対応するホストローダーもそれに同期できなければ意味がない。拙作の EDBGプロトコル準拠 "euboot" が新造されたのも、ホスト側でのあらたな追加対応が不必要だからだ。
AVR4023 では、単一の 装置記述子、単一の 構成記述子、単一の インターフェース記述子 の 3つだけを有する。エンドポイント記述子は含まれない。"Run-Time" 動作用の記述子規約はない。
| Ofs | Size | Field | Value | Description |
|---|---|---|---|---|
| 0 | 1 | bLength | 0x12 | 記述子全体長 |
| 1 | 1 | bDescriptorType | 0x01 | DEVICE descriptor type. |
| 2 | 2 | bcdUSB | 0x0100 | USB版番号(BCD) |
| 4 | 1 | bDeviceClass | 0x00 | This device does not use the base class code. |
| 5 | 1 | bDeviceSubClass | 0x00 | This device does not use the base subclass code. |
| 6 | 1 | bDeviceProtocol | 0x00 | This device does not use the base protocol. |
| 7 | 1 | bMaxPacketSize0 | 0x40 | エンドポイントEP0 のパケット最大長(64 バイト固定) |
| 8 | 2 | idVendor | 0x03EB | Vendor ID is "ATML" specific. |
| 10 | 2 | idProduct | 0x2F** | The Product ID is unique to each product model. |
| 12 | 2 | bcdDevice | 0x0000 | Device release number in binary coded decimal. |
| 14 | 1 | iManufacturer | 0x00 | An index of unused String Descriptors. |
| 15 | 1 | iProduct | 0x00 | An index of unused String Descriptors. |
| 16 | 1 | iSerialNumber | 0x00 | An index of unused String Descriptors. |
| 17 | 1 | bNumConfigurations | 0x01 | 構成定義数(必ず 1) |
下線を引いた項が、旧規約とも、USB標準DFU とも異なる相違点となる。三つ組のクラス符号は全て 0(インターフェース記述子で規定)を示しており、これで各規約違いを(idProduct が同一でも)見分けることができる。また エンドポイントEP0 のサイズは 32 から 64(USB 2.0 Full-Speed の規定値)に倍増され、メモリ転送通信速度が改善した。(逆にページアクセスができない仕様の EEPROM 書込速度は劣化する)
"DFU 1.0/1.1" と相違なし。bNumInterfaces は必ず 1 を指定する。
| Ofs | Size | Field | Value | Description |
|---|---|---|---|---|
| 0 | 1 | bLength | 0x09 | 記述子全体長 |
| 1 | 1 | bDescriptorType | 0x04 | INTERFACE descriptor type. |
| 2 | 1 | bInterfaceNumber | 0x00 | このIFを特定する指標番号(必ず 0x00) |
| 3 | 1 | bAlternateSetting | 0x00 | 代替IF番号 |
| 4 | 1 | bNumEndpoints | 0x00 | このIFで使用されるエンドポイント数(なし) |
| 5 | 1 | bInterfaceClass | 0xFE | Application Specific Class Code. |
| 6 | 1 | bInterfaceSubClass | 0x00 | Application Specific Sub Class Code. |
| 7 | 1 | bInterfaceProtocol | 0x00 | This device does not use the base protocol. |
| 8 | 1 | iInterface | 0x00 | An index of unused String Descriptors. |
下線を引いた項が、前規約と異なる。補助クラス符号は 0(応用定義)に変更された。その他の変更はない。
前規約同様、使用されない。従って "Run-Time Mode" と、wDetachTimeOut、wTransferSize、bcdDFUVersion に関係する機能は使用できない。
応用アプリケーションがこれを独自に実装することは、自由。
これは未使用だった 特有構成設定(SETUP)要求 が規約文書から削除され、4種類に整理(当項目名も変更)された。さらに不明瞭だった インターフェース番号を指定する wIndex も、明確に 0 指定と改められた。
特有構成設定(SETUP)要求 一覧
| Class-Specific Request | bmRequestType | bRequest | wValue | wIndex | wLength | Data |
|---|---|---|---|---|---|---|
| DFU_DNLOAD | 0 01 00001 | 0x01 | wBlock | 0 | * | FLIP from host |
| DFU_UPLOAD | 1 01 00001 | 0x02 | wBlock | 0 | * | Image from device |
| DFU_GETSTATUS | 1 01 00001 | 0x03 | 0 | 0 | 6 | Status from device |
| DFU_CLRSTATUS | 1 01 00001 | 0x05 | 0 | 0 | 0 | (Empty) |
wBlockについての言及はないが、暗に 0 で始まるインクリメント値を求めているように思われる。(DFU規約由来)
これらは、きっぱりと再定義された。
DFU_GETSTATUS で応答すべき 6バイトの内容
| Ofs | Size | Status Field | Value | Description |
|---|---|---|---|---|
| 0 | 1 | bStatus | 数値 | 最近の要求の実行からの結果状況 |
| 1 | 3 | bwPollTimeout | 0 | 未使用、常に 0 |
| 4 | 1 | bState | 数値 | この応答の送信直後に装置が移行する状態 |
| 5 | 1 | iString | 0 | 未使用、常に 0 |
6バイトのフィーマットに変化はないが、
bwPollTimeoutは明確に未使用となった。
状況と状態値
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_STALL | 0x0F | 0x0A | 未知の特有構成設定(SETUP)要求 |
| STATUS_MEM_UNKNOW | 0x03 | 0x0A | 読み/書きメモリアクセス利用不可 |
| STATUS_MEM_PROTECTED | 0x03 | 0x00 | メモリアクセス保護状態 |
| STATUS_OUTOFRANGE | 0x08 | 0x0A | 範囲外アドレスまたは未知のメモリ単位部選択 |
| STATUS_BLANK_FAIL | 0x05 | 0x00 | 空検査不成功 |
| STATUS_ERASE_ONGOING | 0x09 | 0x04 | 消去進行中 |
bStatusとbStateを合わせてひとつの 状態参照基準 が示されるように規約文書が整理された。これにより(本家 DFU規約よりも)DFUローダーの ステートマシン遷移が画一的かつ明確になった。
- 装置が "DFU_GETSTATUS" 要求への応答で、ホストへ異常表示状態を検出して報告する毎に、"dfuERROR" 状態へ遷移する。どの異常状態報告後も、装置は "DFU_CLRSTATUS" 要求を受け取るまで、"dfuERROR" 状態を去ることはできない。"DFU_CLRSTATUS" の受領で、装置は状態を "IDLE" 動作形態に設定する。
-
bState=0x0A は "dfuERRR" 状況を示し、"IDLE" に戻るには、明確な "DFU_CLRSTATUS" 要求の発行が必要になる。 -
bState=0x04 は "dfuDNBUSY" 状況を示し、まだ "IDLE" に戻っていないことを示す。 -
bState=0x00 は "IDLE" 状況を示し、すべての FLIP コマンドが受容可能なことを示す。
以下の4つの命令要求形式は、"DFU_DNLOAD" と "DFU_UPLOAD" の構成設定(SETUP)要求を使用する。
- 単一の FLIP命令
- 空命令 (有効にされた応用開始命令にだけ使用)
- ダウンロードのためのデータ本体を持つ FLIP命令
- アップロードのためのデータ本体を持つ FLIP命令
Single FLIP command.
- SETUP - DFU_DNLOAD
wLength== 6 - OUT - FLIP Comand (6 byte)
- IN - ZLP
Empty command.
- SETUP - DFU_CLRSTATUS or DFU_DNLOAD
wLength== 0 - IN - ZLP
この空命令は、AVRISP 規約でいう "GET_SYNC" のように DFUローダーの WDT Reset を延長/回避する用途を許す。(AVRDUDE の Terminal mode keepalive 等)
FLIP command with data to download.
- SETUP - DFU_DNLOAD
wLength== 64 + out total bytes - OUT - FLIP Command + Padding (6 + 58 Byte) <- start out
- OUT - FLIP sends data payload (64 byte slice)
- ...
- OUT - FLIP sends data payload (short packet or ZLP)
- (end out total bytes)
- IN - ZLP
"DFU Suffix" 送信は廃止された。それ以外は 前規約 と同一の パケット編成ルールである。
FLIP command with data to upload.
- SETUP - DFU_DNLOAD
wLength== 6 - OUT - FLIP Command (6 byte)
- IN - ZLP
- SETUP - DFU_UPLOAD
wLength== in tolal bytes - IN - FLIP receives data payload (64 byte slice) <- start in
- ...
- IN - FLIP receives data payload (short packet or ZLP)
- (end in total bytes)
- OUT - ZLP
前規約 と同一の パケット編成ルールである。
FLIP command structure.
"DFU_DNLOAD" で要求/指令される FLIPコマンドは、常に wLength が示す最初の 6バイトからなる。
| Ofs | Field | Size |
|---|---|---|
| 0 | Group identifier | 1 |
| 1 | Command identifier | 1 |
| 2 | Arguments | 4 |
FLIP group command.
第1バイトはコマンドグループを選択する。実際のコマンド種別は第2バイトで示される。
| Value | Group | Description |
|---|---|---|
| 0x01 | CMD_GROUP_DOWNLOAD | メモリ書込のため |
| 0x03 | CMD_GROUP_UPLOAD | メモリ読込または空検査のため |
| 0x04 | CMD_GROUP_EXEC | チップ消去または使用者応用開始のため |
| 0x06 | CMD_GROUP_SELECT | メモリ領域選択のため |
この選択は「単一の FLIP命令」からなる。
Select memory unit command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x06 | 選択群 |
| Command identifier | 0x03 | メモリ選択命令 |
| Argument 1 | 0x00 | メモリ単位部選択 |
| Argument 2 | Memory Unit | メモリ単位部識別子 |
| Argument 3 | 0x00 | (未使用) |
| Argument 4 | 0x00 | (未使用) |
| Data payload | None | なし(wLength=6) |
Memory unit available.
メモリ単位部識別子。
| Value | Memory Segment |
|---|---|
| 0x00 | FLASH |
| 0x01 | EEPROM |
| 0x02 | SECURITY (LOCKBITS) |
| 0x03 | CONFIGURATION (FUSES) |
| 0x04 | BOOTLOADER |
| 0x05 | SIGNATURE |
| 0x06 | USER (USERROW) |
| 0x07 | INT_RAM (SRAM) |
| 0x08 | EXT_MEM_CS0 |
| 0x09 | EXT_MEM_CS1 |
| 0x0A | EXT_MEM_CS2 |
| 0x0B | EXT_MEM_CS3 |
| 0x0C | EXT_MEM_CS4 |
| 0x0D | EXT_MEM_CS5 |
| 0x0E | EXT_MEM_CS6 |
| 0x0F | EXT_MEM_CS7 |
| 0x10 | EXT_MEM_DF |
- FLASH 単位部は、読込はバイト単位で行われるが、AVR の場合の書込はワード単位でなければならない。番地指定もふつう偶数で行われる。これが奇数であるなら装置側で補正して、端数の不足分には
0xFFのダミーバイトを補完すべきかもしれない。 - 0x08-0x0F は将来用の予約子で、具体的な規約は明記されていない。表にない既知のメモリ単位部には、EXT_RAM、LOCKBITS、FUSES、OSCAL、SIB、SERIALNUMBER、REVID、BOOTROW 等がある。
- 品種により全てのメモリ単位部が存在するわけではない。("STATUS_OUTOFRANGE")
- この指令を受け取った時点で、従前の メモリページ範囲 は 暗にリセットされるべきだ。
Select memory unit status.
この選択は、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。"STATUS_OK" であれば、次の メモリページ選択が実行可能と判定される。装置は選ばれた メモリ単位部 を記憶していなければならない。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_OUTOFRANGE | 0x08 | 0x0A | 未知のメモリ単位部選択 |
この選択は「単一の FLIP命令」からなる。
Select memory page command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x06 | 選択群 |
| Command identifier | 0x03 | メモリ選択命令 |
| Argument 1 | 0x01 | メモリページ選択 |
| Argument 2 | Page MSB | メモリページ番号上位 |
| Argument 3 | Page LSB | メモリページ番号下位 |
| Argument 4 | 0x00 | (予約) |
| Data payload | None | なし(wLength=6) |
- ここではメモリアドレスを直接指定しておらず、メモリページ番号を 最大 16ビットで表現していることに注意。これにメモリ単位部固有のページサイズを乗算(左シフト)することで、最大 24ビットの実メモリ基準アドレスが算出される。AVR ではこの 2バイトは ISP形式の NVM 制御器設定レジスタに、直接設定可能な指示値である。(MSB 先行なのも ISP形式の規約が SPI標準に倣っているからである)
- メモリページ指定は FLASH 単位部では必須だが、他の単位部では必ずしもそうではない。指定されたメモリ単位部が 1個のページ構造に完全に収まっている場合、ページ指定は既定で 0 となるので、暗に省略されうる。
Select memory page status.
この選択は、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。"STATUS_OK" であれば、次の アップロードまたはダウンロード命令が実行可能と判定される。装置は選ばれた メモリページ を記憶していなければならない。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_OUTOFRANGE | 0x08 | 0x0A | 範囲外アドレス |
この群は「ダウンロードのためのデータ本体を持つ FLIP命令」をひとつ含む。ふつうこれは 単一のページサイズ 量目に分割され(さらにEP0パケットサイズである 64バイト長に細分化され)ページ数の数だけ連続して発行される。
先んじて、ホストは必要に応じて メモリ単位部 と メモリページ選択 を装置に指令する。 次いで、ホストは "DFU_DNLOAD" でメモリ書込命令と、書込イメージ本体(ペイロード)を送信する。
Program start command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x01 | 選択群 |
| Command identifier | 0x00 | 書き込み開始命令 |
| Argument 1 | Page MSB | ページ内開始メモリ番地上位 |
| Argument 2 | Page LSB | ページ内開始メモリ番地下位 |
| Argument 3 | Page MSB | ページ内終了メモリ番地上位 |
| Argument 4 | Page LSB | ページ内終了メモリ番地下位 |
(wlength==64 位置まで空送り) |
||
| Data payload | 書込イメージ | (書込開始番地まで空送り) |
| データペイロード本体 | ||
(wlengthが示す位置まで) |
FLIPコマンドは 6バイトだが、EP0パケットサイズの終了位置(wlengthの 64位置)まで 58バイトの無効データ(一般に 0)が挿入される。この位置が前述の メモリページ選択 開始点になる。
次いで ページ内開始メモリ番地が この位置と一致していないなら、ホストはその位置まで 0バイト以上の無効データ(一般に 0xFF)をプレフィクスとして挿入して合わせ、そのあとから真の書込イメージを充填する。
ページ内終了メモリ番地 は通常、次のページ境界を股がない。もし跨いでもページ境界番地を示して打ち切られ、残りは次の新たなダウンロード群に引き継がれる。これは長さゼロになることもありえ、その場合は ZLP が発行される。
なお、前規約で規定されていた "DFU Suffix" 追加は行われない。
- ページサイズが 1バイトのメモリ単位部の場合、その充填バイト数と、発行されるダウンロード群は 同数になる場合がある。非効率的だが、これは ISP 書込仕様に由来する制約である。
- より優れた ISP 書込仕様(非ポーリング型)を持つ比較的新しい MCUを持つ装置の場合は、ホストは複数ページを一括送信できる。装置側はこれを実際の ページ単位に細分化して MCUに順次書き込む。
- いずれの場合でも、ホストは イメージ本体量が 2 KiB を超えない範囲で、ダウンロード群を細分化するだろう。FLIP では "Functional Descriptor" 対応がなく
wTransferSize指定もないので、この大きさは決め打ちの実装依存になる。 - ペイロード全体を受け取る前に、装置がこれを中断したい場合は USB規約の STALLED(着信拒否)を宣言する。(そして "STATUS_STALL" 状況となる)
- 処理を間に合わせるためにパケット着信を保留したい場合は単に ACK を通知しない。AutoACK を設定しない限り、それが一般的な USB周辺機能の”半二重”既定動作である。
- 実行完了後は、内部保持している ページ番号選択値を 暗にインクリメントすべきだ。
Program start status.
この群は、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。"STATUS_OK" であれば、次の ダウンロード群 あるいは 新たな他の命令群が実行可能と判定される。装置は選ばれた メモリ単位部 と メモリページ 情報をまだ(新たに再設定されるまで)破棄してはならない。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_MEM_UNKNOW | 0x03 | 0x0A | 書込メモリアクセス利用不可 |
| STATUS_MEM_PROTECTED | 0x03 | 0x00 | メモリアクセス保護状態 |
| STATUS_OUTOFRANGE | 0x08 | 0x0A | 範囲外アドレス |
- "STATUS_MEM_UNKNOW" は、ISP 方式 NVM 制御器の 書込許可鍵が不受理だったことを示す。
- "STATUS_MEM_PROTECTED" は、LOCKビットによる 書込保護違反が生じたことを示す。
- 装置の DFUローダーは、ほとんどの場合自分自身の範囲外メモリ番地情報を保持しているとは限らないため、"STATUS_OUTOFRANGE" が判明するのは稀である。明快に検査できるのは、FUSEビットによって示される応用アプリケーション領域と、BOOTLOADER 領域の境界程度である。
この群は、装置の内容を読むだけでなく、選択されたメモリの空状態検査もできる。
先んじて、ホストは必要に応じて メモリ単位部 と メモリページ選択 を装置に指令する。
次いで、ホストは "DFU_DNLOAD" でメモリ読込を命令し、続く "DFU_UPLOAD" で wLength 指定量の読出イメージを要求する。
Read memory command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x03 | 選択群 |
| Command identifier | 0x00 | 読込開始命令 |
| Argument 1 | Page MSB | ページ内開始メモリ番地上位 |
| Argument 2 | Page LSB | ページ内開始メモリ番地下位 |
| Argument 3 | Page MSB | ページ内終了メモリ番地上位 |
| Argument 4 | Page LSB | ページ内終了メモリ番地下位 |
| Data payload | 読出イメージ内容 | DFU_UPLOAD wLength指定量 |
- ホストは イメージ本体量が 2 KiB を超えない範囲で、ダウンロード群を細分化するだろう。装置はその処理結果を EP0パケットサイズに細分化して返送するが、マルチパケット送信対応の USB周辺機能を持つ装置では、これが自動で処理されるため手間がない。
- 実行完了後は、内部保持している ページ番号選択値を 暗にインクリメントすべきだ。
Read memory status.
この群は、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。"STATUS_OK" であれば、次の新たな他の命令群が実行可能と判定される。装置は選ばれた メモリ単位部 と メモリページ 情報をまだ(新たに再設定されるまで)破棄してはならない。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_MEM_UNKNOW | 0x03 | 0x0A | 読出メモリアクセス利用不可 |
| STATUS_MEM_PROTECTED | 0x03 | 0x00 | メモリアクセス保護状態 |
| STATUS_OUTOFRANGE | 0x08 | 0x0A | 範囲外アドレス |
- この群は "DFU_DNLOAD" 指令段階と "DFU_UPLOAD" 要求段階 の 2手順操作なので、それぞれが異なる状況結果を生じうる。つまり両者間にも "DFU_GETSTATUS" 要求が挟まれうる。
- "STATUS_MEM_UNKNOW" または "STATUS_MEM_OUTOFRANGE" が起きた場合は、"DFU_DNLOAD" 要求の ZLP は中断(中止)されなければならない。
- "STATUS_MEM_PROTECTED" が起きた場合は、次の "DFU_UPLOAD" 要求は 中断(中止)されなければならない。
メモリ空検査命令は、指定範囲のメモリ内容が 0xFF で満たされているかを確認する。
Blank check memory command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x03 | 選択群 |
| Command identifier | 0x01 | 空検査命令 |
| Argument 1 | Page MSB | ページ内開始メモリ番地上位 |
| Argument 2 | Page LSB | ページ内開始メモリ番地下位 |
| Argument 3 | Page MSB | ページ内終了メモリ番地上位 |
| Argument 4 | Page LSB | ページ内終了メモリ番地下位 |
| Data payload | None | なし(wLength=6) |
- 実行完了後は、内部保持している ページ番号選択値を 暗にインクリメントすべきだ。
Blank check status.
この群は、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。"STATUS_OK" であれば、次の新たな他の命令群が実行可能と判定される。装置は選ばれた メモリ単位部 と メモリページ 情報をまだ(新たに再設定されるまで)破棄してはならない。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_MEM_UNKNOW | 0x03 | 0x0A | 読込メモリアクセス利用不可 |
| STATUS_MEM_PROTECTED | 0x03 | 0x00 | メモリアクセス保護状態 |
| STATUS_BLANK_FAIL | 0x05 | 0x00 | 空検査不成功 |
- "STATUS_MEM_UNKNOW" または "STATUS_MEM_OUTOFRANGE" が起きた場合は、"DFU_DNLOAD" 要求は中断(所定外の ZLPを送って中止)されなければならない。
この群は FLASH 単位部全体の消去、または応用アプリケーションの開始を実行できる。
チップ消去命令は FLASH 単位部全体を消去する。一般にこれは FLASH単位部 ダウンロード群 発行に先立って、必ず実施されるだろう。
Chip erase command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x04 | 選択群 |
| Command identifier | 0x01 | 消去命令 |
| Argument 1 | 0xFF | 消去値 |
| Argument 2 | 0x00 | (予約) |
| Argument 3 | 0x00 | (予約) |
| Argument 4 | 0x00 | (予約) |
| Data payload | None | なし(wLength=6) |
- 消去値には明示的に
0xFFが示されているが、実際それ以外の期待値で初期化することは考慮しなくても良い。(メモリ空検査命令は指定値なしで暗に0xFF充填を期待している) - USB周辺機能が セルフホスト型の装置では、MCU 自身のハードウェアチップ一括消去命令を実行できない(つまり BOOTLOADER、SECURITY/LOCKBITS、CONFIGURATION/FUSES の各単位部は書込保護されている)ので、ページ消去命令の羅列で チップ消去を模倣することになる。当然これには時間がかかる。
- FLASH単位部消去で EEPROM単位部を連動して消去するか否かは、AVR の場合は LOCKBITS の設定に拠るのが正当と思われる。いずれの規定でも EEPROM消去連動についての言及はないが、暗にホストがハードウェアチップ一括消去互換を期待しているならば EEPROM単位部も連動して消去されるのが筋であろう。
Chip erase status.
この群は、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
| STATUS_ERASE_ONGOING | 0x09 | 0x04 | 消去進行中 |
- 消去命令を受け入れた時点で "STATUS_ERASE_ONGOING" 状況となり、その成否と無関係に、実行が完了したら "STATUS_OK" 状況に変化する。真にメモリ単位部を消去できたか否かは メモリ空検査命令 でその務めを果たす。
この群は ひとつの "DFU_DNLOAD" で設定を命令し、続くひとつの「空命令」"DFU_DNLOAD" でその実行を開始する 2手順操作になっている。
Start application command.
| Field | Value | Description |
|---|---|---|
| Group identifier | 0x04 | 選択群 |
| Command identifier | 0x03 | 応用開始命令 |
| Argument 1 | 0x00 | ハードウェアリセット指示 |
| Argument 2 | 0x00 | (予約) |
| Argument 3 | 0x00 | (予約) |
| Argument 4 | 0x00 | (予約) |
| Data payload | None | なし(wLength=6) |
Start application status.
この群は、1手順目の "DFU_DNLOAD" 指令の後で、以下の状況と状態値を "DFU_GETSTATUS" 要求で返しうる。
| State reference criteria | bStatus | bState | Description |
|---|---|---|---|
| STATUS_OK | 0x00 | 0x00 | 命令成功、装置は IDLE 動作形態 |
2手順目の「空命令」はハードウェアリセット(AVR 実装での実態は WDT Reset)を施行するため、もはや DFUローダー実装が ホストに応答することはない。
ふつう DFUローダーは常に WDT Timeout Reset 監視を実行しており、SETUP 着信でタイマー時間をクリアしている。なのでこの 2手順目は USBバスを Detach つまり SETUP 着信を拒否するようにして、意識的に タイムアウトリセットを発生させるだろう。
AVR4023 では 規定されていない。
前規約にあったこの項は AVR4023 では削除されたが、論じていたことは正論である。むしろ近年では、以下の勘案は十分考察するに値する。
- Firmware イメージの不正盗聴/介入を阻止するための、AES規約等での 転送ペイロード暗号化。(時に ISO要件遵守)
- 同じく不正読み出しを避けるための、ハードウェア的な制限要素。(物理リセットの強要、動作制限 DIPスイッチ、ジャンパーピン等)
- 同じく不正読み出しを避けるための、ソフトウェア層での保護機能/制限の追加。
- AVR の場合、LOCKBITS に拠るハードウェア的 メモリ単位部 アクセス制限は ISP操作に対するものなので、DFUローダー経由でのメモリ読込までは制約を受けない。これは Firmware イメージの不正流出を許す。故に DFUローダー層での別のアクセス制限を勘案しなければならない。
なんで愛称が "FLIP" なのか謎ではあったが、実際の動作を USBスニッファー等で追っていると、コマンド群がまさしくフリップを捲るごとくパタパタと変化していくのを見て、まあなるほどな、と腑に落ちた。
-
dfu-programmer / Github
- arguments.c - Atmel 対応製品の DFU対応 Product ID リストを記載している。以下の原書で言及がない製品も多く含まれる。
Twitter(X): @askn37
BlueSky Social: @multix.jp
GitHub: https://github.com/askn37/
Product: https://askn37.github.io/
Copyright (c) 2026 askn (K.Sato) multix.jp
Released under the MIT license
https://opensource.org/licenses/mit-license.php
https://www.oshwa.org/
multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)