Skip to content

USB_ATML_FLIP_DFU

askn37 edited this page Oct 31, 2026 · 3 revisions

Atmel USB FLIP DFU Protocol (AVR4023)

この項の記述は、以下の参考文献を読解して要点を抜き出したものだ。主に前項 Atmel USB DFU Bootloader との相違に着目する。

Atmel AVR4023: FLIP USB DFU Protocol (doc8457.pdf) / PDF

"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" が新造されたのも、ホスト側でのあらたな追加対応が不必要だからだ。

DFU Mode Descriptor Set

AVR4023 では、単一の 装置記述子、単一の 構成記述子、単一の インターフェース記述子 の 3つだけを有する。エンドポイント記述子は含まれない。"Run-Time" 動作用の記述子規約はない。

Atmel FLIP DFU Mode Device Descriptor

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 書込速度は劣化する)

Atmel FLIP DFU Mode Configuration Descriptor

"DFU 1.0/1.1" と相違なし。bNumInterfaces は必ず 1 を指定する。

Atmel FLIP DFU Mode Interface Descriptor

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(応用定義)に変更された。その他の変更はない。

Atmel FLIP DFU Mode Functional Descriptor (Not specified)

前規約同様、使用されない。従って "Run-Time Mode" と、wDetachTimeOut、wTransferSize、bcdDFUVersion に関係する機能は使用できない。

応用アプリケーションがこれを独自に実装することは、自由。

FLIP Specific setup requests

これは未使用だった 特有構成設定(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規約由来)

FLIP Device status and state

これらは、きっぱりと再定義された。

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 コマンドが受容可能なことを示す。

FLIP Command request

以下の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 protocol

Overview

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 メモリ領域選択のため

Select group

この選択は「単一の 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 未知のメモリ単位部選択

Selecting memory page

この選択は「単一の 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 範囲外アドレス

Download group

この群は「ダウンロードのためのデータ本体を持つ FLIP命令」をひとつ含む。ふつうこれは 単一のページサイズ 量目に分割され(さらにEP0パケットサイズである 64バイト長に細分化され)ページ数の数だけ連続して発行される。

Program start

先んじて、ホストは必要に応じて メモリ単位部 と メモリページ選択 を装置に指令する。 次いで、ホストは "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 領域の境界程度である。

Upload group

この群は、装置の内容を読むだけでなく、選択されたメモリの空状態検査もできる。

Read memory

先んじて、ホストは必要に応じて メモリ単位部 と メモリページ選択 を装置に指令する。 次いで、ホストは "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" 要求は 中断(中止)されなければならない。

Blank check memory

メモリ空検査命令は、指定範囲のメモリ内容が 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を送って中止)されなければならない。

Excec group

この群は FLASH 単位部全体の消去、または応用アプリケーションの開始を実行できる。

Chip erase

チップ消去命令は 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" 状況に変化する。真にメモリ単位部を消去できたか否かは メモリ空検査命令 でその務めを果たす。

Starting the application

この群は ひとつの "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 着信を拒否するようにして、意識的に タイムアウトリセットを発生させるだろう。

Manifestation Phase (Not specified)

AVR4023 では 規定されていない。

Bootloader Security (Not specified)

前規約にあったこの項は AVR4023 では削除されたが、論じていたことは正論である。むしろ近年では、以下の勘案は十分考察するに値する。

  • Firmware イメージの不正盗聴/介入を阻止するための、AES規約等での 転送ペイロード暗号化。(時に ISO要件遵守)
  • 同じく不正読み出しを避けるための、ハードウェア的な制限要素。(物理リセットの強要、動作制限 DIPスイッチ、ジャンパーピン等)
  • 同じく不正読み出しを避けるための、ソフトウェア層での保護機能/制限の追加。
    • AVR の場合、LOCKBITS に拠るハードウェア的 メモリ単位部 アクセス制限は ISP操作に対するものなので、DFUローダー経由でのメモリ読込までは制約を受けない。これは Firmware イメージの不正流出を許す。故に DFUローダー層での別のアクセス制限を勘案しなければならない。

まとめ

なんで愛称が "FLIP" なのか謎ではあったが、実際の動作を USBスニッファー等で追っていると、コマンド群がまさしくフリップを捲るごとくパタパタと変化していくのを見て、まあなるほどな、と腑に落ちた。

関連リンク

  • dfu-programmer / Github
    • arguments.c - Atmel 対応製品の DFU対応 Product ID リストを記載している。以下の原書で言及がない製品も多く含まれる。

Microchip

USB協会

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally