blob: 11c88072b89964a8f9bf5975bdc039bf23c10e6a [file] [log] [blame]
Heinrich Schuchardt22a50742021-03-05 12:58:37 +01001.. SPDX-License-Identifier: GPL-2.0+
2
3Device Firmware Upgrade (DFU)
4=============================
5
6Overview
7--------
8
9The Device Firmware Upgrade (DFU) allows to download and upload firmware
10to/from U-Boot connected over USB.
11
12U-boot follows the Universal Serial Bus Device Class Specification for
13Device Firmware Upgrade Version 1.1 the USB forum (DFU v1.1 in www.usb.org).
14
15U-Boot implements this DFU capability (CONFIG_DFU) with the command dfu
16(cmd/dfu.c / CONFIG_CMD_DFU) based on:
17
18- the DFU stack (common/dfu.c and common/spl/spl_dfu.c), based on the
19 USB DFU download gadget (drivers/usb/gadget/f_dfu.c)
20- The access to mediums is done in DFU backends (driver/dfu)
21
22Today the supported DFU backends are:
23
24- MMC (RAW or FAT / EXT2 / EXT3 / EXT4 file system / SKIP / SCRIPT)
25- NAND
26- RAM
27- SF (serial flash)
28- MTD (all MTD device: NAND, SPI-NOR, SPI-NAND,...)
29- virtual
30
31These DFU backends are also used by
32
33- the dfutftp (see README.dfutftp)
34- the thordown command (cmd/thordown.c and gadget/f_thor.c)
35
36The "virtual" backend is a generic DFU backend to support a board specific
37target (for example OTP), only based on the weak functions:
38
39- dfu_write_medium_virt
40- dfu_get_medium_size_virt
41- dfu_read_medium_virt
42
43Configuration Options
44---------------------
45
46The following configuration option are relevant for device firmware upgrade:
47
48* CONFIG_DFU
49* CONFIG_DFU_OVER_USB
50* CONFIG_DFU_MMC
51* CONFIG_DFU_MTD
52* CONFIG_DFU_NAND
53* CONFIG_DFU_RAM
54* CONFIG_DFU_SF
55* CONFIG_DFU_SF_PART
56* CONFIG_DFU_TIMEOUT
57* CONFIG_DFU_VIRTUAL
58* CONFIG_CMD_DFU
59
60Environment variables
61---------------------
62
63The dfu command uses 3 environments variables:
64
65dfu_alt_info
66 The DFU setting for the USB download gadget with a semicolon separated
67 string of information on each alternate::
68
69 dfu_alt_info="<alt1>;<alt2>;....;<altN>"
70
71 When several devices are used, the format is:
72
73 - <interface> <dev>'='alternate list (';' separated)
74 - each interface is separated by '&'::
75
76 dfu_alt_info=\
77 "<interface1> <dev1>=<alt1>;....;<altN>&"\
78 "<interface2> <dev2>=<altN+1>;....;<altM>&"\
79 ...\
80 "<interfaceI> <devI>=<altY+1>;....;<altZ>&"
81
82dfu_bufsiz
83 size of the DFU buffer, when absent, defaults to
84 CONFIG_SYS_DFU_DATA_BUF_SIZE (8 MiB by default)
85
86dfu_hash_algo
87 name of the hash algorithm to use
88
89Commands
90--------
91
92dfu <USB_controller> [<interface> <dev>] list
93 list the alternate device defined in *dfu_alt_info*
94
95dfu <USB_controller> [<interface> <dev>] [<timeout>]
96 start the dfu stack on the USB instance with the selected medium
97 backend and use the *dfu_alt_info* variable to configure the
98 alternate setting and link each one with the medium
99 The dfu command continue until receive a ^C in console or
100 a DFU detach transaction from HOST. If CONFIG_DFU_TIMEOUT option
101 is enabled and <timeout> parameter is present in the command line,
102 the DFU operation will be aborted automatically after <timeout>
103 seconds of waiting remote to initiate DFU session.
104
105The possible values of <interface> are (with <USB controller> = 0 in the dfu
106command example)
107
108mmc
109 for eMMC and SD card::
110
111 dfu 0 mmc <dev>
112
113 each element in *dfu_alt_info* being
114
115 * <name> raw <offset> <size> [mmcpart <num>] raw access to mmc device
116 * <name> part <dev> <part_id> [mmcpart <num>] raw access to partition
117 * <name> fat <dev> <part_id> [mmcpart <num>] file in FAT partition
118 * <name> ext4 <dev> <part_id> [mmcpart <num>] file in EXT4 partition
119 * <name> skip 0 0 ignore flashed data
120 * <name> script 0 0 execute commands in shell
121
122 with
123
124 partid
125 being the GPT or DOS partition index,
126 num
127 being the eMMC hardware partition number.
128
129 A value of environment variable *dfu_alt_info* for eMMC could be::
130
131 u-boot raw 0x3e 0x800 mmcpart 1;bl2 raw 0x1e 0x1d mmcpart 1
132
133 A value of environment variable *dfu_alt_info* for SD card could be::
134
135 u-boot raw 0x80 0x800;uImage ext4 0 2
136
137 If don't want to flash given image file to storage, use "skip" type
138 entity.
139
140 - It can be used to protect flashing wrong image for the specific board.
141 - Especailly, this layout will be useful when thor protocol is used,
142 which performs flashing in batch mode, where more than one file is
143 processed.
144
145 For example, if one makes a single tar file with support for the two
146 boards with u-boot-<board1>.bin and u-boot-<board2>.bin files, one
147 can use it to flash a proper u-boot image on both without a failure::
148
149 u-boot-<board1>.bin raw 0x80 0x800; u-boot-<board2>.bin skip 0 0
150
151 When flashing new system image requires do some more complex things
152 than just writing data to the storage medium, one can use 'script'
153 type. Data written to such entity will be executed as a command list
154 in the u-boot's shell. This for example allows to re-create partition
155 layout and even set new *dfu_alt_info* for the newly created paritions.
156 Such script would look like::
157
158 setenv dfu_alt_info ...
159 setenv mbr_parts ...
160 mbr write ...
161
162 Please note that this means that user will be able to execute any
163 arbitrary commands just like in the u-boot's shell.
164
165nand
166 raw slc nand device::
167
168 dfu 0 nand <dev>
169
170 each element in *dfu_alt_info* being either of
171
172 * <name> raw <offset> <size> raw access to mmc device
173 * <name> part <dev> <part_id> raw acces to partition
174 * <name> partubi <dev> <part_id> raw acces to ubi partition
175
176 with
177
178 partid
179 is the MTD partition index
180
181ram
182 raw access to ram::
183
184 dfu 0 ram <dev>
185
186 dev
187 is not used for RAM target
188
189 each element in *dfu_alt_info* being::
190
191 <name> ram <offset> <size> raw access to ram
192
193sf
194 serial flash : NOR::
195
196 cmd: dfu 0 sf <dev>
197
198 each element in *dfu_alt_info* being either of:
199
200 * <name> raw <offset> <size> raw access to sf device
201 * <name> part <dev> <part_id> raw acces to partition
202 * <name> partubi <dev> <part_id> raw acces to ubi partition
203
204 with
205
206 partid
207 is the MTD partition index
208
209mtd
210 all MTD device: NAND, SPI-NOR, SPI-NAND,...::
211
212 cmd: dfu 0 mtd <dev>
213
214 with
215
216 dev
217 the mtd identifier as defined in mtd command
218 (nand0, nor0, spi-nand0,...)
219
220 each element in *dfu_alt_info* being either of:
221
222 * <name> raw <offset> <size> forraw access to mtd device
223 * <name> part <dev> <part_id> for raw acces to partition
224 * <name> partubi <dev> <part_id> for raw acces to ubi partition
225
226 with
227
228 partid
229 is the MTD partition index
230
231virt
232 virtual flash back end for DFU
233
234 ::
235
236 cmd: dfu 0 virt <dev>
237
238 each element in *dfu_alt_info* being:
239
240 * <name>
241
242<interface> and <dev> are absent, the dfu command to use multiple devices::
243
244 cmd: dfu 0 list
245 cmd: dfu 0
246
247*dfu_alt_info* variable provides the list of <interface> <dev> with
248alternate list separated by '&' with the same format for each <alt>::
249
250 mmc <dev>=<alt1>;....;<altN>
251 nand <dev>=<alt1>;....;<altN>
252 ram <dev>=<alt1>;....;<altN>
253 sf <dev>=<alt1>;....;<altN>
254 mtd <dev>=<alt1>;....;<altN>
255 virt <dev>=<alt1>;....;<altN>
256
257Callbacks
258---------
259
260The weak callback functions can be implemented to manage specific behavior
261
262dfu_initiated_callback
263 called when the DFU transaction is started, used to initiase the device
264
265dfu_flush_callback
266 called at the end of the DFU write after DFU manifestation, used to manage
267 the device when DFU transaction is closed
268
269Host tools
270----------
271
272When U-Boot runs the dfu stack, the DFU host tools can be used
273to send/receive firmwares on each configurated alternate.
274
275For example dfu-util is a host side implementation of the DFU 1.1
276specifications(http://dfu-util.sourceforge.net/) which works with U-Boot.
277
278Usage
279-----
280
281Example 1: firmware located in eMMC or SD card, with:
282
283- alternate 1 (alt=1) for SPL partition (GPT partition 1)
284- alternate 2 (alt=2) for U-Boot partition (GPT partition 2)
285
286The U-Boot configuration is::
287
288 U-Boot> env set dfu_alt_info "spl part 0 1;u-boot part 0 2"
289
290 U-Boot> dfu 0 mmc 0 list
291 DFU alt settings list:
292 dev: eMMC alt: 0 name: spl layout: RAW_ADDR
293 dev: eMMC alt: 1 name: u-boot layout: RAW_ADDR
294
295 Boot> dfu 0 mmc 0
296
297On the Host side:
298
299list the available alternate setting::
300
301 $> dfu-util -l
302 dfu-util 0.9
303
304 Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
305 Copyright 2010-2016 Tormod Volden and Stefan Schmidt
306 This program is Free Software and has ABSOLUTELY NO WARRANTY
307 Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
308
309 Found DFU: [0483:5720] ver=0200, devnum=45, cfg=1, intf=0, path="3-1.3.1", \
310 alt=1, name="u-boot", serial="003A00203438510D36383238"
311 Found DFU: [0483:5720] ver=0200, devnum=45, cfg=1, intf=0, path="3-1.3.1", \
312 alt=0, name="spl", serial="003A00203438510D36383238"
313
314 To download to U-Boot, use -D option
315
316 $> dfu-util -a 0 -D u-boot-spl.bin
317 $> dfu-util -a 1 -D u-boot.bin
318
319 To upload from U-Boot, use -U option
320
321 $> dfu-util -a 0 -U u-boot-spl.bin
322 $> dfu-util -a 1 -U u-boot.bin
323
324 To request a DFU detach and reset the USB connection:
325 $> dfu-util -a 0 -e -R
326
327
328Example 2: firmware located in NOR (sf) and NAND, with:
329
330- alternate 1 (alt=1) for SPL partition (NOR GPT partition 1)
331- alternate 2 (alt=2) for U-Boot partition (NOR GPT partition 2)
332- alternate 3 (alt=3) for U-Boot-env partition (NOR GPT partition 3)
333- alternate 4 (alt=4) for UBI partition (NAND GPT partition 1)
334
335::
336
337 U-Boot> env set dfu_alt_info \
338 "sf 0:0:10000000:0=spl part 0 1;u-boot part 0 2; \
339 u-boot-env part 0 3&nand 0=UBI partubi 0,1"
340
341 U-Boot> dfu 0 list
342
343 DFU alt settings list:
344 dev: SF alt: 0 name: spl layout: RAW_ADDR
345 dev: SF alt: 1 name: ssbl layout: RAW_ADDR
346 dev: SF alt: 2 name: u-boot-env layout: RAW_ADDR
347 dev: NAND alt: 3 name: UBI layout: RAW_ADDR
348
349 U-Boot> dfu 0
350
351::
352
353 $> dfu-util -l
354 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
355 intf=0, alt=3, name="UBI", serial="002700333338511934383330"
356 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
357 intf=0, alt=2, name="u-boot-env", serial="002700333338511934383330"
358 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
359 intf=0, alt=1, name="u-boot", serial="002700333338511934383330"
360 Found DFU: [0483:5720] ver=9999, devnum=96, cfg=1,\
361 intf=0, alt=0, name="spl", serial="002700333338511934383330"
362
363Same example with MTD backend
364
365::
366
367 U-Boot> env set dfu_alt_info \
368 "mtd nor0=spl part 1;u-boot part 2;u-boot-env part 3&"\
369 "mtd nand0=UBI partubi 1"
370
371 U-Boot> dfu 0 list
372 using id 'nor0,0'
373 using id 'nor0,1'
374 using id 'nor0,2'
375 using id 'nand0,0'
376 DFU alt settings list:
377 dev: MTD alt: 0 name: spl layout: RAW_ADDR
378 dev: MTD alt: 1 name: u-boot layout: RAW_ADDR
379 dev: MTD alt: 2 name: u-boot-env layout: RAW_ADDR
380 dev: MTD alt: 3 name: UBI layout: RAW_ADDR
381
382Example 3
383
384firmware located in SD Card (mmc) and virtual partition on OTP and PMIC not
385volatile memory
386
387- alternate 1 (alt=1) for scard
388- alternate 2 (alt=2) for OTP (virtual)
389- alternate 3 (alt=3) for PMIC NVM (virtual)
390
391::
392
393 U-Boot> env set dfu_alt_info \
394 "mmc 0=sdcard raw 0 0x100000&"\
395 "virt 0=otp" \
396 "virt 1=pmic"
397
398::
399
400 U-Boot> dfu 0 list
401 DFU alt settings list:
402 dev: eMMC alt: 0 name: sdcard layout: RAW_ADDR
403 dev: VIRT alt: 1 name: otp layout: RAW_ADDR
404 dev: VIRT alt: 2 name: pmic layout: RAW_ADDR