| U-boot new uImage source file format (bindings definition) | |
| ========================================================== | |
| Author: Marian Balakowicz <m8@semihalf.com> | |
| 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 - 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 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 img@1 {...} | |
| | o img@2 {...} | |
| | ... | |
| | | |
| o configurations | |
| |- default = "cfg@1" | |
| | | |
| o cfg@1 {...} | |
| o cfg@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", "ramdisk", "firmware", "script", "filesystem", | |
| "fdt". | |
| - 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 type="kernel", 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", "nios", "microblaze", "nios2", "blackfin", "avr32", | |
| "st200". | |
| - 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" | |
| 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"). | |
| 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) Examples | |
| ----------- | |
| Please see doc/uImage.FIT/*.its for actual image source files. |