]>
Commit | Line | Data |
---|---|---|
a187559e | 1 | U-Boot new uImage source file format (bindings definition) |
3310c549 MB |
2 | ========================================================== |
3 | ||
4 | Author: Marian Balakowicz <[email protected]> | |
722ebc8f | 5 | External data additions, 25/1/16 Simon Glass <[email protected]> |
3310c549 MB |
6 | |
7 | 1) Introduction | |
8 | --------------- | |
9 | ||
10 | Evolution of the 2.6 Linux kernel for embedded PowerPC systems introduced new | |
11 | booting method which requires that hardware description is available to the | |
12 | kernel in the form of Flattened Device Tree. | |
13 | ||
14 | Booting with a Flattened Device Tree is much more flexible and is intended to | |
15 | replace direct passing of 'struct bd_info' which was used to boot pre-FDT | |
16 | kernels. | |
17 | ||
a187559e | 18 | However, U-Boot needs to support both techniques to provide backward |
3310c549 MB |
19 | compatibility for platforms which are not FDT ready. Number of elements |
20 | playing role in the booting process has increased and now includes the FDT | |
21 | blob. Kernel image, FDT blob and possibly ramdisk image - all must be placed | |
22 | in the system memory and passed to bootm as a arguments. Some of them may be | |
23 | missing: FDT is not present for legacy platforms, ramdisk is always optional. | |
24 | Additionally, old uImage format has been extended to support multi sub-images | |
25 | but the support is limited by simple format of the legacy uImage structure. | |
26 | Single binary header 'struct image_header' is not flexible enough to cover all | |
27 | possible scenarios. | |
28 | ||
29 | All those factors combined clearly show that there is a need for new, more | |
30 | flexible, multi component uImage format. | |
31 | ||
32 | ||
33 | 2) New uImage format assumptions | |
34 | -------------------------------- | |
35 | ||
36 | a) Implementation | |
37 | ||
38 | Libfdt has been selected for the new uImage format implementation as (1) it | |
39 | provides needed functionality, (2) is actively maintained and developed and | |
a187559e | 40 | (3) increases code reuse as it is already part of the U-Boot source tree. |
3310c549 MB |
41 | |
42 | b) Terminology | |
43 | ||
44 | This document defines new uImage structure by providing FDT bindings for new | |
a187559e BM |
45 | uImage internals. Bindings are defined from U-Boot perspective, i.e. describe |
46 | final form of the uImage at the moment when it reaches U-Boot. User | |
3310c549 | 47 | perspective may be simpler, as some of the properties (like timestamps and |
a187559e | 48 | hashes) will need to be filled in automatically by the U-Boot mkimage tool. |
3310c549 MB |
49 | |
50 | To avoid confusion with the kernel FDT the following naming convention is | |
51 | proposed for the new uImage format related terms: | |
52 | ||
53 | FIT - Flattened uImage Tree | |
54 | ||
55 | FIT is formally a flattened device tree (in the libfdt meaning), which | |
56 | conforms to bindings defined in this document. | |
57 | ||
58 | .its - image tree source | |
486c39c2 | 59 | .itb - flattened image tree blob |
3310c549 MB |
60 | |
61 | c) Image building procedure | |
62 | ||
63 | The following picture shows how the new uImage is prepared. Input consists of | |
64 | image source file (.its) and a set of data files. Image is created with the | |
a187559e | 65 | help of standard U-Boot mkimage tool which in turn uses dtc (device tree |
61ffc17a | 66 | compiler) to produce image tree blob (.itb). Resulting .itb file is the |
3310c549 MB |
67 | actual binary of a new uImage. |
68 | ||
69 | ||
70 | tqm5200.its | |
71 | + | |
438a4c11 | 72 | vmlinux.bin.gz mkimage + dtc xfer to target |
3310c549 | 73 | eldk-4.2-ramdisk --------------> tqm5200.itb --------------> bootm |
438a4c11 WD |
74 | tqm5200.dtb /|\ |
75 | ... | | |
76 | 'new uImage' | |
3310c549 MB |
77 | |
78 | - create .its file, automatically filled-in properties are omitted | |
79 | - call mkimage tool on a .its file | |
80 | - mkimage calls dtc to create .itb image and assures that | |
81 | missing properties are added | |
82 | - .itb (new uImage) is uploaded onto the target and used therein | |
83 | ||
84 | ||
85 | d) Unique identifiers | |
86 | ||
87 | To identify FIT sub-nodes representing images, hashes, configurations (which | |
88 | are defined in the following sections), the "unit name" of the given sub-node | |
89 | is used as it's identifier as it assures uniqueness without additional | |
90 | checking required. | |
91 | ||
92 | ||
93 | 3) Root node properties | |
94 | ----------------------- | |
95 | ||
96 | Root node of the uImage Tree should have the following layout: | |
97 | ||
98 | / o image-tree | |
99 | |- description = "image description" | |
100 | |- timestamp = <12399321> | |
101 | |- #address-cells = <1> | |
102 | | | |
103 | o images | |
104 | | | | |
83840405 AP |
105 | | o image-1 {...} |
106 | | o image-2 {...} | |
3310c549 MB |
107 | | ... |
108 | | | |
109 | o configurations | |
83840405 | 110 | |- default = "conf-1" |
3310c549 | 111 | | |
83840405 AP |
112 | o conf-1 {...} |
113 | o conf-2 {...} | |
3310c549 MB |
114 | ... |
115 | ||
116 | ||
117 | Optional property: | |
118 | - description : Textual description of the uImage | |
119 | ||
120 | Mandatory property: | |
121 | - timestamp : Last image modification time being counted in seconds since | |
122 | 1970-01-01 00:00:00 - to be automatically calculated by mkimage tool. | |
123 | ||
124 | Conditionally mandatory property: | |
125 | - #address-cells : Number of 32bit cells required to represent entry and | |
126 | load addresses supplied within sub-image nodes. May be omitted when no | |
127 | entry or load addresses are used. | |
128 | ||
129 | Mandatory node: | |
130 | - images : This node contains a set of sub-nodes, each of them representing | |
131 | single component sub-image (like kernel, ramdisk, etc.). At least one | |
132 | sub-image is required. | |
133 | ||
134 | Optional node: | |
135 | - configurations : Contains a set of available configuration nodes and | |
136 | defines a default configuration. | |
137 | ||
138 | ||
139 | 4) '/images' node | |
140 | ----------------- | |
141 | ||
142 | This node is a container node for component sub-image nodes. Each sub-node of | |
143 | the '/images' node should have the following layout: | |
144 | ||
83840405 | 145 | o image-1 |
3310c549 MB |
146 | |- description = "component sub-image description" |
147 | |- data = /incbin/("path/to/data/file.bin") | |
148 | |- type = "sub-image type name" | |
149 | |- arch = "ARCH name" | |
150 | |- os = "OS name" | |
151 | |- compression = "compression name" | |
152 | |- load = <00000000> | |
153 | |- entry = <00000000> | |
154 | | | |
83840405 AP |
155 | o hash-1 {...} |
156 | o hash-2 {...} | |
3310c549 MB |
157 | ... |
158 | ||
159 | Mandatory properties: | |
160 | - description : Textual description of the component sub-image | |
161 | - type : Name of component sub-image type, supported types are: | |
25fa0b93 TR |
162 | "standalone", "kernel", "kernel_noload", "ramdisk", "firmware", "script", |
163 | "filesystem", "flat_dt" and others (see uimage_type in common/image.c). | |
3310c549 MB |
164 | - data : Path to the external file which contains this node's binary data. |
165 | - compression : Compression used by included data. Supported compressions | |
166 | are "gzip" and "bzip2". If no compression is used compression property | |
fd15a9e2 SG |
167 | should be set to "none". If the data is compressed but it should not be |
168 | uncompressed by U-Boot (e.g. compressed ramdisk), this should also be set | |
169 | to "none". | |
3310c549 MB |
170 | |
171 | Conditionally mandatory property: | |
5cde9d8e GMF |
172 | - os : OS name, mandatory for types "kernel" and "ramdisk". Valid OS names |
173 | are: "openbsd", "netbsd", "freebsd", "4_4bsd", "linux", "svr4", "esix", | |
174 | "solaris", "irix", "sco", "dell", "ncr", "lynxos", "vxworks", "psos", "qnx", | |
175 | "u_boot", "rtems", "unity", "integrity". | |
3310c549 MB |
176 | - arch : Architecture name, mandatory for types: "standalone", "kernel", |
177 | "firmware", "ramdisk" and "fdt". Valid architecture names are: "alpha", | |
178 | "arm", "i386", "ia64", "mips", "mips64", "ppc", "s390", "sh", "sparc", | |
38119778 SG |
179 | "sparc64", "m68k", "microblaze", "nios2", "blackfin", "avr32", "st200", |
180 | "sandbox". | |
3310c549 MB |
181 | - entry : entry point address, address size is determined by |
182 | '#address-cells' property of the root node. Mandatory for for types: | |
183 | "standalone" and "kernel". | |
184 | - load : load address, address size is determined by '#address-cells' | |
185 | property of the root node. Mandatory for types: "standalone" and "kernel". | |
186 | ||
187 | Optional nodes: | |
83840405 | 188 | - hash-1 : Each hash sub-node represents separate hash or checksum |
3310c549 MB |
189 | calculated for node's data according to specified algorithm. |
190 | ||
191 | ||
192 | 5) Hash nodes | |
193 | ------------- | |
194 | ||
83840405 | 195 | o hash-1 |
3310c549 MB |
196 | |- algo = "hash or checksum algorithm name" |
197 | |- value = [hash or checksum value] | |
198 | ||
199 | Mandatory properties: | |
200 | - algo : Algorithm name, supported are "crc32", "md5" and "sha1". | |
201 | - value : Actual checksum or hash value, correspondingly 4, 16 or 20 bytes | |
202 | long. | |
203 | ||
204 | ||
205 | 6) '/configurations' node | |
206 | ------------------------- | |
207 | ||
208 | The 'configurations' node is optional. If present, it allows to create a | |
209 | convenient, labeled boot configurations, which combine together kernel images | |
210 | with their ramdisks and fdt blobs. | |
211 | ||
212 | The 'configurations' node has has the following structure: | |
213 | ||
214 | o configurations | |
215 | |- default = "default configuration sub-node unit name" | |
216 | | | |
83840405 AP |
217 | o config-1 {...} |
218 | o config-2 {...} | |
3310c549 MB |
219 | ... |
220 | ||
221 | ||
222 | Optional property: | |
223 | - default : Selects one of the configuration sub-nodes as a default | |
224 | configuration. | |
225 | ||
226 | Mandatory nodes: | |
227 | - configuration-sub-node-unit-name : At least one of the configuration | |
228 | sub-nodes is required. | |
229 | ||
230 | ||
231 | 7) Configuration nodes | |
232 | ---------------------- | |
233 | ||
234 | Each configuration has the following structure: | |
235 | ||
83840405 | 236 | o config-1 |
3310c549 MB |
237 | |- description = "configuration description" |
238 | |- kernel = "kernel sub-node unit name" | |
239 | |- ramdisk = "ramdisk sub-node unit name" | |
6b54e50b | 240 | |- fdt = "fdt sub-node unit-name" [, "fdt overlay sub-node unit-name", ...] |
ed0cea7c | 241 | |- fpga = "fpga sub-node unit-name" |
ecf8cd65 | 242 | |- loadables = "loadables sub-node unit-name" |
18cfa612 | 243 | |- compatible = "vendor,board-style device tree compatible string" |
3310c549 MB |
244 | |
245 | ||
246 | Mandatory properties: | |
247 | - description : Textual configuration description. | |
248 | - kernel : Unit name of the corresponding kernel image (image sub-node of a | |
249 | "kernel" type). | |
250 | ||
251 | Optional properties: | |
252 | - ramdisk : Unit name of the corresponding ramdisk image (component image | |
253 | node of a "ramdisk" type). | |
254 | - fdt : Unit name of the corresponding fdt blob (component image node of a | |
6b54e50b PA |
255 | "fdt type"). Additional fdt overlay nodes can be supplied which signify |
256 | that the resulting device tree blob is generated by the first base fdt | |
257 | blob with all subsequent overlays applied. | |
90268b87 SG |
258 | - setup : Unit name of the corresponding setup binary (used for booting |
259 | an x86 kernel). This contains the setup.bin file built by the kernel. | |
ed0cea7c MS |
260 | - fpga : Unit name of the corresponding fpga bitstream blob |
261 | (component image node of a "fpga type"). | |
ecf8cd65 KA |
262 | - loadables : Unit name containing a list of additional binaries to be |
263 | loaded at their given locations. "loadables" is a comma-separated list | |
d7be5092 | 264 | of strings. U-Boot will load each binary at its given start-address and |
32f2ca2a | 265 | may optionally invoke additional post-processing steps on this binary based |
d7be5092 | 266 | on its component image node type. |
18cfa612 JW |
267 | - compatible : The root compatible string of the U-Boot device tree that |
268 | this configuration shall automatically match when CONFIG_FIT_BEST_MATCH is | |
269 | enabled. If this property is not provided, the compatible string will be | |
270 | extracted from the fdt blob instead. This is only possible if the fdt is | |
271 | not compressed, so images with compressed fdts that want to use compatible | |
272 | string matching must always provide this property. | |
3310c549 MB |
273 | |
274 | The FDT blob is required to properly boot FDT based kernel, so the minimal | |
275 | configuration for 2.6 FDT kernel is (kernel, fdt) pair. | |
276 | ||
277 | Older, 2.4 kernel and 2.6 non-FDT kernel do not use FDT blob, in such cases | |
278 | 'struct bd_info' must be passed instead of FDT blob, thus fdt property *must | |
279 | not* be specified in a configuration node. | |
280 | ||
281 | ||
722ebc8f SG |
282 | 8) External data |
283 | ---------------- | |
284 | ||
285 | The above format shows a 'data' property which holds the data for each image. | |
286 | It is also possible for this data to reside outside the FIT itself. This | |
287 | allows the FIT to be quite small, so that it can be loaded and scanned | |
288 | without loading a large amount of data. Then when an image is needed it can | |
289 | be loaded from an external source. | |
290 | ||
291 | In this case the 'data' property is omitted. Instead you can use: | |
292 | ||
293 | - data-offset : offset of the data in a separate image store. The image | |
294 | store is placed immediately after the last byte of the device tree binary, | |
295 | aligned to a 4-byte boundary. | |
296 | - data-size : size of the data in bytes | |
297 | ||
f8f9107d TR |
298 | The 'data-offset' property can be substituted with 'data-position', which |
299 | defines an absolute position or address as the offset. This is helpful when | |
a1be94b6 PF |
300 | booting U-Boot proper before performing relocation. Pass '-p [offset]' to |
301 | mkimage to enable 'data-position'. | |
722ebc8f | 302 | |
5fd13d97 YS |
303 | Normal kernel FIT image has data embedded within FIT structure. U-Boot image |
304 | for SPL boot has external data. Existence of 'data-offset' can be used to | |
305 | identify which format is used. | |
306 | ||
ebfe611b KY |
307 | For FIT image with external data, it would be better to align each blob of data |
308 | to block(512 byte) for block device, so that we don't need to do the copy when | |
309 | read the image data in SPL. Pass '-B 0x200' to mkimage to align the FIT | |
310 | structure and data to 512 byte, other values available for other align size. | |
311 | ||
722ebc8f | 312 | 9) Examples |
3310c549 MB |
313 | ----------- |
314 | ||
43142e81 | 315 | Please see doc/uImage.FIT/*.its for actual image source files. |