Last edited 9 months ago

How to load U-Boot with dfu-util

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Applicable for STM32MP13x lines, STM32MP15x 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 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 0x3 by FSBL is the FIP file including the SSBL image (U-Boot)
  4. 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 More info.png: 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 More info.png: 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:

  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 STM32MP15x lines More info.png[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 More info.png[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:

  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 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:

  • 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 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

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]

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