|  | 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. |