xref: /rk3399_rockchip-uboot/doc/uImage.FIT/source_file_format.txt (revision 3310c549a73a949430bfda90876df7552a1dab0c)
1*3310c549SMarian BalakowiczU-boot new uImage source file format (bindings definition)
2*3310c549SMarian Balakowicz==========================================================
3*3310c549SMarian Balakowicz
4*3310c549SMarian BalakowiczAuthor: Marian Balakowicz <m8@semihalf.com>
5*3310c549SMarian Balakowicz
6*3310c549SMarian Balakowicz1) Introduction
7*3310c549SMarian Balakowicz---------------
8*3310c549SMarian Balakowicz
9*3310c549SMarian BalakowiczEvolution of the 2.6 Linux kernel for embedded PowerPC systems introduced new
10*3310c549SMarian Balakowiczbooting method which requires that hardware description is available to the
11*3310c549SMarian Balakowiczkernel in the form of Flattened Device Tree.
12*3310c549SMarian Balakowicz
13*3310c549SMarian BalakowiczBooting with a Flattened Device Tree is much more flexible and is intended to
14*3310c549SMarian Balakowiczreplace direct passing of 'struct bd_info' which was used to boot pre-FDT
15*3310c549SMarian Balakowiczkernels.
16*3310c549SMarian Balakowicz
17*3310c549SMarian BalakowiczHowever, U-boot needs to support both techniques to provide backward
18*3310c549SMarian Balakowiczcompatibility for platforms which are not FDT ready. Number of elements
19*3310c549SMarian Balakowiczplaying role in the booting process has increased and now includes the FDT
20*3310c549SMarian Balakowiczblob. Kernel image, FDT blob and possibly ramdisk image - all must be placed
21*3310c549SMarian Balakowiczin the system memory and passed to bootm as a arguments. Some of them may be
22*3310c549SMarian Balakowiczmissing: FDT is not present for legacy platforms, ramdisk is always optional.
23*3310c549SMarian BalakowiczAdditionally, old uImage format has been extended to support multi sub-images
24*3310c549SMarian Balakowiczbut the support is limited by simple format of the legacy uImage structure.
25*3310c549SMarian BalakowiczSingle binary header 'struct image_header' is not flexible enough to cover all
26*3310c549SMarian Balakowiczpossible scenarios.
27*3310c549SMarian Balakowicz
28*3310c549SMarian BalakowiczAll those factors combined clearly show that there is a need for new, more
29*3310c549SMarian Balakowiczflexible, multi component uImage format.
30*3310c549SMarian Balakowicz
31*3310c549SMarian Balakowicz
32*3310c549SMarian Balakowicz2) New uImage format assumptions
33*3310c549SMarian Balakowicz--------------------------------
34*3310c549SMarian Balakowicz
35*3310c549SMarian Balakowicza) Implementation
36*3310c549SMarian Balakowicz
37*3310c549SMarian BalakowiczLibfdt has been selected for the new uImage format implementation as (1) it
38*3310c549SMarian Balakowiczprovides needed functionality, (2) is actively maintained and developed and
39*3310c549SMarian Balakowicz(3) increases code reuse as it is already part of the U-boot source tree.
40*3310c549SMarian Balakowicz
41*3310c549SMarian Balakowiczb) Terminology
42*3310c549SMarian Balakowicz
43*3310c549SMarian BalakowiczThis document defines new uImage structure by providing FDT bindings for new
44*3310c549SMarian BalakowiczuImage internals. Bindings are defined from U-boot perspective, i.e. describe
45*3310c549SMarian Balakowiczfinal form of the uImage at the moment when it reaches U-boot. User
46*3310c549SMarian Balakowiczperspective may be simpler, as some of the properties (like timestamps and
47*3310c549SMarian Balakowiczhashes) will need to be filled in automatically by the U-boot mkimage tool.
48*3310c549SMarian Balakowicz
49*3310c549SMarian BalakowiczTo avoid confusion with the kernel FDT the following naming convention is
50*3310c549SMarian Balakowiczproposed for the new uImage format related terms:
51*3310c549SMarian Balakowicz
52*3310c549SMarian BalakowiczFIT	- Flattened uImage Tree
53*3310c549SMarian Balakowicz
54*3310c549SMarian BalakowiczFIT is formally a flattened device tree (in the libfdt meaning), which
55*3310c549SMarian Balakowiczconforms to bindings defined in this document.
56*3310c549SMarian Balakowicz
57*3310c549SMarian Balakowicz.its	- image tree source
58*3310c549SMarian Balakowicz.itb	- image tree blob
59*3310c549SMarian Balakowicz
60*3310c549SMarian Balakowiczc) Image building procedure
61*3310c549SMarian Balakowicz
62*3310c549SMarian BalakowiczThe following picture shows how the new uImage is prepared. Input consists of
63*3310c549SMarian Balakowiczimage source file (.its) and a set of data files. Image is created with the
64*3310c549SMarian Balakowiczhelp of standard U-boot mkimage tool which in turn uses dtc (device tree
65*3310c549SMarian Balakowiczcompiler) to produce image tree blob (.itb).  Resulting .itb file is is the
66*3310c549SMarian Balakowiczactual binary of a new uImage.
67*3310c549SMarian Balakowicz
68*3310c549SMarian Balakowicz
69*3310c549SMarian Balakowicztqm5200.its
70*3310c549SMarian Balakowicz+
71*3310c549SMarian Balakowiczvmlinux.bin.gz     mkimage + dtc               xfer to target
72*3310c549SMarian Balakowiczeldk-4.2-ramdisk  --------------> tqm5200.itb --------------> bootm
73*3310c549SMarian Balakowicztqm5200.dtb                          /|\
74*3310c549SMarian Balakowicz...                                   |
75*3310c549SMarian Balakowicz                                 'new uImage'
76*3310c549SMarian Balakowicz
77*3310c549SMarian Balakowicz	- create .its file, automatically filled-in properties are omitted
78*3310c549SMarian Balakowicz	- call mkimage tool on a .its file
79*3310c549SMarian Balakowicz	- mkimage calls dtc to create .itb image and assures that
80*3310c549SMarian Balakowicz	  missing properties are added
81*3310c549SMarian Balakowicz	- .itb (new uImage) is uploaded onto the target and used therein
82*3310c549SMarian Balakowicz
83*3310c549SMarian Balakowicz
84*3310c549SMarian Balakowiczd) Unique identifiers
85*3310c549SMarian Balakowicz
86*3310c549SMarian BalakowiczTo identify FIT sub-nodes representing images, hashes, configurations (which
87*3310c549SMarian Balakowiczare defined in the following sections), the "unit name" of the given sub-node
88*3310c549SMarian Balakowiczis used as it's identifier as it assures uniqueness without additional
89*3310c549SMarian Balakowiczchecking required.
90*3310c549SMarian Balakowicz
91*3310c549SMarian Balakowicz
92*3310c549SMarian Balakowicz3) Root node properties
93*3310c549SMarian Balakowicz-----------------------
94*3310c549SMarian Balakowicz
95*3310c549SMarian BalakowiczRoot node of the uImage Tree should have the following layout:
96*3310c549SMarian Balakowicz
97*3310c549SMarian Balakowicz/ o image-tree
98*3310c549SMarian Balakowicz    |- description = "image description"
99*3310c549SMarian Balakowicz    |- timestamp = <12399321>
100*3310c549SMarian Balakowicz    |- #address-cells = <1>
101*3310c549SMarian Balakowicz    |
102*3310c549SMarian Balakowicz    o images
103*3310c549SMarian Balakowicz    | |
104*3310c549SMarian Balakowicz    | o img@1 {...}
105*3310c549SMarian Balakowicz    | o img@2 {...}
106*3310c549SMarian Balakowicz    | ...
107*3310c549SMarian Balakowicz    |
108*3310c549SMarian Balakowicz    o configurations
109*3310c549SMarian Balakowicz      |- default = "cfg@1"
110*3310c549SMarian Balakowicz      |
111*3310c549SMarian Balakowicz      o cfg@1 {...}
112*3310c549SMarian Balakowicz      o cfg@2 {...}
113*3310c549SMarian Balakowicz      ...
114*3310c549SMarian Balakowicz
115*3310c549SMarian Balakowicz
116*3310c549SMarian Balakowicz  Optional property:
117*3310c549SMarian Balakowicz  - description : Textual description of the uImage
118*3310c549SMarian Balakowicz
119*3310c549SMarian Balakowicz  Mandatory property:
120*3310c549SMarian Balakowicz  - timestamp : Last image modification time being counted in seconds since
121*3310c549SMarian Balakowicz    1970-01-01 00:00:00 - to be automatically calculated by mkimage tool.
122*3310c549SMarian Balakowicz
123*3310c549SMarian Balakowicz  Conditionally mandatory property:
124*3310c549SMarian Balakowicz  - #address-cells : Number of 32bit cells required to represent entry and
125*3310c549SMarian Balakowicz    load addresses supplied within sub-image nodes. May be omitted when no
126*3310c549SMarian Balakowicz    entry or load addresses are used.
127*3310c549SMarian Balakowicz
128*3310c549SMarian Balakowicz  Mandatory node:
129*3310c549SMarian Balakowicz  - images : This node contains a set of sub-nodes, each of them representing
130*3310c549SMarian Balakowicz    single component sub-image (like kernel, ramdisk, etc.). At least one
131*3310c549SMarian Balakowicz    sub-image is required.
132*3310c549SMarian Balakowicz
133*3310c549SMarian Balakowicz  Optional node:
134*3310c549SMarian Balakowicz  - configurations : Contains a set of available configuration nodes and
135*3310c549SMarian Balakowicz    defines a default configuration.
136*3310c549SMarian Balakowicz
137*3310c549SMarian Balakowicz
138*3310c549SMarian Balakowicz4) '/images' node
139*3310c549SMarian Balakowicz-----------------
140*3310c549SMarian Balakowicz
141*3310c549SMarian BalakowiczThis node is a container node for component sub-image nodes. Each sub-node of
142*3310c549SMarian Balakowiczthe '/images' node should have the following layout:
143*3310c549SMarian Balakowicz
144*3310c549SMarian Balakowicz o image@1
145*3310c549SMarian Balakowicz   |- description = "component sub-image description"
146*3310c549SMarian Balakowicz   |- data = /incbin/("path/to/data/file.bin")
147*3310c549SMarian Balakowicz   |- type = "sub-image type name"
148*3310c549SMarian Balakowicz   |- arch = "ARCH name"
149*3310c549SMarian Balakowicz   |- os = "OS name"
150*3310c549SMarian Balakowicz   |- compression = "compression name"
151*3310c549SMarian Balakowicz   |- load = <00000000>
152*3310c549SMarian Balakowicz   |- entry = <00000000>
153*3310c549SMarian Balakowicz   |
154*3310c549SMarian Balakowicz   o hash@1 {...}
155*3310c549SMarian Balakowicz   o hash@2 {...}
156*3310c549SMarian Balakowicz   ...
157*3310c549SMarian Balakowicz
158*3310c549SMarian Balakowicz  Mandatory properties:
159*3310c549SMarian Balakowicz  - description : Textual description of the component sub-image
160*3310c549SMarian Balakowicz  - type : Name of component sub-image type, supported types are:
161*3310c549SMarian Balakowicz    "standalone", "kernel", "ramdisk", "firmware", "script", "filesystem",
162*3310c549SMarian Balakowicz    "fdt".
163*3310c549SMarian Balakowicz  - data : Path to the external file which contains this node's binary data.
164*3310c549SMarian Balakowicz  - compression : Compression used by included data. Supported compressions
165*3310c549SMarian Balakowicz    are "gzip" and "bzip2". If no compression is used compression property
166*3310c549SMarian Balakowicz    should be set to "none".
167*3310c549SMarian Balakowicz
168*3310c549SMarian Balakowicz  Conditionally mandatory property:
169*3310c549SMarian Balakowicz  - os : OS name, mandatory for type="kernel", valid OS names are: "openbsd",
170*3310c549SMarian Balakowicz    "netbsd", "freebsd", "4_4bsd", "linux", "svr4", "esix", "solaris", "irix",
171*3310c549SMarian Balakowicz    "sco", "dell", "ncr", "lynxos", "vxworks", "psos", "qnx", "u_boot",
172*3310c549SMarian Balakowicz    "rtems", "artos", "unity".
173*3310c549SMarian Balakowicz  - arch : Architecture name, mandatory for types: "standalone", "kernel",
174*3310c549SMarian Balakowicz    "firmware", "ramdisk" and "fdt". Valid architecture names are: "alpha",
175*3310c549SMarian Balakowicz    "arm", "i386", "ia64", "mips", "mips64", "ppc", "s390", "sh", "sparc",
176*3310c549SMarian Balakowicz    "sparc64", "m68k", "nios", "microblaze", "nios2", "blackfin", "avr32",
177*3310c549SMarian Balakowicz    "st200".
178*3310c549SMarian Balakowicz  - entry : entry point address, address size is determined by
179*3310c549SMarian Balakowicz    '#address-cells' property of the root node. Mandatory for for types:
180*3310c549SMarian Balakowicz    "standalone" and "kernel".
181*3310c549SMarian Balakowicz  - load : load address, address size is determined by '#address-cells'
182*3310c549SMarian Balakowicz    property of the root node. Mandatory for types: "standalone" and "kernel".
183*3310c549SMarian Balakowicz
184*3310c549SMarian Balakowicz  Optional nodes:
185*3310c549SMarian Balakowicz  - hash@1 : Each hash sub-node represents separate hash or checksum
186*3310c549SMarian Balakowicz    calculated for node's data according to specified algorithm.
187*3310c549SMarian Balakowicz
188*3310c549SMarian Balakowicz
189*3310c549SMarian Balakowicz5) Hash nodes
190*3310c549SMarian Balakowicz-------------
191*3310c549SMarian Balakowicz
192*3310c549SMarian Balakowiczo hash@1
193*3310c549SMarian Balakowicz  |- algo = "hash or checksum algorithm name"
194*3310c549SMarian Balakowicz  |- value = [hash or checksum value]
195*3310c549SMarian Balakowicz
196*3310c549SMarian Balakowicz  Mandatory properties:
197*3310c549SMarian Balakowicz  - algo : Algorithm name, supported are "crc32", "md5" and "sha1".
198*3310c549SMarian Balakowicz  - value : Actual checksum or hash value, correspondingly 4, 16 or 20 bytes
199*3310c549SMarian Balakowicz    long.
200*3310c549SMarian Balakowicz
201*3310c549SMarian Balakowicz
202*3310c549SMarian Balakowicz6) '/configurations' node
203*3310c549SMarian Balakowicz-------------------------
204*3310c549SMarian Balakowicz
205*3310c549SMarian BalakowiczThe 'configurations' node is optional. If present, it allows to create a
206*3310c549SMarian Balakowiczconvenient, labeled boot configurations, which combine together kernel images
207*3310c549SMarian Balakowiczwith their ramdisks and fdt blobs.
208*3310c549SMarian Balakowicz
209*3310c549SMarian BalakowiczThe 'configurations' node has has the following structure:
210*3310c549SMarian Balakowicz
211*3310c549SMarian Balakowiczo configurations
212*3310c549SMarian Balakowicz  |- default = "default configuration sub-node unit name"
213*3310c549SMarian Balakowicz  |
214*3310c549SMarian Balakowicz  o config@1 {...}
215*3310c549SMarian Balakowicz  o config@2 {...}
216*3310c549SMarian Balakowicz  ...
217*3310c549SMarian Balakowicz
218*3310c549SMarian Balakowicz
219*3310c549SMarian Balakowicz  Optional property:
220*3310c549SMarian Balakowicz  - default : Selects one of the configuration sub-nodes as a default
221*3310c549SMarian Balakowicz    configuration.
222*3310c549SMarian Balakowicz
223*3310c549SMarian Balakowicz  Mandatory nodes:
224*3310c549SMarian Balakowicz  - configuration-sub-node-unit-name : At least one of the configuration
225*3310c549SMarian Balakowicz    sub-nodes is required.
226*3310c549SMarian Balakowicz
227*3310c549SMarian Balakowicz
228*3310c549SMarian Balakowicz7) Configuration nodes
229*3310c549SMarian Balakowicz----------------------
230*3310c549SMarian Balakowicz
231*3310c549SMarian BalakowiczEach configuration has the following structure:
232*3310c549SMarian Balakowicz
233*3310c549SMarian Balakowiczo config@1
234*3310c549SMarian Balakowicz  |- description = "configuration description"
235*3310c549SMarian Balakowicz  |- kernel = "kernel sub-node unit name"
236*3310c549SMarian Balakowicz  |- ramdisk = "ramdisk sub-node unit name"
237*3310c549SMarian Balakowicz  |- fdt = "fdt sub-node unit-name"
238*3310c549SMarian Balakowicz
239*3310c549SMarian Balakowicz
240*3310c549SMarian Balakowicz  Mandatory properties:
241*3310c549SMarian Balakowicz  - description : Textual configuration description.
242*3310c549SMarian Balakowicz  - kernel : Unit name of the corresponding kernel image (image sub-node of a
243*3310c549SMarian Balakowicz    "kernel" type).
244*3310c549SMarian Balakowicz
245*3310c549SMarian Balakowicz  Optional properties:
246*3310c549SMarian Balakowicz  - ramdisk : Unit name of the corresponding ramdisk image (component image
247*3310c549SMarian Balakowicz    node of a "ramdisk" type).
248*3310c549SMarian Balakowicz  - fdt : Unit name of the corresponding fdt blob (component image node of a
249*3310c549SMarian Balakowicz    "fdt type").
250*3310c549SMarian Balakowicz
251*3310c549SMarian BalakowiczThe FDT blob is required to properly boot FDT based kernel, so the minimal
252*3310c549SMarian Balakowiczconfiguration for 2.6 FDT kernel is (kernel, fdt) pair.
253*3310c549SMarian Balakowicz
254*3310c549SMarian BalakowiczOlder, 2.4 kernel and 2.6 non-FDT kernel do not use FDT blob, in such cases
255*3310c549SMarian Balakowicz'struct bd_info' must be passed instead of FDT blob, thus fdt property *must
256*3310c549SMarian Balakowicznot* be specified in a configuration node.
257*3310c549SMarian Balakowicz
258*3310c549SMarian Balakowicz
259*3310c549SMarian Balakowicz8) Examples
260*3310c549SMarian Balakowicz-----------
261*3310c549SMarian Balakowicz
262*3310c549SMarian BalakowiczPlease see examples/*.its for actual image source files.
263