uboot/doc/uImage.FIT/howto.txt
<<
>>
Prefs
   1How 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
  19
  20        git://git.kernel.org/pub/scm/utils/dtc/dtc.git
  21
  22for its latest version. mkimage (together with dtc) takes as input
  23an 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
  26doc/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
  28form 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
  43image source file     mkimage + dtc               transfer to target
  44        +            ---------------> image file --------------------> bootm
  45image data file(s)
  46
  47SPL 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).
  68
  69The 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
 153Example 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).
 160The 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:
 165
 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
 172Created:         Tue Mar 11 17:26:15 2008
 173 Image 0 (kernel)
 174  Description:  Vanilla Linux kernel
 175  Type:         Kernel Image
 176  Compression:  gzip compressed
 177  Data Size:    943347 Bytes = 921.24 kB = 0.90 MB
 178  Architecture: PowerPC
 179  OS:           Linux
 180  Load Address: 0x00000000
 181  Entry Point:  0x00000000
 182  Hash algo:    crc32
 183  Hash value:   2ae2bb40
 184  Hash algo:    sha1
 185  Hash value:   3c200f34e2c226ddc789240cca0c59fc54a67cf4
 186 Default Configuration: 'config-1'
 187 Configuration 0 (config-1)
 188  Description:  Boot Linux kernel
 189  Kernel:       kernel
 190
 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
 204Using FEC device
 205TFTP 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
 216   Created:         2008-03-11  16:26:15 UTC
 217    Image 0 (kernel)
 218     Description:  Vanilla Linux kernel
 219     Type:         Kernel Image
 220     Compression:  gzip compressed
 221     Data Start:   0x009000e0
 222     Data Size:    943347 Bytes = 921.2 kB
 223     Architecture: PowerPC
 224     OS:           Linux
 225     Load Address: 0x00000000
 226     Entry Point:  0x00000000
 227     Hash algo:    crc32
 228     Hash value:   2ae2bb40
 229     Hash algo:    sha1
 230     Hash value:   3c200f34e2c226ddc789240cca0c59fc54a67cf4
 231    Default Configuration: 'config-1'
 232    Configuration 0 (config-1)
 233     Description:  Boot Linux kernel
 234     Kernel:       kernel
 235
 236=> bootm
 237## Booting kernel from FIT Image at 00900000 ...
 238   Using 'config-1' configuration
 239   Trying 'kernel' kernel subimage
 240     Description:  Vanilla Linux kernel
 241     Type:         Kernel Image
 242     Compression:  gzip compressed
 243     Data Start:   0x009000e0
 244     Data Size:    943347 Bytes = 921.2 kB
 245     Architecture: PowerPC
 246     OS:           Linux
 247     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
 271be 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):
 275
 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
 282Created:         Tue Mar 11 16:29:22 2008
 283 Image 0 (kernel)
 284  Description:  Vanilla Linux kernel
 285  Type:         Kernel Image
 286  Compression:  gzip compressed
 287  Data Size:    1092037 Bytes = 1066.44 kB = 1.04 MB
 288  Architecture: PowerPC
 289  OS:           Linux
 290  Load Address: 0x00000000
 291  Entry Point:  0x00000000
 292  Hash algo:    crc32
 293  Hash value:   2c0cc807
 294  Hash algo:    sha1
 295  Hash value:   264b59935470e42c418744f83935d44cdf59a3bb
 296 Image 1 (fdt-1)
 297  Description:  Flattened Device Tree blob
 298  Type:         Flat Device Tree
 299  Compression:  uncompressed
 300  Data Size:    16384 Bytes = 16.00 kB = 0.02 MB
 301  Architecture: PowerPC
 302  Hash algo:    crc32
 303  Hash value:   0d655d71
 304  Hash algo:    sha1
 305  Hash value:   25ab4e15cd4b8a5144610394560d9c318ce52def
 306 Default Configuration: 'conf-1'
 307 Configuration 0 (conf-1)
 308  Description:  Boot Linux kernel with FDT blob
 309  Kernel:       kernel
 310  FDT:          fdt-1
 311
 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
 318Using FEC device
 319TFTP 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: #################################################################
 323         ###########
 324done
 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
 331   Created:         2008-03-11  15:29:22 UTC
 332    Image 0 (kernel)
 333     Description:  Vanilla Linux kernel
 334     Type:         Kernel Image
 335     Compression:  gzip compressed
 336     Data Start:   0x009000ec
 337     Data Size:    1092037 Bytes =  1 MB
 338     Architecture: PowerPC
 339     OS:           Linux
 340     Load Address: 0x00000000
 341     Entry Point:  0x00000000
 342     Hash algo:    crc32
 343     Hash value:   2c0cc807
 344     Hash algo:    sha1
 345     Hash value:   264b59935470e42c418744f83935d44cdf59a3bb
 346    Image 1 (fdt-1)
 347     Description:  Flattened Device Tree blob
 348     Type:         Flat Device Tree
 349     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
 357    Default Configuration: 'conf-1'
 358    Configuration 0 (conf-1)
 359     Description:  Boot Linux kernel with FDT blob
 360     Kernel:       kernel
 361     FDT:          fdt-1
 362=> bootm
 363## Booting kernel from FIT Image at 00900000 ...
 364   Using 'conf-1' configuration
 365   Trying 'kernel' kernel subimage
 366     Description:  Vanilla Linux kernel
 367     Type:         Kernel Image
 368     Compression:  gzip compressed
 369     Data Start:   0x009000ec
 370     Data Size:    1092037 Bytes =  1 MB
 371     Architecture: PowerPC
 372     OS:           Linux
 373     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
 382   Using 'conf-1' configuration
 383   Trying 'fdt-1' FDT blob subimage
 384     Description:  Flattened Device Tree blob
 385     Type:         Flat Device Tree
 386     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
 404Refer to doc/uImage.FIT/multi.its for an image source file that allows more
 405sophisticated booting scenarios (multiple kernels, ramdisks and fdt blobs).
 406