blob: 23cbb99b4b0b849b349de492379104c62c525424 [file] [log] [blame]
Simon Glass61adb2d2021-03-18 20:25:13 +13001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (c) 2016 Google, Inc
Simon Glassbf7fd502016-11-25 20:15:51 -07003
4Introduction
Simon Glass072026e2021-03-18 20:25:14 +13005============
Simon Glassbf7fd502016-11-25 20:15:51 -07006
7Firmware often consists of several components which must be packaged together.
8For example, we may have SPL, U-Boot, a device tree and an environment area
9grouped together and placed in MMC flash. When the system starts, it must be
10able to find these pieces.
11
Simon Glassfcae6682021-03-18 20:25:17 +130012Building firmware should be separate from packaging it. Many of the complexities
13of modern firmware build systems come from trying to do both at once. With
14binman, you build all the pieces that are needed, using whatever assortment of
15projects and build systems are needed, then use binman to stitch everything
16together.
Simon Glassbf7fd502016-11-25 20:15:51 -070017
18
19What it does
20------------
21
22Binman reads your board's device tree and finds a node which describes the
Simon Glassfcae6682021-03-18 20:25:17 +130023required image layout. It uses this to work out what to place where.
24
25Binman provides a mechanism for building images, from simple SPL + U-Boot
26combinations, to more complex arrangements with many parts. It also allows
27users to inspect images, extract and replace binaries within them, repacking if
28needed.
Simon Glassbf7fd502016-11-25 20:15:51 -070029
30
31Features
32--------
33
Simon Glassfcae6682021-03-18 20:25:17 +130034Apart from basic padding, alignment and positioning features, Binman supports
35hierarchical images, compression, hashing and dealing with the binary blobs
36which are a sad trend in open-source firmware at present.
Simon Glassbf7fd502016-11-25 20:15:51 -070037
Simon Glassfcae6682021-03-18 20:25:17 +130038Executable binaries can access the location of other binaries in an image by
39using special linker symbols (zero-overhead but somewhat limited) or by reading
40the devicetree description of the image.
Simon Glassbf7fd502016-11-25 20:15:51 -070041
Simon Glassfcae6682021-03-18 20:25:17 +130042Binman is designed primarily for use with U-Boot and associated binaries such
43as ARM Trusted Firmware, but it is suitable for use with other projects, such
44as Zephyr. Binman also provides facilities useful in Chromium OS, such as CBFS,
Simon Glass7d6fade2022-08-07 16:33:26 -060045vblocks and the like.
Simon Glassfcae6682021-03-18 20:25:17 +130046
47Binman provides a way to process binaries before they are included, by adding a
48Python plug-in.
Simon Glassbf7fd502016-11-25 20:15:51 -070049
50Binman is intended for use with U-Boot but is designed to be general enough
51to be useful in other image-packaging situations.
52
53
54Motivation
55----------
56
Simon Glassfcae6682021-03-18 20:25:17 +130057As mentioned above, packaging of firmware is quite a different task from
58building the various parts. In many cases the various binaries which go into
59the image come from separate build systems. For example, ARM Trusted Firmware
60is used on ARMv8 devices but is not built in the U-Boot tree. If a Linux kernel
61is included in the firmware image, it is built elsewhere.
Simon Glassbf7fd502016-11-25 20:15:51 -070062
63It is of course possible to add more and more build rules to the U-Boot
64build system to cover these cases. It can shell out to other Makefiles and
65build scripts. But it seems better to create a clear divide between building
66software and packaging it.
67
68At present this is handled by manual instructions, different for each board,
69on how to create images that will boot. By turning these instructions into a
70standard format, we can support making valid images for any board without
71manual effort, lots of READMEs, etc.
72
73Benefits:
Simon Glass61adb2d2021-03-18 20:25:13 +130074
75 - Each binary can have its own build system and tool chain without creating
76 any dependencies between them
77 - Avoids the need for a single-shot build: individual parts can be updated
78 and brought in as needed
79 - Provides for a standard image description available in the build and at
80 run-time
81 - SoC-specific image-signing tools can be accommodated
82 - Avoids cluttering the U-Boot build system with image-building code
83 - The image description is automatically available at run-time in U-Boot,
84 SPL. It can be made available to other software also
85 - The image description is easily readable (it's a text file in device-tree
86 format) and permits flexible packing of binaries
Simon Glassbf7fd502016-11-25 20:15:51 -070087
88
89Terminology
90-----------
91
92Binman uses the following terms:
93
94- image - an output file containing a firmware image
95- binary - an input binary that goes into the image
96
97
Simon Glass6608acb2023-02-23 18:18:23 -070098Installation
99------------
100
101You can install binman using::
102
103 pip install binary-manager
104
105The name is chosen since binman conflicts with an existing package.
106
107If you are using binman within the U-Boot tree, it may be easiest to add a
108symlink from your local `~/.bin` directory to `/path/to/tools/binman/binman`.
109
110
Simon Glassbf7fd502016-11-25 20:15:51 -0700111Relationship to FIT
112-------------------
113
114FIT is U-Boot's official image format. It supports multiple binaries with
115load / execution addresses, compression. It also supports verification
116through hashing and RSA signatures.
117
118FIT was originally designed to support booting a Linux kernel (with an
119optional ramdisk) and device tree chosen from various options in the FIT.
120Now that U-Boot supports configuration via device tree, it is possible to
121load U-Boot from a FIT, with the device tree chosen by SPL.
122
123Binman considers FIT to be one of the binaries it can place in the image.
124
125Where possible it is best to put as much as possible in the FIT, with binman
126used to deal with cases not covered by FIT. Examples include initial
127execution (since FIT itself does not have an executable header) and dealing
128with device boundaries, such as the read-only/read-write separation in SPI
129flash.
130
131For U-Boot, binman should not be used to create ad-hoc images in place of
132FIT.
133
Simon Glass7d6fade2022-08-07 16:33:26 -0600134Note that binman can itself create a FIT. This helps to move mkimage
135invocations out of the Makefile and into binman image descriptions. It also
136helps by removing the need for ad-hoc tools like `make_fit_atf.py`.
137
Simon Glassbf7fd502016-11-25 20:15:51 -0700138
139Relationship to mkimage
140-----------------------
141
142The mkimage tool provides a means to create a FIT. Traditionally it has
143needed an image description file: a device tree, like binman, but in a
144different format. More recently it has started to support a '-f auto' mode
145which can generate that automatically.
146
147More relevant to binman, mkimage also permits creation of many SoC-specific
148image types. These can be listed by running 'mkimage -T list'. Examples
149include 'rksd', the Rockchip SD/MMC boot format. The mkimage tool is often
150called from the U-Boot build system for this reason.
151
152Binman considers the output files created by mkimage to be binary blobs
153which it can place in an image. Binman does not replace the mkimage tool or
Michael Heimpold383d2562018-08-22 22:01:24 +0200154this purpose. It would be possible in some situations to create a new entry
Simon Glassbf7fd502016-11-25 20:15:51 -0700155type for the images in mkimage, but this would not add functionality. It
Michael Heimpold383d2562018-08-22 22:01:24 +0200156seems better to use the mkimage tool to generate binaries and avoid blurring
Simon Glassbf7fd502016-11-25 20:15:51 -0700157the boundaries between building input files (mkimage) and packaging then
158into a final image (binman).
159
Simon Glass7d6fade2022-08-07 16:33:26 -0600160Note that binman can itself invoke mkimage. This helps to move mkimage
161invocations out of the Makefile and into binman image descriptions.
162
Simon Glassbf7fd502016-11-25 20:15:51 -0700163
Simon Glass072026e2021-03-18 20:25:14 +1300164Using binman
165============
166
Simon Glassbf7fd502016-11-25 20:15:51 -0700167Example use of binman in U-Boot
168-------------------------------
169
170Binman aims to replace some of the ad-hoc image creation in the U-Boot
171build system.
172
173Consider sunxi. It has the following steps:
174
Simon Glass61adb2d2021-03-18 20:25:13 +1300175 #. It uses a custom mksunxiboot tool to build an SPL image called
176 sunxi-spl.bin. This should probably move into mkimage.
Simon Glassbf7fd502016-11-25 20:15:51 -0700177
Simon Glass61adb2d2021-03-18 20:25:13 +1300178 #. It uses mkimage to package U-Boot into a legacy image file (so that it can
179 hold the load and execution address) called u-boot.img.
Simon Glassbf7fd502016-11-25 20:15:51 -0700180
Simon Glass61adb2d2021-03-18 20:25:13 +1300181 #. It builds a final output image called u-boot-sunxi-with-spl.bin which
182 consists of sunxi-spl.bin, some padding and u-boot.img.
Simon Glassbf7fd502016-11-25 20:15:51 -0700183
184Binman is intended to replace the last step. The U-Boot build system builds
185u-boot.bin and sunxi-spl.bin. Binman can then take over creation of
Simon Glass206985e2022-02-08 11:49:54 -0700186sunxi-spl.bin by calling mksunxiboot or mkimage. In any case, it would then
187create the image from the component parts.
Simon Glassbf7fd502016-11-25 20:15:51 -0700188
189This simplifies the U-Boot Makefile somewhat, since various pieces of logic
190can be replaced by a call to binman.
191
192
Simon Glass7d6fade2022-08-07 16:33:26 -0600193Invoking binman within U-Boot
194-----------------------------
195
196Within U-Boot, binman is invoked by the build system, i.e. when you type 'make'
197or use buildman to build U-Boot. There is no need to run binman independently
198during development. Everything happens automatically and is set up for your
199SoC or board so that binman produced the right things.
200
201The general policy is that the Makefile builds all the binaries in INPUTS-y
202(the 'inputs' rule), then binman is run to produce the final images (the 'all'
203rule).
204
205There should be only one invocation of binman in Makefile, the very last step
206that pulls everything together. At present there are some arch-specific
207invocations as well, but these should be dropped when those architectures are
208converted to use binman properly.
209
210As above, the term 'binary' is used for something in INPUTS-y and 'image' is
211used for the things that binman creates. So the binaries are inputs to the
212image(s) and it is the image that is actually loaded on the board.
213
214Again, at present, there are a number of things created in Makefile which should
215be done by binman (when we get around to it), like `u-boot-ivt.img`,
216`lpc32xx-spl.img`, `u-boot-with-nand-spl.imx`, `u-boot-spl-padx4.sfp` and
217`u-boot-mtk.bin`, just to pick on a few. When completed this will remove about
218400 lines from `Makefile`.
219
220Since binman is invoked only once, it must of course create all the images that
221are needed, in that one invocation. It does this by working through the image
222descriptions one by one, collecting the input binaries, processing them as
223needed and producing the final images.
224
225The same binaries may be used by multiple images. For example binman may be used
226to produce an SD-card image and a SPI-flash image. In this case the binaries
227going into the process are the same, but binman produces slightly different
228images in each case.
229
230For some SoCs, U-Boot is not the only project that produces the necessary
231binaries. For example, ARM Trusted Firmware (ATF) is a project that produces
232binaries which must be incorporate, such as `bl31.elf` or `bl31.bin`. For this
233to work you must have built ATF before you build U-Boot and you must tell U-Boot
234where to find the bl31 image, using the BL31 environment variable.
235
236How do you know how to incorporate ATF? It is handled by the atf-bl31 entry type
237(etype). An etype is an implementation of reading a binary into binman, in this
238case the `bl31.bin` file. When you build U-Boot but do not set the BL31
239environment variable, binman provides a help message, which comes from
240`missing-blob-help`::
241
242 See the documentation for your board. You may need to build ARM Trusted
243 Firmware and build with BL31=/path/to/bl31.bin
244
245The mechanism by which binman is advised of this is also in the Makefile. See
246the `-a atf-bl31-path=${BL31}` piece in `cmd_binman`. This tells binman to
247set the EntryArg `atf-bl31-path` to the value of the `BL31` environment
248variable. Within binman, this EntryArg is picked up by the `Entry_atf_bl31`
249etype. An EntryArg is simply an argument to the entry. The `atf-bl31-path`
250name is documented in :ref:`etype_atf_bl31`.
251
Simon Glass07128602022-08-18 02:16:45 -0600252Taking this a little further, when binman is used to create a FIT, it supports
253using an ELF file, e.g. `bl31.elf` and splitting it into separate pieces (with
254`fit,operation = "split-elf"`), each with its own load address.
255
Simon Glass7d6fade2022-08-07 16:33:26 -0600256
257Invoking binman outside U-Boot
258------------------------------
259
260While binman is invoked from within the U-Boot build system, it is also possible
261to invoke it separately. This is typically used in a production build system,
262where signing is completed (with real keys) and any missing binaries are
263provided.
264
265For example, for build testing there is no need to provide a real signature,
266nor is there any need to provide a real ATF BL31 binary (for example). These can
267be added later by invoking binman again, providing all the required inputs
268from the first time, plus any that were missing or placeholders.
269
270So in practice binman is often used twice:
271
272- once within the U-Boot build system, for development and testing
273- again outside U-Boot to assembly and final production images
274
275While the same input binaries are used in each case, you will of course you will
276need to create your own binman command line, similar to that in `cmd_binman` in
277the Makefile. You may find the -I and --toolpath options useful. The
278device tree file is provided to binman in binary form, so there is no need to
279have access to the original `.dts` sources.
280
281
282Assembling the image description
283--------------------------------
284
285Since binman uses the device tree for its image description, you can use the
286same files that describe your board's hardware to describe how the image is
287assembled. Typically the images description is in a common file used by all
288boards with a particular SoC (e.g. `imx8mp-u-boot.dtsi`).
289
290Where a particular boards needs to make changes, it can override properties in
291the SoC file, just as it would for any other device tree property. It can also
292add a image that is specific to the board.
293
294Another way to control the image description to make use of CONFIG options in
295the description. For example, if the start offset of a particular entry varies
296by board, you can add a Kconfig for that and reference it in the description::
297
298 u-boot-spl {
299 };
300
301 fit {
302 offset = <CONFIG_SPL_PAD_TO>;
303 ...
304 };
305
306The SoC can provide a default value but boards can override that as needed and
307binman will take care of it.
308
309It is even possible to control which entries appear in the image, by using the
310C preprocessor::
311
312 #ifdef CONFIG_HAVE_MRC
313 intel-mrc {
Tom Rinifa2fd532022-12-04 10:14:07 -0500314 offset = <CFG_X86_MRC_ADDR>;
Simon Glass7d6fade2022-08-07 16:33:26 -0600315 };
316 #endif
317
318Only boards which enable `HAVE_MRC` will include this entry.
319
320Obviously a similar approach can be used to control which images are produced,
321with a Kconfig option to enable a SPI image, for example. However there is
322generally no harm in producing an image that is not used. If a board uses MMC
323but not SPI, but the SoC supports booting from both, then both images can be
324produced, with only on or other being used by particular boards. This can help
325reduce the need for having multiple defconfig targets for a board where the
326only difference is the boot media, enabling / disabling secure boot, etc.
327
328Of course you can use the device tree itself to pass any board-specific
329information that is needed by U-Boot at runtime (see binman_syms_ for how to
330make binman insert these values directly into executables like SPL).
331
332There is one more way this can be done: with individual .dtsi files for each
333image supported by the SoC. Then the board `.dts` file can include the ones it
334wants. This is not recommended, since it is likely to be difficult to maintain
335and harder to understand the relationship between the different boards.
336
337
338Producing images for multiple boards
339------------------------------------
340
341When invoked within U-Boot, binman only builds a single set of images, for
342the chosen board. This is set by the `CONFIG_DEFAULT_DEVICE_TREE` option.
343
344However, U-Boot generally builds all the device tree files associated with an
345SoC. These are written to the (e.g. for ARM) `arch/arm/dts` directory. Each of
346these contains the full binman description for that board. Often the best
347approach is to build a single image that includes all these device tree binaries
348and allow SPL to select the correct one on boot.
349
350However, it is also possible to build separate images for each board, simply by
351invoking binman multiple times, once for each device tree file, using a
352different output directory. This will produce one set of images for each board.
353
354
Simon Glassbf7fd502016-11-25 20:15:51 -0700355Example use of binman for x86
356-----------------------------
357
358In most cases x86 images have a lot of binary blobs, 'black-box' code
359provided by Intel which must be run for the platform to work. Typically
360these blobs are not relocatable and must be placed at fixed areas in the
Michael Heimpold383d2562018-08-22 22:01:24 +0200361firmware image.
Simon Glassbf7fd502016-11-25 20:15:51 -0700362
363Currently this is handled by ifdtool, which places microcode, FSP, MRC, VGA
364BIOS, reference code and Intel ME binaries into a u-boot.rom file.
365
366Binman is intended to replace all of this, with ifdtool left to handle only
367the configuration of the Intel-format descriptor.
368
369
Simon Glass81d6e3f2022-01-09 20:13:48 -0700370Installing binman
371-----------------
Simon Glassbf7fd502016-11-25 20:15:51 -0700372
Simon Glass7d6fade2022-08-07 16:33:26 -0600373First install prerequisites, e.g:
374
375.. code-block:: bash
Simon Glassd8d40742019-07-08 13:18:35 -0600376
Simon Glass61adb2d2021-03-18 20:25:13 +1300377 sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \
378 liblz4-tool
Simon Glassd8d40742019-07-08 13:18:35 -0600379
Simon Glass81d6e3f2022-01-09 20:13:48 -0700380You can run binman directly if you put it on your PATH. But if you want to
Simon Glass7d6fade2022-08-07 16:33:26 -0600381install into your `~/.local` Python directory, use:
382
383.. code-block:: bash
Simon Glass81d6e3f2022-01-09 20:13:48 -0700384
385 pip install tools/patman tools/dtoc tools/binman
386
387Note that binman makes use of libraries from patman and dtoc, which is why these
388need to be installed. Also you need `libfdt` and `pylibfdt` which can be
Simon Glass7d6fade2022-08-07 16:33:26 -0600389installed like this:
390
391.. code-block:: bash
Simon Glass81d6e3f2022-01-09 20:13:48 -0700392
393 git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git
394 cd dtc
395 pip install .
396 make NO_PYTHON=1 install
397
398This installs the `libfdt.so` library into `~/lib` so you can use
399`LD_LIBRARY_PATH=~/lib` when running binman. If you want to install it in the
Simon Glass7d6fade2022-08-07 16:33:26 -0600400system-library directory, replace the last line with:
401
402.. code-block:: bash
Simon Glass81d6e3f2022-01-09 20:13:48 -0700403
404 make NO_PYTHON=1 PREFIX=/ install
405
406Running binman
407--------------
408
Ralph Siemsenabe2a162023-02-22 15:56:59 -0500409Type:
Simon Glassbf7fd502016-11-25 20:15:51 -0700410
Ralph Siemsenabe2a162023-02-22 15:56:59 -0500411.. code-block:: bash
Simon Glass7d6fade2022-08-07 16:33:26 -0600412
413 make NO_PYTHON=1 PREFIX=/ install
Simon Glass61adb2d2021-03-18 20:25:13 +1300414 binman build -b <board_name>
Simon Glassbf7fd502016-11-25 20:15:51 -0700415
416to build an image for a board. The board name is the same name used when
417configuring U-Boot (e.g. for sandbox_defconfig the board name is 'sandbox').
418Binman assumes that the input files for the build are in ../b/<board_name>.
419
Simon Glass7d6fade2022-08-07 16:33:26 -0600420Or you can specify this explicitly:
Simon Glassbf7fd502016-11-25 20:15:51 -0700421
Simon Glass7d6fade2022-08-07 16:33:26 -0600422.. code-block:: bash
423
424 make NO_PYTHON=1 PREFIX=/ install
Simon Glass61adb2d2021-03-18 20:25:13 +1300425 binman build -I <build_path>
Simon Glassbf7fd502016-11-25 20:15:51 -0700426
427where <build_path> is the build directory containing the output of the U-Boot
428build.
429
430(Future work will make this more configurable)
431
432In either case, binman picks up the device tree file (u-boot.dtb) and looks
433for its instructions in the 'binman' node.
434
435Binman has a few other options which you can see by running 'binman -h'.
436
437
Simon Glass9c0a8b12017-11-12 21:52:06 -0700438Enabling binman for a board
439---------------------------
440
Simon Glassfcae6682021-03-18 20:25:17 +1300441At present binman is invoked from a rule in the main Makefile. You should be
442able to enable CONFIG_BINMAN to enable this rule.
Simon Glass9c0a8b12017-11-12 21:52:06 -0700443
Simon Glassfcae6682021-03-18 20:25:17 +1300444The output file is typically named image.bin and is located in the output
445directory. If input files are needed to you add these to INPUTS-y either in the
446main Makefile or in a config.mk file in your arch subdirectory.
Simon Glass9c0a8b12017-11-12 21:52:06 -0700447
448Once binman is executed it will pick up its instructions from a device-tree
449file, typically <soc>-u-boot.dtsi, where <soc> is your CONFIG_SYS_SOC value.
450You can use other, more specific CONFIG options - see 'Automatic .dtsi
451inclusion' below.
452
Simon Glass7d6fade2022-08-07 16:33:26 -0600453.. _binman_syms:
Simon Glass9c0a8b12017-11-12 21:52:06 -0700454
Simon Glass072026e2021-03-18 20:25:14 +1300455Access to binman entry offsets at run time (symbols)
456----------------------------------------------------
457
458Binman assembles images and determines where each entry is placed in the image.
459This information may be useful to U-Boot at run time. For example, in SPL it
460is useful to be able to find the location of U-Boot so that it can be executed
461when SPL is finished.
462
463Binman allows you to declare symbols in the SPL image which are filled in
Simon Glass7d6fade2022-08-07 16:33:26 -0600464with their correct values during the build. For example:
465
466.. code-block:: c
Simon Glass072026e2021-03-18 20:25:14 +1300467
468 binman_sym_declare(ulong, u_boot_any, image_pos);
469
470declares a ulong value which will be assigned to the image-pos of any U-Boot
471image (u-boot.bin, u-boot.img, u-boot-nodtb.bin) that is present in the image.
Simon Glass7d6fade2022-08-07 16:33:26 -0600472You can access this value with something like:
473
474.. code-block:: c
Simon Glass072026e2021-03-18 20:25:14 +1300475
476 ulong u_boot_offset = binman_sym(ulong, u_boot_any, image_pos);
477
478Thus u_boot_offset will be set to the image-pos of U-Boot in memory, assuming
479that the whole image has been loaded, or is available in flash. You can then
480jump to that address to start U-Boot.
481
482At present this feature is only supported in SPL and TPL. In principle it is
483possible to fill in such symbols in U-Boot proper, as well, but a future C
484library is planned for this instead, to read from the device tree.
485
486As well as image-pos, it is possible to read the size of an entry and its
487offset (which is the start position of the entry within its parent).
488
489A small technical note: Binman automatically adds the base address of the image
490(i.e. __image_copy_start) to the value of the image-pos symbol, so that when the
491image is loaded to its linked address, the value will be correct and actually
492point into the image.
493
494For example, say SPL is at the start of the image and linked to start at address
49580108000. If U-Boot's image-pos is 0x8000 then binman will write an image-pos
496for U-Boot of 80110000 into the SPL binary, since it assumes the image is loaded
497to 80108000, with SPL at 80108000 and U-Boot at 80110000.
498
499For x86 devices (with the end-at-4gb property) this base address is not added
500since it is assumed that images are XIP and the offsets already include the
501address.
502
Simon Glassc1157862023-01-11 16:10:17 -0700503While U-Boot's symbol updating is handled automatically by the u-boot-spl
504entry type (and others), it is possible to use this feature with any blob. To
505do this, add a `write-symbols` (boolean) property to the node, set the ELF
506filename using `elf-filename` and set 'elf-base-sym' to the base symbol for the
507start of the binary image (this defaults to `__image_copy_start` which is what
508U-Boot uses). See `testBlobSymbol()` for an example.
509
Simon Glass23ab4e02023-01-07 14:07:11 -0700510.. _binman_fdt:
Simon Glass072026e2021-03-18 20:25:14 +1300511
512Access to binman entry offsets at run time (fdt)
513------------------------------------------------
514
515Binman can update the U-Boot FDT to include the final position and size of
516each entry in the images it processes. The option to enable this is -u and it
517causes binman to make sure that the 'offset', 'image-pos' and 'size' properties
518are set correctly for every entry. Since it is not necessary to specify these in
519the image definition, binman calculates the final values and writes these to
520the device tree. These can be used by U-Boot at run-time to find the location
521of each entry.
522
523Alternatively, an FDT map entry can be used to add a special FDT containing
524just the information about the image. This is preceded by a magic string so can
525be located anywhere in the image. An image header (typically at the start or end
526of the image) can be used to point to the FDT map. See fdtmap and image-header
527entries for more information.
528
Simon Glass072026e2021-03-18 20:25:14 +1300529Map files
530---------
531
532The -m option causes binman to output a .map file for each image that it
533generates. This shows the offset and size of each entry. For example::
534
535 Offset Size Name
536 00000000 00000028 main-section
537 00000000 00000010 section@0
538 00000000 00000004 u-boot
539 00000010 00000010 section@1
540 00000000 00000004 u-boot
541
542This shows a hierarchical image with two sections, each with a single entry. The
543offsets of the sections are absolute hex byte offsets within the image. The
544offsets of the entries are relative to their respective sections. The size of
545each entry is also shown, in bytes (hex). The indentation shows the entries
546nested inside their sections.
547
548
549Passing command-line arguments to entries
550-----------------------------------------
551
552Sometimes it is useful to pass binman the value of an entry property from the
553command line. For example some entries need access to files and it is not
554always convenient to put these filenames in the image definition (device tree).
555
Bin Meng2817c9d2021-05-10 20:23:30 +0800556The -a option supports this::
Simon Glass072026e2021-03-18 20:25:14 +1300557
Bin Meng2817c9d2021-05-10 20:23:30 +0800558 -a <prop>=<value>
Simon Glass072026e2021-03-18 20:25:14 +1300559
560where::
561
562 <prop> is the property to set
563 <value> is the value to set it to
564
565Not all properties can be provided this way. Only some entries support it,
566typically for filenames.
567
568
Simon Glassbf7fd502016-11-25 20:15:51 -0700569Image description format
Simon Glass072026e2021-03-18 20:25:14 +1300570========================
Simon Glassbf7fd502016-11-25 20:15:51 -0700571
572The binman node is called 'binman'. An example image description is shown
Simon Glass61adb2d2021-03-18 20:25:13 +1300573below::
Simon Glassbf7fd502016-11-25 20:15:51 -0700574
Simon Glass61adb2d2021-03-18 20:25:13 +1300575 binman {
576 filename = "u-boot-sunxi-with-spl.bin";
577 pad-byte = <0xff>;
578 blob {
579 filename = "spl/sunxi-spl.bin";
580 };
581 u-boot {
582 offset = <CONFIG_SPL_PAD_TO>;
583 };
584 };
Simon Glassbf7fd502016-11-25 20:15:51 -0700585
586
587This requests binman to create an image file called u-boot-sunxi-with-spl.bin
588consisting of a specially formatted SPL (spl/sunxi-spl.bin, built by the
589normal U-Boot Makefile), some 0xff padding, and a U-Boot legacy image. The
590padding comes from the fact that the second binary is placed at
591CONFIG_SPL_PAD_TO. If that line were omitted then the U-Boot binary would
592immediately follow the SPL binary.
593
594The binman node describes an image. The sub-nodes describe entries in the
595image. Each entry represents a region within the overall image. The name of
596the entry (blob, u-boot) tells binman what to put there. For 'blob' we must
597provide a filename. For 'u-boot', binman knows that this means 'u-boot.bin'.
598
599Entries are normally placed into the image sequentially, one after the other.
600The image size is the total size of all entries. As you can see, you can
Simon Glass3ab95982018-08-01 15:22:37 -0600601specify the start offset of an entry using the 'offset' property.
Simon Glassbf7fd502016-11-25 20:15:51 -0700602
603Note that due to a device tree requirement, all entries must have a unique
604name. If you want to put the same binary in the image multiple times, you can
605use any unique name, with the 'type' property providing the type.
606
607The attributes supported for entries are described below.
608
Simon Glass3ab95982018-08-01 15:22:37 -0600609offset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300610 This sets the offset of an entry within the image or section containing
611 it. The first byte of the image is normally at offset 0. If 'offset' is
612 not provided, binman sets it to the end of the previous region, or the
613 start of the image's entry area (normally 0) if there is no previous
614 region.
Simon Glassbf7fd502016-11-25 20:15:51 -0700615
616align:
Simon Glass61adb2d2021-03-18 20:25:13 +1300617 This sets the alignment of the entry. The entry offset is adjusted
618 so that the entry starts on an aligned boundary within the containing
619 section or image. For example 'align = <16>' means that the entry will
620 start on a 16-byte boundary. This may mean that padding is added before
621 the entry. The padding is part of the containing section but is not
622 included in the entry, meaning that an empty space may be created before
623 the entry starts. Alignment should be a power of 2. If 'align' is not
624 provided, no alignment is performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700625
626size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300627 This sets the size of the entry. The contents will be padded out to
628 this size. If this is not provided, it will be set to the size of the
629 contents.
Simon Glassbf7fd502016-11-25 20:15:51 -0700630
Samuel Hollandb01ae032023-01-21 17:25:16 -0600631min-size:
632 Sets the minimum size of the entry. This size includes explicit padding
633 ('pad-before' and 'pad-after'), but not padding added to meet alignment
634 requirements. While this does not affect the contents of the entry within
635 binman itself (the padding is performed only when its parent section is
636 assembled), the end result will be that the entry ends with the padding
637 bytes, so may grow. Defaults to 0.
638
Simon Glassbf7fd502016-11-25 20:15:51 -0700639pad-before:
Simon Glass61adb2d2021-03-18 20:25:13 +1300640 Padding before the contents of the entry. Normally this is 0, meaning
641 that the contents start at the beginning of the entry. This can be used
642 to offset the entry contents a little. While this does not affect the
643 contents of the entry within binman itself (the padding is performed
644 only when its parent section is assembled), the end result will be that
645 the entry starts with the padding bytes, so may grow. Defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700646
647pad-after:
Simon Glass61adb2d2021-03-18 20:25:13 +1300648 Padding after the contents of the entry. Normally this is 0, meaning
649 that the entry ends at the last byte of content (unless adjusted by
650 other properties). This allows room to be created in the image for
651 this entry to expand later. While this does not affect the contents of
652 the entry within binman itself (the padding is performed only when its
653 parent section is assembled), the end result will be that the entry ends
654 with the padding bytes, so may grow. Defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700655
656align-size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300657 This sets the alignment of the entry size. For example, to ensure
658 that the size of an entry is a multiple of 64 bytes, set this to 64.
659 While this does not affect the contents of the entry within binman
660 itself (the padding is performed only when its parent section is
661 assembled), the end result is that the entry ends with the padding
662 bytes, so may grow. If 'align-size' is not provided, no alignment is
663 performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700664
665align-end:
Simon Glass61adb2d2021-03-18 20:25:13 +1300666 This sets the alignment of the end of an entry with respect to the
667 containing section. Some entries require that they end on an alignment
668 boundary, regardless of where they start. This does not move the start
669 of the entry, so the contents of the entry will still start at the
670 beginning. But there may be padding at the end. While this does not
671 affect the contents of the entry within binman itself (the padding is
672 performed only when its parent section is assembled), the end result
673 is that the entry ends with the padding bytes, so may grow.
674 If 'align-end' is not provided, no alignment is performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700675
676filename:
Simon Glass61adb2d2021-03-18 20:25:13 +1300677 For 'blob' types this provides the filename containing the binary to
678 put into the entry. If binman knows about the entry type (like
679 u-boot-bin), then there is no need to specify this.
Simon Glassbf7fd502016-11-25 20:15:51 -0700680
681type:
Simon Glass61adb2d2021-03-18 20:25:13 +1300682 Sets the type of an entry. This defaults to the entry name, but it is
683 possible to use any name, and then add (for example) 'type = "u-boot"'
684 to specify the type.
Simon Glassbf7fd502016-11-25 20:15:51 -0700685
Simon Glass3ab95982018-08-01 15:22:37 -0600686offset-unset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300687 Indicates that the offset of this entry should not be set by placing
688 it immediately after the entry before. Instead, is set by another
689 entry which knows where this entry should go. When this boolean
690 property is present, binman will give an error if another entry does
691 not set the offset (with the GetOffsets() method).
Simon Glass258fb0e2018-06-01 09:38:17 -0600692
Simon Glassdbf6be92018-08-01 15:22:42 -0600693image-pos:
Simon Glass61adb2d2021-03-18 20:25:13 +1300694 This cannot be set on entry (or at least it is ignored if it is), but
695 with the -u option, binman will set it to the absolute image position
696 for each entry. This makes it easy to find out exactly where the entry
697 ended up in the image, regardless of parent sections, etc.
Simon Glassdbf6be92018-08-01 15:22:42 -0600698
Simon Glass80a66ae2022-03-05 20:18:59 -0700699extend-size:
700 Extend the size of this entry to fit available space. This space is only
Simon Glass61adb2d2021-03-18 20:25:13 +1300701 limited by the size of the image/section and the position of the next
702 entry.
Simon Glassbf7fd502016-11-25 20:15:51 -0700703
Simon Glass8287ee82019-07-08 14:25:30 -0600704compress:
Simon Glass61adb2d2021-03-18 20:25:13 +1300705 Sets the compression algortihm to use (for blobs only). See the entry
706 documentation for details.
Simon Glass8287ee82019-07-08 14:25:30 -0600707
Simon Glassb2381432020-09-06 10:39:09 -0600708missing-msg:
Simon Glass61adb2d2021-03-18 20:25:13 +1300709 Sets the tag of the message to show if this entry is missing. This is
710 used for external blobs. When they are missing it is helpful to show
711 information about what needs to be fixed. See missing-blob-help for the
712 message for each tag.
Simon Glassb2381432020-09-06 10:39:09 -0600713
Simon Glass3d433382021-03-21 18:24:30 +1300714no-expanded:
715 By default binman substitutes entries with expanded versions if available,
716 so that a `u-boot` entry type turns into `u-boot-expanded`, for example. The
717 `--no-expanded` command-line option disables this globally. The
718 `no-expanded` property disables this just for a single entry. Put the
719 `no-expanded` boolean property in the node to select this behaviour.
720
Simon Glass67a05012023-01-07 14:07:15 -0700721optional:
722 External blobs are normally required to be present for the image to be
723 built (but see `External blobs`_). This properly allows an entry to be
724 optional, so that when it is cannot be found, this problem is ignored and
725 an empty file is used for this blob. This should be used only when the blob
726 is entirely optional and is not needed for correct operation of the image.
727 Note that missing, optional blobs do not produce a non-zero exit code from
728 binman, although it does show a warning about the missing external blob.
729
Simon Glass9c888cc2018-09-14 04:57:30 -0600730The attributes supported for images and sections are described below. Several
731are similar to those for entries.
Simon Glassbf7fd502016-11-25 20:15:51 -0700732
733size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300734 Sets the image size in bytes, for example 'size = <0x100000>' for a
735 1MB image.
Simon Glassbf7fd502016-11-25 20:15:51 -0700736
Simon Glass9481c802019-04-25 21:58:39 -0600737offset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300738 This is similar to 'offset' in entries, setting the offset of a section
739 within the image or section containing it. The first byte of the section
740 is normally at offset 0. If 'offset' is not provided, binman sets it to
741 the end of the previous region, or the start of the image's entry area
742 (normally 0) if there is no previous region.
Simon Glass9481c802019-04-25 21:58:39 -0600743
Simon Glassbf7fd502016-11-25 20:15:51 -0700744align-size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300745 This sets the alignment of the image size. For example, to ensure
746 that the image ends on a 512-byte boundary, use 'align-size = <512>'.
747 If 'align-size' is not provided, no alignment is performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700748
749pad-before:
Simon Glass61adb2d2021-03-18 20:25:13 +1300750 This sets the padding before the image entries. The first entry will
751 be positioned after the padding. This defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700752
753pad-after:
Simon Glass61adb2d2021-03-18 20:25:13 +1300754 This sets the padding after the image entries. The padding will be
755 placed after the last entry. This defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700756
757pad-byte:
Simon Glass61adb2d2021-03-18 20:25:13 +1300758 This specifies the pad byte to use when padding in the image. It
759 defaults to 0. To use 0xff, you would add 'pad-byte = <0xff>'.
Simon Glassbf7fd502016-11-25 20:15:51 -0700760
761filename:
Simon Glass61adb2d2021-03-18 20:25:13 +1300762 This specifies the image filename. It defaults to 'image.bin'.
Simon Glassbf7fd502016-11-25 20:15:51 -0700763
Simon Glass3ab95982018-08-01 15:22:37 -0600764sort-by-offset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300765 This causes binman to reorder the entries as needed to make sure they
766 are in increasing positional order. This can be used when your entry
767 order may not match the positional order. A common situation is where
768 the 'offset' properties are set by CONFIG options, so their ordering is
769 not known a priori.
Simon Glassbf7fd502016-11-25 20:15:51 -0700770
Simon Glass61adb2d2021-03-18 20:25:13 +1300771 This is a boolean property so needs no value. To enable it, add a
772 line 'sort-by-offset;' to your description.
Simon Glassbf7fd502016-11-25 20:15:51 -0700773
774multiple-images:
Simon Glass61adb2d2021-03-18 20:25:13 +1300775 Normally only a single image is generated. To create more than one
776 image, put this property in the binman node. For example, this will
777 create image1.bin containing u-boot.bin, and image2.bin containing
778 both spl/u-boot-spl.bin and u-boot.bin::
Simon Glassbf7fd502016-11-25 20:15:51 -0700779
Simon Glass61adb2d2021-03-18 20:25:13 +1300780 binman {
781 multiple-images;
782 image1 {
783 u-boot {
784 };
785 };
Simon Glassbf7fd502016-11-25 20:15:51 -0700786
Simon Glass61adb2d2021-03-18 20:25:13 +1300787 image2 {
788 spl {
789 };
790 u-boot {
791 };
792 };
793 };
Simon Glassbf7fd502016-11-25 20:15:51 -0700794
795end-at-4gb:
Simon Glass61adb2d2021-03-18 20:25:13 +1300796 For x86 machines the ROM offsets start just before 4GB and extend
797 up so that the image finished at the 4GB boundary. This boolean
798 option can be enabled to support this. The image size must be
799 provided so that binman knows when the image should start. For an
800 8MB ROM, the offset of the first entry would be 0xfff80000 with
801 this option, instead of 0 without this option.
Simon Glassbf7fd502016-11-25 20:15:51 -0700802
Jagdish Gediya94b57db2018-09-03 21:35:07 +0530803skip-at-start:
Simon Glass61adb2d2021-03-18 20:25:13 +1300804 This property specifies the entry offset of the first entry.
Jagdish Gediya94b57db2018-09-03 21:35:07 +0530805
Simon Glass98463902022-10-20 18:22:39 -0600806 For PowerPC mpc85xx based CPU, CONFIG_TEXT_BASE is the entry
Simon Glass61adb2d2021-03-18 20:25:13 +1300807 offset of the first entry. It can be 0xeff40000 or 0xfff40000 for
808 nor flash boot, 0x201000 for sd boot etc.
Jagdish Gediya94b57db2018-09-03 21:35:07 +0530809
Simon Glass98463902022-10-20 18:22:39 -0600810 'end-at-4gb' property is not applicable where CONFIG_TEXT_BASE +
Simon Glass61adb2d2021-03-18 20:25:13 +1300811 Image size != 4gb.
Simon Glassbf7fd502016-11-25 20:15:51 -0700812
Simon Glass5ff9fed2021-03-21 18:24:33 +1300813align-default:
814 Specifies the default alignment for entries in this section, if they do
815 not specify an alignment. Note that this only applies to top-level entries
816 in the section (direct subentries), not any subentries of those entries.
817 This means that each section must specify its own default alignment, if
818 required.
819
Neha Malcom Francis3545e852022-10-17 16:36:25 +0530820symlink:
821 Adds a symlink to the image with string given in the symlink property.
822
Simon Glass9766f692023-01-11 16:10:16 -0700823overlap:
824 Indicates that this entry overlaps with others in the same section. These
825 entries should appear at the end of the section. Overlapping entries are not
826 packed with other entries, but their contents are written over other entries
827 in the section. Overlapping entries must have an explicit offset and size.
828
Simon Glassc1157862023-01-11 16:10:17 -0700829write-symbols:
830 Indicates that the blob should be updated with symbol values calculated by
831 binman. This is automatic for certain entry types, e.g. `u-boot-spl`. See
832 binman_syms_ for more information.
833
834elf-filename:
835 Sets the file name of a blob's associated ELF file. For example, if the
836 blob is `zephyr.bin` then the ELF file may be `zephyr.elf`. This allows
837 binman to locate symbols and understand the structure of the blob. See
838 binman_syms_ for more information.
839
840elf-base-sym:
841 Sets the name of the ELF symbol that points to the start of a blob. For
842 U-Boot this is `__image_copy_start` and that is the default used by binman
843 if this property is missing. For other projects, a difference symbol may be
844 needed. Add this symbol to the properties for the blob so that symbols can
845 be read correctly. See binman_syms_ for more information.
846
Simon Glass571bc4e2023-01-11 16:10:19 -0700847offset-from-elf:
848 Sets the offset of an entry based on a symbol value in an another entry.
849 The format is <&phandle>, "sym_name", <offset> where phandle is the entry
850 containing the blob (with associated ELF file providing symbols), <sym_name>
851 is the symbol to lookup (relative to elf-base-sym) and <offset> is an offset
852 to add to that value.
853
Simon Glass9dbb02b2023-02-12 17:11:15 -0700854preserve:
855 Indicates that this entry should be preserved by any firmware updates. This
856 flag should be checked by the updater when it is deciding which entries to
857 update. This flag is normally attached to sections but can be attached to
858 a single entry in a section if the updater supports it. Not that binman
859 itself has no control over the updater's behaviour, so this is just a
860 signal. It is not enforced by binman.
861
Simon Glassbf7fd502016-11-25 20:15:51 -0700862Examples of the above options can be found in the tests. See the
863tools/binman/test directory.
864
Simon Glassdd57c132018-06-01 09:38:11 -0600865It is possible to have the same binary appear multiple times in the image,
866either by using a unit number suffix (u-boot@0, u-boot@1) or by using a
867different name for each and specifying the type with the 'type' attribute.
868
Simon Glassbf7fd502016-11-25 20:15:51 -0700869
Michael Heimpold383d2562018-08-22 22:01:24 +0200870Sections and hierachical images
Simon Glass18546952018-06-01 09:38:16 -0600871-------------------------------
872
873Sometimes it is convenient to split an image into several pieces, each of which
874contains its own set of binaries. An example is a flash device where part of
875the image is read-only and part is read-write. We can set up sections for each
876of these, and place binaries in them independently. The image is still produced
877as a single output file.
878
879This feature provides a way of creating hierarchical images. For example here
Simon Glass7ae5f312018-06-01 09:38:19 -0600880is an example image with two copies of U-Boot. One is read-only (ro), intended
881to be written only in the factory. Another is read-write (rw), so that it can be
Simon Glass18546952018-06-01 09:38:16 -0600882upgraded in the field. The sizes are fixed so that the ro/rw boundary is known
Simon Glass61adb2d2021-03-18 20:25:13 +1300883and can be programmed::
Simon Glass18546952018-06-01 09:38:16 -0600884
Simon Glass61adb2d2021-03-18 20:25:13 +1300885 binman {
886 section@0 {
887 read-only;
888 name-prefix = "ro-";
889 size = <0x100000>;
890 u-boot {
891 };
892 };
893 section@1 {
894 name-prefix = "rw-";
895 size = <0x100000>;
896 u-boot {
897 };
898 };
899 };
Simon Glass18546952018-06-01 09:38:16 -0600900
901This image could be placed into a SPI flash chip, with the protection boundary
902set at 1MB.
903
904A few special properties are provided for sections:
905
906read-only:
Simon Glass61adb2d2021-03-18 20:25:13 +1300907 Indicates that this section is read-only. This has no impact on binman's
908 operation, but his property can be read at run time.
Simon Glass18546952018-06-01 09:38:16 -0600909
Simon Glassc8d48ef2018-06-01 09:38:21 -0600910name-prefix:
Simon Glass61adb2d2021-03-18 20:25:13 +1300911 This string is prepended to all the names of the binaries in the
912 section. In the example above, the 'u-boot' binaries which actually be
913 renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to
914 distinguish binaries with otherwise identical names.
Simon Glassc8d48ef2018-06-01 09:38:21 -0600915
Simon Glassefddab62023-01-07 14:07:08 -0700916filename:
917 This allows the contents of the section to be written to a file in the
918 output directory. This can sometimes be useful to use the data in one
919 section in different image, since there is currently no way to share data
920 beteen images other than through files.
Simon Glass18546952018-06-01 09:38:16 -0600921
Simon Glass12bb1a92019-07-20 12:23:51 -0600922Image Properties
923----------------
924
925Image nodes act like sections but also have a few extra properties:
926
927filename:
Simon Glass61adb2d2021-03-18 20:25:13 +1300928 Output filename for the image. This defaults to image.bin (or in the
929 case of multiple images <nodename>.bin where <nodename> is the name of
930 the image node.
Simon Glass12bb1a92019-07-20 12:23:51 -0600931
932allow-repack:
Simon Glass61adb2d2021-03-18 20:25:13 +1300933 Create an image that can be repacked. With this option it is possible
934 to change anything in the image after it is created, including updating
935 the position and size of image components. By default this is not
936 permitted since it is not possibly to know whether this might violate a
937 constraint in the image description. For example, if a section has to
938 increase in size to hold a larger binary, that might cause the section
939 to fall out of its allow region (e.g. read-only portion of flash).
Simon Glass12bb1a92019-07-20 12:23:51 -0600940
Simon Glass61adb2d2021-03-18 20:25:13 +1300941 Adding this property causes the original offset and size values in the
942 image description to be stored in the FDT and fdtmap.
Simon Glass12bb1a92019-07-20 12:23:51 -0600943
944
Simon Glass86e54462022-08-18 02:16:46 -0600945Image dependencies
946------------------
947
948Binman does not currently support images that depend on each other. For example,
949if one image creates `fred.bin` and then the next uses this `fred.bin` to
950produce a final `image.bin`, then the behaviour is undefined. It may work, or it
951may produce an error about `fred.bin` being missing, or it may use a version of
952`fred.bin` from a previous run.
953
954Often this can be handled by incorporating the dependency into the second
955image. For example, instead of::
956
957 binman {
958 multiple-images;
959
960 fred {
961 u-boot {
962 };
963 fill {
964 size = <0x100>;
965 };
966 };
967
968 image {
969 blob {
970 filename = "fred.bin";
971 };
972 u-boot-spl {
973 };
974 };
975
976you can do this::
977
978 binman {
979 image {
980 fred {
981 type = "section";
982 u-boot {
983 };
984 fill {
985 size = <0x100>;
986 };
987 };
988 u-boot-spl {
989 };
990 };
991
992
993
Simon Glass072026e2021-03-18 20:25:14 +1300994Hashing Entries
995---------------
996
997It is possible to ask binman to hash the contents of an entry and write that
998value back to the device-tree node. For example::
999
1000 binman {
1001 u-boot {
1002 hash {
1003 algo = "sha256";
1004 };
1005 };
1006 };
1007
1008Here, a new 'value' property will be written to the 'hash' node containing
1009the hash of the 'u-boot' entry. Only SHA256 is supported at present. Whole
1010sections can be hased if desired, by adding the 'hash' node to the section.
1011
1012The has value can be chcked at runtime by hashing the data actually read and
1013comparing this has to the value in the device tree.
1014
1015
1016Expanded entries
1017----------------
1018
1019Binman automatically replaces 'u-boot' with an expanded version of that, i.e.
1020'u-boot-expanded'. This means that when you write::
1021
1022 u-boot {
1023 };
1024
1025you actually get::
1026
1027 u-boot {
1028 type = "u-boot-expanded';
1029 };
1030
1031which in turn expands to::
1032
1033 u-boot {
1034 type = "section";
1035
1036 u-boot-nodtb {
1037 };
1038
1039 u-boot-dtb {
1040 };
1041 };
1042
1043U-Boot's various phase binaries actually comprise two or three pieces.
1044For example, u-boot.bin has the executable followed by a devicetree.
1045
1046With binman we want to be able to update that devicetree with full image
1047information so that it is accessible to the executable. This is tricky
1048if it is not clear where the devicetree starts.
1049
1050The above feature ensures that the devicetree is clearly separated from the
1051U-Boot executable and can be updated separately by binman as needed. It can be
1052disabled with the --no-expanded flag if required.
1053
Heiko Thiery2ce07382022-01-24 08:11:01 +01001054The same applies for u-boot-spl and u-boot-tpl. In those cases, the expansion
Simon Glass072026e2021-03-18 20:25:14 +13001055includes the BSS padding, so for example::
1056
1057 spl {
1058 type = "u-boot-spl"
1059 };
1060
1061you actually get::
1062
1063 spl {
1064 type = "u-boot-expanded';
1065 };
1066
1067which in turn expands to::
1068
1069 spl {
1070 type = "section";
1071
1072 u-boot-spl-nodtb {
1073 };
1074
1075 u-boot-spl-bss-pad {
1076 };
1077
1078 u-boot-spl-dtb {
1079 };
1080 };
1081
1082Of course we should not expand SPL if it has no devicetree. Also if the BSS
1083padding is not needed (because BSS is in RAM as with CONFIG_SPL_SEPARATE_BSS),
1084the 'u-boot-spl-bss-pad' subnode should not be created. The use of the expaned
1085entry type is controlled by the UseExpanded() method. In the SPL case it checks
1086the 'spl-dtb' entry arg, which is 'y' or '1' if SPL has a devicetree.
1087
1088For the BSS case, a 'spl-bss-pad' entry arg controls whether it is present. All
1089entry args are provided by the U-Boot Makefile.
1090
1091
Simon Glassc8c9f312023-01-07 14:07:12 -07001092Optional entries
1093----------------
1094
1095Some entries need to exist only if certain conditions are met. For example, an
1096entry may want to appear in the image only if a file has a particular format.
1097Obviously the entry must exist in the image description for it to be processed
1098at all, so a way needs to be found to have the entry remove itself.
1099
1100To handle this, when entry.ObtainContents() is called, the entry can call
1101entry.mark_absent() to mark itself as absent, passing a suitable message as the
1102reason.
1103
1104Any absent entries are dropped immediately after ObtainContents() has been
1105called on all entries.
1106
1107It is not possible for an entry to mark itself absent at any other point in the
1108processing. It must happen in the ObtainContents() method.
1109
1110The effect is as if the entry had never been present at all, since the image
1111is packed without it and it disappears from the list of entries.
1112
1113
Simon Glass072026e2021-03-18 20:25:14 +13001114Compression
1115-----------
1116
1117Binman support compression for 'blob' entries (those of type 'blob' and
1118derivatives). To enable this for an entry, add a 'compress' property::
1119
1120 blob {
1121 filename = "datafile";
1122 compress = "lz4";
1123 };
1124
1125The entry will then contain the compressed data, using the 'lz4' compression
1126algorithm. Currently this is the only one that is supported. The uncompressed
1127size is written to the node in an 'uncomp-size' property, if -u is used.
1128
1129Compression is also supported for sections. In that case the entire section is
1130compressed in one block, including all its contents. This means that accessing
1131an entry from the section required decompressing the entire section. Also, the
1132size of a section indicates the space that it consumes in its parent section
1133(and typically the image). With compression, the section may contain more data,
1134and the uncomp-size property indicates that, as above. The contents of the
1135section is compressed first, before any padding is added. This ensures that the
1136padding itself is not compressed, which would be a waste of time.
1137
1138
1139Automatic .dtsi inclusion
1140-------------------------
1141
1142It is sometimes inconvenient to add a 'binman' node to the .dts file for each
1143board. This can be done by using #include to bring in a common file. Another
1144approach supported by the U-Boot build system is to automatically include
1145a common header. You can then put the binman node (and anything else that is
Simon Glasse316fba2023-02-13 08:56:34 -07001146specific to U-Boot, such as bootph-all properies) in that header file.
Simon Glass072026e2021-03-18 20:25:14 +13001147
1148Binman will search for the following files in arch/<arch>/dts::
1149
1150 <dts>-u-boot.dtsi where <dts> is the base name of the .dts file
1151 <CONFIG_SYS_SOC>-u-boot.dtsi
1152 <CONFIG_SYS_CPU>-u-boot.dtsi
1153 <CONFIG_SYS_VENDOR>-u-boot.dtsi
1154 u-boot.dtsi
1155
1156U-Boot will only use the first one that it finds. If you need to include a
1157more general file you can do that from the more specific file using #include.
Simon Glassed966832021-12-16 20:59:23 -07001158If you are having trouble figuring out what is going on, you can use
1159`DEVICE_TREE_DEBUG=1` with your build::
Simon Glass072026e2021-03-18 20:25:14 +13001160
Simon Glassed966832021-12-16 20:59:23 -07001161 make DEVICE_TREE_DEBUG=1
1162 scripts/Makefile.lib:334: Automatic .dtsi inclusion: options:
1163 arch/arm/dts/juno-r2-u-boot.dtsi arch/arm/dts/-u-boot.dtsi
1164 arch/arm/dts/armv8-u-boot.dtsi arch/arm/dts/armltd-u-boot.dtsi
1165 arch/arm/dts/u-boot.dtsi ... found: "arch/arm/dts/juno-r2-u-boot.dtsi"
Simon Glass072026e2021-03-18 20:25:14 +13001166
1167
Simon Glass0427bed2021-11-03 21:09:18 -06001168Updating an ELF file
1169====================
1170
1171For the EFI app, where U-Boot is loaded from UEFI and runs as an app, there is
1172no way to update the devicetree after U-Boot is built. Normally this works by
1173creating a new u-boot.dtb.out with he updated devicetree, which is automatically
1174built into the output image. With ELF this is not possible since the ELF is
1175not part of an image, just a stand-along file. We must create an updated ELF
1176file with the new devicetree.
1177
1178This is handled by the --update-fdt-in-elf option. It takes four arguments,
1179separated by comma:
1180
1181 infile - filename of input ELF file, e.g. 'u-boot's
1182 outfile - filename of output ELF file, e.g. 'u-boot.out'
1183 begin_sym - symbol at the start of the embedded devicetree, e.g.
1184 '__dtb_dt_begin'
1185 end_sym - symbol at the start of the embedded devicetree, e.g.
1186 '__dtb_dt_end'
1187
1188When this flag is used, U-Boot does all the normal packaging, but as an
1189additional step, it creates a new ELF file with the new devicetree embedded in
1190it.
1191
1192If logging is enabled you will see a message like this::
1193
1194 Updating file 'u-boot' with data length 0x400a (16394) between symbols
1195 '__dtb_dt_begin' and '__dtb_dt_end'
1196
1197There must be enough space for the updated devicetree. If not, an error like
1198the following is produced::
1199
1200 ValueError: Not enough space in 'u-boot' for data length 0x400a (16394);
1201 size is 0x1744 (5956)
1202
1203
Simon Glass5a5da7c2018-07-17 13:25:37 -06001204Entry Documentation
Simon Glassfcae6682021-03-18 20:25:17 +13001205===================
Simon Glass5a5da7c2018-07-17 13:25:37 -06001206
1207For details on the various entry types supported by binman and how to use them,
Simon Glassfcae6682021-03-18 20:25:17 +13001208see entries.rst which is generated from the source code using:
Simon Glass5a5da7c2018-07-17 13:25:37 -06001209
Simon Glassfcae6682021-03-18 20:25:17 +13001210 binman entry-docs >tools/binman/entries.rst
1211
1212.. toctree::
1213 :maxdepth: 2
1214
1215 entries
Simon Glass5a5da7c2018-07-17 13:25:37 -06001216
1217
Simon Glass072026e2021-03-18 20:25:14 +13001218Managing images
1219===============
1220
Simon Glass61f564d2019-07-08 14:25:48 -06001221Listing images
1222--------------
1223
1224It is possible to list the entries in an existing firmware image created by
Simon Glass61adb2d2021-03-18 20:25:13 +13001225binman, provided that there is an 'fdtmap' entry in the image. For example::
Simon Glass61f564d2019-07-08 14:25:48 -06001226
1227 $ binman ls -i image.bin
1228 Name Image-pos Size Entry-type Offset Uncomp-size
1229 ----------------------------------------------------------------------
1230 main-section c00 section 0
1231 u-boot 0 4 u-boot 0
1232 section 5fc section 4
1233 cbfs 100 400 cbfs 0
1234 u-boot 138 4 u-boot 38
1235 u-boot-dtb 180 108 u-boot-dtb 80 3b5
1236 u-boot-dtb 500 1ff u-boot-dtb 400 3b5
1237 fdtmap 6fc 381 fdtmap 6fc
1238 image-header bf8 8 image-header bf8
1239
1240This shows the hierarchy of the image, the position, size and type of each
1241entry, the offset of each entry within its parent and the uncompressed size if
1242the entry is compressed.
1243
Simon Glass61adb2d2021-03-18 20:25:13 +13001244It is also possible to list just some files in an image, e.g.::
Simon Glass61f564d2019-07-08 14:25:48 -06001245
1246 $ binman ls -i image.bin section/cbfs
1247 Name Image-pos Size Entry-type Offset Uncomp-size
1248 --------------------------------------------------------------------
1249 cbfs 100 400 cbfs 0
1250 u-boot 138 4 u-boot 38
1251 u-boot-dtb 180 108 u-boot-dtb 80 3b5
1252
Simon Glass61adb2d2021-03-18 20:25:13 +13001253or with wildcards::
Simon Glass61f564d2019-07-08 14:25:48 -06001254
1255 $ binman ls -i image.bin "*cb*" "*head*"
1256 Name Image-pos Size Entry-type Offset Uncomp-size
1257 ----------------------------------------------------------------------
1258 cbfs 100 400 cbfs 0
1259 u-boot 138 4 u-boot 38
1260 u-boot-dtb 180 108 u-boot-dtb 80 3b5
1261 image-header bf8 8 image-header bf8
1262
Simon Glass858436d2021-11-23 21:09:49 -07001263If an older version of binman is used to list images created by a newer one, it
1264is possible that it will contain entry types that are not supported. These still
1265show with the correct type, but binman just sees them as blobs (plain binary
1266data). Any special features of that etype are not supported by the old binman.
1267
Simon Glass61f564d2019-07-08 14:25:48 -06001268
Simon Glass71ce0ba2019-07-08 14:25:52 -06001269Extracting files from images
1270----------------------------
1271
1272You can extract files from an existing firmware image created by binman,
Simon Glass61adb2d2021-03-18 20:25:13 +13001273provided that there is an 'fdtmap' entry in the image. For example::
Simon Glass71ce0ba2019-07-08 14:25:52 -06001274
1275 $ binman extract -i image.bin section/cbfs/u-boot
1276
1277which will write the uncompressed contents of that entry to the file 'u-boot' in
1278the current directory. You can also extract to a particular file, in this case
Simon Glass61adb2d2021-03-18 20:25:13 +13001279u-boot.bin::
Simon Glass71ce0ba2019-07-08 14:25:52 -06001280
1281 $ binman extract -i image.bin section/cbfs/u-boot -f u-boot.bin
1282
1283It is possible to extract all files into a destination directory, which will
Simon Glass61adb2d2021-03-18 20:25:13 +13001284put files in subdirectories matching the entry hierarchy::
Simon Glass71ce0ba2019-07-08 14:25:52 -06001285
1286 $ binman extract -i image.bin -O outdir
1287
Simon Glass61adb2d2021-03-18 20:25:13 +13001288or just a selection::
Simon Glass71ce0ba2019-07-08 14:25:52 -06001289
1290 $ binman extract -i image.bin "*u-boot*" -O outdir
1291
Simon Glass943bf782021-11-23 21:09:50 -07001292Some entry types have alternative formats, for example fdtmap which allows
1293extracted just the devicetree binary without the fdtmap header::
1294
1295 $ binman extract -i /tmp/b/odroid-c4/image.bin -f out.dtb -F fdt fdtmap
1296 $ fdtdump out.dtb
1297 /dts-v1/;
1298 // magic: 0xd00dfeed
1299 // totalsize: 0x8ab (2219)
1300 // off_dt_struct: 0x38
1301 // off_dt_strings: 0x82c
1302 // off_mem_rsvmap: 0x28
1303 // version: 17
1304 // last_comp_version: 2
1305 // boot_cpuid_phys: 0x0
1306 // size_dt_strings: 0x7f
1307 // size_dt_struct: 0x7f4
1308
1309 / {
1310 image-node = "binman";
1311 image-pos = <0x00000000>;
1312 size = <0x0011162b>;
1313 ...
1314
1315Use `-F list` to see what alternative formats are available::
1316
1317 $ binman extract -i /tmp/b/odroid-c4/image.bin -F list
1318 Flag (-F) Entry type Description
1319 fdt fdtmap Extract the devicetree blob from the fdtmap
1320
Simon Glass71ce0ba2019-07-08 14:25:52 -06001321
Simon Glass10f9d002019-07-20 12:23:50 -06001322Replacing files in an image
1323---------------------------
1324
1325You can replace files in an existing firmware image created by binman, provided
Simon Glass79450772021-11-23 21:09:48 -07001326that there is an 'fdtmap' entry in the image. For example::
Simon Glass10f9d002019-07-20 12:23:50 -06001327
1328 $ binman replace -i image.bin section/cbfs/u-boot
1329
1330which will write the contents of the file 'u-boot' from the current directory
Simon Glassa6cb9952019-07-20 12:24:15 -06001331to the that entry, compressing if necessary. If the entry size changes, you must
1332add the 'allow-repack' property to the original image before generating it (see
1333above), otherwise you will get an error.
1334
Simon Glass61adb2d2021-03-18 20:25:13 +13001335You can also use a particular file, in this case u-boot.bin::
Simon Glassa6cb9952019-07-20 12:24:15 -06001336
1337 $ binman replace -i image.bin section/cbfs/u-boot -f u-boot.bin
1338
1339It is possible to replace all files from a source directory which uses the same
Simon Glass61adb2d2021-03-18 20:25:13 +13001340hierarchy as the entries::
Simon Glassa6cb9952019-07-20 12:24:15 -06001341
1342 $ binman replace -i image.bin -I indir
1343
1344Files that are missing will generate a warning.
1345
Simon Glass61adb2d2021-03-18 20:25:13 +13001346You can also replace just a selection of entries::
Simon Glassa6cb9952019-07-20 12:24:15 -06001347
1348 $ binman replace -i image.bin "*u-boot*" -I indir
Simon Glass10f9d002019-07-20 12:23:50 -06001349
Simon Glass7caa3722023-03-02 17:02:44 -07001350It is possible to replace whole sections as well, but in that case any
1351information about entries within the section may become outdated. This is
1352because Binman cannot know whether things have moved around or resized within
1353the section, once you have updated its data.
1354
1355Technical note: With 'allow-repack', Binman writes information about the
1356original offset and size properties of each entry, if any were specified, in
1357the 'orig-offset' and 'orig-size' properties. This allows Binman to distinguish
1358between an entry which ended up being packed at an offset (or assigned a size)
1359and an entry which had a particular offset / size requested in the Binman
1360configuration. Where are particular offset / size was requested, this is treated
1361as set in stone, so Binman will ensure it doesn't change. Without this feature,
1362repacking an entry might cause it to disobey the original constraints provided
1363when it was created.
1364
1365 Repacking an image involves
Simon Glass10f9d002019-07-20 12:23:50 -06001366
Simon Glass85760a62022-11-09 19:14:49 -07001367.. _`BinmanLogging`:
1368
Ivan Mikhaylov0f40e232023-03-08 01:13:38 +00001369Signing FIT container with private key in an image
1370--------------------------------------------------
1371
1372You can sign FIT container with private key in your image.
1373For example::
1374
1375 $ binman sign -i image.bin -k privatekey -a sha256,rsa4096 fit
1376
1377binman will extract FIT container, sign and replace it immediately.
1378
1379If you want to sign and replace FIT container in place::
1380
1381 $ binman sign -i image.bin -k privatekey -a sha256,rsa4096 -f fit.fit fit
1382
1383which will sign FIT container with private key and replace it immediately
1384inside your image.
1385
1386
Simon Glasseea264e2019-07-08 14:25:49 -06001387Logging
1388-------
1389
1390Binman normally operates silently unless there is an error, in which case it
1391just displays the error. The -D/--debug option can be used to create a full
Simon Glassef108042021-02-06 09:57:28 -07001392backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select
1393this.
Simon Glasseea264e2019-07-08 14:25:49 -06001394
1395Internally binman logs some output while it is running. This can be displayed
1396by increasing the -v/--verbosity from the default of 1:
1397
1398 0: silent
1399 1: warnings only
1400 2: notices (important messages)
1401 3: info about major operations
1402 4: detailed information about each operation
1403 5: debug (all output)
1404
Simon Glassef108042021-02-06 09:57:28 -07001405You can use BINMAN_VERBOSE=5 (for example) when building to select this.
Simon Glasseea264e2019-07-08 14:25:49 -06001406
Simon Glasse0ff8552016-11-25 20:15:53 -07001407
Simon Glass3e7749e2022-01-09 20:14:12 -07001408Bintools
1409========
1410
1411`Bintool` is the name binman gives to a binary tool which it uses to create and
1412manipulate binaries that binman cannot handle itself. Bintools are often
1413necessary since Binman only supports a subset of the available file formats
1414natively.
1415
1416Many SoC vendors invent ways to load code into their SoC using new file formats,
1417sometimes changing the format with successive SoC generations. Sometimes the
1418tool is available as Open Source. Sometimes it is a pre-compiled binary that
1419must be downloaded from the vendor's website. Sometimes it is available in
1420source form but difficult or slow to build.
1421
1422Even for images that use bintools, binman still assembles the image from its
1423image description. It may handle parts of the image natively and part with
1424various bintools.
1425
1426Binman relies on these tools so provides various features to manage them:
1427
1428- Determining whether the tool is currently installed
1429- Downloading or building the tool
1430- Determining the version of the tool that is installed
1431- Deciding which tools are needed to build an image
1432
1433The Bintool class is an interface to the tool, a thin level of abstration, using
1434Python functions to run the tool for each purpose (e.g. creating a new
1435structure, adding a file to an existing structure) rather than just lists of
1436string arguments.
1437
1438As with external blobs, bintools (which are like 'external' tools) can be
1439missing. When building an image requires a bintool and it is not installed,
1440binman detects this and reports the problem, but continues to build an image.
1441This is useful in CI systems which want to check that everything is correct but
1442don't have access to the bintools.
1443
1444To make this work, all calls to bintools (e.g. with Bintool.run_cmd()) must cope
1445with the tool being missing, i.e. when None is returned, by:
1446
1447- Calling self.record_missing_bintool()
1448- Setting up some fake contents so binman can continue
1449
1450Of course the image will not work, but binman reports which bintools are needed
1451and also provide a way to fetch them.
1452
1453To see the available bintools, use::
1454
1455 binman tool --list
1456
1457To fetch tools which are missing, use::
1458
1459 binman tool --fetch missing
1460
1461You can also use `--fetch all` to fetch all tools or `--fetch <tool>` to fetch
1462a particular tool. Some tools are built from source code, in which case you will
1463need to have at least the `build-essential` and `git` packages installed.
1464
Simon Glassfe7e9242023-02-22 12:14:49 -07001465Tools are fetched into the `~/.binman-tools` directory. This directory is
1466automatically added to the toolpath so there is no need to use `--toolpath` to
1467specify it. If you want to use these tools outside binman, you may want to
1468add this directory to your `PATH`. For example, if you use bash, add this to
1469the end of `.bashrc`::
1470
1471 PATH="$HOME/.binman-tools:$PATH"
1472
1473To select a custom directory, use the `--tooldir` option.
Simon Glass932e40d2023-02-22 12:14:48 -07001474
Simon Glass3e7749e2022-01-09 20:14:12 -07001475Bintool Documentation
1476=====================
1477
1478To provide details on the various bintools supported by binman, bintools.rst is
1479generated from the source code using:
1480
1481 binman bintool-docs >tools/binman/bintools.rst
1482
1483.. toctree::
1484 :maxdepth: 2
1485
1486 bintools
1487
Simon Glass8dd00592022-11-09 19:14:54 -07001488Binman commands and arguments
1489=============================
1490
1491Usage::
1492
Simon Glassfe7e9242023-02-22 12:14:49 -07001493 binman [-h] [-B BUILD_DIR] [-D] [--tooldir TOOLDIR] [-H]
1494 [--toolpath TOOLPATH] [-T THREADS] [--test-section-timeout]
1495 [-v VERBOSITY] [-V]
Simon Glass8dd00592022-11-09 19:14:54 -07001496 {build,bintool-docs,entry-docs,ls,extract,replace,test,tool} ...
1497
1498Binman provides the following commands:
1499
1500- **build** - build images
1501- **bintools-docs** - generate documentation about bintools
1502- **entry-docs** - generate documentation about entry types
1503- **ls** - list an image
1504- **extract** - extract files from an image
1505- **replace** - replace one or more entries in an image
1506- **test** - run tests
1507- **tool** - manage bintools
1508
1509Options:
1510
1511-h, --help
1512 Show help message and exit
1513
1514-B BUILD_DIR, --build-dir BUILD_DIR
1515 Directory containing the build output
1516
1517-D, --debug
1518 Enabling debugging (provides a full traceback on error)
1519
Simon Glassfe7e9242023-02-22 12:14:49 -07001520--tooldir TOOLDIR Set the directory to store tools
1521
Simon Glass8dd00592022-11-09 19:14:54 -07001522-H, --full-help
1523 Display the README file
1524
1525--toolpath TOOLPATH
Simon Glassfe7e9242023-02-22 12:14:49 -07001526 Add a path to the list of directories containing tools
Simon Glass8dd00592022-11-09 19:14:54 -07001527
1528-T THREADS, --threads THREADS
1529 Number of threads to use (0=single-thread). Note that -T0 is useful for
1530 debugging since everything runs in one thread.
1531
1532-v VERBOSITY, --verbosity VERBOSITY
1533 Control verbosity: 0=silent, 1=warnings, 2=notices, 3=info, 4=detail,
1534 5=debug
1535
1536-V, --version
1537 Show the binman version
1538
1539Test options:
1540
1541--test-section-timeout
1542 Use a zero timeout for section multi-threading (for testing)
1543
1544Commands are described below.
1545
1546binman build
1547------------
1548
1549This builds one or more images using the provided image description.
1550
1551Usage::
1552
1553 binman build [-h] [-a ENTRY_ARG] [-b BOARD] [-d DT] [--fake-dtb]
1554 [--fake-ext-blobs] [--force-missing-bintools FORCE_MISSING_BINTOOLS]
1555 [-i IMAGE] [-I INDIR] [-m] [-M] [-n] [-O OUTDIR] [-p] [-u]
1556 [--update-fdt-in-elf UPDATE_FDT_IN_ELF] [-W]
1557
1558Options:
1559
1560-h, --help
1561 Show help message and exit
1562
1563-a ENTRY_ARG, --entry-arg ENTRY_ARG
1564 Set argument value `arg=value`. See
1565 `Passing command-line arguments to entries`_.
1566
1567-b BOARD, --board BOARD
1568 Board name to build. This can be used instead of `-d`, in which case the
1569 file `u-boot.dtb` is used, within the build directory's board subdirectory.
1570
1571-d DT, --dt DT
1572 Configuration file (.dtb) to use. This must have a top-level node called
1573 `binman`. See `Image description format`_.
1574
1575-i IMAGE, --image IMAGE
1576 Image filename to build (if not specified, build all)
1577
1578-I INDIR, --indir INDIR
1579 Add a path to the list of directories to use for input files. This can be
1580 specified multiple times to add more than one path.
1581
1582-m, --map
1583 Output a map file for each image. See `Map files`_.
1584
1585-M, --allow-missing
1586 Allow external blobs and bintools to be missing. See `External blobs`_.
1587
1588-n, --no-expanded
1589 Don't use 'expanded' versions of entries where available; normally 'u-boot'
1590 becomes 'u-boot-expanded', for example. See `Expanded entries`_.
1591
1592-O OUTDIR, --outdir OUTDIR
1593 Path to directory to use for intermediate and output files
1594
1595-p, --preserve
1596 Preserve temporary output directory even if option -O is not given
1597
1598-u, --update-fdt
1599 Update the binman node with offset/size info. See
1600 `Access to binman entry offsets at run time (fdt)`_.
1601
1602--update-fdt-in-elf UPDATE_FDT_IN_ELF
1603 Update an ELF file with the output dtb. The argument is a string consisting
1604 of four parts, separated by commas. See `Updating an ELF file`_.
1605
1606-W, --ignore-missing
1607 Return success even if there are missing blobs/bintools (requires -M)
1608
1609Options used only for testing:
1610
1611--fake-dtb
1612 Use fake device tree contents
1613
1614--fake-ext-blobs
1615 Create fake ext blobs with dummy content
1616
1617--force-missing-bintools FORCE_MISSING_BINTOOLS
1618 Comma-separated list of bintools to consider missing
1619
1620binman bintool-docs
1621-------------------
1622
1623Usage::
1624
1625 binman bintool-docs [-h]
1626
1627This outputs documentation for the bintools in rST format. See
1628`Bintool Documentation`_.
1629
1630binman entry-docs
1631-----------------
1632
1633Usage::
1634
1635 binman entry-docs [-h]
1636
1637This outputs documentation for the entry types in rST format. See
1638`Entry Documentation`_.
1639
1640binman ls
1641---------
1642
1643Usage::
1644
1645 binman ls [-h] -i IMAGE [paths ...]
1646
1647Positional arguments:
1648
1649paths
1650 Paths within file to list (wildcard)
1651
1652Pptions:
1653
1654-h, --help
1655 show help message and exit
1656
1657-i IMAGE, --image IMAGE
1658 Image filename to list
1659
1660This lists an image, showing its contents. See `Listing images`_.
1661
1662binman extract
1663--------------
1664
1665Usage::
1666
1667 binman extract [-h] [-F FORMAT] -i IMAGE [-f FILENAME] [-O OUTDIR] [-U]
1668 [paths ...]
1669
1670Positional arguments:
1671
1672Paths
1673 Paths within file to extract (wildcard)
1674
1675Options:
1676
1677-h, --help
1678 show help message and exit
1679
1680-F FORMAT, --format FORMAT
1681 Select an alternative format for extracted data
1682
1683-i IMAGE, --image IMAGE
1684 Image filename to extract
1685
1686-f FILENAME, --filename FILENAME
1687 Output filename to write to
1688
1689-O OUTDIR, --outdir OUTDIR
1690 Path to directory to use for output files
1691
1692-U, --uncompressed
1693 Output raw uncompressed data for compressed entries
1694
1695This extracts the contents of entries from an image. See
1696`Extracting files from images`_.
1697
1698binman replace
1699--------------
1700
1701Usage::
1702
1703 binman replace [-h] [-C] -i IMAGE [-f FILENAME] [-F] [-I INDIR] [-m]
1704 [paths ...]
1705
1706Positional arguments:
1707
1708paths
1709 Paths within file to replace (wildcard)
1710
1711Options:
1712
1713-h, --help
1714 show help message and exit
1715
1716-C, --compressed
1717 Input data is already compressed if needed for the entry
1718
1719-i IMAGE, --image IMAGE
1720 Image filename to update
1721
1722-f FILENAME, --filename FILENAME
1723 Input filename to read from
1724
1725-F, --fix-size
1726 Don't allow entries to be resized
1727
1728-I INDIR, --indir INDIR
1729 Path to directory to use for input files
1730
1731-m, --map
1732 Output a map file for the updated image
1733
Simon Glasse00197f2023-03-02 17:02:42 -07001734-O OUTDIR, --outdir OUTDIR
1735 Path to directory to use for intermediate and output files
1736
1737-p, --preserve
1738 Preserve temporary output directory even if option -O is not given
1739
Simon Glass8dd00592022-11-09 19:14:54 -07001740This replaces one or more entries in an existing image. See
1741`Replacing files in an image`_.
1742
1743binman test
1744-----------
1745
1746Usage::
1747
1748 binman test [-h] [-P PROCESSES] [-T] [-X] [tests ...]
1749
1750Positional arguments:
1751
1752tests
1753 Test names to run (omit for all)
1754
1755Options:
1756
1757-h, --help
1758 show help message and exit
1759
1760-P PROCESSES, --processes PROCESSES
1761 set number of processes to use for running tests. This defaults to the
1762 number of CPUs on the machine
1763
1764-T, --test-coverage
1765 run tests and check for 100% coverage
1766
1767-X, --test-preserve-dirs
1768 Preserve and display test-created input directories; also preserve the
1769 output directory if a single test is run (pass test name at the end of the
1770 command line
1771
Ivan Mikhaylov0f40e232023-03-08 01:13:38 +00001772binman sign
1773-----------
1774
1775Usage::
1776
1777 binman sign [-h] -a ALGO [-f FILE] -i IMAGE -k KEY [paths ...]
1778
1779positional arguments:
1780
1781paths
1782 Paths within file to sign (wildcard)
1783
1784options:
1785
1786-h, --help
1787 show this help message and exit
1788
1789-a ALGO, --algo ALGO
1790 Hash algorithm e.g. sha256,rsa4096
1791
1792-f FILE, --file FILE
1793 Input filename to sign
1794
1795-i IMAGE, --image IMAGE
1796 Image filename to update
1797
1798-k KEY, --key KEY
1799 Private key file for signing
1800
Simon Glass8dd00592022-11-09 19:14:54 -07001801binman tool
1802-----------
1803
1804Usage::
1805
1806 binman tool [-h] [-l] [-f] [bintools ...]
1807
1808Positional arguments:
1809
1810bintools
1811 Bintools to process
1812
1813Options:
1814
1815-h, --help
1816 show help message and exit
1817
1818-l, --list
1819 List all known bintools
1820
1821-f, --fetch
1822 Fetch a bintool from a known location. Use `all` to fetch all and `missing`
1823 to fetch any missing tools.
1824
Simon Glass3e7749e2022-01-09 20:14:12 -07001825
Simon Glass072026e2021-03-18 20:25:14 +13001826Technical details
1827=================
Simon Glasse0ff8552016-11-25 20:15:53 -07001828
Simon Glassbf7fd502016-11-25 20:15:51 -07001829Order of image creation
1830-----------------------
1831
1832Image creation proceeds in the following order, for each entry in the image.
1833
Simon Glass078ab1a2018-07-06 10:27:41 -060018341. AddMissingProperties() - binman can add calculated values to the device
Simon Glass3ab95982018-08-01 15:22:37 -06001835tree as part of its processing, for example the offset and size of each
Simon Glass078ab1a2018-07-06 10:27:41 -06001836entry. This method adds any properties associated with this, expanding the
1837device tree as needed. These properties can have placeholder values which are
1838set later by SetCalculatedProperties(). By that stage the size of sections
1839cannot be changed (since it would cause the images to need to be repacked),
1840but the correct values can be inserted.
1841
18422. ProcessFdt() - process the device tree information as required by the
Simon Glassecab8972018-07-06 10:27:40 -06001843particular entry. This may involve adding or deleting properties. If the
1844processing is complete, this method should return True. If the processing
1845cannot complete because it needs the ProcessFdt() method of another entry to
1846run first, this method should return False, in which case it will be called
1847again later.
1848
Simon Glass078ab1a2018-07-06 10:27:41 -060018493. GetEntryContents() - the contents of each entry are obtained, normally by
Simon Glassbf7fd502016-11-25 20:15:51 -07001850reading from a file. This calls the Entry.ObtainContents() to read the
1851contents. The default version of Entry.ObtainContents() calls
1852Entry.GetDefaultFilename() and then reads that file. So a common mechanism
1853to select a file to read is to override that function in the subclass. The
1854functions must return True when they have read the contents. Binman will
1855retry calling the functions a few times if False is returned, allowing
1856dependencies between the contents of different entries.
1857
Simon Glass3ab95982018-08-01 15:22:37 -060018584. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can
Simon Glassbf7fd502016-11-25 20:15:51 -07001859return a dict containing entries that need updating. The key should be the
Simon Glass3ab95982018-08-01 15:22:37 -06001860entry name and the value is a tuple (offset, size). This allows an entry to
1861provide the offset and size for other entries. The default implementation
1862of GetEntryOffsets() returns {}.
Simon Glassbf7fd502016-11-25 20:15:51 -07001863
Simon Glass3ab95982018-08-01 15:22:37 -060018645. PackEntries() - calls Entry.Pack() which figures out the offset and
1865size of an entry. The 'current' image offset is passed in, and the function
1866returns the offset immediately after the entry being packed. The default
Simon Glassbf7fd502016-11-25 20:15:51 -07001867implementation of Pack() is usually sufficient.
1868
Simon Glass0b657692020-10-26 17:40:22 -06001869Note: for sections, this also checks that the entries do not overlap, nor extend
1870outside the section. If the section does not have a defined size, the size is
Simon Glass9766f692023-01-11 16:10:16 -07001871set large enough to hold all the entries. For entries that are explicitly marked
1872as overlapping, this check is skipped.
Simon Glassbf7fd502016-11-25 20:15:51 -07001873
Simon Glass0b657692020-10-26 17:40:22 -060018746. SetImagePos() - sets the image position of every entry. This is the absolute
Simon Glass4ab88b62019-07-20 12:23:52 -06001875position 'image-pos', as opposed to 'offset' which is relative to the containing
1876section. This must be done after all offsets are known, which is why it is quite
1877late in the ordering.
1878
Simon Glass0b657692020-10-26 17:40:22 -060018797. SetCalculatedProperties() - update any calculated properties in the device
Simon Glass3ab95982018-08-01 15:22:37 -06001880tree. This sets the correct 'offset' and 'size' vaues, for example.
Simon Glass078ab1a2018-07-06 10:27:41 -06001881
Simon Glass0b657692020-10-26 17:40:22 -060018828. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry.
Simon Glassbf7fd502016-11-25 20:15:51 -07001883The default implementatoin does nothing. This can be overriden to adjust the
1884contents of an entry in some way. For example, it would be possible to create
1885an entry containing a hash of the contents of some other entries. At this
Simon Glassc52c9e72019-07-08 14:25:37 -06001886stage the offset and size of entries should not be adjusted unless absolutely
1887necessary, since it requires a repack (going back to PackEntries()).
Simon Glassbf7fd502016-11-25 20:15:51 -07001888
Simon Glass0b657692020-10-26 17:40:22 -060018899. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry
Simon Glass4ab88b62019-07-20 12:23:52 -06001890has changed its size, then there is no alternative but to go back to step 5 and
1891try again, repacking the entries with the updated size. ResetForPack() removes
1892the fixed offset/size values added by binman, so that the packing can start from
1893scratch.
1894
Simon Glass0b657692020-10-26 17:40:22 -0600189510. WriteSymbols() - write the value of symbols into the U-Boot SPL binary.
Simon Glass3ab95982018-08-01 15:22:37 -06001896See 'Access to binman entry offsets at run time' below for a description of
Simon Glass0a4357c2018-07-06 10:27:39 -06001897what happens in this stage.
Simon Glass39c15022017-11-13 18:55:05 -07001898
Simon Glass0b657692020-10-26 17:40:22 -0600189911. BuildImage() - builds the image and writes it to a file
Simon Glass4ab88b62019-07-20 12:23:52 -06001900
Simon Glass0b657692020-10-26 17:40:22 -0600190112. WriteMap() - writes a text file containing a map of the image. This is the
Simon Glass4ab88b62019-07-20 12:23:52 -06001902final step.
Simon Glassbf7fd502016-11-25 20:15:51 -07001903
1904
Simon Glass85760a62022-11-09 19:14:49 -07001905.. _`External tools`:
1906
Simon Glassc7d80352019-07-08 13:18:28 -06001907External tools
1908--------------
1909
1910Binman can make use of external command-line tools to handle processing of
1911entry contents or to generate entry contents. These tools are executed using
1912the 'tools' module's Run() method. The tools generally must exist on the PATH,
1913but the --toolpath option can be used to specify additional search paths to
1914use. This option can be specified multiple times to add more than one path.
1915
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03001916For some compile tools binman will use the versions specified by commonly-used
1917environment variables like CC and HOSTCC for the C compiler, based on whether
1918the tool's output will be used for the target or for the host machine. If those
1919aren't given, it will also try to derive target-specific versions from the
1920CROSS_COMPILE environment variable during a cross-compilation.
1921
Simon Glass79450772021-11-23 21:09:48 -07001922If the tool is not available in the path you can use BINMAN_TOOLPATHS to specify
1923a space-separated list of paths to search, e.g.::
1924
1925 BINMAN_TOOLPATHS="/tools/g12a /tools/tegra" binman ...
1926
1927
Simon Glass85760a62022-11-09 19:14:49 -07001928.. _`External blobs`:
1929
Simon Glass79450772021-11-23 21:09:48 -07001930External blobs
1931--------------
1932
1933Binary blobs, even if the source code is available, complicate building
1934firmware. The instructions can involve multiple steps and the binaries may be
1935hard to build or obtain. Binman at least provides a unified description of how
1936to build the final image, no matter what steps are needed to get there.
1937
1938Binman also provides a `blob-ext` entry type that pulls in a binary blob from an
1939external file. If the file is missing, binman can optionally complete the build
1940and just report a warning. Use the `-M/--allow-missing` option to enble this.
1941This is useful in CI systems which want to check that everything is correct but
1942don't have access to the blobs.
1943
1944If the blobs are in a different directory, you can specify this with the `-I`
1945option.
1946
1947For U-Boot, you can use set the BINMAN_INDIRS environment variable to provide a
1948space-separated list of directories to search for binary blobs::
1949
1950 BINMAN_INDIRS="odroid-c4/fip/g12a \
1951 odroid-c4/build/board/hardkernel/odroidc4/firmware \
1952 odroid-c4/build/scp_task" binman ...
Simon Glassc7d80352019-07-08 13:18:28 -06001953
Simon Glassb38da152022-11-09 19:14:42 -07001954Note that binman fails with exit code 103 when there are missing blobs. If you
1955wish binman to continue anyway, you can pass `-W` to binman.
1956
1957
Simon Glass6d427c62016-11-25 20:15:59 -07001958Code coverage
1959-------------
1960
1961Binman is a critical tool and is designed to be very testable. Entry
Simon Glass53cd5d92019-07-08 14:25:29 -06001962implementations target 100% test coverage. Run 'binman test -T' to check this.
Simon Glass6d427c62016-11-25 20:15:59 -07001963
Simon Glass61adb2d2021-03-18 20:25:13 +13001964To enable Python test coverage on Debian-type distributions (e.g. Ubuntu)::
Simon Glass6d427c62016-11-25 20:15:59 -07001965
Simon Glass45f449b2019-07-08 13:18:26 -06001966 $ sudo apt-get install python-coverage python3-coverage python-pytest
Simon Glass6d427c62016-11-25 20:15:59 -07001967
1968
Simon Glassb38da152022-11-09 19:14:42 -07001969Exit status
1970-----------
1971
1972Binman produces the following exit codes:
1973
19740
1975 Success
1976
19771
1978 Any sort of failure - see output for more details
1979
1980103
1981 There are missing external blobs or bintools. This is only returned if
1982 -M is passed to binman, otherwise missing blobs return an exit status of 1.
1983 Note, if -W is passed as well as -M, then this is converted into a warning
1984 and will return an exit status of 0 instead.
1985
1986
Simon Glass85760a62022-11-09 19:14:49 -07001987U-Boot environment variables for binman
1988---------------------------------------
1989
1990The U-Boot Makefile supports various environment variables to control binman.
1991All of these are set within the Makefile and result in passing various
1992environment variables (or make flags) to binman:
1993
1994BINMAN_DEBUG
1995 Enables backtrace debugging by adding a `-D` argument. See
1996 :ref:`BinmanLogging`.
1997
1998BINMAN_INDIRS
1999 Sets the search path for input files used by binman by adding one or more
2000 `-I` arguments. See :ref:`External blobs`.
2001
2002BINMAN_TOOLPATHS
2003 Sets the search path for external tool used by binman by adding one or more
2004 `--toolpath` arguments. See :ref:`External tools`.
2005
2006BINMAN_VERBOSE
2007 Sets the logging verbosity of binman by adding a `-v` argument. See
2008 :ref:`BinmanLogging`.
2009
2010
Simon Glass61a631e2022-01-23 12:55:46 -07002011Error messages
2012--------------
2013
2014This section provides some guidance for some of the less obvious error messages
2015produced by binman.
2016
2017
2018Expected __bss_size symbol
2019~~~~~~~~~~~~~~~~~~~~~~~~~~
2020
2021Example::
2022
2023 binman: Node '/binman/u-boot-spl-ddr/u-boot-spl/u-boot-spl-bss-pad':
2024 Expected __bss_size symbol in spl/u-boot-spl
2025
2026This indicates that binman needs the `__bss_size` symbol to be defined in the
2027SPL binary, where `spl/u-boot-spl` is the ELF file containing the symbols. The
2028symbol tells binman the size of the BSS region, in bytes. It needs this to be
2029able to pad the image so that the following entries do not overlap the BSS,
2030which would cause them to be overwritte by variable access in SPL.
2031
2032This symbols is normally defined in the linker script, immediately after
2033_bss_start and __bss_end are defined, like this::
2034
2035 __bss_size = __bss_end - __bss_start;
2036
2037You may need to add it to your linker script if you get this error.
2038
2039
Simon Glass55660d02019-05-17 22:00:52 -06002040Concurrent tests
2041----------------
2042
2043Binman tries to run tests concurrently. This means that the tests make use of
2044all available CPUs to run.
2045
Simon Glass61adb2d2021-03-18 20:25:13 +13002046 To enable this::
Simon Glass55660d02019-05-17 22:00:52 -06002047
2048 $ sudo apt-get install python-subunit python3-subunit
2049
2050Use '-P 1' to disable this. It is automatically disabled when code coverage is
2051being used (-T) since they are incompatible.
2052
2053
Simon Glassd5164a72019-07-08 13:18:49 -06002054Debugging tests
2055---------------
2056
2057Sometimes when debugging tests it is useful to keep the input and output
2058directories so they can be examined later. Use -X or --test-preserve-dirs for
2059this.
2060
2061
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03002062Running tests on non-x86 architectures
2063--------------------------------------
2064
2065Binman's tests have been written under the assumption that they'll be run on a
2066x86-like host and there hasn't been an attempt to make them portable yet.
2067However, it's possible to run the tests by cross-compiling to x86.
2068
Simon Glass61adb2d2021-03-18 20:25:13 +13002069To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu)::
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03002070
2071 $ sudo apt-get install gcc-x86-64-linux-gnu
2072
Simon Glass61adb2d2021-03-18 20:25:13 +13002073Then, you can run the tests under cross-compilation::
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03002074
2075 $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T
2076
2077You can also use gcc-i686-linux-gnu similar to the above.
2078
2079
Simon Glass072026e2021-03-18 20:25:14 +13002080Writing new entries and debugging
2081---------------------------------
Simon Glassbf7fd502016-11-25 20:15:51 -07002082
2083The behaviour of entries is defined by the Entry class. All other entries are
2084a subclass of this. An important subclass is Entry_blob which takes binary
2085data from a file and places it in the entry. In fact most entry types are
2086subclasses of Entry_blob.
2087
2088Each entry type is a separate file in the tools/binman/etype directory. Each
2089file contains a class called Entry_<type> where <type> is the entry type.
2090New entry types can be supported by adding new files in that directory.
2091These will automatically be detected by binman when needed.
2092
2093Entry properties are documented in entry.py. The entry subclasses are free
2094to change the values of properties to support special behaviour. For example,
2095when Entry_blob loads a file, it sets content_size to the size of the file.
2096Entry classes can adjust other entries. For example, an entry that knows
Simon Glass3ab95982018-08-01 15:22:37 -06002097where other entries should be positioned can set up those entries' offsets
Simon Glassbf7fd502016-11-25 20:15:51 -07002098so they don't need to be set in the binman decription. It can also adjust
2099entry contents.
2100
2101Most of the time such essoteric behaviour is not needed, but it can be
2102essential for complex images.
2103
Simon Glass3ed0de32017-12-24 12:12:07 -07002104If you need to specify a particular device-tree compiler to use, you can define
2105the DTC environment variable. This can be useful when the system dtc is too
2106old.
2107
Simon Glassa3c00552018-11-06 15:21:31 -07002108To enable a full backtrace and other debugging features in binman, pass
Simon Glass61adb2d2021-03-18 20:25:13 +13002109BINMAN_DEBUG=1 to your build::
Simon Glassa3c00552018-11-06 15:21:31 -07002110
Bin Mengc443f562019-10-02 19:07:29 -07002111 make qemu-x86_defconfig
Simon Glassa3c00552018-11-06 15:21:31 -07002112 make BINMAN_DEBUG=1
2113
Simon Glass1f338e02019-09-25 08:11:11 -06002114To enable verbose logging from binman, base BINMAN_VERBOSE to your build, which
Simon Glass61adb2d2021-03-18 20:25:13 +13002115adds a -v<level> option to the call to binman::
Simon Glass1f338e02019-09-25 08:11:11 -06002116
Bin Mengc443f562019-10-02 19:07:29 -07002117 make qemu-x86_defconfig
Simon Glass1f338e02019-09-25 08:11:11 -06002118 make BINMAN_VERBOSE=5
2119
Simon Glassbf7fd502016-11-25 20:15:51 -07002120
Simon Glassc69d19c2021-07-06 10:36:37 -06002121Building sections in parallel
2122-----------------------------
2123
2124By default binman uses multiprocessing to speed up compilation of large images.
2125This works at a section level, with one thread for each entry in the section.
2126This can speed things up if the entries are large and use compression.
2127
2128This feature can be disabled with the '-T' flag, which defaults to a suitable
2129value for your machine. This depends on the Python version, e.g on v3.8 it uses
213012 threads on an 8-core machine. See ConcurrentFutures_ for more details.
2131
2132The special value -T0 selects single-threaded mode, useful for debugging during
2133development, since dealing with exceptions and problems in threads is more
2134difficult. This avoids any use of ThreadPoolExecutor.
2135
2136
Simon Glass81b71c32022-02-08 11:50:00 -07002137Collecting data for an entry type
2138---------------------------------
2139
2140Some entry types deal with data obtained from others. For example,
2141`Entry_mkimage` calls the `mkimage` tool with data from its subnodes::
2142
2143 mkimage {
2144 args = "-n test -T script";
2145
2146 u-boot-spl {
2147 };
2148
2149 u-boot {
2150 };
2151 };
2152
2153This shows mkimage being passed a file consisting of SPL and U-Boot proper. It
Simon Glass6d427c42022-03-05 20:18:58 -07002154is created by calling `Entry.collect_contents_to_file()`. Note that in this
2155case, the data is passed to mkimage for processing but does not appear
2156separately in the image. It may not appear at all, depending on what mkimage
2157does. The contents of the `mkimage` entry are entirely dependent on the
2158processing done by the entry, with the provided subnodes (`u-boot-spl` and
2159`u-boot`) simply providing the input data for that processing.
Simon Glass81b71c32022-02-08 11:50:00 -07002160
2161Note that `Entry.collect_contents_to_file()` simply concatenates the data from
2162the different entries together, with no control over alignment, etc. Another
2163approach is to subclass `Entry_section` so that those features become available,
2164such as `size` and `pad-byte`. Then the contents of the entry can be obtained by
Simon Glass6d427c42022-03-05 20:18:58 -07002165calling `super().BuildSectionData()` in the entry's BuildSectionData()
2166implementation to get the input data, then write it to a file and process it
2167however is desired.
Simon Glass81b71c32022-02-08 11:50:00 -07002168
2169There are other ways to obtain data also, depending on the situation. If the
2170entry type is simply signing data which exists elsewhere in the image, then
2171you can use `Entry_collection` as a base class. It lets you use a property
2172called `content` which lists the entries containing data to be processed. This
2173is used by `Entry_vblock`, for example::
2174
2175 u_boot: u-boot {
2176 };
Simon Glass6d427c42022-03-05 20:18:58 -07002177
Simon Glass81b71c32022-02-08 11:50:00 -07002178 vblock {
2179 content = <&u_boot &dtb>;
2180 keyblock = "firmware.keyblock";
2181 signprivate = "firmware_data_key.vbprivk";
2182 version = <1>;
2183 kernelkey = "kernel_subkey.vbpubk";
2184 preamble-flags = <1>;
2185 };
2186
2187 dtb: u-boot-dtb {
2188 };
2189
2190which shows an image containing `u-boot` and `u-boot-dtb`, with the `vblock`
2191image collecting their contents to produce input for its signing process,
2192without affecting those entries, which still appear in the final image
2193untouched.
2194
2195Another example is where an entry type needs several independent pieces of input
2196to function. For example, `Entry_fip` allows a number of different binary blobs
2197to be placed in their own individual places in a custom data structure in the
2198output image. To make that work you can add subnodes for each of them and call
2199`Entry.Create()` on each subnode, as `Entry_fip` does. Then the data for each
2200blob can come from any suitable place, such as an `Entry_u_boot` or an
2201`Entry_blob` or anything else::
2202
2203 atf-fip {
2204 fip-hdr-flags = /bits/ 64 <0x123>;
2205 soc-fw {
2206 fip-flags = /bits/ 64 <0x123456789abcdef>;
2207 filename = "bl31.bin";
2208 };
2209
2210 u-boot {
2211 fip-uuid = [fc 65 13 92 4a 5b 11 ec
2212 94 35 ff 2d 1c fc 79 9c];
2213 };
2214 };
2215
2216The `soc-fw` node is a `blob-ext` (i.e. it reads in a named binary file) whereas
2217`u-boot` is a normal entry type. This works because `Entry_fip` selects the
2218`blob-ext` entry type if the node name (here `soc-fw`) is recognised as being
2219a known blob type.
2220
2221When adding new entry types you are encouraged to use subnodes to provide the
Simon Glass6d427c42022-03-05 20:18:58 -07002222data for processing, unless the `content` approach is more suitable. Consider
2223whether the input entries are contained within (or consumed by) the entry, vs
2224just being 'referenced' by the entry. In the latter case, the `content` approach
2225makes more sense. Ad-hoc properties and other methods of obtaining data are
2226discouraged, since it adds to confusion for users.
Simon Glass81b71c32022-02-08 11:50:00 -07002227
Simon Glassbf7fd502016-11-25 20:15:51 -07002228History / Credits
2229-----------------
2230
2231Binman takes a lot of inspiration from a Chrome OS tool called
2232'cros_bundle_firmware', which I wrote some years ago. That tool was based on
2233a reasonably simple and sound design but has expanded greatly over the
2234years. In particular its handling of x86 images is convoluted.
2235
Simon Glass7ae5f312018-06-01 09:38:19 -06002236Quite a few lessons have been learned which are hopefully applied here.
Simon Glassbf7fd502016-11-25 20:15:51 -07002237
2238
2239Design notes
2240------------
2241
2242On the face of it, a tool to create firmware images should be fairly simple:
2243just find all the input binaries and place them at the right place in the
2244image. The difficulty comes from the wide variety of input types (simple
2245flat binaries containing code, packaged data with various headers), packing
2246requirments (alignment, spacing, device boundaries) and other required
2247features such as hierarchical images.
2248
2249The design challenge is to make it easy to create simple images, while
2250allowing the more complex cases to be supported. For example, for most
2251images we don't much care exactly where each binary ends up, so we should
2252not have to specify that unnecessarily.
2253
2254New entry types should aim to provide simple usage where possible. If new
2255core features are needed, they can be added in the Entry base class.
2256
2257
2258To do
2259-----
2260
2261Some ideas:
Simon Glass61adb2d2021-03-18 20:25:13 +13002262
Simon Glassbf7fd502016-11-25 20:15:51 -07002263- Use of-platdata to make the information available to code that is unable
Simon Glassfcae6682021-03-18 20:25:17 +13002264 to use device tree (such as a very small SPL image). For now, limited info is
2265 available via linker symbols
Simon Glassbf7fd502016-11-25 20:15:51 -07002266- Allow easy building of images by specifying just the board name
Simon Glassbf7fd502016-11-25 20:15:51 -07002267- Support building an image for a board (-b) more completely, with a
2268 configurable build directory
Simon Glass513c53e2019-07-20 12:24:02 -06002269- Detect invalid properties in nodes
2270- Sort the fdtmap by offset
Simon Glass397a7702021-01-06 21:35:12 -07002271- Output temporary files to a different directory
Simon Glass523cde02022-02-08 11:49:57 -07002272- Rationalise the fdt, fdt_util and pylibfdt modules which currently have some
2273 overlapping and confusing functionality
2274- Update the fdt library to use a better format for Prop.value (the current one
2275 is useful for dtoc but not much else)
2276- Figure out how to make Fdt support changing the node order, so that
2277 Node.AddSubnode() can support adding a node before another, existing node.
2278 Perhaps it should completely regenerate the flat tree?
Simon Glass86e54462022-08-18 02:16:46 -06002279- Support images which depend on each other
Simon Glassbf7fd502016-11-25 20:15:51 -07002280
2281--
2282Simon Glass <sjg@chromium.org>
22837/7/2016
Simon Glassc69d19c2021-07-06 10:36:37 -06002284
2285.. _ConcurrentFutures: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor