Что такое DFU?
July 29, 2026 · – посетителей
Если вы когда-нибудь подключали встраиваемую плату к компьютеру и видели, как она определяется как странное USB-устройство без драйвера, велика вероятность, что она находилась в режиме DFU — Device Firmware Update.
Что такое DFU на самом деле
DFU — это класс USB-устройств, определённый USB Implementers Forum, изначально предназначенный для обновления прошивки USB-периферии без какого-либо специфического для продукта инструментария. Устройство, поддерживающее его, предоставляет небольшой стандартизированный интерфейс: инструмент на стороне хоста может опросить его, отправить новый образ прошивки и инициировать перезагрузку в новый код — всё через тот же USB-кабель, который используется для всего остального.
На встраиваемых платах "режим DFU" обычно означает, что сам загрузчик (например, U-Boot) выполняет минимальный стек DFU вместо загрузки Linux. Плата определяется на хосте как USB-устройство класса DFU, а такой инструмент, как dfu-util, может вывести список целей для прошивки (разделы, области памяти — всё, что загрузчик решит предоставить) и записывать в них напрямую.
Почему это важно
Несколько вещей делают DFU по-настоящему полезным в разработке и производстве встраиваемых систем:
- Не нужно дополнительное оборудование. Ни JTAG-пробника, ни UART-адаптера — только USB-порт, который у платы уже есть.
- Восстанавливаемость. Если плата "окирпичена" или на флеш-памяти нет действующей ОС, режим DFU (часто активируемый strap-пином или резервным механизмом boot ROM) нередко становится последней линией обороны, позволяющей снова прошить плату.
- Стандартизация. Поскольку это настоящий USB-класс с настоящими драйверами, он работает одинаково на разных операционных системах без специфического для производителя драйвера ядра.
Стоит сопоставить 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 — одна из тех частей инфраструктуры, которые незаметны, когда работают: вы подключаете кабель, запускаете одну команду, и плата, которая минуту назад не могла загрузиться, снова в строю. Большая часть интересной инженерной работы заключается в том, чтобы правильно реализовать сторону загрузчика — что предоставляется наружу, как это отображается на реальное хранилище и как всё безопасно завершается при обрыве передачи на середине.
Это был короткий пост — в одном из следующих я подробнее разберу конкретные реализации (и то, где они становятся запутанными).
Дополнительное чтение
- Universal Serial Bus Device Class Specification for Device Firmware Upgrade, Revision 1.1 — официальная спецификация USB-IF, на которой основан DFU.
- dfu-util — инструмент на стороне хоста, использованный в примере выше.
- U-Boot: Device Firmware Upgrade (DFU) — как DFU реализован в загрузчике, который используют большинство плат со встраиваемым Linux.
По теме
- цепочка загрузки встраиваемого Linux — как загрузчик передаёт управление ядру
- Что такое Device Tree? — как железо описывается ядру
Комментарии