1.. SPDX-License-Identifier: GPL-2.0+ 2.. Copyright (c) 2016 Google, Inc 3 4Introduction 5============ 6 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 12Building 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. 17 18 19What it does 20------------ 21 22Binman reads your board's device tree and finds a node which describes the 23required 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. 29 30 31Features 32-------- 33 34Apart 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. 37 38Executable 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. 41 42Binman 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, 45vblocks and the like. 46 47Binman provides a way to process binaries before they are included, by adding a 48Python plug-in. 49 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 57As 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. 62 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: 74 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 87 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 98Installation 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 111Relationship 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 134Note 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 138 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 154this purpose. It would be possible in some situations to create a new entry 155type for the images in mkimage, but this would not add functionality. It 156seems better to use the mkimage tool to generate binaries and avoid blurring 157the boundaries between building input files (mkimage) and packaging then 158into a final image (binman). 159 160Note that binman can itself invoke mkimage. This helps to move mkimage 161invocations out of the Makefile and into binman image descriptions. 162 163 164Using binman 165============ 166 167Example 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 175 #. It uses a custom mksunxiboot tool to build an SPL image called 176 sunxi-spl.bin. This should probably move into mkimage. 177 178 #. 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. 180 181 #. 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. 183 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 186sunxi-spl.bin by calling mksunxiboot or mkimage. In any case, it would then 187create the image from the component parts. 188 189This simplifies the U-Boot Makefile somewhat, since various pieces of logic 190can be replaced by a call to binman. 191 192 193Invoking 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 252Taking 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 256 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 { 314 offset = <CFG_X86_MRC_ADDR>; 315 }; 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 355Example 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 361firmware image. 362 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 370Installing binman 371----------------- 372 373First install prerequisites, e.g: 374 375.. code-block:: bash 376 377 sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \ 378 liblz4-tool 379 380You can run binman directly if you put it on your PATH. But if you want to 381install into your `~/.local` Python directory, use: 382 383.. code-block:: bash 384 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 389installed like this: 390 391.. code-block:: bash 392 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 400system-library directory, replace the last line with: 401 402.. code-block:: bash 403 404 make NO_PYTHON=1 PREFIX=/ install 405 406Running binman 407-------------- 408 409Type: 410 411.. code-block:: bash 412 413 make NO_PYTHON=1 PREFIX=/ install 414 binman build -b <board_name> 415 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 420Or you can specify this explicitly: 421 422.. code-block:: bash 423 424 make NO_PYTHON=1 PREFIX=/ install 425 binman build -I <build_path> 426 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 438Enabling binman for a board 439--------------------------- 440 441At present binman is invoked from a rule in the main Makefile. You should be 442able to enable CONFIG_BINMAN to enable this rule. 443 444The 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. 447 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 453.. _binman_syms: 454 455Access 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 464with their correct values during the build. For example: 465 466.. code-block:: c 467 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. 472You can access this value with something like: 473 474.. code-block:: c 475 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 503While 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 510.. _binman_fdt: 511 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 529Map 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 556The -a option supports this:: 557 558 -a <prop>=<value> 559 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 569Image description format 570======================== 571 572The binman node is called 'binman'. An example image description is shown 573below:: 574 575 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 }; 585 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 601specify the start offset of an entry using the 'offset' property. 602 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 609offset: 610 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. 615 616align: 617 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. 625 626size: 627 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. 630 631min-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 639pad-before: 640 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. 646 647pad-after: 648 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. 655 656align-size: 657 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. 664 665align-end: 666 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. 675 676filename: 677 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. 680 681type: 682 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. 685 686offset-unset: 687 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). 692 693image-pos: 694 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. 698 699extend-size: 700 Extend the size of this entry to fit available space. This space is only 701 limited by the size of the image/section and the position of the next 702 entry. 703 704compress: 705 Sets the compression algortihm to use (for blobs only). See the entry 706 documentation for details. 707 708missing-msg: 709 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. 713 714no-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 721optional: 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 730The attributes supported for images and sections are described below. Several 731are similar to those for entries. 732 733size: 734 Sets the image size in bytes, for example 'size = <0x100000>' for a 735 1MB image. 736 737offset: 738 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. 743 744align-size: 745 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. 748 749pad-before: 750 This sets the padding before the image entries. The first entry will 751 be positioned after the padding. This defaults to 0. 752 753pad-after: 754 This sets the padding after the image entries. The padding will be 755 placed after the last entry. This defaults to 0. 756 757pad-byte: 758 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>'. 760 761filename: 762 This specifies the image filename. It defaults to 'image.bin'. 763 764sort-by-offset: 765 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. 770 771 This is a boolean property so needs no value. To enable it, add a 772 line 'sort-by-offset;' to your description. 773 774multiple-images: 775 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:: 779 780 binman { 781 multiple-images; 782 image1 { 783 u-boot { 784 }; 785 }; 786 787 image2 { 788 spl { 789 }; 790 u-boot { 791 }; 792 }; 793 }; 794 795end-at-4gb: 796 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. 802 803skip-at-start: 804 This property specifies the entry offset of the first entry. 805 806 For PowerPC mpc85xx based CPU, CONFIG_TEXT_BASE is the entry 807 offset of the first entry. It can be 0xeff40000 or 0xfff40000 for 808 nor flash boot, 0x201000 for sd boot etc. 809 810 'end-at-4gb' property is not applicable where CONFIG_TEXT_BASE + 811 Image size != 4gb. 812 813align-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 820symlink: 821 Adds a symlink to the image with string given in the symlink property. 822 823overlap: 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 829write-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 847offset-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 854preserve: 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 862Examples of the above options can be found in the tests. See the 863tools/binman/test directory. 864 865It 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 869 870Sections and hierachical images 871------------------------------- 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 880is 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 882upgraded in the field. The sizes are fixed so that the ro/rw boundary is known 883and can be programmed:: 884 885 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 }; 900 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: 907 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. 909 910name-prefix: 911 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. 915 916filename: 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. 921 922Image Properties 923---------------- 924 925Image nodes act like sections but also have a few extra properties: 926 927filename: 928 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. 931 932allow-repack: 933 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). 940 941 Adding this property causes the original offset and size values in the 942 image description to be stored in the FDT and fdtmap. 943 944 945Image 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 994Hashing 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 1054The same applies for u-boot-spl and u-boot-tpl. In those cases, the expansion 1055includes 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 1092Optional 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 1114Compression 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 1146specific to U-Boot, such as bootph-all properies) in that header file. 1147 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. 1158If you are having trouble figuring out what is going on, you can use 1159`DEVICE_TREE_DEBUG=1` with your build:: 1160 1161 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" 1166 1167 1168Updating 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 1204Entry Documentation 1205=================== 1206 1207For details on the various entry types supported by binman and how to use them, 1208see entries.rst which is generated from the source code using: 1209 1210 binman entry-docs >tools/binman/entries.rst 1211 1212.. toctree:: 1213 :maxdepth: 2 1214 1215 entries 1216 1217 1218Managing images 1219=============== 1220 1221Listing images 1222-------------- 1223 1224It is possible to list the entries in an existing firmware image created by 1225binman, provided that there is an 'fdtmap' entry in the image. For example:: 1226 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 1244It is also possible to list just some files in an image, e.g.:: 1245 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 1253or with wildcards:: 1254 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 1263If 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 1268 1269Extracting files from images 1270---------------------------- 1271 1272You can extract files from an existing firmware image created by binman, 1273provided that there is an 'fdtmap' entry in the image. For example:: 1274 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 1279u-boot.bin:: 1280 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 1284put files in subdirectories matching the entry hierarchy:: 1285 1286 $ binman extract -i image.bin -O outdir 1287 1288or just a selection:: 1289 1290 $ binman extract -i image.bin "*u-boot*" -O outdir 1291 1292Some 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 1321 1322Replacing files in an image 1323--------------------------- 1324 1325You can replace files in an existing firmware image created by binman, provided 1326that there is an 'fdtmap' entry in the image. For example:: 1327 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 1331to 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 1335You can also use a particular file, in this case u-boot.bin:: 1336 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 1340hierarchy as the entries:: 1341 1342 $ binman replace -i image.bin -I indir 1343 1344Files that are missing will generate a warning. 1345 1346You can also replace just a selection of entries:: 1347 1348 $ binman replace -i image.bin "*u-boot*" -I indir 1349 1350It 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 1366 1367.. _`BinmanLogging`: 1368 1369Signing 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 1387Logging 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 1392backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select 1393this. 1394 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 1405You can use BINMAN_VERBOSE=5 (for example) when building to select this. 1406 1407 1408Bintools 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 1465Tools 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. 1474 1475Bintool 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 1488Binman commands and arguments 1489============================= 1490 1491Usage:: 1492 1493 binman [-h] [-B BUILD_DIR] [-D] [--tooldir TOOLDIR] [-H] 1494 [--toolpath TOOLPATH] [-T THREADS] [--test-section-timeout] 1495 [-v VERBOSITY] [-V] 1496 {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 1520--tooldir TOOLDIR Set the directory to store tools 1521 1522-H, --full-help 1523 Display the README file 1524 1525--toolpath TOOLPATH 1526 Add a path to the list of directories containing tools 1527 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 1734-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 1740This 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 1772binman 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 1801binman 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 1825 1826Technical details 1827================= 1828 1829Order of image creation 1830----------------------- 1831 1832Image creation proceeds in the following order, for each entry in the image. 1833 18341. AddMissingProperties() - binman can add calculated values to the device 1835tree as part of its processing, for example the offset and size of each 1836entry. 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 1843particular 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 18493. GetEntryContents() - the contents of each entry are obtained, normally by 1850reading 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 18584. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can 1859return a dict containing entries that need updating. The key should be the 1860entry 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 {}. 1863 18645. 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 1867implementation of Pack() is usually sufficient. 1868 1869Note: 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 1871set large enough to hold all the entries. For entries that are explicitly marked 1872as overlapping, this check is skipped. 1873 18746. SetImagePos() - sets the image position of every entry. This is the absolute 1875position '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 18797. SetCalculatedProperties() - update any calculated properties in the device 1880tree. This sets the correct 'offset' and 'size' vaues, for example. 1881 18828. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry. 1883The 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 1886stage the offset and size of entries should not be adjusted unless absolutely 1887necessary, since it requires a repack (going back to PackEntries()). 1888 18899. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry 1890has 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 189510. WriteSymbols() - write the value of symbols into the U-Boot SPL binary. 1896See 'Access to binman entry offsets at run time' below for a description of 1897what happens in this stage. 1898 189911. BuildImage() - builds the image and writes it to a file 1900 190112. WriteMap() - writes a text file containing a map of the image. This is the 1902final step. 1903 1904 1905.. _`External tools`: 1906 1907External 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 1916For 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 1922If 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 1928.. _`External blobs`: 1929 1930External 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 ... 1953 1954Note 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 1958Code coverage 1959------------- 1960 1961Binman is a critical tool and is designed to be very testable. Entry 1962implementations target 100% test coverage. Run 'binman test -T' to check this. 1963 1964To enable Python test coverage on Debian-type distributions (e.g. Ubuntu):: 1965 1966 $ sudo apt-get install python-coverage python3-coverage python-pytest 1967 1968 1969Exit 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 1987U-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 2011Error 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 2040Concurrent tests 2041---------------- 2042 2043Binman tries to run tests concurrently. This means that the tests make use of 2044all available CPUs to run. 2045 2046 To enable this:: 2047 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 2054Debugging 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 2062Running 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 2069To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu):: 2070 2071 $ sudo apt-get install gcc-x86-64-linux-gnu 2072 2073Then, you can run the tests under cross-compilation:: 2074 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 2080Writing new entries and debugging 2081--------------------------------- 2082 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 2097where other entries should be positioned can set up those entries' offsets 2098so 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 2104If 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 2108To enable a full backtrace and other debugging features in binman, pass 2109BINMAN_DEBUG=1 to your build:: 2110 2111 make qemu-x86_defconfig 2112 make BINMAN_DEBUG=1 2113 2114To enable verbose logging from binman, base BINMAN_VERBOSE to your build, which 2115adds a -v<level> option to the call to binman:: 2116 2117 make qemu-x86_defconfig 2118 make BINMAN_VERBOSE=5 2119 2120 2121Building 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 2137Collecting 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 2154is 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. 2160 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 2165calling `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. 2168 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 }; 2177 2178 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 2222data 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. 2227 2228History / 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 2236Quite a few lessons have been learned which are hopefully applied here. 2237 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: 2262 2263- Use of-platdata to make the information available to code that is unable 2264 to use device tree (such as a very small SPL image). For now, limited info is 2265 available via linker symbols 2266- Allow easy building of images by specifying just the board name 2267- Support building an image for a board (-b) more completely, with a 2268 configurable build directory 2269- Detect invalid properties in nodes 2270- Sort the fdtmap by offset 2271- Output temporary files to a different directory 2272- 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? 2279- Support images which depend on each other 2280 2281-- 2282Simon Glass <sjg@chromium.org> 22837/7/2016 2284 2285.. _ConcurrentFutures: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor 2286