]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | # SPDX-License-Identifier: GPL-2.0+ |
bf7fd50b | 2 | # Copyright (c) 2016 Google, Inc |
bf7fd50b SG |
3 | |
4 | Introduction | |
5 | ------------ | |
6 | ||
7 | Firmware often consists of several components which must be packaged together. | |
8 | For example, we may have SPL, U-Boot, a device tree and an environment area | |
9 | grouped together and placed in MMC flash. When the system starts, it must be | |
10 | able to find these pieces. | |
11 | ||
12 | So far U-Boot has not provided a way to handle creating such images in a | |
13 | general way. Each SoC does what it needs to build an image, often packing or | |
14 | concatenating images in the U-Boot build system. | |
15 | ||
16 | Binman aims to provide a mechanism for building images, from simple | |
17 | SPL + U-Boot combinations, to more complex arrangements with many parts. | |
18 | ||
19 | ||
20 | What it does | |
21 | ------------ | |
22 | ||
23 | Binman reads your board's device tree and finds a node which describes the | |
24 | required image layout. It uses this to work out what to place where. The | |
25 | output file normally contains the device tree, so it is in principle possible | |
26 | to read an image and extract its constituent parts. | |
27 | ||
28 | ||
29 | Features | |
30 | -------- | |
31 | ||
32 | So far binman is pretty simple. It supports binary blobs, such as 'u-boot', | |
33 | 'spl' and 'fdt'. It supports empty entries (such as setting to 0xff). It can | |
34 | place entries at a fixed location in the image, or fit them together with | |
35 | suitable padding and alignment. It provides a way to process binaries before | |
36 | they are included, by adding a Python plug-in. The device tree is available | |
37 | to U-Boot at run-time so that the images can be interpreted. | |
38 | ||
57460184 SG |
39 | Binman can update the device tree with the final location of everything when it |
40 | is done. Entry positions can be provided to U-Boot SPL as run-time symbols, | |
41 | avoiding device-tree code overhead. | |
bf7fd50b SG |
42 | |
43 | Binman can also support incorporating filesystems in the image if required. | |
44 | For example x86 platforms may use CBFS in some cases. | |
45 | ||
46 | Binman is intended for use with U-Boot but is designed to be general enough | |
47 | to be useful in other image-packaging situations. | |
48 | ||
49 | ||
50 | Motivation | |
51 | ---------- | |
52 | ||
53 | Packaging of firmware is quite a different task from building the various | |
54 | parts. In many cases the various binaries which go into the image come from | |
55 | separate build systems. For example, ARM Trusted Firmware is used on ARMv8 | |
56 | devices but is not built in the U-Boot tree. If a Linux kernel is included | |
57 | in the firmware image, it is built elsewhere. | |
58 | ||
59 | It is of course possible to add more and more build rules to the U-Boot | |
60 | build system to cover these cases. It can shell out to other Makefiles and | |
61 | build scripts. But it seems better to create a clear divide between building | |
62 | software and packaging it. | |
63 | ||
64 | At present this is handled by manual instructions, different for each board, | |
65 | on how to create images that will boot. By turning these instructions into a | |
66 | standard format, we can support making valid images for any board without | |
67 | manual effort, lots of READMEs, etc. | |
68 | ||
69 | Benefits: | |
70 | - Each binary can have its own build system and tool chain without creating | |
71 | any dependencies between them | |
72 | - Avoids the need for a single-shot build: individual parts can be updated | |
73 | and brought in as needed | |
74 | - Provides for a standard image description available in the build and at | |
75 | run-time | |
32f2ca2a | 76 | - SoC-specific image-signing tools can be accommodated |
bf7fd50b SG |
77 | - Avoids cluttering the U-Boot build system with image-building code |
78 | - The image description is automatically available at run-time in U-Boot, | |
79 | SPL. It can be made available to other software also | |
80 | - The image description is easily readable (it's a text file in device-tree | |
81 | format) and permits flexible packing of binaries | |
82 | ||
83 | ||
84 | Terminology | |
85 | ----------- | |
86 | ||
87 | Binman uses the following terms: | |
88 | ||
89 | - image - an output file containing a firmware image | |
90 | - binary - an input binary that goes into the image | |
91 | ||
92 | ||
93 | Relationship to FIT | |
94 | ------------------- | |
95 | ||
96 | FIT is U-Boot's official image format. It supports multiple binaries with | |
97 | load / execution addresses, compression. It also supports verification | |
98 | through hashing and RSA signatures. | |
99 | ||
100 | FIT was originally designed to support booting a Linux kernel (with an | |
101 | optional ramdisk) and device tree chosen from various options in the FIT. | |
102 | Now that U-Boot supports configuration via device tree, it is possible to | |
103 | load U-Boot from a FIT, with the device tree chosen by SPL. | |
104 | ||
105 | Binman considers FIT to be one of the binaries it can place in the image. | |
106 | ||
107 | Where possible it is best to put as much as possible in the FIT, with binman | |
108 | used to deal with cases not covered by FIT. Examples include initial | |
109 | execution (since FIT itself does not have an executable header) and dealing | |
110 | with device boundaries, such as the read-only/read-write separation in SPI | |
111 | flash. | |
112 | ||
113 | For U-Boot, binman should not be used to create ad-hoc images in place of | |
114 | FIT. | |
115 | ||
116 | ||
117 | Relationship to mkimage | |
118 | ----------------------- | |
119 | ||
120 | The mkimage tool provides a means to create a FIT. Traditionally it has | |
121 | needed an image description file: a device tree, like binman, but in a | |
122 | different format. More recently it has started to support a '-f auto' mode | |
123 | which can generate that automatically. | |
124 | ||
125 | More relevant to binman, mkimage also permits creation of many SoC-specific | |
126 | image types. These can be listed by running 'mkimage -T list'. Examples | |
127 | include 'rksd', the Rockchip SD/MMC boot format. The mkimage tool is often | |
128 | called from the U-Boot build system for this reason. | |
129 | ||
130 | Binman considers the output files created by mkimage to be binary blobs | |
131 | which it can place in an image. Binman does not replace the mkimage tool or | |
383d2568 | 132 | this purpose. It would be possible in some situations to create a new entry |
bf7fd50b | 133 | type for the images in mkimage, but this would not add functionality. It |
383d2568 | 134 | seems better to use the mkimage tool to generate binaries and avoid blurring |
bf7fd50b SG |
135 | the boundaries between building input files (mkimage) and packaging then |
136 | into a final image (binman). | |
137 | ||
138 | ||
139 | Example use of binman in U-Boot | |
140 | ------------------------------- | |
141 | ||
142 | Binman aims to replace some of the ad-hoc image creation in the U-Boot | |
143 | build system. | |
144 | ||
145 | Consider sunxi. It has the following steps: | |
146 | ||
147 | 1. It uses a custom mksunxiboot tool to build an SPL image called | |
148 | sunxi-spl.bin. This should probably move into mkimage. | |
149 | ||
150 | 2. It uses mkimage to package U-Boot into a legacy image file (so that it can | |
151 | hold the load and execution address) called u-boot.img. | |
152 | ||
153 | 3. It builds a final output image called u-boot-sunxi-with-spl.bin which | |
154 | consists of sunxi-spl.bin, some padding and u-boot.img. | |
155 | ||
156 | Binman is intended to replace the last step. The U-Boot build system builds | |
157 | u-boot.bin and sunxi-spl.bin. Binman can then take over creation of | |
158 | sunxi-spl.bin (by calling mksunxiboot, or hopefully one day mkimage). In any | |
159 | case, it would then create the image from the component parts. | |
160 | ||
161 | This simplifies the U-Boot Makefile somewhat, since various pieces of logic | |
162 | can be replaced by a call to binman. | |
163 | ||
164 | ||
165 | Example use of binman for x86 | |
166 | ----------------------------- | |
167 | ||
168 | In most cases x86 images have a lot of binary blobs, 'black-box' code | |
169 | provided by Intel which must be run for the platform to work. Typically | |
170 | these blobs are not relocatable and must be placed at fixed areas in the | |
383d2568 | 171 | firmware image. |
bf7fd50b SG |
172 | |
173 | Currently this is handled by ifdtool, which places microcode, FSP, MRC, VGA | |
174 | BIOS, reference code and Intel ME binaries into a u-boot.rom file. | |
175 | ||
176 | Binman is intended to replace all of this, with ifdtool left to handle only | |
177 | the configuration of the Intel-format descriptor. | |
178 | ||
179 | ||
180 | Running binman | |
181 | -------------- | |
182 | ||
d8d40748 SG |
183 | First install prerequisites, e.g. |
184 | ||
07d9e70b SG |
185 | sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \ |
186 | liblz4-tool | |
d8d40748 | 187 | |
bf7fd50b SG |
188 | Type: |
189 | ||
53cd5d92 | 190 | binman build -b <board_name> |
bf7fd50b SG |
191 | |
192 | to build an image for a board. The board name is the same name used when | |
193 | configuring U-Boot (e.g. for sandbox_defconfig the board name is 'sandbox'). | |
194 | Binman assumes that the input files for the build are in ../b/<board_name>. | |
195 | ||
196 | Or you can specify this explicitly: | |
197 | ||
53cd5d92 | 198 | binman build -I <build_path> |
bf7fd50b SG |
199 | |
200 | where <build_path> is the build directory containing the output of the U-Boot | |
201 | build. | |
202 | ||
203 | (Future work will make this more configurable) | |
204 | ||
205 | In either case, binman picks up the device tree file (u-boot.dtb) and looks | |
206 | for its instructions in the 'binman' node. | |
207 | ||
208 | Binman has a few other options which you can see by running 'binman -h'. | |
209 | ||
210 | ||
9c0a8b1f SG |
211 | Enabling binman for a board |
212 | --------------------------- | |
213 | ||
214 | At present binman is invoked from a rule in the main Makefile. Typically you | |
215 | will have a rule like: | |
216 | ||
217 | ifneq ($(CONFIG_ARCH_<something>),) | |
218 | u-boot-<your_suffix>.bin: <input_file_1> <input_file_2> checkbinman FORCE | |
219 | $(call if_changed,binman) | |
220 | endif | |
221 | ||
222 | This assumes that u-boot-<your_suffix>.bin is a target, and is the final file | |
e6385c7e | 223 | that you need to produce. You can make it a target by adding it to INPUTS-y |
9c0a8b1f SG |
224 | either in the main Makefile or in a config.mk file in your arch subdirectory. |
225 | ||
226 | Once binman is executed it will pick up its instructions from a device-tree | |
227 | file, typically <soc>-u-boot.dtsi, where <soc> is your CONFIG_SYS_SOC value. | |
228 | You can use other, more specific CONFIG options - see 'Automatic .dtsi | |
229 | inclusion' below. | |
230 | ||
231 | ||
bf7fd50b SG |
232 | Image description format |
233 | ------------------------ | |
234 | ||
235 | The binman node is called 'binman'. An example image description is shown | |
236 | below: | |
237 | ||
238 | binman { | |
239 | filename = "u-boot-sunxi-with-spl.bin"; | |
240 | pad-byte = <0xff>; | |
241 | blob { | |
242 | filename = "spl/sunxi-spl.bin"; | |
243 | }; | |
244 | u-boot { | |
3ab9598d | 245 | offset = <CONFIG_SPL_PAD_TO>; |
bf7fd50b SG |
246 | }; |
247 | }; | |
248 | ||
249 | ||
250 | This requests binman to create an image file called u-boot-sunxi-with-spl.bin | |
251 | consisting of a specially formatted SPL (spl/sunxi-spl.bin, built by the | |
252 | normal U-Boot Makefile), some 0xff padding, and a U-Boot legacy image. The | |
253 | padding comes from the fact that the second binary is placed at | |
254 | CONFIG_SPL_PAD_TO. If that line were omitted then the U-Boot binary would | |
255 | immediately follow the SPL binary. | |
256 | ||
257 | The binman node describes an image. The sub-nodes describe entries in the | |
258 | image. Each entry represents a region within the overall image. The name of | |
259 | the entry (blob, u-boot) tells binman what to put there. For 'blob' we must | |
260 | provide a filename. For 'u-boot', binman knows that this means 'u-boot.bin'. | |
261 | ||
262 | Entries are normally placed into the image sequentially, one after the other. | |
263 | The image size is the total size of all entries. As you can see, you can | |
3ab9598d | 264 | specify the start offset of an entry using the 'offset' property. |
bf7fd50b SG |
265 | |
266 | Note that due to a device tree requirement, all entries must have a unique | |
267 | name. If you want to put the same binary in the image multiple times, you can | |
268 | use any unique name, with the 'type' property providing the type. | |
269 | ||
270 | The attributes supported for entries are described below. | |
271 | ||
3ab9598d SG |
272 | offset: |
273 | This sets the offset of an entry within the image or section containing | |
274 | it. The first byte of the image is normally at offset 0. If 'offset' is | |
275 | not provided, binman sets it to the end of the previous region, or the | |
276 | start of the image's entry area (normally 0) if there is no previous | |
277 | region. | |
bf7fd50b SG |
278 | |
279 | align: | |
3ab9598d | 280 | This sets the alignment of the entry. The entry offset is adjusted |
4eec34c9 SG |
281 | so that the entry starts on an aligned boundary within the containing |
282 | section or image. For example 'align = <16>' means that the entry will | |
283 | start on a 16-byte boundary. This may mean that padding is added before | |
284 | the entry. The padding is part of the containing section but is not | |
285 | included in the entry, meaning that an empty space may be created before | |
286 | the entry starts. Alignment should be a power of 2. If 'align' is not | |
bf7fd50b SG |
287 | provided, no alignment is performed. |
288 | ||
289 | size: | |
290 | This sets the size of the entry. The contents will be padded out to | |
291 | this size. If this is not provided, it will be set to the size of the | |
292 | contents. | |
293 | ||
294 | pad-before: | |
295 | Padding before the contents of the entry. Normally this is 0, meaning | |
f90d906a SG |
296 | that the contents start at the beginning of the entry. This can be used |
297 | to offset the entry contents a little. While this does not affect the | |
298 | contents of the entry within binman itself (the padding is performed | |
299 | only when its parent section is assembled), the end result will be that | |
300 | the entry starts with the padding bytes, so may grow. Defaults to 0. | |
bf7fd50b SG |
301 | |
302 | pad-after: | |
303 | Padding after the contents of the entry. Normally this is 0, meaning | |
304 | that the entry ends at the last byte of content (unless adjusted by | |
305 | other properties). This allows room to be created in the image for | |
f90d906a SG |
306 | this entry to expand later. While this does not affect the contents of |
307 | the entry within binman itself (the padding is performed only when its | |
308 | parent section is assembled), the end result will be that the entry ends | |
309 | with the padding bytes, so may grow. Defaults to 0. | |
bf7fd50b SG |
310 | |
311 | align-size: | |
312 | This sets the alignment of the entry size. For example, to ensure | |
313 | that the size of an entry is a multiple of 64 bytes, set this to 64. | |
4eec34c9 SG |
314 | While this does not affect the contents of the entry within binman |
315 | itself (the padding is performed only when its parent section is | |
316 | assembled), the end result is that the entry ends with the padding | |
317 | bytes, so may grow. If 'align-size' is not provided, no alignment is | |
318 | performed. | |
bf7fd50b SG |
319 | |
320 | align-end: | |
4eec34c9 SG |
321 | This sets the alignment of the end of an entry with respect to the |
322 | containing section. Some entries require that they end on an alignment | |
323 | boundary, regardless of where they start. This does not move the start | |
324 | of the entry, so the contents of the entry will still start at the | |
325 | beginning. But there may be padding at the end. While this does not | |
326 | affect the contents of the entry within binman itself (the padding is | |
327 | performed only when its parent section is assembled), the end result | |
328 | is that the entry ends with the padding bytes, so may grow. | |
329 | If 'align-end' is not provided, no alignment is performed. | |
bf7fd50b SG |
330 | |
331 | filename: | |
332 | For 'blob' types this provides the filename containing the binary to | |
333 | put into the entry. If binman knows about the entry type (like | |
334 | u-boot-bin), then there is no need to specify this. | |
335 | ||
336 | type: | |
337 | Sets the type of an entry. This defaults to the entry name, but it is | |
338 | possible to use any name, and then add (for example) 'type = "u-boot"' | |
339 | to specify the type. | |
340 | ||
3ab9598d SG |
341 | offset-unset: |
342 | Indicates that the offset of this entry should not be set by placing | |
258fb0e6 SG |
343 | it immediately after the entry before. Instead, is set by another |
344 | entry which knows where this entry should go. When this boolean | |
345 | property is present, binman will give an error if another entry does | |
3ab9598d | 346 | not set the offset (with the GetOffsets() method). |
258fb0e6 | 347 | |
dbf6be9f SG |
348 | image-pos: |
349 | This cannot be set on entry (or at least it is ignored if it is), but | |
350 | with the -u option, binman will set it to the absolute image position | |
351 | for each entry. This makes it easy to find out exactly where the entry | |
352 | ended up in the image, regardless of parent sections, etc. | |
353 | ||
ba64a0bb SG |
354 | expand-size: |
355 | Expand the size of this entry to fit available space. This space is only | |
356 | limited by the size of the image/section and the position of the next | |
357 | entry. | |
bf7fd50b | 358 | |
8287ee85 SG |
359 | compress: |
360 | Sets the compression algortihm to use (for blobs only). See the entry | |
361 | documentation for details. | |
362 | ||
b238143d SG |
363 | missing-msg: |
364 | Sets the tag of the message to show if this entry is missing. This is | |
365 | used for external blobs. When they are missing it is helpful to show | |
366 | information about what needs to be fixed. See missing-blob-help for the | |
367 | message for each tag. | |
368 | ||
9c888cca SG |
369 | The attributes supported for images and sections are described below. Several |
370 | are similar to those for entries. | |
bf7fd50b SG |
371 | |
372 | size: | |
373 | Sets the image size in bytes, for example 'size = <0x100000>' for a | |
374 | 1MB image. | |
375 | ||
9481c80f SG |
376 | offset: |
377 | This is similar to 'offset' in entries, setting the offset of a section | |
378 | within the image or section containing it. The first byte of the section | |
379 | is normally at offset 0. If 'offset' is not provided, binman sets it to | |
380 | the end of the previous region, or the start of the image's entry area | |
381 | (normally 0) if there is no previous region. | |
382 | ||
bf7fd50b SG |
383 | align-size: |
384 | This sets the alignment of the image size. For example, to ensure | |
385 | that the image ends on a 512-byte boundary, use 'align-size = <512>'. | |
386 | If 'align-size' is not provided, no alignment is performed. | |
387 | ||
388 | pad-before: | |
389 | This sets the padding before the image entries. The first entry will | |
3ab9598d | 390 | be positioned after the padding. This defaults to 0. |
bf7fd50b SG |
391 | |
392 | pad-after: | |
393 | This sets the padding after the image entries. The padding will be | |
394 | placed after the last entry. This defaults to 0. | |
395 | ||
396 | pad-byte: | |
397 | This specifies the pad byte to use when padding in the image. It | |
398 | defaults to 0. To use 0xff, you would add 'pad-byte = <0xff>'. | |
399 | ||
400 | filename: | |
401 | This specifies the image filename. It defaults to 'image.bin'. | |
402 | ||
3ab9598d | 403 | sort-by-offset: |
bf7fd50b SG |
404 | This causes binman to reorder the entries as needed to make sure they |
405 | are in increasing positional order. This can be used when your entry | |
406 | order may not match the positional order. A common situation is where | |
3ab9598d | 407 | the 'offset' properties are set by CONFIG options, so their ordering is |
bf7fd50b SG |
408 | not known a priori. |
409 | ||
410 | This is a boolean property so needs no value. To enable it, add a | |
3ab9598d | 411 | line 'sort-by-offset;' to your description. |
bf7fd50b SG |
412 | |
413 | multiple-images: | |
414 | Normally only a single image is generated. To create more than one | |
415 | image, put this property in the binman node. For example, this will | |
416 | create image1.bin containing u-boot.bin, and image2.bin containing | |
417 | both spl/u-boot-spl.bin and u-boot.bin: | |
418 | ||
419 | binman { | |
420 | multiple-images; | |
421 | image1 { | |
422 | u-boot { | |
423 | }; | |
424 | }; | |
425 | ||
426 | image2 { | |
427 | spl { | |
428 | }; | |
429 | u-boot { | |
430 | }; | |
431 | }; | |
432 | }; | |
433 | ||
434 | end-at-4gb: | |
3ab9598d | 435 | For x86 machines the ROM offsets start just before 4GB and extend |
bf7fd50b SG |
436 | up so that the image finished at the 4GB boundary. This boolean |
437 | option can be enabled to support this. The image size must be | |
438 | provided so that binman knows when the image should start. For an | |
3ab9598d | 439 | 8MB ROM, the offset of the first entry would be 0xfff80000 with |
bf7fd50b SG |
440 | this option, instead of 0 without this option. |
441 | ||
94b57db0 JG |
442 | skip-at-start: |
443 | This property specifies the entry offset of the first entry. | |
444 | ||
445 | For PowerPC mpc85xx based CPU, CONFIG_SYS_TEXT_BASE is the entry | |
446 | offset of the first entry. It can be 0xeff40000 or 0xfff40000 for | |
447 | nor flash boot, 0x201000 for sd boot etc. | |
448 | ||
449 | 'end-at-4gb' property is not applicable where CONFIG_SYS_TEXT_BASE + | |
450 | Image size != 4gb. | |
bf7fd50b SG |
451 | |
452 | Examples of the above options can be found in the tests. See the | |
453 | tools/binman/test directory. | |
454 | ||
dd57c13b SG |
455 | It is possible to have the same binary appear multiple times in the image, |
456 | either by using a unit number suffix (u-boot@0, u-boot@1) or by using a | |
457 | different name for each and specifying the type with the 'type' attribute. | |
458 | ||
bf7fd50b | 459 | |
383d2568 | 460 | Sections and hierachical images |
1854695b SG |
461 | ------------------------------- |
462 | ||
463 | Sometimes it is convenient to split an image into several pieces, each of which | |
464 | contains its own set of binaries. An example is a flash device where part of | |
465 | the image is read-only and part is read-write. We can set up sections for each | |
466 | of these, and place binaries in them independently. The image is still produced | |
467 | as a single output file. | |
468 | ||
469 | This feature provides a way of creating hierarchical images. For example here | |
7ae5f315 SG |
470 | is an example image with two copies of U-Boot. One is read-only (ro), intended |
471 | to be written only in the factory. Another is read-write (rw), so that it can be | |
1854695b SG |
472 | upgraded in the field. The sizes are fixed so that the ro/rw boundary is known |
473 | and can be programmed: | |
474 | ||
475 | binman { | |
476 | section@0 { | |
477 | read-only; | |
c8d48efb | 478 | name-prefix = "ro-"; |
1854695b SG |
479 | size = <0x100000>; |
480 | u-boot { | |
481 | }; | |
482 | }; | |
483 | section@1 { | |
c8d48efb | 484 | name-prefix = "rw-"; |
1854695b SG |
485 | size = <0x100000>; |
486 | u-boot { | |
487 | }; | |
488 | }; | |
489 | }; | |
490 | ||
491 | This image could be placed into a SPI flash chip, with the protection boundary | |
492 | set at 1MB. | |
493 | ||
494 | A few special properties are provided for sections: | |
495 | ||
496 | read-only: | |
497 | Indicates that this section is read-only. This has no impact on binman's | |
498 | operation, but his property can be read at run time. | |
499 | ||
c8d48efb SG |
500 | name-prefix: |
501 | This string is prepended to all the names of the binaries in the | |
502 | section. In the example above, the 'u-boot' binaries which actually be | |
503 | renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to | |
504 | distinguish binaries with otherwise identical names. | |
505 | ||
1854695b | 506 | |
12bb1a99 SG |
507 | Image Properties |
508 | ---------------- | |
509 | ||
510 | Image nodes act like sections but also have a few extra properties: | |
511 | ||
512 | filename: | |
513 | Output filename for the image. This defaults to image.bin (or in the | |
514 | case of multiple images <nodename>.bin where <nodename> is the name of | |
515 | the image node. | |
516 | ||
517 | allow-repack: | |
518 | Create an image that can be repacked. With this option it is possible | |
519 | to change anything in the image after it is created, including updating | |
520 | the position and size of image components. By default this is not | |
521 | permitted since it is not possibly to know whether this might violate a | |
522 | constraint in the image description. For example, if a section has to | |
523 | increase in size to hold a larger binary, that might cause the section | |
524 | to fall out of its allow region (e.g. read-only portion of flash). | |
525 | ||
526 | Adding this property causes the original offset and size values in the | |
527 | image description to be stored in the FDT and fdtmap. | |
528 | ||
529 | ||
5a5da7ce SG |
530 | Entry Documentation |
531 | ------------------- | |
532 | ||
533 | For details on the various entry types supported by binman and how to use them, | |
534 | see README.entries. This is generated from the source code using: | |
535 | ||
53cd5d92 | 536 | binman entry-docs >tools/binman/README.entries |
5a5da7ce SG |
537 | |
538 | ||
61f564d1 SG |
539 | Listing images |
540 | -------------- | |
541 | ||
542 | It is possible to list the entries in an existing firmware image created by | |
543 | binman, provided that there is an 'fdtmap' entry in the image. For example: | |
544 | ||
545 | $ binman ls -i image.bin | |
546 | Name Image-pos Size Entry-type Offset Uncomp-size | |
547 | ---------------------------------------------------------------------- | |
548 | main-section c00 section 0 | |
549 | u-boot 0 4 u-boot 0 | |
550 | section 5fc section 4 | |
551 | cbfs 100 400 cbfs 0 | |
552 | u-boot 138 4 u-boot 38 | |
553 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 | |
554 | u-boot-dtb 500 1ff u-boot-dtb 400 3b5 | |
555 | fdtmap 6fc 381 fdtmap 6fc | |
556 | image-header bf8 8 image-header bf8 | |
557 | ||
558 | This shows the hierarchy of the image, the position, size and type of each | |
559 | entry, the offset of each entry within its parent and the uncompressed size if | |
560 | the entry is compressed. | |
561 | ||
562 | It is also possible to list just some files in an image, e.g. | |
563 | ||
564 | $ binman ls -i image.bin section/cbfs | |
565 | Name Image-pos Size Entry-type Offset Uncomp-size | |
566 | -------------------------------------------------------------------- | |
567 | cbfs 100 400 cbfs 0 | |
568 | u-boot 138 4 u-boot 38 | |
569 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 | |
570 | ||
571 | or with wildcards: | |
572 | ||
573 | $ binman ls -i image.bin "*cb*" "*head*" | |
574 | Name Image-pos Size Entry-type Offset Uncomp-size | |
575 | ---------------------------------------------------------------------- | |
576 | cbfs 100 400 cbfs 0 | |
577 | u-boot 138 4 u-boot 38 | |
578 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 | |
579 | image-header bf8 8 image-header bf8 | |
580 | ||
581 | ||
71ce0ba2 SG |
582 | Extracting files from images |
583 | ---------------------------- | |
584 | ||
585 | You can extract files from an existing firmware image created by binman, | |
586 | provided that there is an 'fdtmap' entry in the image. For example: | |
587 | ||
588 | $ binman extract -i image.bin section/cbfs/u-boot | |
589 | ||
590 | which will write the uncompressed contents of that entry to the file 'u-boot' in | |
591 | the current directory. You can also extract to a particular file, in this case | |
592 | u-boot.bin: | |
593 | ||
594 | $ binman extract -i image.bin section/cbfs/u-boot -f u-boot.bin | |
595 | ||
596 | It is possible to extract all files into a destination directory, which will | |
597 | put files in subdirectories matching the entry hierarchy: | |
598 | ||
599 | $ binman extract -i image.bin -O outdir | |
600 | ||
601 | or just a selection: | |
602 | ||
603 | $ binman extract -i image.bin "*u-boot*" -O outdir | |
604 | ||
605 | ||
10f9d006 SG |
606 | Replacing files in an image |
607 | --------------------------- | |
608 | ||
609 | You can replace files in an existing firmware image created by binman, provided | |
610 | that there is an 'fdtmap' entry in the image. For example: | |
611 | ||
612 | $ binman replace -i image.bin section/cbfs/u-boot | |
613 | ||
614 | which will write the contents of the file 'u-boot' from the current directory | |
a6cb9950 SG |
615 | to the that entry, compressing if necessary. If the entry size changes, you must |
616 | add the 'allow-repack' property to the original image before generating it (see | |
617 | above), otherwise you will get an error. | |
618 | ||
619 | You can also use a particular file, in this case u-boot.bin: | |
620 | ||
621 | $ binman replace -i image.bin section/cbfs/u-boot -f u-boot.bin | |
622 | ||
623 | It is possible to replace all files from a source directory which uses the same | |
624 | hierarchy as the entries: | |
625 | ||
626 | $ binman replace -i image.bin -I indir | |
627 | ||
628 | Files that are missing will generate a warning. | |
629 | ||
630 | You can also replace just a selection of entries: | |
631 | ||
632 | $ binman replace -i image.bin "*u-boot*" -I indir | |
10f9d006 SG |
633 | |
634 | ||
eea264ea SG |
635 | Logging |
636 | ------- | |
637 | ||
638 | Binman normally operates silently unless there is an error, in which case it | |
639 | just displays the error. The -D/--debug option can be used to create a full | |
ef108047 SG |
640 | backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select |
641 | this. | |
eea264ea SG |
642 | |
643 | Internally binman logs some output while it is running. This can be displayed | |
644 | by increasing the -v/--verbosity from the default of 1: | |
645 | ||
646 | 0: silent | |
647 | 1: warnings only | |
648 | 2: notices (important messages) | |
649 | 3: info about major operations | |
650 | 4: detailed information about each operation | |
651 | 5: debug (all output) | |
652 | ||
ef108047 | 653 | You can use BINMAN_VERBOSE=5 (for example) when building to select this. |
eea264ea | 654 | |
e0e5df93 SG |
655 | Hashing Entries |
656 | --------------- | |
e0ff8551 | 657 | |
e0e5df93 SG |
658 | It is possible to ask binman to hash the contents of an entry and write that |
659 | value back to the device-tree node. For example: | |
e0ff8551 | 660 | |
e0e5df93 SG |
661 | binman { |
662 | u-boot { | |
663 | hash { | |
664 | algo = "sha256"; | |
665 | }; | |
666 | }; | |
667 | }; | |
668 | ||
669 | Here, a new 'value' property will be written to the 'hash' node containing | |
670 | the hash of the 'u-boot' entry. Only SHA256 is supported at present. Whole | |
671 | sections can be hased if desired, by adding the 'hash' node to the section. | |
672 | ||
673 | The has value can be chcked at runtime by hashing the data actually read and | |
674 | comparing this has to the value in the device tree. | |
e0ff8551 SG |
675 | |
676 | ||
bf7fd50b SG |
677 | Order of image creation |
678 | ----------------------- | |
679 | ||
680 | Image creation proceeds in the following order, for each entry in the image. | |
681 | ||
078ab1a2 | 682 | 1. AddMissingProperties() - binman can add calculated values to the device |
3ab9598d | 683 | tree as part of its processing, for example the offset and size of each |
078ab1a2 SG |
684 | entry. This method adds any properties associated with this, expanding the |
685 | device tree as needed. These properties can have placeholder values which are | |
686 | set later by SetCalculatedProperties(). By that stage the size of sections | |
687 | cannot be changed (since it would cause the images to need to be repacked), | |
688 | but the correct values can be inserted. | |
689 | ||
690 | 2. ProcessFdt() - process the device tree information as required by the | |
ecab8973 SG |
691 | particular entry. This may involve adding or deleting properties. If the |
692 | processing is complete, this method should return True. If the processing | |
693 | cannot complete because it needs the ProcessFdt() method of another entry to | |
694 | run first, this method should return False, in which case it will be called | |
695 | again later. | |
696 | ||
078ab1a2 | 697 | 3. GetEntryContents() - the contents of each entry are obtained, normally by |
bf7fd50b SG |
698 | reading from a file. This calls the Entry.ObtainContents() to read the |
699 | contents. The default version of Entry.ObtainContents() calls | |
700 | Entry.GetDefaultFilename() and then reads that file. So a common mechanism | |
701 | to select a file to read is to override that function in the subclass. The | |
702 | functions must return True when they have read the contents. Binman will | |
703 | retry calling the functions a few times if False is returned, allowing | |
704 | dependencies between the contents of different entries. | |
705 | ||
3ab9598d | 706 | 4. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can |
bf7fd50b | 707 | return a dict containing entries that need updating. The key should be the |
3ab9598d SG |
708 | entry name and the value is a tuple (offset, size). This allows an entry to |
709 | provide the offset and size for other entries. The default implementation | |
710 | of GetEntryOffsets() returns {}. | |
bf7fd50b | 711 | |
3ab9598d SG |
712 | 5. PackEntries() - calls Entry.Pack() which figures out the offset and |
713 | size of an entry. The 'current' image offset is passed in, and the function | |
714 | returns the offset immediately after the entry being packed. The default | |
bf7fd50b SG |
715 | implementation of Pack() is usually sufficient. |
716 | ||
0b65769c SG |
717 | Note: for sections, this also checks that the entries do not overlap, nor extend |
718 | outside the section. If the section does not have a defined size, the size is | |
719 | set large enough to hold all the entries. | |
bf7fd50b | 720 | |
0b65769c | 721 | 6. SetImagePos() - sets the image position of every entry. This is the absolute |
4ab88b6f SG |
722 | position 'image-pos', as opposed to 'offset' which is relative to the containing |
723 | section. This must be done after all offsets are known, which is why it is quite | |
724 | late in the ordering. | |
725 | ||
0b65769c | 726 | 7. SetCalculatedProperties() - update any calculated properties in the device |
3ab9598d | 727 | tree. This sets the correct 'offset' and 'size' vaues, for example. |
078ab1a2 | 728 | |
0b65769c | 729 | 8. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry. |
bf7fd50b SG |
730 | The default implementatoin does nothing. This can be overriden to adjust the |
731 | contents of an entry in some way. For example, it would be possible to create | |
732 | an entry containing a hash of the contents of some other entries. At this | |
c52c9e7d SG |
733 | stage the offset and size of entries should not be adjusted unless absolutely |
734 | necessary, since it requires a repack (going back to PackEntries()). | |
bf7fd50b | 735 | |
0b65769c | 736 | 9. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry |
4ab88b6f SG |
737 | has changed its size, then there is no alternative but to go back to step 5 and |
738 | try again, repacking the entries with the updated size. ResetForPack() removes | |
739 | the fixed offset/size values added by binman, so that the packing can start from | |
740 | scratch. | |
741 | ||
0b65769c | 742 | 10. WriteSymbols() - write the value of symbols into the U-Boot SPL binary. |
3ab9598d | 743 | See 'Access to binman entry offsets at run time' below for a description of |
0a4357c4 | 744 | what happens in this stage. |
39c1502c | 745 | |
0b65769c | 746 | 11. BuildImage() - builds the image and writes it to a file |
4ab88b6f | 747 | |
0b65769c | 748 | 12. WriteMap() - writes a text file containing a map of the image. This is the |
4ab88b6f | 749 | final step. |
bf7fd50b SG |
750 | |
751 | ||
6d427c6b SG |
752 | Automatic .dtsi inclusion |
753 | ------------------------- | |
754 | ||
755 | It is sometimes inconvenient to add a 'binman' node to the .dts file for each | |
756 | board. This can be done by using #include to bring in a common file. Another | |
757 | approach supported by the U-Boot build system is to automatically include | |
758 | a common header. You can then put the binman node (and anything else that is | |
759 | specific to U-Boot, such as u-boot,dm-pre-reloc properies) in that header | |
760 | file. | |
761 | ||
762 | Binman will search for the following files in arch/<arch>/dts: | |
763 | ||
764 | <dts>-u-boot.dtsi where <dts> is the base name of the .dts file | |
765 | <CONFIG_SYS_SOC>-u-boot.dtsi | |
766 | <CONFIG_SYS_CPU>-u-boot.dtsi | |
767 | <CONFIG_SYS_VENDOR>-u-boot.dtsi | |
768 | u-boot.dtsi | |
769 | ||
770 | U-Boot will only use the first one that it finds. If you need to include a | |
771 | more general file you can do that from the more specific file using #include. | |
772 | If you are having trouble figuring out what is going on, you can uncomment | |
773 | the 'warning' line in scripts/Makefile.lib to see what it has found: | |
774 | ||
775 | # Uncomment for debugging | |
511fd0b2 SG |
776 | # This shows all the files that were considered and the one that we chose. |
777 | # u_boot_dtsi_options_debug = $(u_boot_dtsi_options_raw) | |
6d427c6b SG |
778 | |
779 | ||
dbf6be9f SG |
780 | Access to binman entry offsets at run time (symbols) |
781 | ---------------------------------------------------- | |
39c1502c SG |
782 | |
783 | Binman assembles images and determines where each entry is placed in the image. | |
784 | This information may be useful to U-Boot at run time. For example, in SPL it | |
785 | is useful to be able to find the location of U-Boot so that it can be executed | |
786 | when SPL is finished. | |
787 | ||
788 | Binman allows you to declare symbols in the SPL image which are filled in | |
789 | with their correct values during the build. For example: | |
790 | ||
7c150136 | 791 | binman_sym_declare(ulong, u_boot_any, image_pos); |
39c1502c | 792 | |
7c150136 | 793 | declares a ulong value which will be assigned to the image-pos of any U-Boot |
39c1502c SG |
794 | image (u-boot.bin, u-boot.img, u-boot-nodtb.bin) that is present in the image. |
795 | You can access this value with something like: | |
796 | ||
7c150136 | 797 | ulong u_boot_offset = binman_sym(ulong, u_boot_any, image_pos); |
39c1502c | 798 | |
7c150136 SG |
799 | Thus u_boot_offset will be set to the image-pos of U-Boot in memory, assuming |
800 | that the whole image has been loaded, or is available in flash. You can then | |
801 | jump to that address to start U-Boot. | |
39c1502c | 802 | |
7c150136 SG |
803 | At present this feature is only supported in SPL and TPL. In principle it is |
804 | possible to fill in such symbols in U-Boot proper, as well, but a future C | |
805 | library is planned for this instead, to read from the device tree. | |
806 | ||
807 | As well as image-pos, it is possible to read the size of an entry and its | |
808 | offset (which is the start position of the entry within its parent). | |
809 | ||
810 | A small technical note: Binman automatically adds the base address of the image | |
811 | (i.e. __image_copy_start) to the value of the image-pos symbol, so that when the | |
812 | image is loaded to its linked address, the value will be correct and actually | |
813 | point into the image. | |
814 | ||
815 | For example, say SPL is at the start of the image and linked to start at address | |
816 | 80108000. If U-Boot's image-pos is 0x8000 then binman will write an image-pos | |
817 | for U-Boot of 80110000 into the SPL binary, since it assumes the image is loaded | |
818 | to 80108000, with SPL at 80108000 and U-Boot at 80110000. | |
819 | ||
820 | For x86 devices (with the end-at-4gb property) this base address is not added | |
821 | since it is assumed that images are XIP and the offsets already include the | |
822 | address. | |
39c1502c SG |
823 | |
824 | ||
dbf6be9f SG |
825 | Access to binman entry offsets at run time (fdt) |
826 | ------------------------------------------------ | |
827 | ||
828 | Binman can update the U-Boot FDT to include the final position and size of | |
829 | each entry in the images it processes. The option to enable this is -u and it | |
830 | causes binman to make sure that the 'offset', 'image-pos' and 'size' properties | |
831 | are set correctly for every entry. Since it is not necessary to specify these in | |
832 | the image definition, binman calculates the final values and writes these to | |
833 | the device tree. These can be used by U-Boot at run-time to find the location | |
834 | of each entry. | |
835 | ||
086cec9f SG |
836 | Alternatively, an FDT map entry can be used to add a special FDT containing |
837 | just the information about the image. This is preceded by a magic string so can | |
cf228943 SG |
838 | be located anywhere in the image. An image header (typically at the start or end |
839 | of the image) can be used to point to the FDT map. See fdtmap and image-header | |
840 | entries for more information. | |
086cec9f | 841 | |
dbf6be9f | 842 | |
83d73c2f SG |
843 | Compression |
844 | ----------- | |
845 | ||
846 | Binman support compression for 'blob' entries (those of type 'blob' and | |
8287ee85 | 847 | derivatives). To enable this for an entry, add a 'compress' property: |
83d73c2f SG |
848 | |
849 | blob { | |
850 | filename = "datafile"; | |
8287ee85 | 851 | compress = "lz4"; |
83d73c2f SG |
852 | }; |
853 | ||
854 | The entry will then contain the compressed data, using the 'lz4' compression | |
8287ee85 SG |
855 | algorithm. Currently this is the only one that is supported. The uncompressed |
856 | size is written to the node in an 'uncomp-size' property, if -u is used. | |
83d73c2f | 857 | |
8f5ef89f SG |
858 | Compression is also supported for sections. In that case the entire section is |
859 | compressed in one block, including all its contents. This means that accessing | |
860 | an entry from the section required decompressing the entire section. Also, the | |
861 | size of a section indicates the space that it consumes in its parent section | |
862 | (and typically the image). With compression, the section may contain more data, | |
863 | and the uncomp-size property indicates that, as above. The contents of the | |
864 | section is compressed first, before any padding is added. This ensures that the | |
865 | padding itself is not compressed, which would be a waste of time. | |
83d73c2f SG |
866 | |
867 | ||
3b0c3821 SG |
868 | Map files |
869 | --------- | |
870 | ||
871 | The -m option causes binman to output a .map file for each image that it | |
3ab9598d | 872 | generates. This shows the offset and size of each entry. For example: |
3b0c3821 | 873 | |
3ab9598d | 874 | Offset Size Name |
8122f396 SG |
875 | 00000000 00000028 main-section |
876 | 00000000 00000010 section@0 | |
877 | 00000000 00000004 u-boot | |
878 | 00000010 00000010 section@1 | |
879 | 00000000 00000004 u-boot | |
3b0c3821 SG |
880 | |
881 | This shows a hierarchical image with two sections, each with a single entry. The | |
3ab9598d SG |
882 | offsets of the sections are absolute hex byte offsets within the image. The |
883 | offsets of the entries are relative to their respective sections. The size of | |
3b0c3821 SG |
884 | each entry is also shown, in bytes (hex). The indentation shows the entries |
885 | nested inside their sections. | |
886 | ||
887 | ||
53af22a9 SG |
888 | Passing command-line arguments to entries |
889 | ----------------------------------------- | |
890 | ||
891 | Sometimes it is useful to pass binman the value of an entry property from the | |
892 | command line. For example some entries need access to files and it is not | |
893 | always convenient to put these filenames in the image definition (device tree). | |
894 | ||
895 | The-a option supports this: | |
896 | ||
897 | -a<prop>=<value> | |
898 | ||
899 | where | |
900 | ||
901 | <prop> is the property to set | |
902 | <value> is the value to set it to | |
903 | ||
904 | Not all properties can be provided this way. Only some entries support it, | |
905 | typically for filenames. | |
906 | ||
907 | ||
c7d8035e SG |
908 | External tools |
909 | -------------- | |
910 | ||
911 | Binman can make use of external command-line tools to handle processing of | |
912 | entry contents or to generate entry contents. These tools are executed using | |
913 | the 'tools' module's Run() method. The tools generally must exist on the PATH, | |
914 | but the --toolpath option can be used to specify additional search paths to | |
915 | use. This option can be specified multiple times to add more than one path. | |
916 | ||
4ec40a72 ANY |
917 | For some compile tools binman will use the versions specified by commonly-used |
918 | environment variables like CC and HOSTCC for the C compiler, based on whether | |
919 | the tool's output will be used for the target or for the host machine. If those | |
920 | aren't given, it will also try to derive target-specific versions from the | |
921 | CROSS_COMPILE environment variable during a cross-compilation. | |
922 | ||
c7d8035e | 923 | |
6d427c6b SG |
924 | Code coverage |
925 | ------------- | |
926 | ||
927 | Binman is a critical tool and is designed to be very testable. Entry | |
53cd5d92 | 928 | implementations target 100% test coverage. Run 'binman test -T' to check this. |
6d427c6b SG |
929 | |
930 | To enable Python test coverage on Debian-type distributions (e.g. Ubuntu): | |
931 | ||
45f449bf | 932 | $ sudo apt-get install python-coverage python3-coverage python-pytest |
6d427c6b SG |
933 | |
934 | ||
55660d08 SG |
935 | Concurrent tests |
936 | ---------------- | |
937 | ||
938 | Binman tries to run tests concurrently. This means that the tests make use of | |
939 | all available CPUs to run. | |
940 | ||
941 | To enable this: | |
942 | ||
943 | $ sudo apt-get install python-subunit python3-subunit | |
944 | ||
945 | Use '-P 1' to disable this. It is automatically disabled when code coverage is | |
946 | being used (-T) since they are incompatible. | |
947 | ||
948 | ||
d5164a79 SG |
949 | Debugging tests |
950 | --------------- | |
951 | ||
952 | Sometimes when debugging tests it is useful to keep the input and output | |
953 | directories so they can be examined later. Use -X or --test-preserve-dirs for | |
954 | this. | |
955 | ||
956 | ||
4ec40a72 ANY |
957 | Running tests on non-x86 architectures |
958 | -------------------------------------- | |
959 | ||
960 | Binman's tests have been written under the assumption that they'll be run on a | |
961 | x86-like host and there hasn't been an attempt to make them portable yet. | |
962 | However, it's possible to run the tests by cross-compiling to x86. | |
963 | ||
964 | To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu): | |
965 | ||
966 | $ sudo apt-get install gcc-x86-64-linux-gnu | |
967 | ||
968 | Then, you can run the tests under cross-compilation: | |
969 | ||
970 | $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T | |
971 | ||
972 | You can also use gcc-i686-linux-gnu similar to the above. | |
973 | ||
974 | ||
bf7fd50b SG |
975 | Advanced Features / Technical docs |
976 | ---------------------------------- | |
977 | ||
978 | The behaviour of entries is defined by the Entry class. All other entries are | |
979 | a subclass of this. An important subclass is Entry_blob which takes binary | |
980 | data from a file and places it in the entry. In fact most entry types are | |
981 | subclasses of Entry_blob. | |
982 | ||
983 | Each entry type is a separate file in the tools/binman/etype directory. Each | |
984 | file contains a class called Entry_<type> where <type> is the entry type. | |
985 | New entry types can be supported by adding new files in that directory. | |
986 | These will automatically be detected by binman when needed. | |
987 | ||
988 | Entry properties are documented in entry.py. The entry subclasses are free | |
989 | to change the values of properties to support special behaviour. For example, | |
990 | when Entry_blob loads a file, it sets content_size to the size of the file. | |
991 | Entry classes can adjust other entries. For example, an entry that knows | |
3ab9598d | 992 | where other entries should be positioned can set up those entries' offsets |
bf7fd50b SG |
993 | so they don't need to be set in the binman decription. It can also adjust |
994 | entry contents. | |
995 | ||
996 | Most of the time such essoteric behaviour is not needed, but it can be | |
997 | essential for complex images. | |
998 | ||
3ed0de31 SG |
999 | If you need to specify a particular device-tree compiler to use, you can define |
1000 | the DTC environment variable. This can be useful when the system dtc is too | |
1001 | old. | |
1002 | ||
a3c00550 SG |
1003 | To enable a full backtrace and other debugging features in binman, pass |
1004 | BINMAN_DEBUG=1 to your build: | |
1005 | ||
c443f56c | 1006 | make qemu-x86_defconfig |
a3c00550 SG |
1007 | make BINMAN_DEBUG=1 |
1008 | ||
1f338e00 SG |
1009 | To enable verbose logging from binman, base BINMAN_VERBOSE to your build, which |
1010 | adds a -v<level> option to the call to binman: | |
1011 | ||
c443f56c | 1012 | make qemu-x86_defconfig |
1f338e00 SG |
1013 | make BINMAN_VERBOSE=5 |
1014 | ||
bf7fd50b SG |
1015 | |
1016 | History / Credits | |
1017 | ----------------- | |
1018 | ||
1019 | Binman takes a lot of inspiration from a Chrome OS tool called | |
1020 | 'cros_bundle_firmware', which I wrote some years ago. That tool was based on | |
1021 | a reasonably simple and sound design but has expanded greatly over the | |
1022 | years. In particular its handling of x86 images is convoluted. | |
1023 | ||
7ae5f315 | 1024 | Quite a few lessons have been learned which are hopefully applied here. |
bf7fd50b SG |
1025 | |
1026 | ||
1027 | Design notes | |
1028 | ------------ | |
1029 | ||
1030 | On the face of it, a tool to create firmware images should be fairly simple: | |
1031 | just find all the input binaries and place them at the right place in the | |
1032 | image. The difficulty comes from the wide variety of input types (simple | |
1033 | flat binaries containing code, packaged data with various headers), packing | |
1034 | requirments (alignment, spacing, device boundaries) and other required | |
1035 | features such as hierarchical images. | |
1036 | ||
1037 | The design challenge is to make it easy to create simple images, while | |
1038 | allowing the more complex cases to be supported. For example, for most | |
1039 | images we don't much care exactly where each binary ends up, so we should | |
1040 | not have to specify that unnecessarily. | |
1041 | ||
1042 | New entry types should aim to provide simple usage where possible. If new | |
1043 | core features are needed, they can be added in the Entry base class. | |
1044 | ||
1045 | ||
1046 | To do | |
1047 | ----- | |
1048 | ||
1049 | Some ideas: | |
bf7fd50b SG |
1050 | - Use of-platdata to make the information available to code that is unable |
1051 | to use device tree (such as a very small SPL image) | |
bf7fd50b | 1052 | - Allow easy building of images by specifying just the board name |
bf7fd50b SG |
1053 | - Support building an image for a board (-b) more completely, with a |
1054 | configurable build directory | |
513c53e4 SG |
1055 | - Detect invalid properties in nodes |
1056 | - Sort the fdtmap by offset | |
397a7702 | 1057 | - Output temporary files to a different directory |
bf7fd50b SG |
1058 | |
1059 | -- | |
1060 | Simon Glass <[email protected]> | |
1061 | 7/7/2016 |