Last edited 6 months ago

How to load U-Boot with dfu-util

Applicable for STM32MP13x lines, STM32MP15x lines, STM32MP25x lines

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: USB DFU/USART protocols used in STM32MP1 series bootloaders and provide the binaries in the order expected by the bootloaders:

  1. Download phase 0x1 by ROM code is the FSBL (TF-A BL2)
  2. DFU detach to request an FSBL start - not required for STM32MP15x lines More info.png ROM code
  3. Download phase 0x2 by FSBL is the FIP file including the DDR settings - not required for STM32MP1 series
  4. DFU detach to request handle DDR initalization - not required for STM32MP1 series
  5. Download phase 0x3 by FSBL is the FIP file including the SSBL image (U-Boot)
  6. 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 More info.png: 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 More info.png: 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 STM32MP25x lines More info.png: 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:

  1. Download phase P = dfu-util -a A -D [file]
  2. DFU detach = dfu-util -a 0 -e
Info white.png 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 More info.png[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 More info.png[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 STM32MP25x lines More info.png[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:

  dfu-util -a 0 -D flashlayout.tsv
  dfu-util -a 0 -e
  • interrupt the stm32progcommand 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

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:

  • on STM32MP13x lines More info.png
  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
  • on STM32MP15x lines More info.png
  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 STM32MP25x lines More info.png
  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: 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 | edit source]

  1. 1.0 1.1 dfu-util - Device Firmware Upgrade Utilities - http://dfu-util.sourceforge.net
  2. 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