This page explains how to load and start U-Boot with the dfu-util
[1] tool over a USB port.
This tool, available on Linux or Windows, supports the DFU standard [2] and can replace STM32CubeProgrammer for the U-Boot load use case.
1. Overview[edit source]
To load and execute U-Boot in DDR with the DFU protocol, the dfu-util
tools can be used instead of STM32CubeProgrammer.
As the GetPhase is an STMicroelectronics protocol for STM32CubeProgrammer and is not supported by dfu-util
, you must follow the steps described in AN5275: USB DFU/USART protocols used in STM32MP1 Series bootloaders and provide the binaries in the order expected by the bootloaders:
- Download phase 0x1 by ROM code is the FSBL (TF-A BL2)
- DFU detach to request an FSBL start - not required for STM32MP15x lines ROM code
- Download phase 0x3 by FSBL is the FIP file including the SSBL image (U-Boot)
- DFU detach to request an SSBL start
The FSBL, SSBL and FIP definitions can be found in the Boot chain overview.
The FIP includes the required SSBL = U-Boot, see How to configure TF-A FIP in order to update it with the U-Boot binary.
This feature can be used to debug U-Boot during board bring-up.
See also How to load U-Boot with STM32CubeProgrammer.
2. dfu-util[edit source]
The help message of dfu-util
is:
dfu-util --help
Usage: dfu-util [options] ... -h --help Print this help message -V --version Print the version number -v --verbose Print verbose debug statements -l --list List currently attached DFU capable devices -e --detach Detach currently attached DFU capable devices -E --detach-delay seconds Time to wait before reopening a device after detach -d --device <vendor>:<product>[,<vendor_dfu>:<product_dfu>] Specify Vendor/Product ID(s) of DFU device -p --path <bus-port. ... .port> Specify path to DFU device -c --cfg <config_nr> Specify the Configuration of DFU device -i --intf <intf_nr> Specify the DFU Interface number -S --serial <serial_string>[,<serial_string_dfu>] Specify Serial String of DFU device -a --alt <alt> Specify the Altsetting of the DFU Interface by name or by number -t --transfer-size <size> Specify the number of bytes per USB Transfer -U --upload <file> Read firmware from device into <file> -Z --upload-size <bytes> Specify the expected upload size in bytes -D --download <file> Write firmware from <file> into device -R --reset Issue USB Reset signalling once we're finished -s --dfuse-address <address> ST DfuSe mode, specify target address for raw file download or upload. Not applicable for DfuSe file (.dfu) downloads
The minimal dfu-util
option used to load U-Boot is:
- -a/--alt select the alternate to load the requested phase
- -D/--download Download the requested binary for the selected phase
- -e/--detach request a DFU DETACH
2.1. Identify alternate[edit source]
You can also use the -l/--list option to check the alternate associated to each phase (see AN5275 for the coding of the alternate name).
For example the result of this command on ROM code with a USB serial boot is:
- on STM32MP15x lines : the first alternate is alt=1 for FSB alternate associate to phase 0x1 and the last one is alt = 5 for virtual associate to phase 0xF1
dfu-util -l dfu-util 0.9 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2016 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Found DFU: [0483:df11] ver=0200, devnum=12, cfg=1, intf=0, path="1-5.2", alt=5, name="@virtual /0xF1/1*512Ba", serial="004100323338511634383330" Found DFU: [0483:df11] ver=0200, devnum=12, cfg=1, intf=0, path="1-5.2", alt=4, name="@Partition4 /0x04/1*16Me", serial="004100323338511634383330" Found DFU: [0483:df11] ver=0200, devnum=12, cfg=1, intf=0, path="1-5.2", alt=3, name="@Partition3 /0x03/1*16Me", serial="004100323338511634383330" Found DFU: [0483:df11] ver=0200, devnum=12, cfg=1, intf=0, path="1-5.2", alt=2, name="@Partition2 /0x02/1*1Me", serial="004100323338511634383330" Found DFU: [0483:df11] ver=0200, devnum=12, cfg=1, intf=0, path="1-5.2", alt=1, name="@FSBL /0x01/1*1Me", serial="004100323338511634383330" Found DFU: [0483:df11] ver=0200, devnum=12, cfg=1, intf=0, path="1-5.2", alt=0, name="@Partition0 /0x00/1*256Ke", serial="004100323338511634383330"
- on STM32MP13x lines : the first alternate is alt=0 for FSB alternate associate to phase 0x1 and the second is alt = 1 for virtual associate to phase 0xF1
dfu-util -l dfu-util 0.9 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2016 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Found DFU: [0483:df11] ver=0200, devnum=6, cfg=1, intf=0, path="1-5.2", alt=1, name="@virtual /0xF1/1*512Ba", serial="801480113530510138343532" Found DFU: [0483:df11] ver=0200, devnum=6, cfg=1, intf=0, path="1-5.2", alt=0, name="@FSBL/0x01/1*128Ke", serial="801480113530510138343532"
2.2. Select device[edit source]
In each dfu-util
command, the command device can be identified by:
- USB vendor and product identifiers (VID and PID)
- USB serial number
In the previous STM32MP15 example, the device has VID:PID=0483:df11 and its serial number is 004100323338511634383330.
In the following sections, you can add the -d/--device and -S/--serial options to select this specific device:
dfu-util -d 0483:df11 -S 004100323338511634383330 ....
It is required only when several devices are connected on the host.
3. The U-Boot load sequence[edit source]
The load sequence is described in #Overview, depending of the alternate (phase = P for alternate A) and the corresponding commands are:
- Download phase P =
dfu-util -a A -D [file]
- DFU detach =
dfu-util -a 0 -e
3.1. On STM32MP15x lines [edit source]
dfu-util -a 1 -D tf-a-usb.stm32 dfu-util -a 3 -D fip.bin dfu-util -a 0 -e
3.2. On STM32MP13x lines [edit source]
dfu-util -a 0 -D tf-a-usb.stm32 dfu-util -a 0 -e dfu-util -a 0 -D fip.bin dfu-util -a 0 -e
4. U-Boot DFU support[edit source]
After load sequence, U-Boot is running, the boot command is executed, the DFU stack is running and the stm32prog
is waiting the FlashLayout file before to reenumerate. you can:
- provided the flashlayout file in alternate 0: flashlayout.tsv or flashlayout.stm32, the same file with STM32 header:
dfu-util -a 0 -D flashlayout.tsv dfu-util -a 0 -e
- interrupt the
stm32prog
command by sending a Ctrl-C on the console or sending an empty flashlayout with 2 DFU detach:
dfu-util -a 0 -e dfu-util -a 0 -e
- request device reboot by a USB reset with option -R --reset:
dfu-util -a 0 -e -R
- #Execute a U-Boot script as explained in the next chapter
4.1. Generate an flashlayout.stm32 file[edit source]
You can generate the flashlayout.stm32 file from the tsv flashlayout file = flashlayout.tsv with the U-Boot mkimage
tool by using the following Linux shell commands:
mkimage -T stm32image -a 0xC0000000 -e 0xC0000000 -d flashlayout.tsv flashlayout.stm32
4.2. Execute a U-Boot script[edit source]
You can replace the flashlayout file with a U-Boot script containing a U-Boot image header. This is then executed automatically by U-Boot.
The following example is for a simple script to start U-Boot in dfu mode and then reset:
dfu 0 reset
echo "dfu 0; reset" > script.cmd
mkimage -C none -A arm -T script -d script.cmd script.uimg
Then the complete sequence is:
dfu-util -a 1 -D tf-a-usb.stm32 dfu-util -a 3 -D fip.bin dfu-util -a 0 -e dfu-util -a 0 -D script.uimg dfu-util -a 0 -e
dfu-util -a 0 -D tf-a-usb.stm32 dfu-util -a 0 -e dfu-util -a 0 -D fip.bin dfu-util -a 0 -e dfu-util -a 0 -D script.uimg dfu-util -a 0 -e
5. GetPhase support with dfu-util[edit source]
The GetPhase is an STMicroelectronics addition, on top of DFU, not supported by dfu-util, see AN5275: USB DFU/USART protocols used in STM32MP1 Series bootloaders for details.
The expected Phase P and the expected DFU detach request are indicated by device in the Get Phase answer, read (= DFU_UPLOAD) in the last alternate, with alternate id = A, name = "virtual" with phase id = 0xF1 with the command:
dfu-util -a A -U phase.bin
The format of the received data, the phase.bin file in this example, is:
Byte | Name | Description |
---|---|---|
1 | Phase | Phase P expected by device |
2-5 | Address | 0xFFFFFFFF or load address in embedded RAM |
6-9 | Offset | 0x0 |
10 | NeedDFUDetach | Present only if P = 0 1 : DFU detach is requested for a new USB enumeration |
This information can be used to dynamically manage the load sequence in script using dfu-util
as it is done in STM32CubeProgrammer.
Example of "Get Phase" answer done by STM32MP13x ROM code on alternate 1:
dfu-util -a 1 -U phase.bin dfu-util 0.9 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc. Copyright 2010-2016 Tormod Volden and Stefan Schmidt This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Opening DFU capable USB device... ID 0483:df11 Run-time device DFU version 0110 Claiming USB DFU Interface... Setting Alternate Setting #0 ... Determining device status: state = dfuIDLE, status = 0 dfuIDLE, continuing DFU mode device DFU version 0110 Device returned transfer size 1024 Copying data from DFU device to PC Upload [=========================] 100% 9 bytes Upload done. hexdump phase.bin 0000000 0001 fdfe 002f 0000 0000 0000009
6. References[edit source]
- ↑ dfu-util - Device Firmware Upgrade Utilities - http://dfu-util.sourceforge.net
- ↑ USB DFU - Universal Serial Bus Device Class Specification for Device Firmware Upgrade Version 1.1 - https://usb.org/sites/default/files/DFU_1.1.pdf