25fa0b930f
In the source_file_format.txt file we talk about how to construct a valid FIT image. While it already says to look at the source for the full list, add kernel_noload to the explicit list of types. This is arguably the most important type to use as most often we are including a kernel that will run from wherever it is loaded into memory and execute. This for example, allows you to create a single FIT image for Linux that can be used on both OMAP and i.MX devices as the kernel will not need to be moved in memory. Signed-off-by: Tom Rini <trini@konsulko.com>
295 lines
10 KiB
Plaintext
295 lines
10 KiB
Plaintext
U-Boot new uImage source file format (bindings definition)
|
|
==========================================================
|
|
|
|
Author: Marian Balakowicz <m8@semihalf.com>
|
|
External data additions, 25/1/16 Simon Glass <sjg@chromium.org>
|
|
|
|
1) Introduction
|
|
---------------
|
|
|
|
Evolution of the 2.6 Linux kernel for embedded PowerPC systems introduced new
|
|
booting method which requires that hardware description is available to the
|
|
kernel in the form of Flattened Device Tree.
|
|
|
|
Booting with a Flattened Device Tree is much more flexible and is intended to
|
|
replace direct passing of 'struct bd_info' which was used to boot pre-FDT
|
|
kernels.
|
|
|
|
However, U-Boot needs to support both techniques to provide backward
|
|
compatibility for platforms which are not FDT ready. Number of elements
|
|
playing role in the booting process has increased and now includes the FDT
|
|
blob. Kernel image, FDT blob and possibly ramdisk image - all must be placed
|
|
in the system memory and passed to bootm as a arguments. Some of them may be
|
|
missing: FDT is not present for legacy platforms, ramdisk is always optional.
|
|
Additionally, old uImage format has been extended to support multi sub-images
|
|
but the support is limited by simple format of the legacy uImage structure.
|
|
Single binary header 'struct image_header' is not flexible enough to cover all
|
|
possible scenarios.
|
|
|
|
All those factors combined clearly show that there is a need for new, more
|
|
flexible, multi component uImage format.
|
|
|
|
|
|
2) New uImage format assumptions
|
|
--------------------------------
|
|
|
|
a) Implementation
|
|
|
|
Libfdt has been selected for the new uImage format implementation as (1) it
|
|
provides needed functionality, (2) is actively maintained and developed and
|
|
(3) increases code reuse as it is already part of the U-Boot source tree.
|
|
|
|
b) Terminology
|
|
|
|
This document defines new uImage structure by providing FDT bindings for new
|
|
uImage internals. Bindings are defined from U-Boot perspective, i.e. describe
|
|
final form of the uImage at the moment when it reaches U-Boot. User
|
|
perspective may be simpler, as some of the properties (like timestamps and
|
|
hashes) will need to be filled in automatically by the U-Boot mkimage tool.
|
|
|
|
To avoid confusion with the kernel FDT the following naming convention is
|
|
proposed for the new uImage format related terms:
|
|
|
|
FIT - Flattened uImage Tree
|
|
|
|
FIT is formally a flattened device tree (in the libfdt meaning), which
|
|
conforms to bindings defined in this document.
|
|
|
|
.its - image tree source
|
|
.itb - flattened image tree blob
|
|
|
|
c) Image building procedure
|
|
|
|
The following picture shows how the new uImage is prepared. Input consists of
|
|
image source file (.its) and a set of data files. Image is created with the
|
|
help of standard U-Boot mkimage tool which in turn uses dtc (device tree
|
|
compiler) to produce image tree blob (.itb). Resulting .itb file is the
|
|
actual binary of a new uImage.
|
|
|
|
|
|
tqm5200.its
|
|
+
|
|
vmlinux.bin.gz mkimage + dtc xfer to target
|
|
eldk-4.2-ramdisk --------------> tqm5200.itb --------------> bootm
|
|
tqm5200.dtb /|\
|
|
... |
|
|
'new uImage'
|
|
|
|
- create .its file, automatically filled-in properties are omitted
|
|
- call mkimage tool on a .its file
|
|
- mkimage calls dtc to create .itb image and assures that
|
|
missing properties are added
|
|
- .itb (new uImage) is uploaded onto the target and used therein
|
|
|
|
|
|
d) Unique identifiers
|
|
|
|
To identify FIT sub-nodes representing images, hashes, configurations (which
|
|
are defined in the following sections), the "unit name" of the given sub-node
|
|
is used as it's identifier as it assures uniqueness without additional
|
|
checking required.
|
|
|
|
|
|
3) Root node properties
|
|
-----------------------
|
|
|
|
Root node of the uImage Tree should have the following layout:
|
|
|
|
/ o image-tree
|
|
|- description = "image description"
|
|
|- timestamp = <12399321>
|
|
|- #address-cells = <1>
|
|
|
|
|
o images
|
|
| |
|
|
| o image@1 {...}
|
|
| o image@2 {...}
|
|
| ...
|
|
|
|
|
o configurations
|
|
|- default = "conf@1"
|
|
|
|
|
o conf@1 {...}
|
|
o conf@2 {...}
|
|
...
|
|
|
|
|
|
Optional property:
|
|
- description : Textual description of the uImage
|
|
|
|
Mandatory property:
|
|
- timestamp : Last image modification time being counted in seconds since
|
|
1970-01-01 00:00:00 - to be automatically calculated by mkimage tool.
|
|
|
|
Conditionally mandatory property:
|
|
- #address-cells : Number of 32bit cells required to represent entry and
|
|
load addresses supplied within sub-image nodes. May be omitted when no
|
|
entry or load addresses are used.
|
|
|
|
Mandatory node:
|
|
- images : This node contains a set of sub-nodes, each of them representing
|
|
single component sub-image (like kernel, ramdisk, etc.). At least one
|
|
sub-image is required.
|
|
|
|
Optional node:
|
|
- configurations : Contains a set of available configuration nodes and
|
|
defines a default configuration.
|
|
|
|
|
|
4) '/images' node
|
|
-----------------
|
|
|
|
This node is a container node for component sub-image nodes. Each sub-node of
|
|
the '/images' node should have the following layout:
|
|
|
|
o image@1
|
|
|- description = "component sub-image description"
|
|
|- data = /incbin/("path/to/data/file.bin")
|
|
|- type = "sub-image type name"
|
|
|- arch = "ARCH name"
|
|
|- os = "OS name"
|
|
|- compression = "compression name"
|
|
|- load = <00000000>
|
|
|- entry = <00000000>
|
|
|
|
|
o hash@1 {...}
|
|
o hash@2 {...}
|
|
...
|
|
|
|
Mandatory properties:
|
|
- description : Textual description of the component sub-image
|
|
- type : Name of component sub-image type, supported types are:
|
|
"standalone", "kernel", "kernel_noload", "ramdisk", "firmware", "script",
|
|
"filesystem", "flat_dt" and others (see uimage_type in common/image.c).
|
|
- data : Path to the external file which contains this node's binary data.
|
|
- compression : Compression used by included data. Supported compressions
|
|
are "gzip" and "bzip2". If no compression is used compression property
|
|
should be set to "none".
|
|
|
|
Conditionally mandatory property:
|
|
- os : OS name, mandatory for types "kernel" and "ramdisk". Valid OS names
|
|
are: "openbsd", "netbsd", "freebsd", "4_4bsd", "linux", "svr4", "esix",
|
|
"solaris", "irix", "sco", "dell", "ncr", "lynxos", "vxworks", "psos", "qnx",
|
|
"u_boot", "rtems", "unity", "integrity".
|
|
- arch : Architecture name, mandatory for types: "standalone", "kernel",
|
|
"firmware", "ramdisk" and "fdt". Valid architecture names are: "alpha",
|
|
"arm", "i386", "ia64", "mips", "mips64", "ppc", "s390", "sh", "sparc",
|
|
"sparc64", "m68k", "microblaze", "nios2", "blackfin", "avr32", "st200",
|
|
"sandbox".
|
|
- entry : entry point address, address size is determined by
|
|
'#address-cells' property of the root node. Mandatory for for types:
|
|
"standalone" and "kernel".
|
|
- load : load address, address size is determined by '#address-cells'
|
|
property of the root node. Mandatory for types: "standalone" and "kernel".
|
|
|
|
Optional nodes:
|
|
- hash@1 : Each hash sub-node represents separate hash or checksum
|
|
calculated for node's data according to specified algorithm.
|
|
|
|
|
|
5) Hash nodes
|
|
-------------
|
|
|
|
o hash@1
|
|
|- algo = "hash or checksum algorithm name"
|
|
|- value = [hash or checksum value]
|
|
|
|
Mandatory properties:
|
|
- algo : Algorithm name, supported are "crc32", "md5" and "sha1".
|
|
- value : Actual checksum or hash value, correspondingly 4, 16 or 20 bytes
|
|
long.
|
|
|
|
|
|
6) '/configurations' node
|
|
-------------------------
|
|
|
|
The 'configurations' node is optional. If present, it allows to create a
|
|
convenient, labeled boot configurations, which combine together kernel images
|
|
with their ramdisks and fdt blobs.
|
|
|
|
The 'configurations' node has has the following structure:
|
|
|
|
o configurations
|
|
|- default = "default configuration sub-node unit name"
|
|
|
|
|
o config@1 {...}
|
|
o config@2 {...}
|
|
...
|
|
|
|
|
|
Optional property:
|
|
- default : Selects one of the configuration sub-nodes as a default
|
|
configuration.
|
|
|
|
Mandatory nodes:
|
|
- configuration-sub-node-unit-name : At least one of the configuration
|
|
sub-nodes is required.
|
|
|
|
|
|
7) Configuration nodes
|
|
----------------------
|
|
|
|
Each configuration has the following structure:
|
|
|
|
o config@1
|
|
|- description = "configuration description"
|
|
|- kernel = "kernel sub-node unit name"
|
|
|- ramdisk = "ramdisk sub-node unit name"
|
|
|- fdt = "fdt sub-node unit-name"
|
|
|- fpga = "fpga sub-node unit-name"
|
|
|- loadables = "loadables sub-node unit-name"
|
|
|
|
|
|
Mandatory properties:
|
|
- description : Textual configuration description.
|
|
- kernel : Unit name of the corresponding kernel image (image sub-node of a
|
|
"kernel" type).
|
|
|
|
Optional properties:
|
|
- ramdisk : Unit name of the corresponding ramdisk image (component image
|
|
node of a "ramdisk" type).
|
|
- fdt : Unit name of the corresponding fdt blob (component image node of a
|
|
"fdt type").
|
|
- setup : Unit name of the corresponding setup binary (used for booting
|
|
an x86 kernel). This contains the setup.bin file built by the kernel.
|
|
- fpga : Unit name of the corresponding fpga bitstream blob
|
|
(component image node of a "fpga type").
|
|
- loadables : Unit name containing a list of additional binaries to be
|
|
loaded at their given locations. "loadables" is a comma-separated list
|
|
of strings. U-Boot will load each binary at its given start-address and
|
|
may optionaly invoke additional post-processing steps on this binary based
|
|
on its component image node type.
|
|
|
|
The FDT blob is required to properly boot FDT based kernel, so the minimal
|
|
configuration for 2.6 FDT kernel is (kernel, fdt) pair.
|
|
|
|
Older, 2.4 kernel and 2.6 non-FDT kernel do not use FDT blob, in such cases
|
|
'struct bd_info' must be passed instead of FDT blob, thus fdt property *must
|
|
not* be specified in a configuration node.
|
|
|
|
|
|
8) External data
|
|
----------------
|
|
|
|
The above format shows a 'data' property which holds the data for each image.
|
|
It is also possible for this data to reside outside the FIT itself. This
|
|
allows the FIT to be quite small, so that it can be loaded and scanned
|
|
without loading a large amount of data. Then when an image is needed it can
|
|
be loaded from an external source.
|
|
|
|
In this case the 'data' property is omitted. Instead you can use:
|
|
|
|
- data-offset : offset of the data in a separate image store. The image
|
|
store is placed immediately after the last byte of the device tree binary,
|
|
aligned to a 4-byte boundary.
|
|
- data-size : size of the data in bytes
|
|
|
|
The 'data-offset' property can be substituted with 'data-position', which
|
|
defines an absolute position or address as the offset. This is helpful when
|
|
booting U-Boot proper before performing relocation.
|
|
|
|
9) Examples
|
|
-----------
|
|
|
|
Please see doc/uImage.FIT/*.its for actual image source files.
|