blob: 6cb1cba9d790ea9226e2f86a779e33e9acc3d028 [file] [log] [blame]
Patrick Delaunay5bce4672019-10-14 09:27:59 +02001# SPDX-License-Identifier: GPL-2.0+
2
3Device Firmware Upgrade (DFU)
4
5Overview:
6
7 The Device Firmware Upgrade (DFU) allows to download and upload firmware
8 to/from U-Boot connected over USB.
9
10 U-boot follows the Universal Serial Bus Device Class Specification for
11 Device Firmware Upgrade Version 1.1 the USB forum (DFU v1.1 in www.usb.org).
12
13 U-Boot implements this DFU capability (CONFIG_DFU) with the command dfu
14 (cmd/dfu.c / CONFIG_CMD_DFU) based on:
15 - the DFU stack (common/dfu.c and common/spl/spl_dfu.c), based on the
16 USB DFU download gadget (drivers/usb/gadget/f_dfu.c)
17 - The access to mediums is done in DFU backends (driver/dfu)
18
19 Today the supported DFU backends are:
Jaehoon Chungd7cbe122020-12-22 11:32:21 +010020 - MMC (RAW or FAT / EXT2 / EXT3 / EXT4 file system / SKIP)
Patrick Delaunay5bce4672019-10-14 09:27:59 +020021 - NAND
22 - RAM
23 - SF (serial flash)
Patrick Delaunayf7aee232019-10-14 09:28:04 +020024 - MTD (all MTD device: NAND, SPI-NOR, SPI-NAND,...)
Patrick Delaunay2111e3c2019-10-14 09:28:06 +020025 - virtual
Patrick Delaunay5bce4672019-10-14 09:27:59 +020026
27 These DFU backends are also used by
28 - the dfutftp (see README.dfutftp)
29 - the thordown command (cmd/thordown.c and gadget/f_thor.c)
30
Patrick Delaunay2111e3c2019-10-14 09:28:06 +020031 The "virtual" backend is a generic DFU backend to support a board specific
32 target (for example OTP), only based on the weak functions:
33 - dfu_write_medium_virt
34 - dfu_get_medium_size_virt
35 - dfu_read_medium_virt
36
Patrick Delaunay5bce4672019-10-14 09:27:59 +020037Configuration Options:
38 CONFIG_DFU
39 CONFIG_DFU_OVER_USB
40 CONFIG_DFU_MMC
Patrick Delaunayf7aee232019-10-14 09:28:04 +020041 CONFIG_DFU_MTD
Patrick Delaunay5bce4672019-10-14 09:27:59 +020042 CONFIG_DFU_NAND
43 CONFIG_DFU_RAM
44 CONFIG_DFU_SF
Patrick Delaunaybdc0f122019-10-14 09:28:00 +020045 CONFIG_DFU_SF_PART
Andy Shevchenko1e414012019-11-27 18:12:15 +020046 CONFIG_DFU_TIMEOUT
Patrick Delaunay2111e3c2019-10-14 09:28:06 +020047 CONFIG_DFU_VIRTUAL
Patrick Delaunay5bce4672019-10-14 09:27:59 +020048 CONFIG_CMD_DFU
49
50Environment variables:
Heinrich Schuchardt10eba702020-05-23 13:48:07 +020051 the dfu command uses 3 environments variables:
Heinrich Schuchardt1d4e44d2020-05-23 11:36:49 +020052 "dfu_alt_info" : the DFU setting for the USB download gadget with a semicolon
Patrick Delaunay5bce4672019-10-14 09:27:59 +020053 separated string of information on each alternate:
54 dfu_alt_info="<alt1>;<alt2>;....;<altN>"
55
Heinrich Schuchardt10eba702020-05-23 13:48:07 +020056 when several devices are used, the format is:
Patrick Delaunay06164032019-10-14 09:28:02 +020057 - <interface> <dev>'='alternate list (';' separated)
58 - each interface is separated by '&'
59 dfu_alt_info=\
60 "<interface1> <dev1>=<alt1>;....;<altN>&"\
61 "<interface2> <dev2>=<altN+1>;....;<altM>&"\
62 ...\
63 "<interfaceI> <devI>=<altY+1>;....;<altZ>&"
64
Patrick Delaunay5bce4672019-10-14 09:27:59 +020065 "dfu_bufsiz" : size of the DFU buffer, when absent, use
Heinrich Schuchardt10eba702020-05-23 13:48:07 +020066 CONFIG_SYS_DFU_DATA_BUF_SIZE (8 MiB by default)
Patrick Delaunay5bce4672019-10-14 09:27:59 +020067
68 "dfu_hash_algo" : name of the hash algorithm to use
69
70Commands:
Patrick Delaunay06164032019-10-14 09:28:02 +020071 dfu <USB_controller> [<interface> <dev>] list
Patrick Delaunay5bce4672019-10-14 09:27:59 +020072 list the alternate device defined in "dfu_alt_info"
73
Andy Shevchenko1e414012019-11-27 18:12:15 +020074 dfu <USB_controller> [<interface> <dev>] [<timeout>]
Patrick Delaunay5bce4672019-10-14 09:27:59 +020075 start the dfu stack on the USB instance with the selected medium
76 backend and use the "dfu_alt_info" variable to configure the
77 alternate setting and link each one with the medium
78 The dfu command continue until receive a ^C in console or
Andy Shevchenko1e414012019-11-27 18:12:15 +020079 a DFU detach transaction from HOST. If CONFIG_DFU_TIMEOUT option
80 is enabled and <timeout> parameter is present in the command line,
81 the DFU operation will be aborted automatically after <timeout>
82 seconds of waiting remote to initiate DFU session.
Patrick Delaunay5bce4672019-10-14 09:27:59 +020083
84 The possible values of <interface> are :
85 (with <USB controller> = 0 in the dfu command example)
86
87 "mmc" (for eMMC and SD card)
88 cmd: dfu 0 mmc <dev>
89 each element in "dfu_alt_info" =
Heinrich Schuchardt1d4e44d2020-05-23 11:36:49 +020090 <name> raw <offset> <size> [mmcpart <num>] raw access to mmc device
91 <name> part <dev> <part_id> [mmcpart <num>] raw access to partition
92 <name> fat <dev> <part_id> [mmcpart <num>] file in FAT partition
93 <name> ext4 <dev> <part_id> [mmcpart <num>] file in EXT4 partition
Jaehoon Chungd7cbe122020-12-22 11:32:21 +010094 <name> skip 0 0 ignore flashed data
Heinrich Schuchardt1d4e44d2020-05-23 11:36:49 +020095
96 with <partid> being the GPT or DOS partition index,
97 with <num> being the eMMC hardware partition number.
98
99 A value of environment variable dfu_alt_info for eMMC could be:
100
101 "u-boot raw 0x3e 0x800 mmcpart 1;bl2 raw 0x1e 0x1d mmcpart 1"
102
103 A value of environment variable dfu_alt_info for SD card could be:
Patrick Delaunay5bce4672019-10-14 09:27:59 +0200104
Heinrich Schuchardt1d4e44d2020-05-23 11:36:49 +0200105 "u-boot raw 0x80 0x800;uImage ext4 0 2"
Patrick Delaunay5bce4672019-10-14 09:27:59 +0200106
Jaehoon Chungd7cbe122020-12-22 11:32:21 +0100107 If don't want to flash given image file to storage, use "skip" type
108 entity.
109 - It can be used to protect flashing wrong image for the specific board.
110 - Especailly, this layout will be useful when thor protocol is used,
111 which performs flashing in batch mode, where more than one file is
112 processed.
113 For example, if one makes a single tar file with support for the two
114 boards with u-boot-<board1>.bin and u-boot-<board2>.bin files, one
115 can use it to flash a proper u-boot image on both without a failure:
116
117 "u-boot-<board1>.bin raw 0x80 0x800; u-boot-<board2>.bin skip 0 0"
118
Patrick Delaunay5bce4672019-10-14 09:27:59 +0200119 "nand" (raw slc nand device)
120 cmd: dfu 0 nand <dev>
121 each element in "dfu_alt_info" =
122 <name> raw <offset> <size> raw access to mmc device
123 <name> part <dev> <part_id> raw acces to partition
124 <name> partubi <dev> <part_id> raw acces to ubi partition
125
126 with <partid> is the MTD partition index
127
128 "ram"
129 cmd: dfu 0 ram <dev>
130 (<dev> is not used for RAM target)
131 each element in "dfu_alt_info" =
132 <name> ram <offset> <size> raw access to ram
133
134 "sf" (serial flash : NOR)
135 cmd: dfu 0 sf <dev>
136 each element in "dfu_alt_info" =
Chance.Yang2be36002020-10-14 11:47:33 +0800137 <name> raw <offset> <size> raw access to sf device
Patrick Delaunaybdc0f122019-10-14 09:28:00 +0200138 <name> part <dev> <part_id> raw acces to partition
139 <name> partubi <dev> <part_id> raw acces to ubi partition
140
141 with <partid> is the MTD partition index
Patrick Delaunay5bce4672019-10-14 09:27:59 +0200142
Patrick Delaunayf7aee232019-10-14 09:28:04 +0200143 "mtd" (all MTD device: NAND, SPI-NOR, SPI-NAND,...)
144 cmd: dfu 0 mtd <dev>
145 with <dev> the mtd identifier as defined in mtd command
146 (nand0, nor0, spi-nand0,...)
147 each element in "dfu_alt_info" =
148 <name> raw <offset> <size> raw access to mtd device
Patrick Delaunaycb47cb02019-10-14 09:28:05 +0200149 <name> part <dev> <part_id> raw acces to partition
150 <name> partubi <dev> <part_id> raw acces to ubi partition
151
152 with <partid> is the MTD partition index
Patrick Delaunayf7aee232019-10-14 09:28:04 +0200153
Patrick Delaunay2111e3c2019-10-14 09:28:06 +0200154 "virt"
155 cmd: dfu 0 virt <dev>
156 each element in "dfu_alt_info" =
157 <name>
158
Patrick Delaunay06164032019-10-14 09:28:02 +0200159 <interface> and <dev> are absent:
160 the dfu command to use multiple devices
161 cmd: dfu 0 list
162 cmd: dfu 0
163 "dfu_alt_info" variable provides the list of <interface> <dev> with
164 alternate list separated by '&' with the same format for each <alt>
165 mmc <dev>=<alt1>;....;<altN>
166 nand <dev>=<alt1>;....;<altN>
167 ram <dev>=<alt1>;....;<altN>
168 sf <dev>=<alt1>;....;<altN>
Patrick Delaunayf7aee232019-10-14 09:28:04 +0200169 mtd <dev>=<alt1>;....;<altN>
Patrick Delaunay2111e3c2019-10-14 09:28:06 +0200170 virt <dev>=<alt1>;....;<altN>
Patrick Delaunay06164032019-10-14 09:28:02 +0200171
Patrick Delaunay773771f2019-10-14 09:28:07 +0200172Callbacks:
173 The weak callback functions can be implemented to manage specific behavior
174 - dfu_initiated_callback : called when the DFU transaction is started,
175 used to initiase the device
176 - dfu_flush_callback : called at the end of the DFU write after DFU
177 manifestation, used to manage the device when
178 DFU transaction is closed
179
Patrick Delaunay5bce4672019-10-14 09:27:59 +0200180Host tools:
181 When U-Boot runs the dfu stack, the DFU host tools can be used
182 to send/receive firmwares on each configurated alternate.
183
184 For example dfu-util is a host side implementation of the DFU 1.1
185 specifications(http://dfu-util.sourceforge.net/) which works with U-Boot.
186
187Usage:
Patrick Delaunay06164032019-10-14 09:28:02 +0200188 Example 1: firmware located in eMMC or SD card, with:
Patrick Delaunay5bce4672019-10-14 09:27:59 +0200189 - alternate 1 (alt=1) for SPL partition (GPT partition 1)
190 - alternate 2 (alt=2) for U-Boot partition (GPT partition 2)
191
192 The U-Boot configuration is:
193
194 U-Boot> env set dfu_alt_info "spl part 0 1;u-boot part 0 2"
195
196 U-Boot> dfu 0 mmc 0 list
197 DFU alt settings list:
198 dev: eMMC alt: 0 name: spl layout: RAW_ADDR
199 dev: eMMC alt: 1 name: u-boot layout: RAW_ADDR
200
201 Boot> dfu 0 mmc 0
202
203 On the Host side:
204
205 list the available alternate setting:
206
207 $> dfu-util -l
208 dfu-util 0.9
209
210 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
211 Copyright 2010-2016 Tormod Volden and Stefan Schmidt
212 This program is Free Software and has ABSOLUTELY NO WARRANTY
213 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
214
215 Found DFU: [0483:5720] ver=0200, devnum=45, cfg=1, intf=0, path="3-1.3.1", \
216 alt=1, name="u-boot", serial="003A00203438510D36383238"
217 Found DFU: [0483:5720] ver=0200, devnum=45, cfg=1, intf=0, path="3-1.3.1", \
218 alt=0, name="spl", serial="003A00203438510D36383238"
219
220 To download to U-Boot, use -D option
221
222 $> dfu-util -a 0 -D u-boot-spl.bin
223 $> dfu-util -a 1 -D u-boot.bin
224
225 To upload from U-Boot, use -U option
226
227 $> dfu-util -a 0 -U u-boot-spl.bin
228 $> dfu-util -a 1 -U u-boot.bin
229
230 To request a DFU detach and reset the USB connection:
231 $> dfu-util -a 0 -e -R
Patrick Delaunay06164032019-10-14 09:28:02 +0200232
233
234 Example 2: firmware located in NOR (sf) and NAND, with:
235 - alternate 1 (alt=1) for SPL partition (NOR GPT partition 1)
236 - alternate 2 (alt=2) for U-Boot partition (NOR GPT partition 2)
237 - alternate 3 (alt=3) for U-Boot-env partition (NOR GPT partition 3)
238 - alternate 4 (alt=4) for UBI partition (NAND GPT partition 1)
239
240 U-Boot> env set dfu_alt_info \
241 "sf 0:0:10000000:0=spl part 0 1;u-boot part 0 2; \
242 u-boot-env part 0 3&nand 0=UBI partubi 0,1"
243
244 U-Boot> dfu 0 list
245
246 DFU alt settings list:
247 dev: SF alt: 0 name: spl layout: RAW_ADDR
248 dev: SF alt: 1 name: ssbl layout: RAW_ADDR
249 dev: SF alt: 2 name: u-boot-env layout: RAW_ADDR
250 dev: NAND alt: 3 name: UBI layout: RAW_ADDR
251
252 U-Boot> dfu 0
253
254 $> dfu-util -l
255 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
256 intf=0, alt=3, name="UBI", serial="002700333338511934383330"
257 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
258 intf=0, alt=2, name="u-boot-env", serial="002700333338511934383330"
259 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
260 intf=0, alt=1, name="u-boot", serial="002700333338511934383330"
261 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
262 intf=0, alt=0, name="spl", serial="002700333338511934383330"
Patrick Delaunaycb47cb02019-10-14 09:28:05 +0200263
264 Same example with MTD backend
265
266 U-Boot> env set dfu_alt_info \
267 "mtd nor0=spl part 1;u-boot part 2;u-boot-env part 3&"\
268 "mtd nand0=UBI partubi 1"
269
270 U-Boot> dfu 0 list
271 using id 'nor0,0'
272 using id 'nor0,1'
273 using id 'nor0,2'
274 using id 'nand0,0'
275 DFU alt settings list:
276 dev: MTD alt: 0 name: spl layout: RAW_ADDR
277 dev: MTD alt: 1 name: u-boot layout: RAW_ADDR
278 dev: MTD alt: 2 name: u-boot-env layout: RAW_ADDR
279 dev: MTD alt: 3 name: UBI layout: RAW_ADDR
Patrick Delaunay2111e3c2019-10-14 09:28:06 +0200280
281 Example 3: firmware located in SD Card (mmc) and virtual partition on
282 OTP and PMIC not volatile memory
283 - alternate 1 (alt=1) for scard
284 - alternate 2 (alt=2) for OTP (virtual)
285 - alternate 3 (alt=3) for PMIC NVM (virtual)
286
287 U-Boot> env set dfu_alt_info \
288 "mmc 0=sdcard raw 0 0x100000&"\
289 "virt 0=otp" \
290 "virt 1=pmic"
291
292 U-Boot> dfu 0 list
293 DFU alt settings list:
294 dev: eMMC alt: 0 name: sdcard layout: RAW_ADDR
295 dev: VIRT alt: 1 name: otp layout: RAW_ADDR
296 dev: VIRT alt: 2 name: pmic layout: RAW_ADDR