Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1 | .. SPDX-License-Identifier: GPL-2.0+ |
| 2 | .. Copyright (c) 2016 Google, Inc |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 3 | |
| 4 | Introduction |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 5 | ============ |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 6 | |
| 7 | Firmware often consists of several components which must be packaged together. |
| 8 | For example, we may have SPL, U-Boot, a device tree and an environment area |
| 9 | grouped together and placed in MMC flash. When the system starts, it must be |
| 10 | able to find these pieces. |
| 11 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 12 | Building firmware should be separate from packaging it. Many of the complexities |
| 13 | of modern firmware build systems come from trying to do both at once. With |
| 14 | binman, you build all the pieces that are needed, using whatever assortment of |
| 15 | projects and build systems are needed, then use binman to stitch everything |
| 16 | together. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 17 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 18 | |
| 19 | What it does |
| 20 | ------------ |
| 21 | |
| 22 | Binman reads your board's device tree and finds a node which describes the |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 23 | required image layout. It uses this to work out what to place where. |
| 24 | |
| 25 | Binman provides a mechanism for building images, from simple SPL + U-Boot |
| 26 | combinations, to more complex arrangements with many parts. It also allows |
| 27 | users to inspect images, extract and replace binaries within them, repacking if |
| 28 | needed. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 29 | |
| 30 | |
| 31 | Features |
| 32 | -------- |
| 33 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 34 | Apart from basic padding, alignment and positioning features, Binman supports |
| 35 | hierarchical images, compression, hashing and dealing with the binary blobs |
| 36 | which are a sad trend in open-source firmware at present. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 37 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 38 | Executable binaries can access the location of other binaries in an image by |
| 39 | using special linker symbols (zero-overhead but somewhat limited) or by reading |
| 40 | the devicetree description of the image. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 41 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 42 | Binman is designed primarily for use with U-Boot and associated binaries such |
| 43 | as ARM Trusted Firmware, but it is suitable for use with other projects, such |
| 44 | as Zephyr. Binman also provides facilities useful in Chromium OS, such as CBFS, |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 45 | vblocks and the like. |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 46 | |
| 47 | Binman provides a way to process binaries before they are included, by adding a |
| 48 | Python plug-in. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 49 | |
| 50 | Binman is intended for use with U-Boot but is designed to be general enough |
| 51 | to be useful in other image-packaging situations. |
| 52 | |
| 53 | |
| 54 | Motivation |
| 55 | ---------- |
| 56 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 57 | As mentioned above, packaging of firmware is quite a different task from |
| 58 | building the various parts. In many cases the various binaries which go into |
| 59 | the image come from separate build systems. For example, ARM Trusted Firmware |
| 60 | is used on ARMv8 devices but is not built in the U-Boot tree. If a Linux kernel |
| 61 | is included in the firmware image, it is built elsewhere. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 62 | |
| 63 | It is of course possible to add more and more build rules to the U-Boot |
| 64 | build system to cover these cases. It can shell out to other Makefiles and |
| 65 | build scripts. But it seems better to create a clear divide between building |
| 66 | software and packaging it. |
| 67 | |
| 68 | At present this is handled by manual instructions, different for each board, |
| 69 | on how to create images that will boot. By turning these instructions into a |
| 70 | standard format, we can support making valid images for any board without |
| 71 | manual effort, lots of READMEs, etc. |
| 72 | |
| 73 | Benefits: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 74 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 88 | |
| 89 | Terminology |
| 90 | ----------- |
| 91 | |
| 92 | Binman 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 Glass | bf3e1c6 | 2023-02-23 18:18:23 -0700 | [diff] [blame] | 98 | Installation |
| 99 | ------------ |
| 100 | |
| 101 | You can install binman using:: |
| 102 | |
| 103 | pip install binary-manager |
| 104 | |
| 105 | The name is chosen since binman conflicts with an existing package. |
| 106 | |
| 107 | If you are using binman within the U-Boot tree, it may be easiest to add a |
| 108 | symlink from your local `~/.bin` directory to `/path/to/tools/binman/binman`. |
| 109 | |
| 110 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 111 | Relationship to FIT |
| 112 | ------------------- |
| 113 | |
| 114 | FIT is U-Boot's official image format. It supports multiple binaries with |
| 115 | load / execution addresses, compression. It also supports verification |
| 116 | through hashing and RSA signatures. |
| 117 | |
| 118 | FIT was originally designed to support booting a Linux kernel (with an |
| 119 | optional ramdisk) and device tree chosen from various options in the FIT. |
| 120 | Now that U-Boot supports configuration via device tree, it is possible to |
| 121 | load U-Boot from a FIT, with the device tree chosen by SPL. |
| 122 | |
| 123 | Binman considers FIT to be one of the binaries it can place in the image. |
| 124 | |
| 125 | Where possible it is best to put as much as possible in the FIT, with binman |
| 126 | used to deal with cases not covered by FIT. Examples include initial |
| 127 | execution (since FIT itself does not have an executable header) and dealing |
| 128 | with device boundaries, such as the read-only/read-write separation in SPI |
| 129 | flash. |
| 130 | |
| 131 | For U-Boot, binman should not be used to create ad-hoc images in place of |
| 132 | FIT. |
| 133 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 134 | Note that binman can itself create a FIT. This helps to move mkimage |
| 135 | invocations out of the Makefile and into binman image descriptions. It also |
| 136 | helps by removing the need for ad-hoc tools like `make_fit_atf.py`. |
| 137 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 138 | |
| 139 | Relationship to mkimage |
| 140 | ----------------------- |
| 141 | |
| 142 | The mkimage tool provides a means to create a FIT. Traditionally it has |
| 143 | needed an image description file: a device tree, like binman, but in a |
| 144 | different format. More recently it has started to support a '-f auto' mode |
| 145 | which can generate that automatically. |
| 146 | |
| 147 | More relevant to binman, mkimage also permits creation of many SoC-specific |
| 148 | image types. These can be listed by running 'mkimage -T list'. Examples |
| 149 | include 'rksd', the Rockchip SD/MMC boot format. The mkimage tool is often |
| 150 | called from the U-Boot build system for this reason. |
| 151 | |
| 152 | Binman considers the output files created by mkimage to be binary blobs |
| 153 | which it can place in an image. Binman does not replace the mkimage tool or |
Michael Heimpold | 55c822d | 2018-08-22 22:01:24 +0200 | [diff] [blame] | 154 | this purpose. It would be possible in some situations to create a new entry |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 155 | type for the images in mkimage, but this would not add functionality. It |
Michael Heimpold | 55c822d | 2018-08-22 22:01:24 +0200 | [diff] [blame] | 156 | seems better to use the mkimage tool to generate binaries and avoid blurring |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 157 | the boundaries between building input files (mkimage) and packaging then |
| 158 | into a final image (binman). |
| 159 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 160 | Note that binman can itself invoke mkimage. This helps to move mkimage |
| 161 | invocations out of the Makefile and into binman image descriptions. |
| 162 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 163 | |
| 164 | Using binman |
| 165 | ============ |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 166 | |
| 167 | Example use of binman in U-Boot |
| 168 | ------------------------------- |
| 169 | |
| 170 | Binman aims to replace some of the ad-hoc image creation in the U-Boot |
| 171 | build system. |
| 172 | |
| 173 | Consider sunxi. It has the following steps: |
| 174 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 175 | #. It uses a custom mksunxiboot tool to build an SPL image called |
| 176 | sunxi-spl.bin. This should probably move into mkimage. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 177 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 180 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 183 | |
| 184 | Binman is intended to replace the last step. The U-Boot build system builds |
| 185 | u-boot.bin and sunxi-spl.bin. Binman can then take over creation of |
Simon Glass | 243c2c1 | 2022-02-08 11:49:54 -0700 | [diff] [blame] | 186 | sunxi-spl.bin by calling mksunxiboot or mkimage. In any case, it would then |
| 187 | create the image from the component parts. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 188 | |
| 189 | This simplifies the U-Boot Makefile somewhat, since various pieces of logic |
| 190 | can be replaced by a call to binman. |
| 191 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 192 | |
| 193 | Invoking binman within U-Boot |
| 194 | ----------------------------- |
| 195 | |
| 196 | Within U-Boot, binman is invoked by the build system, i.e. when you type 'make' |
| 197 | or use buildman to build U-Boot. There is no need to run binman independently |
| 198 | during development. Everything happens automatically and is set up for your |
| 199 | SoC or board so that binman produced the right things. |
| 200 | |
| 201 | The 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' |
| 203 | rule). |
| 204 | |
| 205 | There should be only one invocation of binman in Makefile, the very last step |
| 206 | that pulls everything together. At present there are some arch-specific |
| 207 | invocations as well, but these should be dropped when those architectures are |
| 208 | converted to use binman properly. |
| 209 | |
| 210 | As above, the term 'binary' is used for something in INPUTS-y and 'image' is |
| 211 | used for the things that binman creates. So the binaries are inputs to the |
| 212 | image(s) and it is the image that is actually loaded on the board. |
| 213 | |
| 214 | Again, at present, there are a number of things created in Makefile which should |
| 215 | be 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 |
| 218 | 400 lines from `Makefile`. |
| 219 | |
| 220 | Since binman is invoked only once, it must of course create all the images that |
| 221 | are needed, in that one invocation. It does this by working through the image |
| 222 | descriptions one by one, collecting the input binaries, processing them as |
| 223 | needed and producing the final images. |
| 224 | |
| 225 | The same binaries may be used by multiple images. For example binman may be used |
| 226 | to produce an SD-card image and a SPI-flash image. In this case the binaries |
| 227 | going into the process are the same, but binman produces slightly different |
| 228 | images in each case. |
| 229 | |
| 230 | For some SoCs, U-Boot is not the only project that produces the necessary |
| 231 | binaries. For example, ARM Trusted Firmware (ATF) is a project that produces |
| 232 | binaries which must be incorporate, such as `bl31.elf` or `bl31.bin`. For this |
| 233 | to work you must have built ATF before you build U-Boot and you must tell U-Boot |
| 234 | where to find the bl31 image, using the BL31 environment variable. |
| 235 | |
| 236 | How 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 |
| 238 | case the `bl31.bin` file. When you build U-Boot but do not set the BL31 |
| 239 | environment 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 | |
| 245 | The mechanism by which binman is advised of this is also in the Makefile. See |
| 246 | the `-a atf-bl31-path=${BL31}` piece in `cmd_binman`. This tells binman to |
| 247 | set the EntryArg `atf-bl31-path` to the value of the `BL31` environment |
| 248 | variable. Within binman, this EntryArg is picked up by the `Entry_atf_bl31` |
| 249 | etype. An EntryArg is simply an argument to the entry. The `atf-bl31-path` |
| 250 | name is documented in :ref:`etype_atf_bl31`. |
| 251 | |
Simon Glass | 7d959c5 | 2022-08-18 02:16:45 -0600 | [diff] [blame] | 252 | Taking this a little further, when binman is used to create a FIT, it supports |
| 253 | using 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 Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 256 | |
| 257 | Invoking binman outside U-Boot |
| 258 | ------------------------------ |
| 259 | |
| 260 | While binman is invoked from within the U-Boot build system, it is also possible |
| 261 | to invoke it separately. This is typically used in a production build system, |
| 262 | where signing is completed (with real keys) and any missing binaries are |
| 263 | provided. |
| 264 | |
| 265 | For example, for build testing there is no need to provide a real signature, |
| 266 | nor is there any need to provide a real ATF BL31 binary (for example). These can |
| 267 | be added later by invoking binman again, providing all the required inputs |
| 268 | from the first time, plus any that were missing or placeholders. |
| 269 | |
| 270 | So 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 | |
| 275 | While the same input binaries are used in each case, you will of course you will |
| 276 | need to create your own binman command line, similar to that in `cmd_binman` in |
| 277 | the Makefile. You may find the -I and --toolpath options useful. The |
| 278 | device tree file is provided to binman in binary form, so there is no need to |
| 279 | have access to the original `.dts` sources. |
| 280 | |
| 281 | |
| 282 | Assembling the image description |
| 283 | -------------------------------- |
| 284 | |
| 285 | Since binman uses the device tree for its image description, you can use the |
| 286 | same files that describe your board's hardware to describe how the image is |
| 287 | assembled. Typically the images description is in a common file used by all |
| 288 | boards with a particular SoC (e.g. `imx8mp-u-boot.dtsi`). |
| 289 | |
| 290 | Where a particular boards needs to make changes, it can override properties in |
| 291 | the SoC file, just as it would for any other device tree property. It can also |
| 292 | add a image that is specific to the board. |
| 293 | |
| 294 | Another way to control the image description to make use of CONFIG options in |
| 295 | the description. For example, if the start offset of a particular entry varies |
| 296 | by 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 | |
| 306 | The SoC can provide a default value but boards can override that as needed and |
| 307 | binman will take care of it. |
| 308 | |
| 309 | It is even possible to control which entries appear in the image, by using the |
| 310 | C preprocessor:: |
| 311 | |
| 312 | #ifdef CONFIG_HAVE_MRC |
| 313 | intel-mrc { |
Tom Rini | aefad5d | 2022-12-04 10:14:07 -0500 | [diff] [blame] | 314 | offset = <CFG_X86_MRC_ADDR>; |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 315 | }; |
| 316 | #endif |
| 317 | |
| 318 | Only boards which enable `HAVE_MRC` will include this entry. |
| 319 | |
| 320 | Obviously a similar approach can be used to control which images are produced, |
| 321 | with a Kconfig option to enable a SPI image, for example. However there is |
| 322 | generally no harm in producing an image that is not used. If a board uses MMC |
| 323 | but not SPI, but the SoC supports booting from both, then both images can be |
| 324 | produced, with only on or other being used by particular boards. This can help |
| 325 | reduce the need for having multiple defconfig targets for a board where the |
| 326 | only difference is the boot media, enabling / disabling secure boot, etc. |
| 327 | |
| 328 | Of course you can use the device tree itself to pass any board-specific |
| 329 | information that is needed by U-Boot at runtime (see binman_syms_ for how to |
| 330 | make binman insert these values directly into executables like SPL). |
| 331 | |
| 332 | There is one more way this can be done: with individual .dtsi files for each |
| 333 | image supported by the SoC. Then the board `.dts` file can include the ones it |
| 334 | wants. This is not recommended, since it is likely to be difficult to maintain |
| 335 | and harder to understand the relationship between the different boards. |
| 336 | |
| 337 | |
| 338 | Producing images for multiple boards |
| 339 | ------------------------------------ |
| 340 | |
| 341 | When invoked within U-Boot, binman only builds a single set of images, for |
| 342 | the chosen board. This is set by the `CONFIG_DEFAULT_DEVICE_TREE` option. |
| 343 | |
| 344 | However, U-Boot generally builds all the device tree files associated with an |
| 345 | SoC. These are written to the (e.g. for ARM) `arch/arm/dts` directory. Each of |
| 346 | these contains the full binman description for that board. Often the best |
| 347 | approach is to build a single image that includes all these device tree binaries |
| 348 | and allow SPL to select the correct one on boot. |
| 349 | |
| 350 | However, it is also possible to build separate images for each board, simply by |
| 351 | invoking binman multiple times, once for each device tree file, using a |
| 352 | different output directory. This will produce one set of images for each board. |
| 353 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 354 | |
| 355 | Example use of binman for x86 |
| 356 | ----------------------------- |
| 357 | |
| 358 | In most cases x86 images have a lot of binary blobs, 'black-box' code |
| 359 | provided by Intel which must be run for the platform to work. Typically |
| 360 | these blobs are not relocatable and must be placed at fixed areas in the |
Michael Heimpold | 55c822d | 2018-08-22 22:01:24 +0200 | [diff] [blame] | 361 | firmware image. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 362 | |
| 363 | Currently this is handled by ifdtool, which places microcode, FSP, MRC, VGA |
| 364 | BIOS, reference code and Intel ME binaries into a u-boot.rom file. |
| 365 | |
| 366 | Binman is intended to replace all of this, with ifdtool left to handle only |
| 367 | the configuration of the Intel-format descriptor. |
| 368 | |
| 369 | |
Simon Glass | 7a7874f | 2022-01-09 20:13:48 -0700 | [diff] [blame] | 370 | Installing binman |
| 371 | ----------------- |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 372 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 373 | First install prerequisites, e.g: |
| 374 | |
| 375 | .. code-block:: bash |
Simon Glass | 567b682 | 2019-07-08 13:18:35 -0600 | [diff] [blame] | 376 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 377 | sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \ |
| 378 | liblz4-tool |
Simon Glass | 567b682 | 2019-07-08 13:18:35 -0600 | [diff] [blame] | 379 | |
Simon Glass | 7a7874f | 2022-01-09 20:13:48 -0700 | [diff] [blame] | 380 | You can run binman directly if you put it on your PATH. But if you want to |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 381 | install into your `~/.local` Python directory, use: |
| 382 | |
| 383 | .. code-block:: bash |
Simon Glass | 7a7874f | 2022-01-09 20:13:48 -0700 | [diff] [blame] | 384 | |
| 385 | pip install tools/patman tools/dtoc tools/binman |
| 386 | |
| 387 | Note that binman makes use of libraries from patman and dtoc, which is why these |
| 388 | need to be installed. Also you need `libfdt` and `pylibfdt` which can be |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 389 | installed like this: |
| 390 | |
| 391 | .. code-block:: bash |
Simon Glass | 7a7874f | 2022-01-09 20:13:48 -0700 | [diff] [blame] | 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 | |
| 398 | This 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 Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 400 | system-library directory, replace the last line with: |
| 401 | |
| 402 | .. code-block:: bash |
Simon Glass | 7a7874f | 2022-01-09 20:13:48 -0700 | [diff] [blame] | 403 | |
| 404 | make NO_PYTHON=1 PREFIX=/ install |
| 405 | |
| 406 | Running binman |
| 407 | -------------- |
| 408 | |
Ralph Siemsen | d4f763c | 2023-02-22 15:56:59 -0500 | [diff] [blame] | 409 | Type: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 410 | |
Ralph Siemsen | d4f763c | 2023-02-22 15:56:59 -0500 | [diff] [blame] | 411 | .. code-block:: bash |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 412 | |
| 413 | make NO_PYTHON=1 PREFIX=/ install |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 414 | binman build -b <board_name> |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 415 | |
| 416 | to build an image for a board. The board name is the same name used when |
| 417 | configuring U-Boot (e.g. for sandbox_defconfig the board name is 'sandbox'). |
| 418 | Binman assumes that the input files for the build are in ../b/<board_name>. |
| 419 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 420 | Or you can specify this explicitly: |
| 421 | |
| 422 | .. code-block:: bash |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 423 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 424 | make NO_PYTHON=1 PREFIX=/ install |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 425 | binman build -I <build_path> |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 426 | |
| 427 | where <build_path> is the build directory containing the output of the U-Boot |
| 428 | build. |
| 429 | |
| 430 | (Future work will make this more configurable) |
| 431 | |
| 432 | In either case, binman picks up the device tree file (u-boot.dtb) and looks |
| 433 | for its instructions in the 'binman' node. |
| 434 | |
| 435 | Binman has a few other options which you can see by running 'binman -h'. |
| 436 | |
| 437 | |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 438 | Enabling binman for a board |
| 439 | --------------------------- |
| 440 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 441 | At present binman is invoked from a rule in the main Makefile. You should be |
| 442 | able to enable CONFIG_BINMAN to enable this rule. |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 443 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 444 | The output file is typically named image.bin and is located in the output |
| 445 | directory. If input files are needed to you add these to INPUTS-y either in the |
| 446 | main Makefile or in a config.mk file in your arch subdirectory. |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 447 | |
| 448 | Once binman is executed it will pick up its instructions from a device-tree |
| 449 | file, typically <soc>-u-boot.dtsi, where <soc> is your CONFIG_SYS_SOC value. |
| 450 | You can use other, more specific CONFIG options - see 'Automatic .dtsi |
| 451 | inclusion' below. |
| 452 | |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 453 | .. _binman_syms: |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 454 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 455 | Access to binman entry offsets at run time (symbols) |
| 456 | ---------------------------------------------------- |
| 457 | |
| 458 | Binman assembles images and determines where each entry is placed in the image. |
| 459 | This information may be useful to U-Boot at run time. For example, in SPL it |
| 460 | is useful to be able to find the location of U-Boot so that it can be executed |
| 461 | when SPL is finished. |
| 462 | |
| 463 | Binman allows you to declare symbols in the SPL image which are filled in |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 464 | with their correct values during the build. For example: |
| 465 | |
| 466 | .. code-block:: c |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 467 | |
| 468 | binman_sym_declare(ulong, u_boot_any, image_pos); |
| 469 | |
| 470 | declares a ulong value which will be assigned to the image-pos of any U-Boot |
| 471 | image (u-boot.bin, u-boot.img, u-boot-nodtb.bin) that is present in the image. |
Simon Glass | 76d71b0 | 2022-08-07 16:33:26 -0600 | [diff] [blame] | 472 | You can access this value with something like: |
| 473 | |
| 474 | .. code-block:: c |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 475 | |
| 476 | ulong u_boot_offset = binman_sym(ulong, u_boot_any, image_pos); |
| 477 | |
| 478 | Thus u_boot_offset will be set to the image-pos of U-Boot in memory, assuming |
| 479 | that the whole image has been loaded, or is available in flash. You can then |
| 480 | jump to that address to start U-Boot. |
| 481 | |
| 482 | At present this feature is only supported in SPL and TPL. In principle it is |
| 483 | possible to fill in such symbols in U-Boot proper, as well, but a future C |
| 484 | library is planned for this instead, to read from the device tree. |
| 485 | |
| 486 | As well as image-pos, it is possible to read the size of an entry and its |
| 487 | offset (which is the start position of the entry within its parent). |
| 488 | |
| 489 | A 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 |
| 491 | image is loaded to its linked address, the value will be correct and actually |
| 492 | point into the image. |
| 493 | |
| 494 | For example, say SPL is at the start of the image and linked to start at address |
| 495 | 80108000. If U-Boot's image-pos is 0x8000 then binman will write an image-pos |
| 496 | for U-Boot of 80110000 into the SPL binary, since it assumes the image is loaded |
| 497 | to 80108000, with SPL at 80108000 and U-Boot at 80110000. |
| 498 | |
| 499 | For x86 devices (with the end-at-4gb property) this base address is not added |
| 500 | since it is assumed that images are XIP and the offsets already include the |
| 501 | address. |
| 502 | |
Simon Glass | e0035c9 | 2023-01-11 16:10:17 -0700 | [diff] [blame] | 503 | While U-Boot's symbol updating is handled automatically by the u-boot-spl |
| 504 | entry type (and others), it is possible to use this feature with any blob. To |
| 505 | do this, add a `write-symbols` (boolean) property to the node, set the ELF |
| 506 | filename using `elf-filename` and set 'elf-base-sym' to the base symbol for the |
| 507 | start of the binary image (this defaults to `__image_copy_start` which is what |
| 508 | U-Boot uses). See `testBlobSymbol()` for an example. |
| 509 | |
Simon Glass | 18ed996 | 2023-01-07 14:07:11 -0700 | [diff] [blame] | 510 | .. _binman_fdt: |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 511 | |
| 512 | Access to binman entry offsets at run time (fdt) |
| 513 | ------------------------------------------------ |
| 514 | |
| 515 | Binman can update the U-Boot FDT to include the final position and size of |
| 516 | each entry in the images it processes. The option to enable this is -u and it |
| 517 | causes binman to make sure that the 'offset', 'image-pos' and 'size' properties |
| 518 | are set correctly for every entry. Since it is not necessary to specify these in |
| 519 | the image definition, binman calculates the final values and writes these to |
| 520 | the device tree. These can be used by U-Boot at run-time to find the location |
| 521 | of each entry. |
| 522 | |
| 523 | Alternatively, an FDT map entry can be used to add a special FDT containing |
| 524 | just the information about the image. This is preceded by a magic string so can |
| 525 | be located anywhere in the image. An image header (typically at the start or end |
| 526 | of the image) can be used to point to the FDT map. See fdtmap and image-header |
| 527 | entries for more information. |
| 528 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 529 | Map files |
| 530 | --------- |
| 531 | |
| 532 | The -m option causes binman to output a .map file for each image that it |
| 533 | generates. 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 | |
| 542 | This shows a hierarchical image with two sections, each with a single entry. The |
| 543 | offsets of the sections are absolute hex byte offsets within the image. The |
| 544 | offsets of the entries are relative to their respective sections. The size of |
| 545 | each entry is also shown, in bytes (hex). The indentation shows the entries |
| 546 | nested inside their sections. |
| 547 | |
| 548 | |
| 549 | Passing command-line arguments to entries |
| 550 | ----------------------------------------- |
| 551 | |
| 552 | Sometimes it is useful to pass binman the value of an entry property from the |
| 553 | command line. For example some entries need access to files and it is not |
| 554 | always convenient to put these filenames in the image definition (device tree). |
| 555 | |
Bin Meng | 1fa2b7c | 2021-05-10 20:23:30 +0800 | [diff] [blame] | 556 | The -a option supports this:: |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 557 | |
Bin Meng | 1fa2b7c | 2021-05-10 20:23:30 +0800 | [diff] [blame] | 558 | -a <prop>=<value> |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 559 | |
| 560 | where:: |
| 561 | |
| 562 | <prop> is the property to set |
| 563 | <value> is the value to set it to |
| 564 | |
| 565 | Not all properties can be provided this way. Only some entries support it, |
| 566 | typically for filenames. |
| 567 | |
| 568 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 569 | Image description format |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 570 | ======================== |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 571 | |
| 572 | The binman node is called 'binman'. An example image description is shown |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 573 | below:: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 574 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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 | }; |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 585 | |
| 586 | |
| 587 | This requests binman to create an image file called u-boot-sunxi-with-spl.bin |
| 588 | consisting of a specially formatted SPL (spl/sunxi-spl.bin, built by the |
| 589 | normal U-Boot Makefile), some 0xff padding, and a U-Boot legacy image. The |
| 590 | padding comes from the fact that the second binary is placed at |
| 591 | CONFIG_SPL_PAD_TO. If that line were omitted then the U-Boot binary would |
| 592 | immediately follow the SPL binary. |
| 593 | |
| 594 | The binman node describes an image. The sub-nodes describe entries in the |
| 595 | image. Each entry represents a region within the overall image. The name of |
| 596 | the entry (blob, u-boot) tells binman what to put there. For 'blob' we must |
| 597 | provide a filename. For 'u-boot', binman knows that this means 'u-boot.bin'. |
| 598 | |
| 599 | Entries are normally placed into the image sequentially, one after the other. |
| 600 | The image size is the total size of all entries. As you can see, you can |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 601 | specify the start offset of an entry using the 'offset' property. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 602 | |
| 603 | Note that due to a device tree requirement, all entries must have a unique |
| 604 | name. If you want to put the same binary in the image multiple times, you can |
| 605 | use any unique name, with the 'type' property providing the type. |
| 606 | |
| 607 | The attributes supported for entries are described below. |
| 608 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 609 | offset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 615 | |
| 616 | align: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 625 | |
| 626 | size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 630 | |
Samuel Holland | e257402 | 2023-01-21 17:25:16 -0600 | [diff] [blame] | 631 | min-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 Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 639 | pad-before: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 646 | |
| 647 | pad-after: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 655 | |
| 656 | align-size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 664 | |
| 665 | align-end: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 675 | |
| 676 | filename: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 680 | |
| 681 | type: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 685 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 686 | offset-unset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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). |
Simon Glass | 4ba8d50 | 2018-06-01 09:38:17 -0600 | [diff] [blame] | 692 | |
Simon Glass | 9dcc861 | 2018-08-01 15:22:42 -0600 | [diff] [blame] | 693 | image-pos: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | 9dcc861 | 2018-08-01 15:22:42 -0600 | [diff] [blame] | 698 | |
Simon Glass | dd156a4 | 2022-03-05 20:18:59 -0700 | [diff] [blame] | 699 | extend-size: |
| 700 | Extend the size of this entry to fit available space. This space is only |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 701 | limited by the size of the image/section and the position of the next |
| 702 | entry. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 703 | |
Simon Glass | aa2fcf9 | 2019-07-08 14:25:30 -0600 | [diff] [blame] | 704 | compress: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 705 | Sets the compression algortihm to use (for blobs only). See the entry |
| 706 | documentation for details. |
Simon Glass | aa2fcf9 | 2019-07-08 14:25:30 -0600 | [diff] [blame] | 707 | |
Simon Glass | a820af7 | 2020-09-06 10:39:09 -0600 | [diff] [blame] | 708 | missing-msg: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 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. |
Simon Glass | a820af7 | 2020-09-06 10:39:09 -0600 | [diff] [blame] | 713 | |
Simon Glass | a360b8f | 2024-06-23 11:55:06 -0600 | [diff] [blame^] | 714 | assume-size: |
| 715 | Sets the assumed size of a blob entry if it is missing. This allows for a |
| 716 | check that the rest of the image fits into the available space, even when |
| 717 | the contents are not available. If the entry is missing, Binman will use |
| 718 | this assumed size for the entry size, including creating a fake file of that |
| 719 | size if requested. |
| 720 | |
Simon Glass | 7098b7f | 2021-03-21 18:24:30 +1300 | [diff] [blame] | 721 | no-expanded: |
| 722 | By default binman substitutes entries with expanded versions if available, |
| 723 | so that a `u-boot` entry type turns into `u-boot-expanded`, for example. The |
| 724 | `--no-expanded` command-line option disables this globally. The |
| 725 | `no-expanded` property disables this just for a single entry. Put the |
| 726 | `no-expanded` boolean property in the node to select this behaviour. |
| 727 | |
Simon Glass | 63328f1 | 2023-01-07 14:07:15 -0700 | [diff] [blame] | 728 | optional: |
| 729 | External blobs are normally required to be present for the image to be |
| 730 | built (but see `External blobs`_). This properly allows an entry to be |
| 731 | optional, so that when it is cannot be found, this problem is ignored and |
| 732 | an empty file is used for this blob. This should be used only when the blob |
| 733 | is entirely optional and is not needed for correct operation of the image. |
| 734 | Note that missing, optional blobs do not produce a non-zero exit code from |
| 735 | binman, although it does show a warning about the missing external blob. |
| 736 | |
Simon Glass | fc79284 | 2023-07-18 07:24:04 -0600 | [diff] [blame] | 737 | insert-template: |
| 738 | This is not strictly speaking an entry property, since it is processed early |
| 739 | in Binman before the entries are read. It is a list of phandles of nodes to |
| 740 | include in the current (target) node. For each node, its subnodes and their |
| 741 | properties are brought into the target node. See Templates_ below for |
| 742 | more information. |
| 743 | |
Simon Glass | 8004581 | 2018-09-14 04:57:30 -0600 | [diff] [blame] | 744 | The attributes supported for images and sections are described below. Several |
| 745 | are similar to those for entries. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 746 | |
| 747 | size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 748 | Sets the image size in bytes, for example 'size = <0x100000>' for a |
| 749 | 1MB image. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 750 | |
Simon Glass | eb023b3 | 2019-04-25 21:58:39 -0600 | [diff] [blame] | 751 | offset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 752 | This is similar to 'offset' in entries, setting the offset of a section |
| 753 | within the image or section containing it. The first byte of the section |
| 754 | is normally at offset 0. If 'offset' is not provided, binman sets it to |
| 755 | the end of the previous region, or the start of the image's entry area |
| 756 | (normally 0) if there is no previous region. |
Simon Glass | eb023b3 | 2019-04-25 21:58:39 -0600 | [diff] [blame] | 757 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 758 | align-size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 759 | This sets the alignment of the image size. For example, to ensure |
| 760 | that the image ends on a 512-byte boundary, use 'align-size = <512>'. |
| 761 | If 'align-size' is not provided, no alignment is performed. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 762 | |
| 763 | pad-before: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 764 | This sets the padding before the image entries. The first entry will |
| 765 | be positioned after the padding. This defaults to 0. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 766 | |
| 767 | pad-after: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 768 | This sets the padding after the image entries. The padding will be |
| 769 | placed after the last entry. This defaults to 0. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 770 | |
| 771 | pad-byte: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 772 | This specifies the pad byte to use when padding in the image. It |
| 773 | defaults to 0. To use 0xff, you would add 'pad-byte = <0xff>'. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 774 | |
| 775 | filename: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 776 | This specifies the image filename. It defaults to 'image.bin'. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 777 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 778 | sort-by-offset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 779 | This causes binman to reorder the entries as needed to make sure they |
| 780 | are in increasing positional order. This can be used when your entry |
| 781 | order may not match the positional order. A common situation is where |
| 782 | the 'offset' properties are set by CONFIG options, so their ordering is |
| 783 | not known a priori. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 784 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 785 | This is a boolean property so needs no value. To enable it, add a |
| 786 | line 'sort-by-offset;' to your description. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 787 | |
| 788 | multiple-images: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 789 | Normally only a single image is generated. To create more than one |
| 790 | image, put this property in the binman node. For example, this will |
| 791 | create image1.bin containing u-boot.bin, and image2.bin containing |
| 792 | both spl/u-boot-spl.bin and u-boot.bin:: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 793 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 794 | binman { |
| 795 | multiple-images; |
| 796 | image1 { |
| 797 | u-boot { |
| 798 | }; |
| 799 | }; |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 800 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 801 | image2 { |
| 802 | spl { |
| 803 | }; |
| 804 | u-boot { |
| 805 | }; |
| 806 | }; |
| 807 | }; |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 808 | |
| 809 | end-at-4gb: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 810 | For x86 machines the ROM offsets start just before 4GB and extend |
| 811 | up so that the image finished at the 4GB boundary. This boolean |
| 812 | option can be enabled to support this. The image size must be |
| 813 | provided so that binman knows when the image should start. For an |
| 814 | 8MB ROM, the offset of the first entry would be 0xfff80000 with |
| 815 | this option, instead of 0 without this option. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 816 | |
Jagdish Gediya | 0fb978c | 2018-09-03 21:35:07 +0530 | [diff] [blame] | 817 | skip-at-start: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 818 | This property specifies the entry offset of the first entry. |
Jagdish Gediya | 0fb978c | 2018-09-03 21:35:07 +0530 | [diff] [blame] | 819 | |
Simon Glass | 72cc538 | 2022-10-20 18:22:39 -0600 | [diff] [blame] | 820 | For PowerPC mpc85xx based CPU, CONFIG_TEXT_BASE is the entry |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 821 | offset of the first entry. It can be 0xeff40000 or 0xfff40000 for |
| 822 | nor flash boot, 0x201000 for sd boot etc. |
Jagdish Gediya | 0fb978c | 2018-09-03 21:35:07 +0530 | [diff] [blame] | 823 | |
Simon Glass | 72cc538 | 2022-10-20 18:22:39 -0600 | [diff] [blame] | 824 | 'end-at-4gb' property is not applicable where CONFIG_TEXT_BASE + |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 825 | Image size != 4gb. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 826 | |
Simon Glass | f427c5f | 2021-03-21 18:24:33 +1300 | [diff] [blame] | 827 | align-default: |
| 828 | Specifies the default alignment for entries in this section, if they do |
| 829 | not specify an alignment. Note that this only applies to top-level entries |
| 830 | in the section (direct subentries), not any subentries of those entries. |
| 831 | This means that each section must specify its own default alignment, if |
| 832 | required. |
| 833 | |
Neha Malcom Francis | 3eb4be3 | 2022-10-17 16:36:25 +0530 | [diff] [blame] | 834 | symlink: |
| 835 | Adds a symlink to the image with string given in the symlink property. |
| 836 | |
Simon Glass | f1ee03b | 2023-01-11 16:10:16 -0700 | [diff] [blame] | 837 | overlap: |
| 838 | Indicates that this entry overlaps with others in the same section. These |
| 839 | entries should appear at the end of the section. Overlapping entries are not |
| 840 | packed with other entries, but their contents are written over other entries |
| 841 | in the section. Overlapping entries must have an explicit offset and size. |
| 842 | |
Simon Glass | e0035c9 | 2023-01-11 16:10:17 -0700 | [diff] [blame] | 843 | write-symbols: |
| 844 | Indicates that the blob should be updated with symbol values calculated by |
| 845 | binman. This is automatic for certain entry types, e.g. `u-boot-spl`. See |
| 846 | binman_syms_ for more information. |
| 847 | |
Simon Glass | 4abf784 | 2023-07-18 07:23:54 -0600 | [diff] [blame] | 848 | no-write-symbols: |
| 849 | Disables symbol writing for this entry. This can be used in entry types |
| 850 | where symbol writing is automatic. For example, if `u-boot-spl` refers to |
| 851 | the `u_boot_any_image_pos` symbol but U-Boot is not available in the image |
| 852 | containing SPL, this can be used to disable the writing. Quite likely this |
| 853 | indicates a bug in your setup. |
| 854 | |
Simon Glass | e0035c9 | 2023-01-11 16:10:17 -0700 | [diff] [blame] | 855 | elf-filename: |
| 856 | Sets the file name of a blob's associated ELF file. For example, if the |
| 857 | blob is `zephyr.bin` then the ELF file may be `zephyr.elf`. This allows |
| 858 | binman to locate symbols and understand the structure of the blob. See |
| 859 | binman_syms_ for more information. |
| 860 | |
| 861 | elf-base-sym: |
| 862 | Sets the name of the ELF symbol that points to the start of a blob. For |
| 863 | U-Boot this is `__image_copy_start` and that is the default used by binman |
| 864 | if this property is missing. For other projects, a difference symbol may be |
| 865 | needed. Add this symbol to the properties for the blob so that symbols can |
| 866 | be read correctly. See binman_syms_ for more information. |
| 867 | |
Simon Glass | 49e9c00 | 2023-01-11 16:10:19 -0700 | [diff] [blame] | 868 | offset-from-elf: |
| 869 | Sets the offset of an entry based on a symbol value in an another entry. |
| 870 | The format is <&phandle>, "sym_name", <offset> where phandle is the entry |
| 871 | containing the blob (with associated ELF file providing symbols), <sym_name> |
| 872 | is the symbol to lookup (relative to elf-base-sym) and <offset> is an offset |
| 873 | to add to that value. |
| 874 | |
Simon Glass | cda991e | 2023-02-12 17:11:15 -0700 | [diff] [blame] | 875 | preserve: |
| 876 | Indicates that this entry should be preserved by any firmware updates. This |
| 877 | flag should be checked by the updater when it is deciding which entries to |
| 878 | update. This flag is normally attached to sections but can be attached to |
| 879 | a single entry in a section if the updater supports it. Not that binman |
| 880 | itself has no control over the updater's behaviour, so this is just a |
| 881 | signal. It is not enforced by binman. |
| 882 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 883 | Examples of the above options can be found in the tests. See the |
| 884 | tools/binman/test directory. |
| 885 | |
Simon Glass | e76a3e6 | 2018-06-01 09:38:11 -0600 | [diff] [blame] | 886 | It is possible to have the same binary appear multiple times in the image, |
| 887 | either by using a unit number suffix (u-boot@0, u-boot@1) or by using a |
| 888 | different name for each and specifying the type with the 'type' attribute. |
| 889 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 890 | |
Michael Heimpold | 55c822d | 2018-08-22 22:01:24 +0200 | [diff] [blame] | 891 | Sections and hierachical images |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 892 | ------------------------------- |
| 893 | |
| 894 | Sometimes it is convenient to split an image into several pieces, each of which |
| 895 | contains its own set of binaries. An example is a flash device where part of |
| 896 | the image is read-only and part is read-write. We can set up sections for each |
| 897 | of these, and place binaries in them independently. The image is still produced |
| 898 | as a single output file. |
| 899 | |
| 900 | This feature provides a way of creating hierarchical images. For example here |
Simon Glass | 1e32400 | 2018-06-01 09:38:19 -0600 | [diff] [blame] | 901 | is an example image with two copies of U-Boot. One is read-only (ro), intended |
| 902 | to be written only in the factory. Another is read-write (rw), so that it can be |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 903 | upgraded in the field. The sizes are fixed so that the ro/rw boundary is known |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 904 | and can be programmed:: |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 905 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 906 | binman { |
| 907 | section@0 { |
| 908 | read-only; |
| 909 | name-prefix = "ro-"; |
| 910 | size = <0x100000>; |
| 911 | u-boot { |
| 912 | }; |
| 913 | }; |
| 914 | section@1 { |
| 915 | name-prefix = "rw-"; |
| 916 | size = <0x100000>; |
| 917 | u-boot { |
| 918 | }; |
| 919 | }; |
| 920 | }; |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 921 | |
| 922 | This image could be placed into a SPI flash chip, with the protection boundary |
| 923 | set at 1MB. |
| 924 | |
| 925 | A few special properties are provided for sections: |
| 926 | |
| 927 | read-only: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 928 | Indicates that this section is read-only. This has no impact on binman's |
| 929 | operation, but his property can be read at run time. |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 930 | |
Simon Glass | 3b78d53 | 2018-06-01 09:38:21 -0600 | [diff] [blame] | 931 | name-prefix: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 932 | This string is prepended to all the names of the binaries in the |
| 933 | section. In the example above, the 'u-boot' binaries which actually be |
| 934 | renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to |
| 935 | distinguish binaries with otherwise identical names. |
Simon Glass | 3b78d53 | 2018-06-01 09:38:21 -0600 | [diff] [blame] | 936 | |
Simon Glass | de24416 | 2023-01-07 14:07:08 -0700 | [diff] [blame] | 937 | filename: |
| 938 | This allows the contents of the section to be written to a file in the |
| 939 | output directory. This can sometimes be useful to use the data in one |
| 940 | section in different image, since there is currently no way to share data |
| 941 | beteen images other than through files. |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 942 | |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 943 | Image Properties |
| 944 | ---------------- |
| 945 | |
| 946 | Image nodes act like sections but also have a few extra properties: |
| 947 | |
| 948 | filename: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 949 | Output filename for the image. This defaults to image.bin (or in the |
| 950 | case of multiple images <nodename>.bin where <nodename> is the name of |
| 951 | the image node. |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 952 | |
| 953 | allow-repack: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 954 | Create an image that can be repacked. With this option it is possible |
| 955 | to change anything in the image after it is created, including updating |
| 956 | the position and size of image components. By default this is not |
| 957 | permitted since it is not possibly to know whether this might violate a |
| 958 | constraint in the image description. For example, if a section has to |
| 959 | increase in size to hold a larger binary, that might cause the section |
| 960 | to fall out of its allow region (e.g. read-only portion of flash). |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 961 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 962 | Adding this property causes the original offset and size values in the |
| 963 | image description to be stored in the FDT and fdtmap. |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 964 | |
| 965 | |
Simon Glass | fca3856 | 2022-08-18 02:16:46 -0600 | [diff] [blame] | 966 | Image dependencies |
| 967 | ------------------ |
| 968 | |
| 969 | Binman does not currently support images that depend on each other. For example, |
| 970 | if one image creates `fred.bin` and then the next uses this `fred.bin` to |
| 971 | produce a final `image.bin`, then the behaviour is undefined. It may work, or it |
| 972 | may produce an error about `fred.bin` being missing, or it may use a version of |
| 973 | `fred.bin` from a previous run. |
| 974 | |
| 975 | Often this can be handled by incorporating the dependency into the second |
| 976 | image. For example, instead of:: |
| 977 | |
| 978 | binman { |
| 979 | multiple-images; |
| 980 | |
| 981 | fred { |
| 982 | u-boot { |
| 983 | }; |
| 984 | fill { |
| 985 | size = <0x100>; |
| 986 | }; |
| 987 | }; |
| 988 | |
| 989 | image { |
| 990 | blob { |
| 991 | filename = "fred.bin"; |
| 992 | }; |
| 993 | u-boot-spl { |
| 994 | }; |
| 995 | }; |
| 996 | |
| 997 | you can do this:: |
| 998 | |
| 999 | binman { |
| 1000 | image { |
| 1001 | fred { |
| 1002 | type = "section"; |
| 1003 | u-boot { |
| 1004 | }; |
| 1005 | fill { |
| 1006 | size = <0x100>; |
| 1007 | }; |
| 1008 | }; |
| 1009 | u-boot-spl { |
| 1010 | }; |
| 1011 | }; |
| 1012 | |
| 1013 | |
| 1014 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1015 | Hashing Entries |
| 1016 | --------------- |
| 1017 | |
| 1018 | It is possible to ask binman to hash the contents of an entry and write that |
| 1019 | value back to the device-tree node. For example:: |
| 1020 | |
| 1021 | binman { |
| 1022 | u-boot { |
| 1023 | hash { |
| 1024 | algo = "sha256"; |
| 1025 | }; |
| 1026 | }; |
| 1027 | }; |
| 1028 | |
| 1029 | Here, a new 'value' property will be written to the 'hash' node containing |
| 1030 | the hash of the 'u-boot' entry. Only SHA256 is supported at present. Whole |
| 1031 | sections can be hased if desired, by adding the 'hash' node to the section. |
| 1032 | |
| 1033 | The has value can be chcked at runtime by hashing the data actually read and |
| 1034 | comparing this has to the value in the device tree. |
| 1035 | |
| 1036 | |
| 1037 | Expanded entries |
| 1038 | ---------------- |
| 1039 | |
| 1040 | Binman automatically replaces 'u-boot' with an expanded version of that, i.e. |
| 1041 | 'u-boot-expanded'. This means that when you write:: |
| 1042 | |
| 1043 | u-boot { |
| 1044 | }; |
| 1045 | |
| 1046 | you actually get:: |
| 1047 | |
| 1048 | u-boot { |
| 1049 | type = "u-boot-expanded'; |
| 1050 | }; |
| 1051 | |
| 1052 | which in turn expands to:: |
| 1053 | |
| 1054 | u-boot { |
| 1055 | type = "section"; |
| 1056 | |
| 1057 | u-boot-nodtb { |
| 1058 | }; |
| 1059 | |
| 1060 | u-boot-dtb { |
| 1061 | }; |
| 1062 | }; |
| 1063 | |
| 1064 | U-Boot's various phase binaries actually comprise two or three pieces. |
| 1065 | For example, u-boot.bin has the executable followed by a devicetree. |
| 1066 | |
| 1067 | With binman we want to be able to update that devicetree with full image |
| 1068 | information so that it is accessible to the executable. This is tricky |
| 1069 | if it is not clear where the devicetree starts. |
| 1070 | |
| 1071 | The above feature ensures that the devicetree is clearly separated from the |
| 1072 | U-Boot executable and can be updated separately by binman as needed. It can be |
| 1073 | disabled with the --no-expanded flag if required. |
| 1074 | |
Heiko Thiery | d589456 | 2022-01-24 08:11:01 +0100 | [diff] [blame] | 1075 | The same applies for u-boot-spl and u-boot-tpl. In those cases, the expansion |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1076 | includes the BSS padding, so for example:: |
| 1077 | |
| 1078 | spl { |
| 1079 | type = "u-boot-spl" |
| 1080 | }; |
| 1081 | |
| 1082 | you actually get:: |
| 1083 | |
| 1084 | spl { |
| 1085 | type = "u-boot-expanded'; |
| 1086 | }; |
| 1087 | |
| 1088 | which in turn expands to:: |
| 1089 | |
| 1090 | spl { |
| 1091 | type = "section"; |
| 1092 | |
| 1093 | u-boot-spl-nodtb { |
| 1094 | }; |
| 1095 | |
| 1096 | u-boot-spl-bss-pad { |
| 1097 | }; |
| 1098 | |
| 1099 | u-boot-spl-dtb { |
| 1100 | }; |
| 1101 | }; |
| 1102 | |
| 1103 | Of course we should not expand SPL if it has no devicetree. Also if the BSS |
| 1104 | padding is not needed (because BSS is in RAM as with CONFIG_SPL_SEPARATE_BSS), |
| 1105 | the 'u-boot-spl-bss-pad' subnode should not be created. The use of the expaned |
| 1106 | entry type is controlled by the UseExpanded() method. In the SPL case it checks |
| 1107 | the 'spl-dtb' entry arg, which is 'y' or '1' if SPL has a devicetree. |
| 1108 | |
| 1109 | For the BSS case, a 'spl-bss-pad' entry arg controls whether it is present. All |
| 1110 | entry args are provided by the U-Boot Makefile. |
| 1111 | |
| 1112 | |
Simon Glass | 1e9e61c | 2023-01-07 14:07:12 -0700 | [diff] [blame] | 1113 | Optional entries |
| 1114 | ---------------- |
| 1115 | |
| 1116 | Some entries need to exist only if certain conditions are met. For example, an |
| 1117 | entry may want to appear in the image only if a file has a particular format. |
| 1118 | Obviously the entry must exist in the image description for it to be processed |
| 1119 | at all, so a way needs to be found to have the entry remove itself. |
| 1120 | |
| 1121 | To handle this, when entry.ObtainContents() is called, the entry can call |
| 1122 | entry.mark_absent() to mark itself as absent, passing a suitable message as the |
| 1123 | reason. |
| 1124 | |
| 1125 | Any absent entries are dropped immediately after ObtainContents() has been |
| 1126 | called on all entries. |
| 1127 | |
| 1128 | It is not possible for an entry to mark itself absent at any other point in the |
| 1129 | processing. It must happen in the ObtainContents() method. |
| 1130 | |
| 1131 | The effect is as if the entry had never been present at all, since the image |
| 1132 | is packed without it and it disappears from the list of entries. |
| 1133 | |
| 1134 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1135 | Compression |
| 1136 | ----------- |
| 1137 | |
| 1138 | Binman support compression for 'blob' entries (those of type 'blob' and |
| 1139 | derivatives). To enable this for an entry, add a 'compress' property:: |
| 1140 | |
| 1141 | blob { |
| 1142 | filename = "datafile"; |
| 1143 | compress = "lz4"; |
| 1144 | }; |
| 1145 | |
| 1146 | The entry will then contain the compressed data, using the 'lz4' compression |
| 1147 | algorithm. Currently this is the only one that is supported. The uncompressed |
| 1148 | size is written to the node in an 'uncomp-size' property, if -u is used. |
| 1149 | |
| 1150 | Compression is also supported for sections. In that case the entire section is |
| 1151 | compressed in one block, including all its contents. This means that accessing |
| 1152 | an entry from the section required decompressing the entire section. Also, the |
| 1153 | size of a section indicates the space that it consumes in its parent section |
| 1154 | (and typically the image). With compression, the section may contain more data, |
| 1155 | and the uncomp-size property indicates that, as above. The contents of the |
| 1156 | section is compressed first, before any padding is added. This ensures that the |
| 1157 | padding itself is not compressed, which would be a waste of time. |
| 1158 | |
| 1159 | |
| 1160 | Automatic .dtsi inclusion |
| 1161 | ------------------------- |
| 1162 | |
| 1163 | It is sometimes inconvenient to add a 'binman' node to the .dts file for each |
| 1164 | board. This can be done by using #include to bring in a common file. Another |
| 1165 | approach supported by the U-Boot build system is to automatically include |
| 1166 | a common header. You can then put the binman node (and anything else that is |
Simon Glass | fc1aa35 | 2023-02-13 08:56:34 -0700 | [diff] [blame] | 1167 | specific to U-Boot, such as bootph-all properies) in that header file. |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1168 | |
| 1169 | Binman will search for the following files in arch/<arch>/dts:: |
| 1170 | |
| 1171 | <dts>-u-boot.dtsi where <dts> is the base name of the .dts file |
| 1172 | <CONFIG_SYS_SOC>-u-boot.dtsi |
| 1173 | <CONFIG_SYS_CPU>-u-boot.dtsi |
| 1174 | <CONFIG_SYS_VENDOR>-u-boot.dtsi |
| 1175 | u-boot.dtsi |
| 1176 | |
| 1177 | U-Boot will only use the first one that it finds. If you need to include a |
| 1178 | more general file you can do that from the more specific file using #include. |
Simon Glass | 0a1b3b6 | 2021-12-16 20:59:23 -0700 | [diff] [blame] | 1179 | If you are having trouble figuring out what is going on, you can use |
| 1180 | `DEVICE_TREE_DEBUG=1` with your build:: |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1181 | |
Simon Glass | 0a1b3b6 | 2021-12-16 20:59:23 -0700 | [diff] [blame] | 1182 | make DEVICE_TREE_DEBUG=1 |
| 1183 | scripts/Makefile.lib:334: Automatic .dtsi inclusion: options: |
| 1184 | arch/arm/dts/juno-r2-u-boot.dtsi arch/arm/dts/-u-boot.dtsi |
| 1185 | arch/arm/dts/armv8-u-boot.dtsi arch/arm/dts/armltd-u-boot.dtsi |
| 1186 | arch/arm/dts/u-boot.dtsi ... found: "arch/arm/dts/juno-r2-u-boot.dtsi" |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1187 | |
| 1188 | |
Simon Glass | fc79284 | 2023-07-18 07:24:04 -0600 | [diff] [blame] | 1189 | Templates |
| 1190 | ========= |
| 1191 | |
| 1192 | Sometimes multiple images need to be created which have all have a common |
| 1193 | part. For example, a board may generate SPI and eMMC images which both include |
| 1194 | a FIT. Since the FIT includes many entries, it is tedious to repeat them twice |
| 1195 | in the image description. |
| 1196 | |
| 1197 | Templates provide a simple way to handle this:: |
| 1198 | |
| 1199 | binman { |
| 1200 | multiple-images; |
| 1201 | common_part: template-1 { |
| 1202 | some-property; |
| 1203 | fit { |
| 1204 | ... lots of entries in here |
| 1205 | }; |
| 1206 | |
| 1207 | text { |
| 1208 | text = "base image"; |
| 1209 | }; |
| 1210 | }; |
| 1211 | |
| 1212 | spi-image { |
| 1213 | filename = "image-spi.bin"; |
| 1214 | insert-template = <&fit>; |
| 1215 | |
| 1216 | /* things specific to SPI follow */ |
| 1217 | footer { |
| 1218 | ]; |
| 1219 | |
| 1220 | text { |
| 1221 | text = "SPI image"; |
| 1222 | }; |
| 1223 | }; |
| 1224 | |
| 1225 | mmc-image { |
| 1226 | filename = "image-mmc.bin"; |
| 1227 | insert-template = <&fit>; |
| 1228 | |
| 1229 | /* things specific to MMC follow */ |
| 1230 | footer { |
| 1231 | ]; |
| 1232 | |
| 1233 | text { |
| 1234 | text = "MMC image"; |
| 1235 | }; |
| 1236 | }; |
| 1237 | }; |
| 1238 | |
| 1239 | The template node name must start with 'template', so it is not considered to be |
| 1240 | an image itself. |
| 1241 | |
| 1242 | The mechanism is very simple. For each phandle in the 'insert-templates' |
| 1243 | property, the source node is looked up. Then the subnodes of that source node |
| 1244 | are copied into the target node, i.e. the one containing the `insert-template` |
| 1245 | property. |
| 1246 | |
| 1247 | If the target node has a node with the same name as a template, its properties |
| 1248 | override corresponding properties in the template. This allows the template to |
| 1249 | be uses as a base, with the node providing updates to the properties as needed. |
| 1250 | The overriding happens recursively. |
| 1251 | |
| 1252 | Template nodes appear first in each node that they are inserted into and |
| 1253 | ordering of template nodes is preserved. Other nodes come afterwards. If a |
| 1254 | template node also appears in the target node, then the template node sets the |
| 1255 | order. Thus the template can be used to set the ordering, even if the target |
| 1256 | node provides all the properties. In the above example, `fit` and `text` appear |
| 1257 | first in the `spi-image` and `mmc-image` images, followed by `footer`. |
| 1258 | |
| 1259 | Where there are multiple template nodes, they are inserted in that order. so |
| 1260 | the first template node appears first, then the second. |
| 1261 | |
| 1262 | Properties in the template node are inserted into the destination node if they |
| 1263 | do not exist there. In the example above, `some-property` is added to each of |
| 1264 | `spi-image` and `mmc-image`. |
| 1265 | |
Simon Glass | 54825e1 | 2023-07-22 21:43:56 -0600 | [diff] [blame] | 1266 | Note that template nodes are removed from the binman description after |
| 1267 | processing and before binman builds the image descriptions. |
| 1268 | |
Simon Glass | 09490b0 | 2023-07-22 21:43:52 -0600 | [diff] [blame] | 1269 | The initial devicetree produced by the templating process is written to the |
| 1270 | `u-boot.dtb.tmpl1` file. This can be useful to see what is going on if there is |
Simon Glass | 54825e1 | 2023-07-22 21:43:56 -0600 | [diff] [blame] | 1271 | a failure before the final `u-boot.dtb.out` file is written. A second |
| 1272 | `u-boot.dtb.tmpl2` file is written when the templates themselves are removed. |
Simon Glass | fc79284 | 2023-07-18 07:24:04 -0600 | [diff] [blame] | 1273 | |
Simon Glass | 86b3e47 | 2023-07-22 21:43:57 -0600 | [diff] [blame] | 1274 | Dealing with phandles |
| 1275 | --------------------- |
| 1276 | |
| 1277 | Templates can contain phandles and these are copied to the destination node. |
| 1278 | However this should be used with care, since if a template is instantiated twice |
| 1279 | then the phandle will be copied twice, resulting in a devicetree with duplicate |
| 1280 | phandles, i.e. the same phandle used by two different nodes. Binman detects this |
| 1281 | situation and produces an error, for example:: |
| 1282 | |
| 1283 | Duplicate phandle 1 in nodes /binman/image/fit/images/atf/atf-bl31 and |
| 1284 | /binman/image-2/fit/images/atf/atf-bl31 |
| 1285 | |
| 1286 | In this case an atf-bl31 node containing a phandle has been copied into two |
| 1287 | different target nodes, resulting in the same phandle for each. See |
| 1288 | testTemplatePhandleDup() for the test case. |
| 1289 | |
| 1290 | The solution is typically to put the phandles in the corresponding target nodes |
| 1291 | (one for each) and remove the phandle from the template. |
Simon Glass | fc79284 | 2023-07-18 07:24:04 -0600 | [diff] [blame] | 1292 | |
Simon Glass | adfb849 | 2021-11-03 21:09:18 -0600 | [diff] [blame] | 1293 | Updating an ELF file |
| 1294 | ==================== |
| 1295 | |
| 1296 | For the EFI app, where U-Boot is loaded from UEFI and runs as an app, there is |
| 1297 | no way to update the devicetree after U-Boot is built. Normally this works by |
| 1298 | creating a new u-boot.dtb.out with he updated devicetree, which is automatically |
| 1299 | built into the output image. With ELF this is not possible since the ELF is |
| 1300 | not part of an image, just a stand-along file. We must create an updated ELF |
| 1301 | file with the new devicetree. |
| 1302 | |
| 1303 | This is handled by the --update-fdt-in-elf option. It takes four arguments, |
| 1304 | separated by comma: |
| 1305 | |
| 1306 | infile - filename of input ELF file, e.g. 'u-boot's |
| 1307 | outfile - filename of output ELF file, e.g. 'u-boot.out' |
| 1308 | begin_sym - symbol at the start of the embedded devicetree, e.g. |
| 1309 | '__dtb_dt_begin' |
| 1310 | end_sym - symbol at the start of the embedded devicetree, e.g. |
| 1311 | '__dtb_dt_end' |
| 1312 | |
| 1313 | When this flag is used, U-Boot does all the normal packaging, but as an |
| 1314 | additional step, it creates a new ELF file with the new devicetree embedded in |
| 1315 | it. |
| 1316 | |
| 1317 | If logging is enabled you will see a message like this:: |
| 1318 | |
| 1319 | Updating file 'u-boot' with data length 0x400a (16394) between symbols |
| 1320 | '__dtb_dt_begin' and '__dtb_dt_end' |
| 1321 | |
| 1322 | There must be enough space for the updated devicetree. If not, an error like |
| 1323 | the following is produced:: |
| 1324 | |
| 1325 | ValueError: Not enough space in 'u-boot' for data length 0x400a (16394); |
| 1326 | size is 0x1744 (5956) |
| 1327 | |
| 1328 | |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 1329 | Entry Documentation |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 1330 | =================== |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 1331 | |
| 1332 | For details on the various entry types supported by binman and how to use them, |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 1333 | see entries.rst which is generated from the source code using: |
| 1334 | |
| 1335 | binman entry-docs >tools/binman/entries.rst |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 1336 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 1337 | .. toctree:: |
| 1338 | :maxdepth: 2 |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 1339 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 1340 | entries |
| 1341 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1342 | |
| 1343 | Managing images |
| 1344 | =============== |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 1345 | |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 1346 | Listing images |
| 1347 | -------------- |
| 1348 | |
| 1349 | It is possible to list the entries in an existing firmware image created by |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1350 | binman, provided that there is an 'fdtmap' entry in the image. For example:: |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 1351 | |
| 1352 | $ binman ls -i image.bin |
| 1353 | Name Image-pos Size Entry-type Offset Uncomp-size |
| 1354 | ---------------------------------------------------------------------- |
| 1355 | main-section c00 section 0 |
| 1356 | u-boot 0 4 u-boot 0 |
| 1357 | section 5fc section 4 |
| 1358 | cbfs 100 400 cbfs 0 |
| 1359 | u-boot 138 4 u-boot 38 |
| 1360 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 |
| 1361 | u-boot-dtb 500 1ff u-boot-dtb 400 3b5 |
| 1362 | fdtmap 6fc 381 fdtmap 6fc |
| 1363 | image-header bf8 8 image-header bf8 |
| 1364 | |
| 1365 | This shows the hierarchy of the image, the position, size and type of each |
| 1366 | entry, the offset of each entry within its parent and the uncompressed size if |
| 1367 | the entry is compressed. |
| 1368 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1369 | It is also possible to list just some files in an image, e.g.:: |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 1370 | |
| 1371 | $ binman ls -i image.bin section/cbfs |
| 1372 | Name Image-pos Size Entry-type Offset Uncomp-size |
| 1373 | -------------------------------------------------------------------- |
| 1374 | cbfs 100 400 cbfs 0 |
| 1375 | u-boot 138 4 u-boot 38 |
| 1376 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 |
| 1377 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1378 | or with wildcards:: |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 1379 | |
| 1380 | $ binman ls -i image.bin "*cb*" "*head*" |
| 1381 | Name Image-pos Size Entry-type Offset Uncomp-size |
| 1382 | ---------------------------------------------------------------------- |
| 1383 | cbfs 100 400 cbfs 0 |
| 1384 | u-boot 138 4 u-boot 38 |
| 1385 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 |
| 1386 | image-header bf8 8 image-header bf8 |
| 1387 | |
Simon Glass | b9028bc | 2021-11-23 21:09:49 -0700 | [diff] [blame] | 1388 | If an older version of binman is used to list images created by a newer one, it |
| 1389 | is possible that it will contain entry types that are not supported. These still |
| 1390 | show with the correct type, but binman just sees them as blobs (plain binary |
| 1391 | data). Any special features of that etype are not supported by the old binman. |
| 1392 | |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 1393 | |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 1394 | Extracting files from images |
| 1395 | ---------------------------- |
| 1396 | |
| 1397 | You can extract files from an existing firmware image created by binman, |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1398 | provided that there is an 'fdtmap' entry in the image. For example:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 1399 | |
| 1400 | $ binman extract -i image.bin section/cbfs/u-boot |
| 1401 | |
| 1402 | which will write the uncompressed contents of that entry to the file 'u-boot' in |
| 1403 | the current directory. You can also extract to a particular file, in this case |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1404 | u-boot.bin:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 1405 | |
| 1406 | $ binman extract -i image.bin section/cbfs/u-boot -f u-boot.bin |
| 1407 | |
| 1408 | It is possible to extract all files into a destination directory, which will |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1409 | put files in subdirectories matching the entry hierarchy:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 1410 | |
| 1411 | $ binman extract -i image.bin -O outdir |
| 1412 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1413 | or just a selection:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 1414 | |
| 1415 | $ binman extract -i image.bin "*u-boot*" -O outdir |
| 1416 | |
Simon Glass | 637958f | 2021-11-23 21:09:50 -0700 | [diff] [blame] | 1417 | Some entry types have alternative formats, for example fdtmap which allows |
| 1418 | extracted just the devicetree binary without the fdtmap header:: |
| 1419 | |
| 1420 | $ binman extract -i /tmp/b/odroid-c4/image.bin -f out.dtb -F fdt fdtmap |
| 1421 | $ fdtdump out.dtb |
| 1422 | /dts-v1/; |
| 1423 | // magic: 0xd00dfeed |
| 1424 | // totalsize: 0x8ab (2219) |
| 1425 | // off_dt_struct: 0x38 |
| 1426 | // off_dt_strings: 0x82c |
| 1427 | // off_mem_rsvmap: 0x28 |
| 1428 | // version: 17 |
| 1429 | // last_comp_version: 2 |
| 1430 | // boot_cpuid_phys: 0x0 |
| 1431 | // size_dt_strings: 0x7f |
| 1432 | // size_dt_struct: 0x7f4 |
| 1433 | |
| 1434 | / { |
| 1435 | image-node = "binman"; |
| 1436 | image-pos = <0x00000000>; |
| 1437 | size = <0x0011162b>; |
| 1438 | ... |
| 1439 | |
| 1440 | Use `-F list` to see what alternative formats are available:: |
| 1441 | |
| 1442 | $ binman extract -i /tmp/b/odroid-c4/image.bin -F list |
| 1443 | Flag (-F) Entry type Description |
| 1444 | fdt fdtmap Extract the devicetree blob from the fdtmap |
| 1445 | |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 1446 | |
Simon Glass | 072959a | 2019-07-20 12:23:50 -0600 | [diff] [blame] | 1447 | Replacing files in an image |
| 1448 | --------------------------- |
| 1449 | |
| 1450 | You can replace files in an existing firmware image created by binman, provided |
Simon Glass | 31cce97 | 2021-11-23 21:09:48 -0700 | [diff] [blame] | 1451 | that there is an 'fdtmap' entry in the image. For example:: |
Simon Glass | 072959a | 2019-07-20 12:23:50 -0600 | [diff] [blame] | 1452 | |
| 1453 | $ binman replace -i image.bin section/cbfs/u-boot |
| 1454 | |
| 1455 | which will write the contents of the file 'u-boot' from the current directory |
Simon Glass | 30033c2 | 2019-07-20 12:24:15 -0600 | [diff] [blame] | 1456 | to the that entry, compressing if necessary. If the entry size changes, you must |
| 1457 | add the 'allow-repack' property to the original image before generating it (see |
| 1458 | above), otherwise you will get an error. |
Simon Glass | 072959a | 2019-07-20 12:23:50 -0600 | [diff] [blame] | 1459 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1460 | You can also use a particular file, in this case u-boot.bin:: |
Simon Glass | 30033c2 | 2019-07-20 12:24:15 -0600 | [diff] [blame] | 1461 | |
| 1462 | $ binman replace -i image.bin section/cbfs/u-boot -f u-boot.bin |
| 1463 | |
| 1464 | It is possible to replace all files from a source directory which uses the same |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1465 | hierarchy as the entries:: |
Simon Glass | 30033c2 | 2019-07-20 12:24:15 -0600 | [diff] [blame] | 1466 | |
| 1467 | $ binman replace -i image.bin -I indir |
| 1468 | |
| 1469 | Files that are missing will generate a warning. |
| 1470 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1471 | You can also replace just a selection of entries:: |
Simon Glass | 30033c2 | 2019-07-20 12:24:15 -0600 | [diff] [blame] | 1472 | |
| 1473 | $ binman replace -i image.bin "*u-boot*" -I indir |
| 1474 | |
Simon Glass | 49b77e8 | 2023-03-02 17:02:44 -0700 | [diff] [blame] | 1475 | It is possible to replace whole sections as well, but in that case any |
| 1476 | information about entries within the section may become outdated. This is |
| 1477 | because Binman cannot know whether things have moved around or resized within |
| 1478 | the section, once you have updated its data. |
| 1479 | |
| 1480 | Technical note: With 'allow-repack', Binman writes information about the |
| 1481 | original offset and size properties of each entry, if any were specified, in |
| 1482 | the 'orig-offset' and 'orig-size' properties. This allows Binman to distinguish |
| 1483 | between an entry which ended up being packed at an offset (or assigned a size) |
| 1484 | and an entry which had a particular offset / size requested in the Binman |
| 1485 | configuration. Where are particular offset / size was requested, this is treated |
| 1486 | as set in stone, so Binman will ensure it doesn't change. Without this feature, |
| 1487 | repacking an entry might cause it to disobey the original constraints provided |
| 1488 | when it was created. |
| 1489 | |
Simon Glass | a922347 | 2022-11-09 19:14:49 -0700 | [diff] [blame] | 1490 | |
Ivan Mikhaylov | 3d80de0 | 2023-03-08 01:13:38 +0000 | [diff] [blame] | 1491 | Signing FIT container with private key in an image |
| 1492 | -------------------------------------------------- |
| 1493 | |
| 1494 | You can sign FIT container with private key in your image. |
| 1495 | For example:: |
| 1496 | |
| 1497 | $ binman sign -i image.bin -k privatekey -a sha256,rsa4096 fit |
| 1498 | |
| 1499 | binman will extract FIT container, sign and replace it immediately. |
| 1500 | |
| 1501 | If you want to sign and replace FIT container in place:: |
| 1502 | |
| 1503 | $ binman sign -i image.bin -k privatekey -a sha256,rsa4096 -f fit.fit fit |
| 1504 | |
| 1505 | which will sign FIT container with private key and replace it immediately |
| 1506 | inside your image. |
| 1507 | |
Massimo Pegorer | b05ac5e | 2023-09-09 15:52:35 +0200 | [diff] [blame] | 1508 | .. _`BinmanLogging`: |
Ivan Mikhaylov | 3d80de0 | 2023-03-08 01:13:38 +0000 | [diff] [blame] | 1509 | |
Simon Glass | 233a26a9 | 2019-07-08 14:25:49 -0600 | [diff] [blame] | 1510 | Logging |
| 1511 | ------- |
| 1512 | |
| 1513 | Binman normally operates silently unless there is an error, in which case it |
| 1514 | just displays the error. The -D/--debug option can be used to create a full |
Simon Glass | caa5f18 | 2021-02-06 09:57:28 -0700 | [diff] [blame] | 1515 | backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select |
| 1516 | this. |
Simon Glass | 233a26a9 | 2019-07-08 14:25:49 -0600 | [diff] [blame] | 1517 | |
| 1518 | Internally binman logs some output while it is running. This can be displayed |
| 1519 | by increasing the -v/--verbosity from the default of 1: |
| 1520 | |
| 1521 | 0: silent |
| 1522 | 1: warnings only |
| 1523 | 2: notices (important messages) |
| 1524 | 3: info about major operations |
| 1525 | 4: detailed information about each operation |
| 1526 | 5: debug (all output) |
| 1527 | |
Simon Glass | caa5f18 | 2021-02-06 09:57:28 -0700 | [diff] [blame] | 1528 | You can use BINMAN_VERBOSE=5 (for example) when building to select this. |
Simon Glass | 233a26a9 | 2019-07-08 14:25:49 -0600 | [diff] [blame] | 1529 | |
Simon Glass | 7223245 | 2016-11-25 20:15:53 -0700 | [diff] [blame] | 1530 | |
Simon Glass | 4142486 | 2022-01-09 20:14:12 -0700 | [diff] [blame] | 1531 | Bintools |
| 1532 | ======== |
| 1533 | |
| 1534 | `Bintool` is the name binman gives to a binary tool which it uses to create and |
| 1535 | manipulate binaries that binman cannot handle itself. Bintools are often |
| 1536 | necessary since Binman only supports a subset of the available file formats |
| 1537 | natively. |
| 1538 | |
| 1539 | Many SoC vendors invent ways to load code into their SoC using new file formats, |
| 1540 | sometimes changing the format with successive SoC generations. Sometimes the |
| 1541 | tool is available as Open Source. Sometimes it is a pre-compiled binary that |
| 1542 | must be downloaded from the vendor's website. Sometimes it is available in |
| 1543 | source form but difficult or slow to build. |
| 1544 | |
| 1545 | Even for images that use bintools, binman still assembles the image from its |
| 1546 | image description. It may handle parts of the image natively and part with |
| 1547 | various bintools. |
| 1548 | |
| 1549 | Binman relies on these tools so provides various features to manage them: |
| 1550 | |
| 1551 | - Determining whether the tool is currently installed |
| 1552 | - Downloading or building the tool |
| 1553 | - Determining the version of the tool that is installed |
| 1554 | - Deciding which tools are needed to build an image |
| 1555 | |
| 1556 | The Bintool class is an interface to the tool, a thin level of abstration, using |
| 1557 | Python functions to run the tool for each purpose (e.g. creating a new |
| 1558 | structure, adding a file to an existing structure) rather than just lists of |
| 1559 | string arguments. |
| 1560 | |
| 1561 | As with external blobs, bintools (which are like 'external' tools) can be |
| 1562 | missing. When building an image requires a bintool and it is not installed, |
| 1563 | binman detects this and reports the problem, but continues to build an image. |
| 1564 | This is useful in CI systems which want to check that everything is correct but |
| 1565 | don't have access to the bintools. |
| 1566 | |
| 1567 | To make this work, all calls to bintools (e.g. with Bintool.run_cmd()) must cope |
| 1568 | with the tool being missing, i.e. when None is returned, by: |
| 1569 | |
| 1570 | - Calling self.record_missing_bintool() |
| 1571 | - Setting up some fake contents so binman can continue |
| 1572 | |
| 1573 | Of course the image will not work, but binman reports which bintools are needed |
| 1574 | and also provide a way to fetch them. |
| 1575 | |
| 1576 | To see the available bintools, use:: |
| 1577 | |
| 1578 | binman tool --list |
| 1579 | |
| 1580 | To fetch tools which are missing, use:: |
| 1581 | |
| 1582 | binman tool --fetch missing |
| 1583 | |
| 1584 | You can also use `--fetch all` to fetch all tools or `--fetch <tool>` to fetch |
| 1585 | a particular tool. Some tools are built from source code, in which case you will |
| 1586 | need to have at least the `build-essential` and `git` packages installed. |
| 1587 | |
Simon Glass | 9a1c726 | 2023-02-22 12:14:49 -0700 | [diff] [blame] | 1588 | Tools are fetched into the `~/.binman-tools` directory. This directory is |
| 1589 | automatically added to the toolpath so there is no need to use `--toolpath` to |
| 1590 | specify it. If you want to use these tools outside binman, you may want to |
| 1591 | add this directory to your `PATH`. For example, if you use bash, add this to |
| 1592 | the end of `.bashrc`:: |
| 1593 | |
| 1594 | PATH="$HOME/.binman-tools:$PATH" |
| 1595 | |
| 1596 | To select a custom directory, use the `--tooldir` option. |
Simon Glass | c911496 | 2023-02-22 12:14:48 -0700 | [diff] [blame] | 1597 | |
Simon Glass | 4142486 | 2022-01-09 20:14:12 -0700 | [diff] [blame] | 1598 | Bintool Documentation |
| 1599 | ===================== |
| 1600 | |
| 1601 | To provide details on the various bintools supported by binman, bintools.rst is |
| 1602 | generated from the source code using: |
| 1603 | |
| 1604 | binman bintool-docs >tools/binman/bintools.rst |
| 1605 | |
| 1606 | .. toctree:: |
| 1607 | :maxdepth: 2 |
| 1608 | |
| 1609 | bintools |
| 1610 | |
Simon Glass | a20c041 | 2022-11-09 19:14:54 -0700 | [diff] [blame] | 1611 | Binman commands and arguments |
| 1612 | ============================= |
| 1613 | |
| 1614 | Usage:: |
| 1615 | |
Simon Glass | 9a1c726 | 2023-02-22 12:14:49 -0700 | [diff] [blame] | 1616 | binman [-h] [-B BUILD_DIR] [-D] [--tooldir TOOLDIR] [-H] |
| 1617 | [--toolpath TOOLPATH] [-T THREADS] [--test-section-timeout] |
| 1618 | [-v VERBOSITY] [-V] |
Simon Glass | a20c041 | 2022-11-09 19:14:54 -0700 | [diff] [blame] | 1619 | {build,bintool-docs,entry-docs,ls,extract,replace,test,tool} ... |
| 1620 | |
| 1621 | Binman provides the following commands: |
| 1622 | |
| 1623 | - **build** - build images |
| 1624 | - **bintools-docs** - generate documentation about bintools |
| 1625 | - **entry-docs** - generate documentation about entry types |
| 1626 | - **ls** - list an image |
| 1627 | - **extract** - extract files from an image |
| 1628 | - **replace** - replace one or more entries in an image |
| 1629 | - **test** - run tests |
| 1630 | - **tool** - manage bintools |
| 1631 | |
| 1632 | Options: |
| 1633 | |
| 1634 | -h, --help |
| 1635 | Show help message and exit |
| 1636 | |
| 1637 | -B BUILD_DIR, --build-dir BUILD_DIR |
| 1638 | Directory containing the build output |
| 1639 | |
| 1640 | -D, --debug |
| 1641 | Enabling debugging (provides a full traceback on error) |
| 1642 | |
Simon Glass | 9a1c726 | 2023-02-22 12:14:49 -0700 | [diff] [blame] | 1643 | --tooldir TOOLDIR Set the directory to store tools |
| 1644 | |
Simon Glass | a20c041 | 2022-11-09 19:14:54 -0700 | [diff] [blame] | 1645 | -H, --full-help |
| 1646 | Display the README file |
| 1647 | |
| 1648 | --toolpath TOOLPATH |
Simon Glass | 9a1c726 | 2023-02-22 12:14:49 -0700 | [diff] [blame] | 1649 | Add a path to the list of directories containing tools |
Simon Glass | a20c041 | 2022-11-09 19:14:54 -0700 | [diff] [blame] | 1650 | |
| 1651 | -T THREADS, --threads THREADS |
| 1652 | Number of threads to use (0=single-thread). Note that -T0 is useful for |
| 1653 | debugging since everything runs in one thread. |
| 1654 | |
| 1655 | -v VERBOSITY, --verbosity VERBOSITY |
| 1656 | Control verbosity: 0=silent, 1=warnings, 2=notices, 3=info, 4=detail, |
| 1657 | 5=debug |
| 1658 | |
| 1659 | -V, --version |
| 1660 | Show the binman version |
| 1661 | |
| 1662 | Test options: |
| 1663 | |
| 1664 | --test-section-timeout |
| 1665 | Use a zero timeout for section multi-threading (for testing) |
| 1666 | |
| 1667 | Commands are described below. |
| 1668 | |
| 1669 | binman build |
| 1670 | ------------ |
| 1671 | |
| 1672 | This builds one or more images using the provided image description. |
| 1673 | |
| 1674 | Usage:: |
| 1675 | |
| 1676 | binman build [-h] [-a ENTRY_ARG] [-b BOARD] [-d DT] [--fake-dtb] |
| 1677 | [--fake-ext-blobs] [--force-missing-bintools FORCE_MISSING_BINTOOLS] |
| 1678 | [-i IMAGE] [-I INDIR] [-m] [-M] [-n] [-O OUTDIR] [-p] [-u] |
| 1679 | [--update-fdt-in-elf UPDATE_FDT_IN_ELF] [-W] |
| 1680 | |
| 1681 | Options: |
| 1682 | |
| 1683 | -h, --help |
| 1684 | Show help message and exit |
| 1685 | |
| 1686 | -a ENTRY_ARG, --entry-arg ENTRY_ARG |
| 1687 | Set argument value `arg=value`. See |
| 1688 | `Passing command-line arguments to entries`_. |
| 1689 | |
| 1690 | -b BOARD, --board BOARD |
| 1691 | Board name to build. This can be used instead of `-d`, in which case the |
| 1692 | file `u-boot.dtb` is used, within the build directory's board subdirectory. |
| 1693 | |
| 1694 | -d DT, --dt DT |
| 1695 | Configuration file (.dtb) to use. This must have a top-level node called |
| 1696 | `binman`. See `Image description format`_. |
| 1697 | |
| 1698 | -i IMAGE, --image IMAGE |
| 1699 | Image filename to build (if not specified, build all) |
| 1700 | |
| 1701 | -I INDIR, --indir INDIR |
| 1702 | Add a path to the list of directories to use for input files. This can be |
| 1703 | specified multiple times to add more than one path. |
| 1704 | |
| 1705 | -m, --map |
| 1706 | Output a map file for each image. See `Map files`_. |
| 1707 | |
| 1708 | -M, --allow-missing |
| 1709 | Allow external blobs and bintools to be missing. See `External blobs`_. |
| 1710 | |
| 1711 | -n, --no-expanded |
| 1712 | Don't use 'expanded' versions of entries where available; normally 'u-boot' |
| 1713 | becomes 'u-boot-expanded', for example. See `Expanded entries`_. |
| 1714 | |
| 1715 | -O OUTDIR, --outdir OUTDIR |
| 1716 | Path to directory to use for intermediate and output files |
| 1717 | |
| 1718 | -p, --preserve |
| 1719 | Preserve temporary output directory even if option -O is not given |
| 1720 | |
| 1721 | -u, --update-fdt |
| 1722 | Update the binman node with offset/size info. See |
| 1723 | `Access to binman entry offsets at run time (fdt)`_. |
| 1724 | |
| 1725 | --update-fdt-in-elf UPDATE_FDT_IN_ELF |
| 1726 | Update an ELF file with the output dtb. The argument is a string consisting |
| 1727 | of four parts, separated by commas. See `Updating an ELF file`_. |
| 1728 | |
| 1729 | -W, --ignore-missing |
| 1730 | Return success even if there are missing blobs/bintools (requires -M) |
| 1731 | |
| 1732 | Options used only for testing: |
| 1733 | |
| 1734 | --fake-dtb |
| 1735 | Use fake device tree contents |
| 1736 | |
| 1737 | --fake-ext-blobs |
| 1738 | Create fake ext blobs with dummy content |
| 1739 | |
| 1740 | --force-missing-bintools FORCE_MISSING_BINTOOLS |
| 1741 | Comma-separated list of bintools to consider missing |
| 1742 | |
| 1743 | binman bintool-docs |
| 1744 | ------------------- |
| 1745 | |
| 1746 | Usage:: |
| 1747 | |
| 1748 | binman bintool-docs [-h] |
| 1749 | |
| 1750 | This outputs documentation for the bintools in rST format. See |
| 1751 | `Bintool Documentation`_. |
| 1752 | |
| 1753 | binman entry-docs |
| 1754 | ----------------- |
| 1755 | |
| 1756 | Usage:: |
| 1757 | |
| 1758 | binman entry-docs [-h] |
| 1759 | |
| 1760 | This outputs documentation for the entry types in rST format. See |
| 1761 | `Entry Documentation`_. |
| 1762 | |
| 1763 | binman ls |
| 1764 | --------- |
| 1765 | |
| 1766 | Usage:: |
| 1767 | |
| 1768 | binman ls [-h] -i IMAGE [paths ...] |
| 1769 | |
| 1770 | Positional arguments: |
| 1771 | |
| 1772 | paths |
| 1773 | Paths within file to list (wildcard) |
| 1774 | |
| 1775 | Pptions: |
| 1776 | |
| 1777 | -h, --help |
| 1778 | show help message and exit |
| 1779 | |
| 1780 | -i IMAGE, --image IMAGE |
| 1781 | Image filename to list |
| 1782 | |
| 1783 | This lists an image, showing its contents. See `Listing images`_. |
| 1784 | |
| 1785 | binman extract |
| 1786 | -------------- |
| 1787 | |
| 1788 | Usage:: |
| 1789 | |
| 1790 | binman extract [-h] [-F FORMAT] -i IMAGE [-f FILENAME] [-O OUTDIR] [-U] |
| 1791 | [paths ...] |
| 1792 | |
| 1793 | Positional arguments: |
| 1794 | |
| 1795 | Paths |
| 1796 | Paths within file to extract (wildcard) |
| 1797 | |
| 1798 | Options: |
| 1799 | |
| 1800 | -h, --help |
| 1801 | show help message and exit |
| 1802 | |
| 1803 | -F FORMAT, --format FORMAT |
| 1804 | Select an alternative format for extracted data |
| 1805 | |
| 1806 | -i IMAGE, --image IMAGE |
| 1807 | Image filename to extract |
| 1808 | |
| 1809 | -f FILENAME, --filename FILENAME |
| 1810 | Output filename to write to |
| 1811 | |
| 1812 | -O OUTDIR, --outdir OUTDIR |
| 1813 | Path to directory to use for output files |
| 1814 | |
| 1815 | -U, --uncompressed |
| 1816 | Output raw uncompressed data for compressed entries |
| 1817 | |
| 1818 | This extracts the contents of entries from an image. See |
| 1819 | `Extracting files from images`_. |
| 1820 | |
| 1821 | binman replace |
| 1822 | -------------- |
| 1823 | |
| 1824 | Usage:: |
| 1825 | |
| 1826 | binman replace [-h] [-C] -i IMAGE [-f FILENAME] [-F] [-I INDIR] [-m] |
| 1827 | [paths ...] |
| 1828 | |
| 1829 | Positional arguments: |
| 1830 | |
| 1831 | paths |
| 1832 | Paths within file to replace (wildcard) |
| 1833 | |
| 1834 | Options: |
| 1835 | |
| 1836 | -h, --help |
| 1837 | show help message and exit |
| 1838 | |
| 1839 | -C, --compressed |
| 1840 | Input data is already compressed if needed for the entry |
| 1841 | |
| 1842 | -i IMAGE, --image IMAGE |
| 1843 | Image filename to update |
| 1844 | |
| 1845 | -f FILENAME, --filename FILENAME |
| 1846 | Input filename to read from |
| 1847 | |
| 1848 | -F, --fix-size |
| 1849 | Don't allow entries to be resized |
| 1850 | |
| 1851 | -I INDIR, --indir INDIR |
| 1852 | Path to directory to use for input files |
| 1853 | |
| 1854 | -m, --map |
| 1855 | Output a map file for the updated image |
| 1856 | |
Simon Glass | b9b9b27 | 2023-03-02 17:02:42 -0700 | [diff] [blame] | 1857 | -O OUTDIR, --outdir OUTDIR |
| 1858 | Path to directory to use for intermediate and output files |
| 1859 | |
| 1860 | -p, --preserve |
| 1861 | Preserve temporary output directory even if option -O is not given |
| 1862 | |
Simon Glass | a20c041 | 2022-11-09 19:14:54 -0700 | [diff] [blame] | 1863 | This replaces one or more entries in an existing image. See |
| 1864 | `Replacing files in an image`_. |
| 1865 | |
| 1866 | binman test |
| 1867 | ----------- |
| 1868 | |
| 1869 | Usage:: |
| 1870 | |
| 1871 | binman test [-h] [-P PROCESSES] [-T] [-X] [tests ...] |
| 1872 | |
| 1873 | Positional arguments: |
| 1874 | |
| 1875 | tests |
| 1876 | Test names to run (omit for all) |
| 1877 | |
| 1878 | Options: |
| 1879 | |
| 1880 | -h, --help |
| 1881 | show help message and exit |
| 1882 | |
| 1883 | -P PROCESSES, --processes PROCESSES |
| 1884 | set number of processes to use for running tests. This defaults to the |
| 1885 | number of CPUs on the machine |
| 1886 | |
| 1887 | -T, --test-coverage |
| 1888 | run tests and check for 100% coverage |
| 1889 | |
| 1890 | -X, --test-preserve-dirs |
| 1891 | Preserve and display test-created input directories; also preserve the |
| 1892 | output directory if a single test is run (pass test name at the end of the |
| 1893 | command line |
| 1894 | |
Ivan Mikhaylov | 3d80de0 | 2023-03-08 01:13:38 +0000 | [diff] [blame] | 1895 | binman sign |
| 1896 | ----------- |
| 1897 | |
| 1898 | Usage:: |
| 1899 | |
| 1900 | binman sign [-h] -a ALGO [-f FILE] -i IMAGE -k KEY [paths ...] |
| 1901 | |
| 1902 | positional arguments: |
| 1903 | |
| 1904 | paths |
| 1905 | Paths within file to sign (wildcard) |
| 1906 | |
| 1907 | options: |
| 1908 | |
| 1909 | -h, --help |
| 1910 | show this help message and exit |
| 1911 | |
| 1912 | -a ALGO, --algo ALGO |
| 1913 | Hash algorithm e.g. sha256,rsa4096 |
| 1914 | |
| 1915 | -f FILE, --file FILE |
| 1916 | Input filename to sign |
| 1917 | |
| 1918 | -i IMAGE, --image IMAGE |
| 1919 | Image filename to update |
| 1920 | |
| 1921 | -k KEY, --key KEY |
| 1922 | Private key file for signing |
| 1923 | |
Simon Glass | a20c041 | 2022-11-09 19:14:54 -0700 | [diff] [blame] | 1924 | binman tool |
| 1925 | ----------- |
| 1926 | |
| 1927 | Usage:: |
| 1928 | |
| 1929 | binman tool [-h] [-l] [-f] [bintools ...] |
| 1930 | |
| 1931 | Positional arguments: |
| 1932 | |
| 1933 | bintools |
| 1934 | Bintools to process |
| 1935 | |
| 1936 | Options: |
| 1937 | |
| 1938 | -h, --help |
| 1939 | show help message and exit |
| 1940 | |
| 1941 | -l, --list |
| 1942 | List all known bintools |
| 1943 | |
| 1944 | -f, --fetch |
| 1945 | Fetch a bintool from a known location. Use `all` to fetch all and `missing` |
| 1946 | to fetch any missing tools. |
| 1947 | |
Simon Glass | 4142486 | 2022-01-09 20:14:12 -0700 | [diff] [blame] | 1948 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1949 | Technical details |
| 1950 | ================= |
Simon Glass | 7223245 | 2016-11-25 20:15:53 -0700 | [diff] [blame] | 1951 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1952 | Order of image creation |
| 1953 | ----------------------- |
| 1954 | |
| 1955 | Image creation proceeds in the following order, for each entry in the image. |
| 1956 | |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 1957 | 1. AddMissingProperties() - binman can add calculated values to the device |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 1958 | tree as part of its processing, for example the offset and size of each |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 1959 | entry. This method adds any properties associated with this, expanding the |
| 1960 | device tree as needed. These properties can have placeholder values which are |
| 1961 | set later by SetCalculatedProperties(). By that stage the size of sections |
| 1962 | cannot be changed (since it would cause the images to need to be repacked), |
| 1963 | but the correct values can be inserted. |
| 1964 | |
| 1965 | 2. ProcessFdt() - process the device tree information as required by the |
Simon Glass | 9230773 | 2018-07-06 10:27:40 -0600 | [diff] [blame] | 1966 | particular entry. This may involve adding or deleting properties. If the |
| 1967 | processing is complete, this method should return True. If the processing |
| 1968 | cannot complete because it needs the ProcessFdt() method of another entry to |
| 1969 | run first, this method should return False, in which case it will be called |
| 1970 | again later. |
| 1971 | |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 1972 | 3. GetEntryContents() - the contents of each entry are obtained, normally by |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1973 | reading from a file. This calls the Entry.ObtainContents() to read the |
| 1974 | contents. The default version of Entry.ObtainContents() calls |
| 1975 | Entry.GetDefaultFilename() and then reads that file. So a common mechanism |
| 1976 | to select a file to read is to override that function in the subclass. The |
| 1977 | functions must return True when they have read the contents. Binman will |
| 1978 | retry calling the functions a few times if False is returned, allowing |
| 1979 | dependencies between the contents of different entries. |
| 1980 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 1981 | 4. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1982 | return a dict containing entries that need updating. The key should be the |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 1983 | entry name and the value is a tuple (offset, size). This allows an entry to |
| 1984 | provide the offset and size for other entries. The default implementation |
| 1985 | of GetEntryOffsets() returns {}. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1986 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 1987 | 5. PackEntries() - calls Entry.Pack() which figures out the offset and |
| 1988 | size of an entry. The 'current' image offset is passed in, and the function |
| 1989 | returns the offset immediately after the entry being packed. The default |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1990 | implementation of Pack() is usually sufficient. |
| 1991 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1992 | Note: for sections, this also checks that the entries do not overlap, nor extend |
| 1993 | outside the section. If the section does not have a defined size, the size is |
Simon Glass | f1ee03b | 2023-01-11 16:10:16 -0700 | [diff] [blame] | 1994 | set large enough to hold all the entries. For entries that are explicitly marked |
| 1995 | as overlapping, this check is skipped. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1996 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1997 | 6. SetImagePos() - sets the image position of every entry. This is the absolute |
Simon Glass | 4b05b2d | 2019-07-20 12:23:52 -0600 | [diff] [blame] | 1998 | position 'image-pos', as opposed to 'offset' which is relative to the containing |
| 1999 | section. This must be done after all offsets are known, which is why it is quite |
| 2000 | late in the ordering. |
| 2001 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 2002 | 7. SetCalculatedProperties() - update any calculated properties in the device |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 2003 | tree. This sets the correct 'offset' and 'size' vaues, for example. |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 2004 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 2005 | 8. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2006 | The default implementatoin does nothing. This can be overriden to adjust the |
| 2007 | contents of an entry in some way. For example, it would be possible to create |
| 2008 | an entry containing a hash of the contents of some other entries. At this |
Simon Glass | e61b6f6 | 2019-07-08 14:25:37 -0600 | [diff] [blame] | 2009 | stage the offset and size of entries should not be adjusted unless absolutely |
| 2010 | necessary, since it requires a repack (going back to PackEntries()). |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2011 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 2012 | 9. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry |
Simon Glass | 4b05b2d | 2019-07-20 12:23:52 -0600 | [diff] [blame] | 2013 | has changed its size, then there is no alternative but to go back to step 5 and |
| 2014 | try again, repacking the entries with the updated size. ResetForPack() removes |
| 2015 | the fixed offset/size values added by binman, so that the packing can start from |
| 2016 | scratch. |
| 2017 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 2018 | 10. WriteSymbols() - write the value of symbols into the U-Boot SPL binary. |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 2019 | See 'Access to binman entry offsets at run time' below for a description of |
Simon Glass | 29dae67 | 2018-07-06 10:27:39 -0600 | [diff] [blame] | 2020 | what happens in this stage. |
Simon Glass | be83bc7 | 2017-11-13 18:55:05 -0700 | [diff] [blame] | 2021 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 2022 | 11. BuildImage() - builds the image and writes it to a file |
Simon Glass | 4b05b2d | 2019-07-20 12:23:52 -0600 | [diff] [blame] | 2023 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 2024 | 12. WriteMap() - writes a text file containing a map of the image. This is the |
Simon Glass | 4b05b2d | 2019-07-20 12:23:52 -0600 | [diff] [blame] | 2025 | final step. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2026 | |
| 2027 | |
Simon Glass | a922347 | 2022-11-09 19:14:49 -0700 | [diff] [blame] | 2028 | .. _`External tools`: |
| 2029 | |
Simon Glass | 6244fa4 | 2019-07-08 13:18:28 -0600 | [diff] [blame] | 2030 | External tools |
| 2031 | -------------- |
| 2032 | |
| 2033 | Binman can make use of external command-line tools to handle processing of |
| 2034 | entry contents or to generate entry contents. These tools are executed using |
| 2035 | the 'tools' module's Run() method. The tools generally must exist on the PATH, |
| 2036 | but the --toolpath option can be used to specify additional search paths to |
| 2037 | use. This option can be specified multiple times to add more than one path. |
| 2038 | |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 2039 | For some compile tools binman will use the versions specified by commonly-used |
| 2040 | environment variables like CC and HOSTCC for the C compiler, based on whether |
| 2041 | the tool's output will be used for the target or for the host machine. If those |
| 2042 | aren't given, it will also try to derive target-specific versions from the |
| 2043 | CROSS_COMPILE environment variable during a cross-compilation. |
| 2044 | |
Simon Glass | 31cce97 | 2021-11-23 21:09:48 -0700 | [diff] [blame] | 2045 | If the tool is not available in the path you can use BINMAN_TOOLPATHS to specify |
| 2046 | a space-separated list of paths to search, e.g.:: |
| 2047 | |
| 2048 | BINMAN_TOOLPATHS="/tools/g12a /tools/tegra" binman ... |
| 2049 | |
| 2050 | |
Simon Glass | a922347 | 2022-11-09 19:14:49 -0700 | [diff] [blame] | 2051 | .. _`External blobs`: |
| 2052 | |
Simon Glass | 31cce97 | 2021-11-23 21:09:48 -0700 | [diff] [blame] | 2053 | External blobs |
| 2054 | -------------- |
| 2055 | |
| 2056 | Binary blobs, even if the source code is available, complicate building |
| 2057 | firmware. The instructions can involve multiple steps and the binaries may be |
| 2058 | hard to build or obtain. Binman at least provides a unified description of how |
| 2059 | to build the final image, no matter what steps are needed to get there. |
| 2060 | |
| 2061 | Binman also provides a `blob-ext` entry type that pulls in a binary blob from an |
| 2062 | external file. If the file is missing, binman can optionally complete the build |
| 2063 | and just report a warning. Use the `-M/--allow-missing` option to enble this. |
| 2064 | This is useful in CI systems which want to check that everything is correct but |
| 2065 | don't have access to the blobs. |
| 2066 | |
| 2067 | If the blobs are in a different directory, you can specify this with the `-I` |
| 2068 | option. |
| 2069 | |
Dario Binacchi | 1eec165 | 2023-11-23 14:10:00 +0100 | [diff] [blame] | 2070 | For U-Boot, you can set the BINMAN_INDIRS environment variable to provide a |
Simon Glass | 31cce97 | 2021-11-23 21:09:48 -0700 | [diff] [blame] | 2071 | space-separated list of directories to search for binary blobs:: |
| 2072 | |
| 2073 | BINMAN_INDIRS="odroid-c4/fip/g12a \ |
| 2074 | odroid-c4/build/board/hardkernel/odroidc4/firmware \ |
| 2075 | odroid-c4/build/scp_task" binman ... |
Simon Glass | 6244fa4 | 2019-07-08 13:18:28 -0600 | [diff] [blame] | 2076 | |
Simon Glass | 6bce5dc | 2022-11-09 19:14:42 -0700 | [diff] [blame] | 2077 | Note that binman fails with exit code 103 when there are missing blobs. If you |
| 2078 | wish binman to continue anyway, you can pass `-W` to binman. |
| 2079 | |
| 2080 | |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 2081 | Code coverage |
| 2082 | ------------- |
| 2083 | |
| 2084 | Binman is a critical tool and is designed to be very testable. Entry |
Simon Glass | f46732a | 2019-07-08 14:25:29 -0600 | [diff] [blame] | 2085 | implementations target 100% test coverage. Run 'binman test -T' to check this. |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 2086 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2087 | To enable Python test coverage on Debian-type distributions (e.g. Ubuntu):: |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 2088 | |
Simon Glass | a16dd6e | 2019-07-08 13:18:26 -0600 | [diff] [blame] | 2089 | $ sudo apt-get install python-coverage python3-coverage python-pytest |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 2090 | |
| 2091 | |
Simon Glass | 6bce5dc | 2022-11-09 19:14:42 -0700 | [diff] [blame] | 2092 | Exit status |
| 2093 | ----------- |
| 2094 | |
| 2095 | Binman produces the following exit codes: |
| 2096 | |
| 2097 | 0 |
| 2098 | Success |
| 2099 | |
| 2100 | 1 |
| 2101 | Any sort of failure - see output for more details |
| 2102 | |
| 2103 | 103 |
| 2104 | There are missing external blobs or bintools. This is only returned if |
| 2105 | -M is passed to binman, otherwise missing blobs return an exit status of 1. |
| 2106 | Note, if -W is passed as well as -M, then this is converted into a warning |
| 2107 | and will return an exit status of 0 instead. |
| 2108 | |
| 2109 | |
Simon Glass | a922347 | 2022-11-09 19:14:49 -0700 | [diff] [blame] | 2110 | U-Boot environment variables for binman |
| 2111 | --------------------------------------- |
| 2112 | |
| 2113 | The U-Boot Makefile supports various environment variables to control binman. |
| 2114 | All of these are set within the Makefile and result in passing various |
| 2115 | environment variables (or make flags) to binman: |
| 2116 | |
| 2117 | BINMAN_DEBUG |
| 2118 | Enables backtrace debugging by adding a `-D` argument. See |
| 2119 | :ref:`BinmanLogging`. |
| 2120 | |
| 2121 | BINMAN_INDIRS |
| 2122 | Sets the search path for input files used by binman by adding one or more |
| 2123 | `-I` arguments. See :ref:`External blobs`. |
| 2124 | |
| 2125 | BINMAN_TOOLPATHS |
| 2126 | Sets the search path for external tool used by binman by adding one or more |
| 2127 | `--toolpath` arguments. See :ref:`External tools`. |
| 2128 | |
| 2129 | BINMAN_VERBOSE |
| 2130 | Sets the logging verbosity of binman by adding a `-v` argument. See |
| 2131 | :ref:`BinmanLogging`. |
| 2132 | |
| 2133 | |
Simon Glass | ddd5e1d | 2022-01-23 12:55:46 -0700 | [diff] [blame] | 2134 | Error messages |
| 2135 | -------------- |
| 2136 | |
| 2137 | This section provides some guidance for some of the less obvious error messages |
| 2138 | produced by binman. |
| 2139 | |
| 2140 | |
| 2141 | Expected __bss_size symbol |
| 2142 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 2143 | |
| 2144 | Example:: |
| 2145 | |
| 2146 | binman: Node '/binman/u-boot-spl-ddr/u-boot-spl/u-boot-spl-bss-pad': |
| 2147 | Expected __bss_size symbol in spl/u-boot-spl |
| 2148 | |
| 2149 | This indicates that binman needs the `__bss_size` symbol to be defined in the |
| 2150 | SPL binary, where `spl/u-boot-spl` is the ELF file containing the symbols. The |
| 2151 | symbol tells binman the size of the BSS region, in bytes. It needs this to be |
| 2152 | able to pad the image so that the following entries do not overlap the BSS, |
| 2153 | which would cause them to be overwritte by variable access in SPL. |
| 2154 | |
| 2155 | This symbols is normally defined in the linker script, immediately after |
| 2156 | _bss_start and __bss_end are defined, like this:: |
| 2157 | |
| 2158 | __bss_size = __bss_end - __bss_start; |
| 2159 | |
| 2160 | You may need to add it to your linker script if you get this error. |
| 2161 | |
| 2162 | |
Simon Glass | 1aeb751 | 2019-05-17 22:00:52 -0600 | [diff] [blame] | 2163 | Concurrent tests |
| 2164 | ---------------- |
| 2165 | |
| 2166 | Binman tries to run tests concurrently. This means that the tests make use of |
| 2167 | all available CPUs to run. |
| 2168 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2169 | To enable this:: |
Simon Glass | 1aeb751 | 2019-05-17 22:00:52 -0600 | [diff] [blame] | 2170 | |
| 2171 | $ sudo apt-get install python-subunit python3-subunit |
| 2172 | |
| 2173 | Use '-P 1' to disable this. It is automatically disabled when code coverage is |
| 2174 | being used (-T) since they are incompatible. |
| 2175 | |
| 2176 | |
Simon Glass | 1c420c9 | 2019-07-08 13:18:49 -0600 | [diff] [blame] | 2177 | Debugging tests |
| 2178 | --------------- |
| 2179 | |
| 2180 | Sometimes when debugging tests it is useful to keep the input and output |
| 2181 | directories so they can be examined later. Use -X or --test-preserve-dirs for |
| 2182 | this. |
| 2183 | |
| 2184 | |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 2185 | Running tests on non-x86 architectures |
| 2186 | -------------------------------------- |
| 2187 | |
| 2188 | Binman's tests have been written under the assumption that they'll be run on a |
| 2189 | x86-like host and there hasn't been an attempt to make them portable yet. |
| 2190 | However, it's possible to run the tests by cross-compiling to x86. |
| 2191 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2192 | To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu):: |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 2193 | |
| 2194 | $ sudo apt-get install gcc-x86-64-linux-gnu |
| 2195 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2196 | Then, you can run the tests under cross-compilation:: |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 2197 | |
| 2198 | $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T |
| 2199 | |
| 2200 | You can also use gcc-i686-linux-gnu similar to the above. |
| 2201 | |
| 2202 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 2203 | Writing new entries and debugging |
| 2204 | --------------------------------- |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2205 | |
| 2206 | The behaviour of entries is defined by the Entry class. All other entries are |
| 2207 | a subclass of this. An important subclass is Entry_blob which takes binary |
| 2208 | data from a file and places it in the entry. In fact most entry types are |
| 2209 | subclasses of Entry_blob. |
| 2210 | |
| 2211 | Each entry type is a separate file in the tools/binman/etype directory. Each |
| 2212 | file contains a class called Entry_<type> where <type> is the entry type. |
| 2213 | New entry types can be supported by adding new files in that directory. |
| 2214 | These will automatically be detected by binman when needed. |
| 2215 | |
| 2216 | Entry properties are documented in entry.py. The entry subclasses are free |
| 2217 | to change the values of properties to support special behaviour. For example, |
| 2218 | when Entry_blob loads a file, it sets content_size to the size of the file. |
| 2219 | Entry classes can adjust other entries. For example, an entry that knows |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 2220 | where other entries should be positioned can set up those entries' offsets |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2221 | so they don't need to be set in the binman decription. It can also adjust |
| 2222 | entry contents. |
| 2223 | |
| 2224 | Most of the time such essoteric behaviour is not needed, but it can be |
| 2225 | essential for complex images. |
| 2226 | |
Simon Glass | ade2ef6 | 2017-12-24 12:12:07 -0700 | [diff] [blame] | 2227 | If you need to specify a particular device-tree compiler to use, you can define |
| 2228 | the DTC environment variable. This can be useful when the system dtc is too |
| 2229 | old. |
| 2230 | |
Simon Glass | e64a092 | 2018-11-06 15:21:31 -0700 | [diff] [blame] | 2231 | To enable a full backtrace and other debugging features in binman, pass |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2232 | BINMAN_DEBUG=1 to your build:: |
Simon Glass | e64a092 | 2018-11-06 15:21:31 -0700 | [diff] [blame] | 2233 | |
Bin Meng | a089c41 | 2019-10-02 19:07:29 -0700 | [diff] [blame] | 2234 | make qemu-x86_defconfig |
Simon Glass | e64a092 | 2018-11-06 15:21:31 -0700 | [diff] [blame] | 2235 | make BINMAN_DEBUG=1 |
| 2236 | |
Simon Glass | 03b1d8f | 2019-09-25 08:11:11 -0600 | [diff] [blame] | 2237 | To enable verbose logging from binman, base BINMAN_VERBOSE to your build, which |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2238 | adds a -v<level> option to the call to binman:: |
Simon Glass | 03b1d8f | 2019-09-25 08:11:11 -0600 | [diff] [blame] | 2239 | |
Bin Meng | a089c41 | 2019-10-02 19:07:29 -0700 | [diff] [blame] | 2240 | make qemu-x86_defconfig |
Simon Glass | 03b1d8f | 2019-09-25 08:11:11 -0600 | [diff] [blame] | 2241 | make BINMAN_VERBOSE=5 |
| 2242 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2243 | |
Simon Glass | 76f496d | 2021-07-06 10:36:37 -0600 | [diff] [blame] | 2244 | Building sections in parallel |
| 2245 | ----------------------------- |
| 2246 | |
| 2247 | By default binman uses multiprocessing to speed up compilation of large images. |
| 2248 | This works at a section level, with one thread for each entry in the section. |
| 2249 | This can speed things up if the entries are large and use compression. |
| 2250 | |
| 2251 | This feature can be disabled with the '-T' flag, which defaults to a suitable |
| 2252 | value for your machine. This depends on the Python version, e.g on v3.8 it uses |
| 2253 | 12 threads on an 8-core machine. See ConcurrentFutures_ for more details. |
| 2254 | |
| 2255 | The special value -T0 selects single-threaded mode, useful for debugging during |
| 2256 | development, since dealing with exceptions and problems in threads is more |
| 2257 | difficult. This avoids any use of ThreadPoolExecutor. |
| 2258 | |
| 2259 | |
Simon Glass | 6fba35c | 2022-02-08 11:50:00 -0700 | [diff] [blame] | 2260 | Collecting data for an entry type |
| 2261 | --------------------------------- |
| 2262 | |
| 2263 | Some entry types deal with data obtained from others. For example, |
| 2264 | `Entry_mkimage` calls the `mkimage` tool with data from its subnodes:: |
| 2265 | |
| 2266 | mkimage { |
| 2267 | args = "-n test -T script"; |
| 2268 | |
| 2269 | u-boot-spl { |
| 2270 | }; |
| 2271 | |
| 2272 | u-boot { |
| 2273 | }; |
| 2274 | }; |
| 2275 | |
| 2276 | This shows mkimage being passed a file consisting of SPL and U-Boot proper. It |
Simon Glass | 43a98cc | 2022-03-05 20:18:58 -0700 | [diff] [blame] | 2277 | is created by calling `Entry.collect_contents_to_file()`. Note that in this |
| 2278 | case, the data is passed to mkimage for processing but does not appear |
| 2279 | separately in the image. It may not appear at all, depending on what mkimage |
| 2280 | does. The contents of the `mkimage` entry are entirely dependent on the |
| 2281 | processing done by the entry, with the provided subnodes (`u-boot-spl` and |
| 2282 | `u-boot`) simply providing the input data for that processing. |
Simon Glass | 6fba35c | 2022-02-08 11:50:00 -0700 | [diff] [blame] | 2283 | |
| 2284 | Note that `Entry.collect_contents_to_file()` simply concatenates the data from |
| 2285 | the different entries together, with no control over alignment, etc. Another |
| 2286 | approach is to subclass `Entry_section` so that those features become available, |
| 2287 | such as `size` and `pad-byte`. Then the contents of the entry can be obtained by |
Simon Glass | 43a98cc | 2022-03-05 20:18:58 -0700 | [diff] [blame] | 2288 | calling `super().BuildSectionData()` in the entry's BuildSectionData() |
| 2289 | implementation to get the input data, then write it to a file and process it |
| 2290 | however is desired. |
Simon Glass | 6fba35c | 2022-02-08 11:50:00 -0700 | [diff] [blame] | 2291 | |
| 2292 | There are other ways to obtain data also, depending on the situation. If the |
| 2293 | entry type is simply signing data which exists elsewhere in the image, then |
| 2294 | you can use `Entry_collection` as a base class. It lets you use a property |
| 2295 | called `content` which lists the entries containing data to be processed. This |
| 2296 | is used by `Entry_vblock`, for example:: |
| 2297 | |
| 2298 | u_boot: u-boot { |
| 2299 | }; |
Simon Glass | 43a98cc | 2022-03-05 20:18:58 -0700 | [diff] [blame] | 2300 | |
Simon Glass | 6fba35c | 2022-02-08 11:50:00 -0700 | [diff] [blame] | 2301 | vblock { |
| 2302 | content = <&u_boot &dtb>; |
| 2303 | keyblock = "firmware.keyblock"; |
| 2304 | signprivate = "firmware_data_key.vbprivk"; |
| 2305 | version = <1>; |
| 2306 | kernelkey = "kernel_subkey.vbpubk"; |
| 2307 | preamble-flags = <1>; |
| 2308 | }; |
| 2309 | |
| 2310 | dtb: u-boot-dtb { |
| 2311 | }; |
| 2312 | |
| 2313 | which shows an image containing `u-boot` and `u-boot-dtb`, with the `vblock` |
| 2314 | image collecting their contents to produce input for its signing process, |
| 2315 | without affecting those entries, which still appear in the final image |
| 2316 | untouched. |
| 2317 | |
| 2318 | Another example is where an entry type needs several independent pieces of input |
| 2319 | to function. For example, `Entry_fip` allows a number of different binary blobs |
| 2320 | to be placed in their own individual places in a custom data structure in the |
| 2321 | output image. To make that work you can add subnodes for each of them and call |
| 2322 | `Entry.Create()` on each subnode, as `Entry_fip` does. Then the data for each |
| 2323 | blob can come from any suitable place, such as an `Entry_u_boot` or an |
| 2324 | `Entry_blob` or anything else:: |
| 2325 | |
| 2326 | atf-fip { |
| 2327 | fip-hdr-flags = /bits/ 64 <0x123>; |
| 2328 | soc-fw { |
| 2329 | fip-flags = /bits/ 64 <0x123456789abcdef>; |
| 2330 | filename = "bl31.bin"; |
| 2331 | }; |
| 2332 | |
| 2333 | u-boot { |
| 2334 | fip-uuid = [fc 65 13 92 4a 5b 11 ec |
| 2335 | 94 35 ff 2d 1c fc 79 9c]; |
| 2336 | }; |
| 2337 | }; |
| 2338 | |
| 2339 | The `soc-fw` node is a `blob-ext` (i.e. it reads in a named binary file) whereas |
| 2340 | `u-boot` is a normal entry type. This works because `Entry_fip` selects the |
| 2341 | `blob-ext` entry type if the node name (here `soc-fw`) is recognised as being |
| 2342 | a known blob type. |
| 2343 | |
| 2344 | When adding new entry types you are encouraged to use subnodes to provide the |
Simon Glass | 43a98cc | 2022-03-05 20:18:58 -0700 | [diff] [blame] | 2345 | data for processing, unless the `content` approach is more suitable. Consider |
| 2346 | whether the input entries are contained within (or consumed by) the entry, vs |
| 2347 | just being 'referenced' by the entry. In the latter case, the `content` approach |
| 2348 | makes more sense. Ad-hoc properties and other methods of obtaining data are |
| 2349 | discouraged, since it adds to confusion for users. |
Simon Glass | 6fba35c | 2022-02-08 11:50:00 -0700 | [diff] [blame] | 2350 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2351 | History / Credits |
| 2352 | ----------------- |
| 2353 | |
| 2354 | Binman takes a lot of inspiration from a Chrome OS tool called |
| 2355 | 'cros_bundle_firmware', which I wrote some years ago. That tool was based on |
| 2356 | a reasonably simple and sound design but has expanded greatly over the |
| 2357 | years. In particular its handling of x86 images is convoluted. |
| 2358 | |
Simon Glass | 1e32400 | 2018-06-01 09:38:19 -0600 | [diff] [blame] | 2359 | Quite a few lessons have been learned which are hopefully applied here. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2360 | |
| 2361 | |
| 2362 | Design notes |
| 2363 | ------------ |
| 2364 | |
| 2365 | On the face of it, a tool to create firmware images should be fairly simple: |
| 2366 | just find all the input binaries and place them at the right place in the |
| 2367 | image. The difficulty comes from the wide variety of input types (simple |
| 2368 | flat binaries containing code, packaged data with various headers), packing |
| 2369 | requirments (alignment, spacing, device boundaries) and other required |
| 2370 | features such as hierarchical images. |
| 2371 | |
| 2372 | The design challenge is to make it easy to create simple images, while |
| 2373 | allowing the more complex cases to be supported. For example, for most |
| 2374 | images we don't much care exactly where each binary ends up, so we should |
| 2375 | not have to specify that unnecessarily. |
| 2376 | |
| 2377 | New entry types should aim to provide simple usage where possible. If new |
| 2378 | core features are needed, they can be added in the Entry base class. |
| 2379 | |
| 2380 | |
| 2381 | To do |
| 2382 | ----- |
| 2383 | |
| 2384 | Some ideas: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 2385 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2386 | - Use of-platdata to make the information available to code that is unable |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 2387 | to use device tree (such as a very small SPL image). For now, limited info is |
| 2388 | available via linker symbols |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2389 | - Allow easy building of images by specifying just the board name |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2390 | - Support building an image for a board (-b) more completely, with a |
| 2391 | configurable build directory |
Simon Glass | 8100a8e | 2019-07-20 12:24:02 -0600 | [diff] [blame] | 2392 | - Detect invalid properties in nodes |
| 2393 | - Sort the fdtmap by offset |
Simon Glass | 01ab229 | 2021-01-06 21:35:12 -0700 | [diff] [blame] | 2394 | - Output temporary files to a different directory |
Simon Glass | e87009da | 2022-02-08 11:49:57 -0700 | [diff] [blame] | 2395 | - Rationalise the fdt, fdt_util and pylibfdt modules which currently have some |
| 2396 | overlapping and confusing functionality |
| 2397 | - Update the fdt library to use a better format for Prop.value (the current one |
| 2398 | is useful for dtoc but not much else) |
| 2399 | - Figure out how to make Fdt support changing the node order, so that |
| 2400 | Node.AddSubnode() can support adding a node before another, existing node. |
| 2401 | Perhaps it should completely regenerate the flat tree? |
Simon Glass | fca3856 | 2022-08-18 02:16:46 -0600 | [diff] [blame] | 2402 | - Support images which depend on each other |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 2403 | |
| 2404 | -- |
| 2405 | Simon Glass <sjg@chromium.org> |
| 2406 | 7/7/2016 |
Simon Glass | 76f496d | 2021-07-06 10:36:37 -0600 | [diff] [blame] | 2407 | |
| 2408 | .. _ConcurrentFutures: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor |