blob: 019dda24a081b910f509e1a1b957cbf81bd7be2b [file] [log] [blame]
Marian Balakowicz3310c542008-03-12 12:13:13 +01001How to use images in the new image format
2=========================================
3
4Author: Bartlomiej Sieka <tur@semihalf.com>
5
6
7Overview
8--------
9
10The new uImage format allows more flexibility in handling images of various
11types (kernel, ramdisk, etc.), it also enhances integrity protection of images
12with sha1 and md5 checksums.
13
14Two auxiliary tools are needed on the development host system in order to
15create an uImage in the new format: mkimage and dtc, although only one
16(mkimage) is invoked directly. dtc is called from within mkimage and operates
17behind the scenes, but needs to be present in the $PATH nevertheless. It is
18important that the dtc used has support for binary includes -- refer to
Jon Loeliger5f658262014-05-27 09:12:48 -050019
20 git://git.kernel.org/pub/scm/utils/dtc/dtc.git
21
22for its latest version. mkimage (together with dtc) takes as input
Marian Balakowicz3310c542008-03-12 12:13:13 +010023an image source file, which describes the contents of the image and defines
24its various properties used during booting. By convention, image source file
25has the ".its" extension, also, the details of its format are given in
Masahiro Yamada09b72d62014-01-16 11:05:23 +090026doc/uImage.FIT/source_file_format.txt. The actual data that is to be included in
27the uImage (kernel, ramdisk, etc.) is specified in the image source file in the
Marian Balakowicz3310c542008-03-12 12:13:13 +010028form of paths to appropriate data files. The outcome of the image creation
29process is a binary file (by convention with the ".itb" extension) that
30contains all the referenced data (kernel, ramdisk, etc.) and other information
31needed by U-Boot to handle the uImage properly. The uImage file is then
32transferred to the target (e.g., via tftp) and booted using the bootm command.
33
34To summarize the prerequisites needed for new uImage creation:
35- mkimage
36- dtc (with support for binary includes)
37- image source file (*.its)
38- image data file(s)
39
40
41Here's a graphical overview of the image creation and booting process:
42
Wolfgang Denk438a4c12008-03-26 11:48:46 +010043image source file mkimage + dtc transfer to target
44 + ---------------> image file --------------------> bootm
Masahiro Yamada09b72d62014-01-16 11:05:23 +090045image data file(s)
Marian Balakowicz3310c542008-03-12 12:13:13 +010046
Andre Przywara411cf322017-04-26 01:32:37 +010047SPL usage
48---------
49
50The SPL can make use of the new image format as well, this traditionally
51is used to ship multiple device tree files within one image. Code in the SPL
52will choose the one matching the current board and append this to the
53U-Boot proper binary to be automatically used up by it.
54Aside from U-Boot proper and one device tree blob the SPL can load multiple,
55arbitrary image files as well. These binaries should be specified in their
56own subnode under the /images node, which should then be referenced from one or
57multiple /configurations subnodes. The required images must be enumerated in
58the "loadables" property as a list of strings.
59
60If a platform specific image source file (.its) is shipped with the U-Boot
61source, it can be specified using the CONFIG_SPL_FIT_SOURCE Kconfig symbol.
62In this case it will be automatically used by U-Boot's Makefile to generate
63the image.
64If a static source file is not flexible enough, CONFIG_SPL_FIT_GENERATOR
65can point to a script which generates this image source file during
66the build process. It gets passed a list of device tree files (taken from the
67CONFIG_OF_LIST symbol).
Marian Balakowicz3310c542008-03-12 12:13:13 +010068
Michal Simekcaa7fc22020-09-03 11:24:28 +020069The SPL also records to a DT all additional images (called loadables) which are
70loaded. The information about loadables locations is passed via the DT node with
71fit-images name.
72
73Loadables Example
74-----------------
75Consider the following case for an ARM64 platform where U-Boot runs in EL2
76started by ATF where SPL is loading U-Boot (as loadables) and ATF (as firmware).
77
78/dts-v1/;
79
80/ {
81 description = "Configuration to load ATF before U-Boot";
82
83 images {
84 uboot {
85 description = "U-Boot (64-bit)";
86 data = /incbin/("u-boot-nodtb.bin");
87 type = "firmware";
88 os = "u-boot";
89 arch = "arm64";
90 compression = "none";
91 load = <0x8 0x8000000>;
92 entry = <0x8 0x8000000>;
93 hash {
94 algo = "md5";
95 };
96 };
97 atf {
98 description = "ARM Trusted Firmware";
99 data = /incbin/("bl31.bin");
100 type = "firmware";
101 os = "arm-trusted-firmware";
102 arch = "arm64";
103 compression = "none";
104 load = <0xfffea000>;
105 entry = <0xfffea000>;
106 hash {
107 algo = "md5";
108 };
109 };
110 fdt_1 {
111 description = "zynqmp-zcu102-revA";
112 data = /incbin/("arch/arm/dts/zynqmp-zcu102-revA.dtb");
113 type = "flat_dt";
114 arch = "arm64";
115 compression = "none";
116 load = <0x100000>;
117 hash {
118 algo = "md5";
119 };
120 };
121 };
122 configurations {
123 default = "config_1";
124
125 config_1 {
126 description = "zynqmp-zcu102-revA";
127 firmware = "atf";
128 loadables = "uboot";
129 fdt = "fdt_1";
130 };
131 };
132};
133
134In this case the SPL records via fit-images DT node the information about
135loadables U-Boot image.
136
137ZynqMP> fdt addr $fdtcontroladdr
138ZynqMP> fdt print /fit-images
139fit-images {
140 uboot {
141 os = "u-boot";
142 type = "firmware";
143 size = <0x001017c8>;
144 entry = <0x00000008 0x08000000>;
145 load = <0x00000008 0x08000000>;
146 };
147};
148
149As you can see entry and load properties are 64bit wide to support loading
150images above 4GB (in past entry and load properties where just 32bit).
151
152
Marian Balakowicz3310c542008-03-12 12:13:13 +0100153Example 1 -- old-style (non-FDT) kernel booting
154-----------------------------------------------
155
156Consider a simple scenario, where a PPC Linux kernel built from sources on the
157development host is to be booted old-style (non-FDT) by U-Boot on an embedded
158target. Assume that the outcome of the build is vmlinux.bin.gz, a file which
159contains a gzip-compressed PPC Linux kernel (the only data file in this case).
Bartlomiej Sieka43142e82008-03-20 23:10:19 +0100160The uImage can be produced using the image source file
161doc/uImage.FIT/kernel.its (note that kernel.its assumes that vmlinux.bin.gz is
162in the current working directory; if desired, an alternative path can be
163specified in the kernel.its file). Here's how to create the image and inspect
164its contents:
Marian Balakowicz3310c542008-03-12 12:13:13 +0100165
166[on the host system]
167$ mkimage -f kernel.its kernel.itb
168DTC: dts->dtb on file "kernel.its"
169$
170$ mkimage -l kernel.itb
171FIT description: Simple image with single Linux kernel
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100172Created: Tue Mar 11 17:26:15 2008
Andre Przywara83840402017-12-04 02:05:07 +0000173 Image 0 (kernel)
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100174 Description: Vanilla Linux kernel
175 Type: Kernel Image
176 Compression: gzip compressed
177 Data Size: 943347 Bytes = 921.24 kB = 0.90 MB
Marian Balakowicz3310c542008-03-12 12:13:13 +0100178 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100179 OS: Linux
Marian Balakowicz3310c542008-03-12 12:13:13 +0100180 Load Address: 0x00000000
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100181 Entry Point: 0x00000000
182 Hash algo: crc32
183 Hash value: 2ae2bb40
184 Hash algo: sha1
185 Hash value: 3c200f34e2c226ddc789240cca0c59fc54a67cf4
Andre Przywara83840402017-12-04 02:05:07 +0000186 Default Configuration: 'config-1'
187 Configuration 0 (config-1)
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100188 Description: Boot Linux kernel
Andre Przywara83840402017-12-04 02:05:07 +0000189 Kernel: kernel
Marian Balakowicz3310c542008-03-12 12:13:13 +0100190
191
192The resulting image file kernel.itb can be now transferred to the target,
193inspected and booted (note that first three U-Boot commands below are shown
194for completeness -- they are part of the standard booting procedure and not
195specific to the new image format).
196
197[on the target system]
198=> print nfsargs
199nfsargs=setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${rootpath}
200=> print addip
201addip=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off panic=1
202=> run nfsargs addip
203=> tftp 900000 /path/to/tftp/location/kernel.itb
Heiko Schocher48690d82010-07-20 17:45:02 +0200204Using FEC device
Marian Balakowicz3310c542008-03-12 12:13:13 +0100205TFTP from server 192.168.1.1; our IP address is 192.168.160.5
206Filename '/path/to/tftp/location/kernel.itb'.
207Load address: 0x900000
208Loading: #################################################################
209done
210Bytes transferred = 944464 (e6950 hex)
211=> iminfo
212
213## Checking Image at 00900000 ...
214 FIT image found
215 FIT description: Simple image with single Linux kernel
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100216 Created: 2008-03-11 16:26:15 UTC
Andre Przywara83840402017-12-04 02:05:07 +0000217 Image 0 (kernel)
Marian Balakowicz3310c542008-03-12 12:13:13 +0100218 Description: Vanilla Linux kernel
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100219 Type: Kernel Image
Marian Balakowicz3310c542008-03-12 12:13:13 +0100220 Compression: gzip compressed
221 Data Start: 0x009000e0
222 Data Size: 943347 Bytes = 921.2 kB
223 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100224 OS: Linux
Marian Balakowicz3310c542008-03-12 12:13:13 +0100225 Load Address: 0x00000000
226 Entry Point: 0x00000000
227 Hash algo: crc32
228 Hash value: 2ae2bb40
229 Hash algo: sha1
230 Hash value: 3c200f34e2c226ddc789240cca0c59fc54a67cf4
Andre Przywara83840402017-12-04 02:05:07 +0000231 Default Configuration: 'config-1'
232 Configuration 0 (config-1)
Marian Balakowicz3310c542008-03-12 12:13:13 +0100233 Description: Boot Linux kernel
Andre Przywara83840402017-12-04 02:05:07 +0000234 Kernel: kernel
Marian Balakowicz3310c542008-03-12 12:13:13 +0100235
236=> bootm
237## Booting kernel from FIT Image at 00900000 ...
Andre Przywara83840402017-12-04 02:05:07 +0000238 Using 'config-1' configuration
239 Trying 'kernel' kernel subimage
Marian Balakowicz3310c542008-03-12 12:13:13 +0100240 Description: Vanilla Linux kernel
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100241 Type: Kernel Image
Marian Balakowicz3310c542008-03-12 12:13:13 +0100242 Compression: gzip compressed
243 Data Start: 0x009000e0
244 Data Size: 943347 Bytes = 921.2 kB
245 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100246 OS: Linux
Marian Balakowicz3310c542008-03-12 12:13:13 +0100247 Load Address: 0x00000000
248 Entry Point: 0x00000000
249 Hash algo: crc32
250 Hash value: 2ae2bb40
251 Hash algo: sha1
252 Hash value: 3c200f34e2c226ddc789240cca0c59fc54a67cf4
253 Verifying Hash Integrity ... crc32+ sha1+ OK
254 Uncompressing Kernel Image ... OK
255Memory BAT mapping: BAT2=256Mb, BAT3=0Mb, residual: 0Mb
256Linux version 2.4.25 (m8@hekate) (gcc version 4.0.0 (DENX ELDK 4.0 4.0.0)) #2 czw lip 5 17:56:18 CEST 2007
257On node 0 totalpages: 65536
258zone(0): 65536 pages.
259zone(1): 0 pages.
260zone(2): 0 pages.
261Kernel command line: root=/dev/nfs rw nfsroot=192.168.1.1:/opt/eldk-4.1/ppc_6xx ip=192.168.160.5:192.168.1.1::255.255.0.0:lite5200b:eth0:off panic=1
262Calibrating delay loop... 307.20 BogoMIPS
263
264
265Example 2 -- new-style (FDT) kernel booting
266-------------------------------------------
267
268Consider another simple scenario, where a PPC Linux kernel is to be booted
269new-style, i.e., with a FDT blob. In this case there are two prerequisite data
270files: vmlinux.bin.gz (Linux kernel) and target.dtb (FDT blob). The uImage can
Bartlomiej Sieka43142e82008-03-20 23:10:19 +0100271be produced using image source file doc/uImage.FIT/kernel_fdt.its like this
272(note again, that both prerequisite data files are assumed to be present in
273the current working directory -- image source file kernel_fdt.its can be
274modified to take the files from some other location if needed):
Marian Balakowicz3310c542008-03-12 12:13:13 +0100275
276[on the host system]
277$ mkimage -f kernel_fdt.its kernel_fdt.itb
278DTC: dts->dtb on file "kernel_fdt.its"
279$
280$ mkimage -l kernel_fdt.itb
281FIT description: Simple image with single Linux kernel and FDT blob
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100282Created: Tue Mar 11 16:29:22 2008
Andre Przywara83840402017-12-04 02:05:07 +0000283 Image 0 (kernel)
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100284 Description: Vanilla Linux kernel
285 Type: Kernel Image
286 Compression: gzip compressed
287 Data Size: 1092037 Bytes = 1066.44 kB = 1.04 MB
Marian Balakowicz3310c542008-03-12 12:13:13 +0100288 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100289 OS: Linux
Marian Balakowicz3310c542008-03-12 12:13:13 +0100290 Load Address: 0x00000000
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100291 Entry Point: 0x00000000
292 Hash algo: crc32
293 Hash value: 2c0cc807
294 Hash algo: sha1
295 Hash value: 264b59935470e42c418744f83935d44cdf59a3bb
Andre Przywara83840402017-12-04 02:05:07 +0000296 Image 1 (fdt-1)
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100297 Description: Flattened Device Tree blob
298 Type: Flat Device Tree
299 Compression: uncompressed
300 Data Size: 16384 Bytes = 16.00 kB = 0.02 MB
Marian Balakowicz3310c542008-03-12 12:13:13 +0100301 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100302 Hash algo: crc32
303 Hash value: 0d655d71
304 Hash algo: sha1
305 Hash value: 25ab4e15cd4b8a5144610394560d9c318ce52def
Andre Przywara83840402017-12-04 02:05:07 +0000306 Default Configuration: 'conf-1'
307 Configuration 0 (conf-1)
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100308 Description: Boot Linux kernel with FDT blob
Andre Przywara83840402017-12-04 02:05:07 +0000309 Kernel: kernel
310 FDT: fdt-1
Marian Balakowicz3310c542008-03-12 12:13:13 +0100311
312
313The resulting image file kernel_fdt.itb can be now transferred to the target,
314inspected and booted:
315
316[on the target system]
317=> tftp 900000 /path/to/tftp/location/kernel_fdt.itb
Heiko Schocher48690d82010-07-20 17:45:02 +0200318Using FEC device
Marian Balakowicz3310c542008-03-12 12:13:13 +0100319TFTP from server 192.168.1.1; our IP address is 192.168.160.5
320Filename '/path/to/tftp/location/kernel_fdt.itb'.
321Load address: 0x900000
322Loading: #################################################################
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100323 ###########
Marian Balakowicz3310c542008-03-12 12:13:13 +0100324done
325Bytes transferred = 1109776 (10ef10 hex)
326=> iminfo
327
328## Checking Image at 00900000 ...
329 FIT image found
330 FIT description: Simple image with single Linux kernel and FDT blob
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100331 Created: 2008-03-11 15:29:22 UTC
Andre Przywara83840402017-12-04 02:05:07 +0000332 Image 0 (kernel)
Marian Balakowicz3310c542008-03-12 12:13:13 +0100333 Description: Vanilla Linux kernel
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100334 Type: Kernel Image
Marian Balakowicz3310c542008-03-12 12:13:13 +0100335 Compression: gzip compressed
336 Data Start: 0x009000ec
337 Data Size: 1092037 Bytes = 1 MB
338 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100339 OS: Linux
Marian Balakowicz3310c542008-03-12 12:13:13 +0100340 Load Address: 0x00000000
341 Entry Point: 0x00000000
342 Hash algo: crc32
343 Hash value: 2c0cc807
344 Hash algo: sha1
345 Hash value: 264b59935470e42c418744f83935d44cdf59a3bb
Andre Przywara83840402017-12-04 02:05:07 +0000346 Image 1 (fdt-1)
Marian Balakowicz3310c542008-03-12 12:13:13 +0100347 Description: Flattened Device Tree blob
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100348 Type: Flat Device Tree
Marian Balakowicz3310c542008-03-12 12:13:13 +0100349 Compression: uncompressed
350 Data Start: 0x00a0abdc
351 Data Size: 16384 Bytes = 16 kB
352 Architecture: PowerPC
353 Hash algo: crc32
354 Hash value: 0d655d71
355 Hash algo: sha1
356 Hash value: 25ab4e15cd4b8a5144610394560d9c318ce52def
Andre Przywara83840402017-12-04 02:05:07 +0000357 Default Configuration: 'conf-1'
358 Configuration 0 (conf-1)
Marian Balakowicz3310c542008-03-12 12:13:13 +0100359 Description: Boot Linux kernel with FDT blob
Andre Przywara83840402017-12-04 02:05:07 +0000360 Kernel: kernel
361 FDT: fdt-1
Marian Balakowicz3310c542008-03-12 12:13:13 +0100362=> bootm
363## Booting kernel from FIT Image at 00900000 ...
Andre Przywara83840402017-12-04 02:05:07 +0000364 Using 'conf-1' configuration
365 Trying 'kernel' kernel subimage
Marian Balakowicz3310c542008-03-12 12:13:13 +0100366 Description: Vanilla Linux kernel
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100367 Type: Kernel Image
Marian Balakowicz3310c542008-03-12 12:13:13 +0100368 Compression: gzip compressed
369 Data Start: 0x009000ec
370 Data Size: 1092037 Bytes = 1 MB
371 Architecture: PowerPC
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100372 OS: Linux
Marian Balakowicz3310c542008-03-12 12:13:13 +0100373 Load Address: 0x00000000
374 Entry Point: 0x00000000
375 Hash algo: crc32
376 Hash value: 2c0cc807
377 Hash algo: sha1
378 Hash value: 264b59935470e42c418744f83935d44cdf59a3bb
379 Verifying Hash Integrity ... crc32+ sha1+ OK
380 Uncompressing Kernel Image ... OK
381## Flattened Device Tree from FIT Image at 00900000
Andre Przywara83840402017-12-04 02:05:07 +0000382 Using 'conf-1' configuration
383 Trying 'fdt-1' FDT blob subimage
Marian Balakowicz3310c542008-03-12 12:13:13 +0100384 Description: Flattened Device Tree blob
Wolfgang Denk438a4c12008-03-26 11:48:46 +0100385 Type: Flat Device Tree
Marian Balakowicz3310c542008-03-12 12:13:13 +0100386 Compression: uncompressed
387 Data Start: 0x00a0abdc
388 Data Size: 16384 Bytes = 16 kB
389 Architecture: PowerPC
390 Hash algo: crc32
391 Hash value: 0d655d71
392 Hash algo: sha1
393 Hash value: 25ab4e15cd4b8a5144610394560d9c318ce52def
394 Verifying Hash Integrity ... crc32+ sha1+ OK
395 Booting using the fdt blob at 0xa0abdc
396 Loading Device Tree to 007fc000, end 007fffff ... OK
397[ 0.000000] Using lite5200 machine description
398[ 0.000000] Linux version 2.6.24-rc6-gaebecdfc (m8@hekate) (gcc version 4.0.0 (DENX ELDK 4.1 4.0.0)) #1 Sat Jan 12 15:38:48 CET 2008
399
400
401Example 3 -- advanced booting
402-----------------------------
403
Bartlomiej Sieka43142e82008-03-20 23:10:19 +0100404Refer to doc/uImage.FIT/multi.its for an image source file that allows more
Marian Balakowicz3310c542008-03-12 12:13:13 +0100405sophisticated booting scenarios (multiple kernels, ramdisks and fdt blobs).