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 | 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: Introduction to USB DFU/USART protocols used in STM32MP1 and STM32MP2 MPU 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 0x2 by FSBL is the FIP file including the DDR settings - not required for STM32MP1 series
- DFU detach to request handle DDR initalization - not required for STM32MP1 series
- 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 | 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 | 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 STM32MP13x lines : the first alternate is alt=0 for FSBL 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"
- on STM32MP15x lines : the first alternate is alt=1 for FSBL 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 STM32MP2 series: the first alternate is alt=0 for FSBL alternate associate to phase 0x1 and the second is alt = 1 for virtual associate to phase 0xF1
2.2. Select device[edit | 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.
2.3. DFU suffix and dfu-suffix[edit | edit source]
Note that a suffix is recommended by the DFU standard [2], defined in Annex B, but not required.
A DFU host tool like dfu-util
will recognize the suffix and use it to check
that the device is matching, but not transfer the suffix to the device.
In the next chapters, we are uploading binaries without suffix and dfu-util
tool display a warning for each DFU download:
dfu-util: Warning: Invalid DFU suffix signature dfu-util: A valid DFU suffix will be required in a future dfu-util release
This warning is acceptable but can avoid it by adding the suffix with the dfu-suffix
tool[1].
dfu-suffix -h dfu-suffix (dfu-util) 0.9 Copyright 2011-2012 Stefan Schmidt, 2013-2014 Tormod Volden This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ Usage: dfu-suffix [options] ... -h --help Print this help message -V --version Print the version number -c --check <file> Check DFU suffix of <file> -a --add <file> Add DFU suffix to <file> -D --delete <file> Delete DFU suffix from <file> -p --pid <productID> Add product ID into DFU suffix in <file> -v --vid <vendorID> Add vendor ID into DFU suffix in <file> -d --did <deviceID> Add device ID into DFU suffix in <file> -S --spec <specID> Add DFU specification ID into DFU suffix in <file>
For example with STMicroelectronics VID=0x0483, PID=0xDF11, compatible DFU V1.0 (specID=0x100):
dfu-suffix -p df11 -v 0483 -S 0x100 -a <file>
And you can check the suffix:
dfu-suffix -c <file> dfu-suffix (dfu-util) 0.9 Copyright 2011-2012 Stefan Schmidt, 2013-2014 Tormod Volden This program is Free Software and has ABSOLUTELY NO WARRANTY Please report bugs to http://sourceforge.net/p/dfu-util/tickets/ The file <file> contains a DFU suffix with the following properties: BCD device: 0xFFFF Product ID: 0xDF11 Vendor ID: 0x0483 BCD DFU: 0x0100 Length: 16 CRC: 0x92497D1C
And the download is performed without warnings:
dfu-util -a 0 -D <file> 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/ Match vendor ID from file: 0483 Match product ID from file: df11 hightligth|Opening DFU capable USB device... hightligth|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 PC to DFU device Download [=========================] 100% 92664 bytes Download done. state(7) = dfuMANIFEST, status(0) = No error condition is present state(2) = dfuIDLE, status(0) = No error condition is present Done!
3. The U-Boot load sequence[edit | 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
Information |
After a DFU detach done with dfu-util -a 0 -e , you must wait that the next stage is ready, for example by adding some delay in script.
|
3.1. On STM32MP13x lines [edit | 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
3.2. On STM32MP15x lines [edit | edit source]
dfu-util -a 1 -D tf-a-usb.stm32 dfu-util -a 3 -D fip.bin dfu-util -a 0 -e
3.3. On STM32MP2 series[edit | edit source]
dfu-util -a 0 -D tf-a-usb.stm32 dfu-util -a 0 -e dfu-util -a 0 -D fip_ddr.bin dfu-util -a 0 -e dfu-util -a 1 -D fip.bin dfu-util -a 0 -e
4. U-Boot DFU support[edit | 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 | 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:
- For STM32MP1 series:
mkimage -T stm32image -a 0xC0000000 -e 0xC0000000 -d flashlayout.tsv flashlayout.stm32
- For STM32MP2 series
mkimage -T stm32image -a 0x84000000 -e 0x84000000 -d flashlayout.tsv flashlayout.stm32
4.2. Execute a U-Boot script[edit | 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 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
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
- on STM32MP2 series
dfu-util -a 0 -D tf-a-usb.stm32 dfu-util -a 0 -e dfu-util -a 0 -D fip_ddr.bin dfu-util -a 0 -e dfu-util -a 1 -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 | edit source]
The GetPhase is an STMicroelectronics addition, on top of DFU, not supported by dfu-util, see AN5275: Introduction to USB DFU/USART protocols used in STM32MP1 and STM32MP2 MPU 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 | edit source]
- ↑ 1.0 1.1 dfu-util - Device Firmware Upgrade Utilities - http://dfu-util.sourceforge.net
- ↑ 2.0 2.1 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