What Is DFU?

July 29, 2026 · visitors

If you've ever plugged an embedded board into your computer and watched it enumerate as a strange, driver-less USB device, there's a good chance it was sitting in DFU mode — Device Firmware Update.

What DFU actually is

DFU is a USB device class defined by the USB Implementers Forum, originally meant for updating firmware on USB peripherals without any product-specific tooling. A device that supports it exposes a small, standardized interface: a host-side tool can query it, send a new firmware image, and trigger a reboot into the new code — all over the same USB cable used for everything else.

On embedded boards, "DFU mode" usually means the bootloader itself (U-Boot, for example) is running a minimal DFU stack instead of booting Linux. The board shows up on the host as a DFU-class USB device, and a tool like dfu-util can list the flashable targets (partitions, memory regions, whatever the bootloader chooses to expose) and write to them directly.

Why it matters

A few things make DFU genuinely useful in embedded development and production:

It's worth contrasting DFU with adjacent mechanisms you'll bump into on the same boards: fastboot (Android's protocol, similar goal, different wire format), and full system-image tools like swupdate or RAUC, which handle update delivery and rollback once Linux is already running — DFU typically operates one layer below that, closer to the bootloader.

A rough workflow

A typical DFU session from the host side looks like:

# 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

The board resets into the bootloader's DFU handler, the host tool negotiates the transfer, and the image lands wherever the bootloader mapped that alt-setting — often a specific eMMC/NAND partition or a staging area the bootloader flashes on next boot.

Closing thought

DFU is one of those pieces of infrastructure that's invisible when it works: you plug in a cable, run one command, and a board that couldn't boot a minute ago is back up. Most of the interesting engineering is in getting the bootloader side right — what gets exposed, how it maps to real storage, and how it fails safely when the transfer gets interrupted halfway through.

This was a short one — I'll go deeper into specific implementations (and where they get hairy) in a future post.

Further reading

Comments