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, |
| 45 | vblocks and and the like. |
| 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 | |
| 98 | Relationship to FIT |
| 99 | ------------------- |
| 100 | |
| 101 | FIT is U-Boot's official image format. It supports multiple binaries with |
| 102 | load / execution addresses, compression. It also supports verification |
| 103 | through hashing and RSA signatures. |
| 104 | |
| 105 | FIT was originally designed to support booting a Linux kernel (with an |
| 106 | optional ramdisk) and device tree chosen from various options in the FIT. |
| 107 | Now that U-Boot supports configuration via device tree, it is possible to |
| 108 | load U-Boot from a FIT, with the device tree chosen by SPL. |
| 109 | |
| 110 | Binman considers FIT to be one of the binaries it can place in the image. |
| 111 | |
| 112 | Where possible it is best to put as much as possible in the FIT, with binman |
| 113 | used to deal with cases not covered by FIT. Examples include initial |
| 114 | execution (since FIT itself does not have an executable header) and dealing |
| 115 | with device boundaries, such as the read-only/read-write separation in SPI |
| 116 | flash. |
| 117 | |
| 118 | For U-Boot, binman should not be used to create ad-hoc images in place of |
| 119 | FIT. |
| 120 | |
| 121 | |
| 122 | Relationship to mkimage |
| 123 | ----------------------- |
| 124 | |
| 125 | The mkimage tool provides a means to create a FIT. Traditionally it has |
| 126 | needed an image description file: a device tree, like binman, but in a |
| 127 | different format. More recently it has started to support a '-f auto' mode |
| 128 | which can generate that automatically. |
| 129 | |
| 130 | More relevant to binman, mkimage also permits creation of many SoC-specific |
| 131 | image types. These can be listed by running 'mkimage -T list'. Examples |
| 132 | include 'rksd', the Rockchip SD/MMC boot format. The mkimage tool is often |
| 133 | called from the U-Boot build system for this reason. |
| 134 | |
| 135 | Binman considers the output files created by mkimage to be binary blobs |
| 136 | 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] | 137 | 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] | 138 | 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] | 139 | 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] | 140 | the boundaries between building input files (mkimage) and packaging then |
| 141 | into a final image (binman). |
| 142 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 143 | |
| 144 | Using binman |
| 145 | ============ |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 146 | |
| 147 | Example use of binman in U-Boot |
| 148 | ------------------------------- |
| 149 | |
| 150 | Binman aims to replace some of the ad-hoc image creation in the U-Boot |
| 151 | build system. |
| 152 | |
| 153 | Consider sunxi. It has the following steps: |
| 154 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 155 | #. It uses a custom mksunxiboot tool to build an SPL image called |
| 156 | sunxi-spl.bin. This should probably move into mkimage. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 157 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 158 | #. It uses mkimage to package U-Boot into a legacy image file (so that it can |
| 159 | hold the load and execution address) called u-boot.img. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 160 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 161 | #. It builds a final output image called u-boot-sunxi-with-spl.bin which |
| 162 | consists of sunxi-spl.bin, some padding and u-boot.img. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 163 | |
| 164 | Binman is intended to replace the last step. The U-Boot build system builds |
| 165 | u-boot.bin and sunxi-spl.bin. Binman can then take over creation of |
| 166 | sunxi-spl.bin (by calling mksunxiboot, or hopefully one day mkimage). In any |
| 167 | case, it would then create the image from the component parts. |
| 168 | |
| 169 | This simplifies the U-Boot Makefile somewhat, since various pieces of logic |
| 170 | can be replaced by a call to binman. |
| 171 | |
| 172 | |
| 173 | Example use of binman for x86 |
| 174 | ----------------------------- |
| 175 | |
| 176 | In most cases x86 images have a lot of binary blobs, 'black-box' code |
| 177 | provided by Intel which must be run for the platform to work. Typically |
| 178 | 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] | 179 | firmware image. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 180 | |
| 181 | Currently this is handled by ifdtool, which places microcode, FSP, MRC, VGA |
| 182 | BIOS, reference code and Intel ME binaries into a u-boot.rom file. |
| 183 | |
| 184 | Binman is intended to replace all of this, with ifdtool left to handle only |
| 185 | the configuration of the Intel-format descriptor. |
| 186 | |
| 187 | |
| 188 | Running binman |
| 189 | -------------- |
| 190 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 191 | First install prerequisites, e.g:: |
Simon Glass | 567b682 | 2019-07-08 13:18:35 -0600 | [diff] [blame] | 192 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 193 | sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \ |
| 194 | liblz4-tool |
Simon Glass | 567b682 | 2019-07-08 13:18:35 -0600 | [diff] [blame] | 195 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 196 | Type:: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 197 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 198 | binman build -b <board_name> |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 199 | |
| 200 | to build an image for a board. The board name is the same name used when |
| 201 | configuring U-Boot (e.g. for sandbox_defconfig the board name is 'sandbox'). |
| 202 | Binman assumes that the input files for the build are in ../b/<board_name>. |
| 203 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 204 | Or you can specify this explicitly:: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 205 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 206 | binman build -I <build_path> |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 207 | |
| 208 | where <build_path> is the build directory containing the output of the U-Boot |
| 209 | build. |
| 210 | |
| 211 | (Future work will make this more configurable) |
| 212 | |
| 213 | In either case, binman picks up the device tree file (u-boot.dtb) and looks |
| 214 | for its instructions in the 'binman' node. |
| 215 | |
| 216 | Binman has a few other options which you can see by running 'binman -h'. |
| 217 | |
| 218 | |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 219 | Enabling binman for a board |
| 220 | --------------------------- |
| 221 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 222 | At present binman is invoked from a rule in the main Makefile. You should be |
| 223 | able to enable CONFIG_BINMAN to enable this rule. |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 224 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 225 | The output file is typically named image.bin and is located in the output |
| 226 | directory. If input files are needed to you add these to INPUTS-y either in the |
| 227 | main Makefile or in a config.mk file in your arch subdirectory. |
Simon Glass | 4b94ac9 | 2017-11-12 21:52:06 -0700 | [diff] [blame] | 228 | |
| 229 | Once binman is executed it will pick up its instructions from a device-tree |
| 230 | file, typically <soc>-u-boot.dtsi, where <soc> is your CONFIG_SYS_SOC value. |
| 231 | You can use other, more specific CONFIG options - see 'Automatic .dtsi |
| 232 | inclusion' below. |
| 233 | |
| 234 | |
Ilias Apalodimas | 554f85e | 2021-10-12 00:00:15 +0300 | [diff] [blame] | 235 | Using binman with OF_BOARD |
Bin Meng | d72582f | 2021-05-10 20:23:37 +0800 | [diff] [blame] | 236 | -------------------------------------------- |
| 237 | |
| 238 | Normally binman is used with a board configured with OF_SEPARATE or OF_EMBED. |
| 239 | This is a typical scenario where a device tree source that contains the binman |
| 240 | node is provided in the arch/<arch>/dts directory for a specific board. |
| 241 | |
Ilias Apalodimas | 554f85e | 2021-10-12 00:00:15 +0300 | [diff] [blame] | 242 | However for a board configured with OF_BOARD, no device tree blob is provided |
| 243 | in the U-Boot build phase hence the binman node information is not available. |
| 244 | In order to support such use case, a new Kconfig option BINMAN_STANDALONE_FDT |
| 245 | is introduced, to tell the build system that a standalone device tree blob |
| 246 | containing binman node is explicitly required. |
Bin Meng | d72582f | 2021-05-10 20:23:37 +0800 | [diff] [blame] | 247 | |
| 248 | Note there is a Kconfig option BINMAN_FDT which enables U-Boot run time to |
| 249 | access information about binman entries, stored in the device tree in a binman |
| 250 | node. Generally speaking, this option makes sense for OF_SEPARATE or OF_EMBED. |
| 251 | For the other OF_CONTROL methods, it's quite possible binman node is not |
| 252 | available as binman is invoked during the build phase, thus this option is not |
| 253 | turned on by default for these OF_CONTROL methods. |
| 254 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 255 | Access to binman entry offsets at run time (symbols) |
| 256 | ---------------------------------------------------- |
| 257 | |
| 258 | Binman assembles images and determines where each entry is placed in the image. |
| 259 | This information may be useful to U-Boot at run time. For example, in SPL it |
| 260 | is useful to be able to find the location of U-Boot so that it can be executed |
| 261 | when SPL is finished. |
| 262 | |
| 263 | Binman allows you to declare symbols in the SPL image which are filled in |
| 264 | with their correct values during the build. For example:: |
| 265 | |
| 266 | binman_sym_declare(ulong, u_boot_any, image_pos); |
| 267 | |
| 268 | declares a ulong value which will be assigned to the image-pos of any U-Boot |
| 269 | image (u-boot.bin, u-boot.img, u-boot-nodtb.bin) that is present in the image. |
| 270 | You can access this value with something like:: |
| 271 | |
| 272 | ulong u_boot_offset = binman_sym(ulong, u_boot_any, image_pos); |
| 273 | |
| 274 | Thus u_boot_offset will be set to the image-pos of U-Boot in memory, assuming |
| 275 | that the whole image has been loaded, or is available in flash. You can then |
| 276 | jump to that address to start U-Boot. |
| 277 | |
| 278 | At present this feature is only supported in SPL and TPL. In principle it is |
| 279 | possible to fill in such symbols in U-Boot proper, as well, but a future C |
| 280 | library is planned for this instead, to read from the device tree. |
| 281 | |
| 282 | As well as image-pos, it is possible to read the size of an entry and its |
| 283 | offset (which is the start position of the entry within its parent). |
| 284 | |
| 285 | A small technical note: Binman automatically adds the base address of the image |
| 286 | (i.e. __image_copy_start) to the value of the image-pos symbol, so that when the |
| 287 | image is loaded to its linked address, the value will be correct and actually |
| 288 | point into the image. |
| 289 | |
| 290 | For example, say SPL is at the start of the image and linked to start at address |
| 291 | 80108000. If U-Boot's image-pos is 0x8000 then binman will write an image-pos |
| 292 | for U-Boot of 80110000 into the SPL binary, since it assumes the image is loaded |
| 293 | to 80108000, with SPL at 80108000 and U-Boot at 80110000. |
| 294 | |
| 295 | For x86 devices (with the end-at-4gb property) this base address is not added |
| 296 | since it is assumed that images are XIP and the offsets already include the |
| 297 | address. |
| 298 | |
| 299 | |
| 300 | Access to binman entry offsets at run time (fdt) |
| 301 | ------------------------------------------------ |
| 302 | |
| 303 | Binman can update the U-Boot FDT to include the final position and size of |
| 304 | each entry in the images it processes. The option to enable this is -u and it |
| 305 | causes binman to make sure that the 'offset', 'image-pos' and 'size' properties |
| 306 | are set correctly for every entry. Since it is not necessary to specify these in |
| 307 | the image definition, binman calculates the final values and writes these to |
| 308 | the device tree. These can be used by U-Boot at run-time to find the location |
| 309 | of each entry. |
| 310 | |
| 311 | Alternatively, an FDT map entry can be used to add a special FDT containing |
| 312 | just the information about the image. This is preceded by a magic string so can |
| 313 | be located anywhere in the image. An image header (typically at the start or end |
| 314 | of the image) can be used to point to the FDT map. See fdtmap and image-header |
| 315 | entries for more information. |
| 316 | |
| 317 | |
| 318 | Map files |
| 319 | --------- |
| 320 | |
| 321 | The -m option causes binman to output a .map file for each image that it |
| 322 | generates. This shows the offset and size of each entry. For example:: |
| 323 | |
| 324 | Offset Size Name |
| 325 | 00000000 00000028 main-section |
| 326 | 00000000 00000010 section@0 |
| 327 | 00000000 00000004 u-boot |
| 328 | 00000010 00000010 section@1 |
| 329 | 00000000 00000004 u-boot |
| 330 | |
| 331 | This shows a hierarchical image with two sections, each with a single entry. The |
| 332 | offsets of the sections are absolute hex byte offsets within the image. The |
| 333 | offsets of the entries are relative to their respective sections. The size of |
| 334 | each entry is also shown, in bytes (hex). The indentation shows the entries |
| 335 | nested inside their sections. |
| 336 | |
| 337 | |
| 338 | Passing command-line arguments to entries |
| 339 | ----------------------------------------- |
| 340 | |
| 341 | Sometimes it is useful to pass binman the value of an entry property from the |
| 342 | command line. For example some entries need access to files and it is not |
| 343 | always convenient to put these filenames in the image definition (device tree). |
| 344 | |
Bin Meng | 1fa2b7c | 2021-05-10 20:23:30 +0800 | [diff] [blame] | 345 | The -a option supports this:: |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 346 | |
Bin Meng | 1fa2b7c | 2021-05-10 20:23:30 +0800 | [diff] [blame] | 347 | -a <prop>=<value> |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 348 | |
| 349 | where:: |
| 350 | |
| 351 | <prop> is the property to set |
| 352 | <value> is the value to set it to |
| 353 | |
| 354 | Not all properties can be provided this way. Only some entries support it, |
| 355 | typically for filenames. |
| 356 | |
| 357 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 358 | Image description format |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 359 | ======================== |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 360 | |
| 361 | The binman node is called 'binman'. An example image description is shown |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 362 | below:: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 363 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 364 | binman { |
| 365 | filename = "u-boot-sunxi-with-spl.bin"; |
| 366 | pad-byte = <0xff>; |
| 367 | blob { |
| 368 | filename = "spl/sunxi-spl.bin"; |
| 369 | }; |
| 370 | u-boot { |
| 371 | offset = <CONFIG_SPL_PAD_TO>; |
| 372 | }; |
| 373 | }; |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 374 | |
| 375 | |
| 376 | This requests binman to create an image file called u-boot-sunxi-with-spl.bin |
| 377 | consisting of a specially formatted SPL (spl/sunxi-spl.bin, built by the |
| 378 | normal U-Boot Makefile), some 0xff padding, and a U-Boot legacy image. The |
| 379 | padding comes from the fact that the second binary is placed at |
| 380 | CONFIG_SPL_PAD_TO. If that line were omitted then the U-Boot binary would |
| 381 | immediately follow the SPL binary. |
| 382 | |
| 383 | The binman node describes an image. The sub-nodes describe entries in the |
| 384 | image. Each entry represents a region within the overall image. The name of |
| 385 | the entry (blob, u-boot) tells binman what to put there. For 'blob' we must |
| 386 | provide a filename. For 'u-boot', binman knows that this means 'u-boot.bin'. |
| 387 | |
| 388 | Entries are normally placed into the image sequentially, one after the other. |
| 389 | 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] | 390 | specify the start offset of an entry using the 'offset' property. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 391 | |
| 392 | Note that due to a device tree requirement, all entries must have a unique |
| 393 | name. If you want to put the same binary in the image multiple times, you can |
| 394 | use any unique name, with the 'type' property providing the type. |
| 395 | |
| 396 | The attributes supported for entries are described below. |
| 397 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 398 | offset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 399 | This sets the offset of an entry within the image or section containing |
| 400 | it. The first byte of the image is normally at offset 0. If 'offset' is |
| 401 | not provided, binman sets it to the end of the previous region, or the |
| 402 | start of the image's entry area (normally 0) if there is no previous |
| 403 | region. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 404 | |
| 405 | align: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 406 | This sets the alignment of the entry. The entry offset is adjusted |
| 407 | so that the entry starts on an aligned boundary within the containing |
| 408 | section or image. For example 'align = <16>' means that the entry will |
| 409 | start on a 16-byte boundary. This may mean that padding is added before |
| 410 | the entry. The padding is part of the containing section but is not |
| 411 | included in the entry, meaning that an empty space may be created before |
| 412 | the entry starts. Alignment should be a power of 2. If 'align' is not |
| 413 | provided, no alignment is performed. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 414 | |
| 415 | size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 416 | This sets the size of the entry. The contents will be padded out to |
| 417 | this size. If this is not provided, it will be set to the size of the |
| 418 | contents. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 419 | |
| 420 | pad-before: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 421 | Padding before the contents of the entry. Normally this is 0, meaning |
| 422 | that the contents start at the beginning of the entry. This can be used |
| 423 | to offset the entry contents a little. While this does not affect the |
| 424 | contents of the entry within binman itself (the padding is performed |
| 425 | only when its parent section is assembled), the end result will be that |
| 426 | 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] | 427 | |
| 428 | pad-after: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 429 | Padding after the contents of the entry. Normally this is 0, meaning |
| 430 | that the entry ends at the last byte of content (unless adjusted by |
| 431 | other properties). This allows room to be created in the image for |
| 432 | this entry to expand later. While this does not affect the contents of |
| 433 | the entry within binman itself (the padding is performed only when its |
| 434 | parent section is assembled), the end result will be that the entry ends |
| 435 | with the padding bytes, so may grow. Defaults to 0. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 436 | |
| 437 | align-size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 438 | This sets the alignment of the entry size. For example, to ensure |
| 439 | that the size of an entry is a multiple of 64 bytes, set this to 64. |
| 440 | While this does not affect the contents of the entry within binman |
| 441 | itself (the padding is performed only when its parent section is |
| 442 | assembled), the end result is that the entry ends with the padding |
| 443 | bytes, so may grow. If 'align-size' is not provided, no alignment is |
| 444 | performed. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 445 | |
| 446 | align-end: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 447 | This sets the alignment of the end of an entry with respect to the |
| 448 | containing section. Some entries require that they end on an alignment |
| 449 | boundary, regardless of where they start. This does not move the start |
| 450 | of the entry, so the contents of the entry will still start at the |
| 451 | beginning. But there may be padding at the end. While this does not |
| 452 | affect the contents of the entry within binman itself (the padding is |
| 453 | performed only when its parent section is assembled), the end result |
| 454 | is that the entry ends with the padding bytes, so may grow. |
| 455 | If 'align-end' is not provided, no alignment is performed. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 456 | |
| 457 | filename: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 458 | For 'blob' types this provides the filename containing the binary to |
| 459 | put into the entry. If binman knows about the entry type (like |
| 460 | u-boot-bin), then there is no need to specify this. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 461 | |
| 462 | type: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 463 | Sets the type of an entry. This defaults to the entry name, but it is |
| 464 | possible to use any name, and then add (for example) 'type = "u-boot"' |
| 465 | to specify the type. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 466 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 467 | offset-unset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 468 | Indicates that the offset of this entry should not be set by placing |
| 469 | it immediately after the entry before. Instead, is set by another |
| 470 | entry which knows where this entry should go. When this boolean |
| 471 | property is present, binman will give an error if another entry does |
| 472 | not set the offset (with the GetOffsets() method). |
Simon Glass | 4ba8d50 | 2018-06-01 09:38:17 -0600 | [diff] [blame] | 473 | |
Simon Glass | 9dcc861 | 2018-08-01 15:22:42 -0600 | [diff] [blame] | 474 | image-pos: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 475 | This cannot be set on entry (or at least it is ignored if it is), but |
| 476 | with the -u option, binman will set it to the absolute image position |
| 477 | for each entry. This makes it easy to find out exactly where the entry |
| 478 | ended up in the image, regardless of parent sections, etc. |
Simon Glass | 9dcc861 | 2018-08-01 15:22:42 -0600 | [diff] [blame] | 479 | |
Simon Glass | fa79a81 | 2018-09-14 04:57:29 -0600 | [diff] [blame] | 480 | expand-size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 481 | Expand the size of this entry to fit available space. This space is only |
| 482 | limited by the size of the image/section and the position of the next |
| 483 | entry. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 484 | |
Simon Glass | aa2fcf9 | 2019-07-08 14:25:30 -0600 | [diff] [blame] | 485 | compress: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 486 | Sets the compression algortihm to use (for blobs only). See the entry |
| 487 | documentation for details. |
Simon Glass | aa2fcf9 | 2019-07-08 14:25:30 -0600 | [diff] [blame] | 488 | |
Simon Glass | a820af7 | 2020-09-06 10:39:09 -0600 | [diff] [blame] | 489 | missing-msg: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 490 | Sets the tag of the message to show if this entry is missing. This is |
| 491 | used for external blobs. When they are missing it is helpful to show |
| 492 | information about what needs to be fixed. See missing-blob-help for the |
| 493 | message for each tag. |
Simon Glass | a820af7 | 2020-09-06 10:39:09 -0600 | [diff] [blame] | 494 | |
Simon Glass | 7098b7f | 2021-03-21 18:24:30 +1300 | [diff] [blame] | 495 | no-expanded: |
| 496 | By default binman substitutes entries with expanded versions if available, |
| 497 | so that a `u-boot` entry type turns into `u-boot-expanded`, for example. The |
| 498 | `--no-expanded` command-line option disables this globally. The |
| 499 | `no-expanded` property disables this just for a single entry. Put the |
| 500 | `no-expanded` boolean property in the node to select this behaviour. |
| 501 | |
Simon Glass | 8004581 | 2018-09-14 04:57:30 -0600 | [diff] [blame] | 502 | The attributes supported for images and sections are described below. Several |
| 503 | are similar to those for entries. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 504 | |
| 505 | size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 506 | Sets the image size in bytes, for example 'size = <0x100000>' for a |
| 507 | 1MB image. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 508 | |
Simon Glass | eb023b3 | 2019-04-25 21:58:39 -0600 | [diff] [blame] | 509 | offset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 510 | This is similar to 'offset' in entries, setting the offset of a section |
| 511 | within the image or section containing it. The first byte of the section |
| 512 | is normally at offset 0. If 'offset' is not provided, binman sets it to |
| 513 | the end of the previous region, or the start of the image's entry area |
| 514 | (normally 0) if there is no previous region. |
Simon Glass | eb023b3 | 2019-04-25 21:58:39 -0600 | [diff] [blame] | 515 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 516 | align-size: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 517 | This sets the alignment of the image size. For example, to ensure |
| 518 | that the image ends on a 512-byte boundary, use 'align-size = <512>'. |
| 519 | If 'align-size' is not provided, no alignment is performed. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 520 | |
| 521 | pad-before: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 522 | This sets the padding before the image entries. The first entry will |
| 523 | be positioned after the padding. This defaults to 0. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 524 | |
| 525 | pad-after: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 526 | This sets the padding after the image entries. The padding will be |
| 527 | placed after the last entry. This defaults to 0. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 528 | |
| 529 | pad-byte: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 530 | This specifies the pad byte to use when padding in the image. It |
| 531 | defaults to 0. To use 0xff, you would add 'pad-byte = <0xff>'. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 532 | |
| 533 | filename: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 534 | This specifies the image filename. It defaults to 'image.bin'. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 535 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 536 | sort-by-offset: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 537 | This causes binman to reorder the entries as needed to make sure they |
| 538 | are in increasing positional order. This can be used when your entry |
| 539 | order may not match the positional order. A common situation is where |
| 540 | the 'offset' properties are set by CONFIG options, so their ordering is |
| 541 | not known a priori. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 542 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 543 | This is a boolean property so needs no value. To enable it, add a |
| 544 | line 'sort-by-offset;' to your description. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 545 | |
| 546 | multiple-images: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 547 | Normally only a single image is generated. To create more than one |
| 548 | image, put this property in the binman node. For example, this will |
| 549 | create image1.bin containing u-boot.bin, and image2.bin containing |
| 550 | both spl/u-boot-spl.bin and u-boot.bin:: |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 551 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 552 | binman { |
| 553 | multiple-images; |
| 554 | image1 { |
| 555 | u-boot { |
| 556 | }; |
| 557 | }; |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 558 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 559 | image2 { |
| 560 | spl { |
| 561 | }; |
| 562 | u-boot { |
| 563 | }; |
| 564 | }; |
| 565 | }; |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 566 | |
| 567 | end-at-4gb: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 568 | For x86 machines the ROM offsets start just before 4GB and extend |
| 569 | up so that the image finished at the 4GB boundary. This boolean |
| 570 | option can be enabled to support this. The image size must be |
| 571 | provided so that binman knows when the image should start. For an |
| 572 | 8MB ROM, the offset of the first entry would be 0xfff80000 with |
| 573 | this option, instead of 0 without this option. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 574 | |
Jagdish Gediya | 0fb978c | 2018-09-03 21:35:07 +0530 | [diff] [blame] | 575 | skip-at-start: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 576 | This property specifies the entry offset of the first entry. |
Jagdish Gediya | 0fb978c | 2018-09-03 21:35:07 +0530 | [diff] [blame] | 577 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 578 | For PowerPC mpc85xx based CPU, CONFIG_SYS_TEXT_BASE is the entry |
| 579 | offset of the first entry. It can be 0xeff40000 or 0xfff40000 for |
| 580 | nor flash boot, 0x201000 for sd boot etc. |
Jagdish Gediya | 0fb978c | 2018-09-03 21:35:07 +0530 | [diff] [blame] | 581 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 582 | 'end-at-4gb' property is not applicable where CONFIG_SYS_TEXT_BASE + |
| 583 | Image size != 4gb. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 584 | |
Simon Glass | f427c5f | 2021-03-21 18:24:33 +1300 | [diff] [blame] | 585 | align-default: |
| 586 | Specifies the default alignment for entries in this section, if they do |
| 587 | not specify an alignment. Note that this only applies to top-level entries |
| 588 | in the section (direct subentries), not any subentries of those entries. |
| 589 | This means that each section must specify its own default alignment, if |
| 590 | required. |
| 591 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 592 | Examples of the above options can be found in the tests. See the |
| 593 | tools/binman/test directory. |
| 594 | |
Simon Glass | e76a3e6 | 2018-06-01 09:38:11 -0600 | [diff] [blame] | 595 | It is possible to have the same binary appear multiple times in the image, |
| 596 | either by using a unit number suffix (u-boot@0, u-boot@1) or by using a |
| 597 | different name for each and specifying the type with the 'type' attribute. |
| 598 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 599 | |
Michael Heimpold | 55c822d | 2018-08-22 22:01:24 +0200 | [diff] [blame] | 600 | Sections and hierachical images |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 601 | ------------------------------- |
| 602 | |
| 603 | Sometimes it is convenient to split an image into several pieces, each of which |
| 604 | contains its own set of binaries. An example is a flash device where part of |
| 605 | the image is read-only and part is read-write. We can set up sections for each |
| 606 | of these, and place binaries in them independently. The image is still produced |
| 607 | as a single output file. |
| 608 | |
| 609 | This feature provides a way of creating hierarchical images. For example here |
Simon Glass | 1e32400 | 2018-06-01 09:38:19 -0600 | [diff] [blame] | 610 | is an example image with two copies of U-Boot. One is read-only (ro), intended |
| 611 | 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] | 612 | 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] | 613 | and can be programmed:: |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 614 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 615 | binman { |
| 616 | section@0 { |
| 617 | read-only; |
| 618 | name-prefix = "ro-"; |
| 619 | size = <0x100000>; |
| 620 | u-boot { |
| 621 | }; |
| 622 | }; |
| 623 | section@1 { |
| 624 | name-prefix = "rw-"; |
| 625 | size = <0x100000>; |
| 626 | u-boot { |
| 627 | }; |
| 628 | }; |
| 629 | }; |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 630 | |
| 631 | This image could be placed into a SPI flash chip, with the protection boundary |
| 632 | set at 1MB. |
| 633 | |
| 634 | A few special properties are provided for sections: |
| 635 | |
| 636 | read-only: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 637 | Indicates that this section is read-only. This has no impact on binman's |
| 638 | operation, but his property can be read at run time. |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 639 | |
Simon Glass | 3b78d53 | 2018-06-01 09:38:21 -0600 | [diff] [blame] | 640 | name-prefix: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 641 | This string is prepended to all the names of the binaries in the |
| 642 | section. In the example above, the 'u-boot' binaries which actually be |
| 643 | renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to |
| 644 | distinguish binaries with otherwise identical names. |
Simon Glass | 3b78d53 | 2018-06-01 09:38:21 -0600 | [diff] [blame] | 645 | |
Simon Glass | a91e115 | 2018-06-01 09:38:16 -0600 | [diff] [blame] | 646 | |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 647 | Image Properties |
| 648 | ---------------- |
| 649 | |
| 650 | Image nodes act like sections but also have a few extra properties: |
| 651 | |
| 652 | filename: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 653 | Output filename for the image. This defaults to image.bin (or in the |
| 654 | case of multiple images <nodename>.bin where <nodename> is the name of |
| 655 | the image node. |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 656 | |
| 657 | allow-repack: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 658 | Create an image that can be repacked. With this option it is possible |
| 659 | to change anything in the image after it is created, including updating |
| 660 | the position and size of image components. By default this is not |
| 661 | permitted since it is not possibly to know whether this might violate a |
| 662 | constraint in the image description. For example, if a section has to |
| 663 | increase in size to hold a larger binary, that might cause the section |
| 664 | 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] | 665 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 666 | Adding this property causes the original offset and size values in the |
| 667 | image description to be stored in the FDT and fdtmap. |
Simon Glass | fb30e29 | 2019-07-20 12:23:51 -0600 | [diff] [blame] | 668 | |
| 669 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 670 | Hashing Entries |
| 671 | --------------- |
| 672 | |
| 673 | It is possible to ask binman to hash the contents of an entry and write that |
| 674 | value back to the device-tree node. For example:: |
| 675 | |
| 676 | binman { |
| 677 | u-boot { |
| 678 | hash { |
| 679 | algo = "sha256"; |
| 680 | }; |
| 681 | }; |
| 682 | }; |
| 683 | |
| 684 | Here, a new 'value' property will be written to the 'hash' node containing |
| 685 | the hash of the 'u-boot' entry. Only SHA256 is supported at present. Whole |
| 686 | sections can be hased if desired, by adding the 'hash' node to the section. |
| 687 | |
| 688 | The has value can be chcked at runtime by hashing the data actually read and |
| 689 | comparing this has to the value in the device tree. |
| 690 | |
| 691 | |
| 692 | Expanded entries |
| 693 | ---------------- |
| 694 | |
| 695 | Binman automatically replaces 'u-boot' with an expanded version of that, i.e. |
| 696 | 'u-boot-expanded'. This means that when you write:: |
| 697 | |
| 698 | u-boot { |
| 699 | }; |
| 700 | |
| 701 | you actually get:: |
| 702 | |
| 703 | u-boot { |
| 704 | type = "u-boot-expanded'; |
| 705 | }; |
| 706 | |
| 707 | which in turn expands to:: |
| 708 | |
| 709 | u-boot { |
| 710 | type = "section"; |
| 711 | |
| 712 | u-boot-nodtb { |
| 713 | }; |
| 714 | |
| 715 | u-boot-dtb { |
| 716 | }; |
| 717 | }; |
| 718 | |
| 719 | U-Boot's various phase binaries actually comprise two or three pieces. |
| 720 | For example, u-boot.bin has the executable followed by a devicetree. |
| 721 | |
| 722 | With binman we want to be able to update that devicetree with full image |
| 723 | information so that it is accessible to the executable. This is tricky |
| 724 | if it is not clear where the devicetree starts. |
| 725 | |
| 726 | The above feature ensures that the devicetree is clearly separated from the |
| 727 | U-Boot executable and can be updated separately by binman as needed. It can be |
| 728 | disabled with the --no-expanded flag if required. |
| 729 | |
| 730 | The same applies for u-boot-spl and u-boot-spl. In those cases, the expansion |
| 731 | includes the BSS padding, so for example:: |
| 732 | |
| 733 | spl { |
| 734 | type = "u-boot-spl" |
| 735 | }; |
| 736 | |
| 737 | you actually get:: |
| 738 | |
| 739 | spl { |
| 740 | type = "u-boot-expanded'; |
| 741 | }; |
| 742 | |
| 743 | which in turn expands to:: |
| 744 | |
| 745 | spl { |
| 746 | type = "section"; |
| 747 | |
| 748 | u-boot-spl-nodtb { |
| 749 | }; |
| 750 | |
| 751 | u-boot-spl-bss-pad { |
| 752 | }; |
| 753 | |
| 754 | u-boot-spl-dtb { |
| 755 | }; |
| 756 | }; |
| 757 | |
| 758 | Of course we should not expand SPL if it has no devicetree. Also if the BSS |
| 759 | padding is not needed (because BSS is in RAM as with CONFIG_SPL_SEPARATE_BSS), |
| 760 | the 'u-boot-spl-bss-pad' subnode should not be created. The use of the expaned |
| 761 | entry type is controlled by the UseExpanded() method. In the SPL case it checks |
| 762 | the 'spl-dtb' entry arg, which is 'y' or '1' if SPL has a devicetree. |
| 763 | |
| 764 | For the BSS case, a 'spl-bss-pad' entry arg controls whether it is present. All |
| 765 | entry args are provided by the U-Boot Makefile. |
| 766 | |
| 767 | |
| 768 | Compression |
| 769 | ----------- |
| 770 | |
| 771 | Binman support compression for 'blob' entries (those of type 'blob' and |
| 772 | derivatives). To enable this for an entry, add a 'compress' property:: |
| 773 | |
| 774 | blob { |
| 775 | filename = "datafile"; |
| 776 | compress = "lz4"; |
| 777 | }; |
| 778 | |
| 779 | The entry will then contain the compressed data, using the 'lz4' compression |
| 780 | algorithm. Currently this is the only one that is supported. The uncompressed |
| 781 | size is written to the node in an 'uncomp-size' property, if -u is used. |
| 782 | |
| 783 | Compression is also supported for sections. In that case the entire section is |
| 784 | compressed in one block, including all its contents. This means that accessing |
| 785 | an entry from the section required decompressing the entire section. Also, the |
| 786 | size of a section indicates the space that it consumes in its parent section |
| 787 | (and typically the image). With compression, the section may contain more data, |
| 788 | and the uncomp-size property indicates that, as above. The contents of the |
| 789 | section is compressed first, before any padding is added. This ensures that the |
| 790 | padding itself is not compressed, which would be a waste of time. |
| 791 | |
| 792 | |
| 793 | Automatic .dtsi inclusion |
| 794 | ------------------------- |
| 795 | |
| 796 | It is sometimes inconvenient to add a 'binman' node to the .dts file for each |
| 797 | board. This can be done by using #include to bring in a common file. Another |
| 798 | approach supported by the U-Boot build system is to automatically include |
| 799 | a common header. You can then put the binman node (and anything else that is |
| 800 | specific to U-Boot, such as u-boot,dm-pre-reloc properies) in that header |
| 801 | file. |
| 802 | |
| 803 | Binman will search for the following files in arch/<arch>/dts:: |
| 804 | |
| 805 | <dts>-u-boot.dtsi where <dts> is the base name of the .dts file |
| 806 | <CONFIG_SYS_SOC>-u-boot.dtsi |
| 807 | <CONFIG_SYS_CPU>-u-boot.dtsi |
| 808 | <CONFIG_SYS_VENDOR>-u-boot.dtsi |
| 809 | u-boot.dtsi |
| 810 | |
| 811 | U-Boot will only use the first one that it finds. If you need to include a |
| 812 | more general file you can do that from the more specific file using #include. |
| 813 | If you are having trouble figuring out what is going on, you can uncomment |
| 814 | the 'warning' line in scripts/Makefile.lib to see what it has found:: |
| 815 | |
| 816 | # Uncomment for debugging |
| 817 | # This shows all the files that were considered and the one that we chose. |
| 818 | # u_boot_dtsi_options_debug = $(u_boot_dtsi_options_raw) |
| 819 | |
| 820 | |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 821 | Entry Documentation |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 822 | =================== |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 823 | |
| 824 | 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] | 825 | see entries.rst which is generated from the source code using: |
| 826 | |
| 827 | binman entry-docs >tools/binman/entries.rst |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 828 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 829 | .. toctree:: |
| 830 | :maxdepth: 2 |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 831 | |
Simon Glass | 774b23f | 2021-03-18 20:25:17 +1300 | [diff] [blame] | 832 | entries |
| 833 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 834 | |
| 835 | Managing images |
| 836 | =============== |
Simon Glass | 7a61c6b | 2018-07-17 13:25:37 -0600 | [diff] [blame] | 837 | |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 838 | Listing images |
| 839 | -------------- |
| 840 | |
| 841 | 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] | 842 | 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] | 843 | |
| 844 | $ binman ls -i image.bin |
| 845 | Name Image-pos Size Entry-type Offset Uncomp-size |
| 846 | ---------------------------------------------------------------------- |
| 847 | main-section c00 section 0 |
| 848 | u-boot 0 4 u-boot 0 |
| 849 | section 5fc section 4 |
| 850 | cbfs 100 400 cbfs 0 |
| 851 | u-boot 138 4 u-boot 38 |
| 852 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 |
| 853 | u-boot-dtb 500 1ff u-boot-dtb 400 3b5 |
| 854 | fdtmap 6fc 381 fdtmap 6fc |
| 855 | image-header bf8 8 image-header bf8 |
| 856 | |
| 857 | This shows the hierarchy of the image, the position, size and type of each |
| 858 | entry, the offset of each entry within its parent and the uncompressed size if |
| 859 | the entry is compressed. |
| 860 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 861 | 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] | 862 | |
| 863 | $ binman ls -i image.bin section/cbfs |
| 864 | Name Image-pos Size Entry-type Offset Uncomp-size |
| 865 | -------------------------------------------------------------------- |
| 866 | cbfs 100 400 cbfs 0 |
| 867 | u-boot 138 4 u-boot 38 |
| 868 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 |
| 869 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 870 | or with wildcards:: |
Simon Glass | b2fd11d | 2019-07-08 14:25:48 -0600 | [diff] [blame] | 871 | |
| 872 | $ binman ls -i image.bin "*cb*" "*head*" |
| 873 | Name Image-pos Size Entry-type Offset Uncomp-size |
| 874 | ---------------------------------------------------------------------- |
| 875 | cbfs 100 400 cbfs 0 |
| 876 | u-boot 138 4 u-boot 38 |
| 877 | u-boot-dtb 180 108 u-boot-dtb 80 3b5 |
| 878 | image-header bf8 8 image-header bf8 |
| 879 | |
| 880 | |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 881 | Extracting files from images |
| 882 | ---------------------------- |
| 883 | |
| 884 | You can extract files from an existing firmware image created by binman, |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 885 | provided that there is an 'fdtmap' entry in the image. For example:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 886 | |
| 887 | $ binman extract -i image.bin section/cbfs/u-boot |
| 888 | |
| 889 | which will write the uncompressed contents of that entry to the file 'u-boot' in |
| 890 | 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] | 891 | u-boot.bin:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 892 | |
| 893 | $ binman extract -i image.bin section/cbfs/u-boot -f u-boot.bin |
| 894 | |
| 895 | 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] | 896 | put files in subdirectories matching the entry hierarchy:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 897 | |
| 898 | $ binman extract -i image.bin -O outdir |
| 899 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 900 | or just a selection:: |
Simon Glass | 980a284 | 2019-07-08 14:25:52 -0600 | [diff] [blame] | 901 | |
| 902 | $ binman extract -i image.bin "*u-boot*" -O outdir |
| 903 | |
| 904 | |
Simon Glass | 072959a | 2019-07-20 12:23:50 -0600 | [diff] [blame] | 905 | Replacing files in an image |
| 906 | --------------------------- |
| 907 | |
| 908 | You can replace files in an existing firmware image created by binman, provided |
| 909 | that there is an 'fdtmap' entry in the image. For example: |
| 910 | |
| 911 | $ binman replace -i image.bin section/cbfs/u-boot |
| 912 | |
| 913 | 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] | 914 | to the that entry, compressing if necessary. If the entry size changes, you must |
| 915 | add the 'allow-repack' property to the original image before generating it (see |
| 916 | above), otherwise you will get an error. |
Simon Glass | 072959a | 2019-07-20 12:23:50 -0600 | [diff] [blame] | 917 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 918 | 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] | 919 | |
| 920 | $ binman replace -i image.bin section/cbfs/u-boot -f u-boot.bin |
| 921 | |
| 922 | 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] | 923 | hierarchy as the entries:: |
Simon Glass | 30033c2 | 2019-07-20 12:24:15 -0600 | [diff] [blame] | 924 | |
| 925 | $ binman replace -i image.bin -I indir |
| 926 | |
| 927 | Files that are missing will generate a warning. |
| 928 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 929 | You can also replace just a selection of entries:: |
Simon Glass | 30033c2 | 2019-07-20 12:24:15 -0600 | [diff] [blame] | 930 | |
| 931 | $ binman replace -i image.bin "*u-boot*" -I indir |
| 932 | |
Simon Glass | 072959a | 2019-07-20 12:23:50 -0600 | [diff] [blame] | 933 | |
Simon Glass | 233a26a9 | 2019-07-08 14:25:49 -0600 | [diff] [blame] | 934 | Logging |
| 935 | ------- |
| 936 | |
| 937 | Binman normally operates silently unless there is an error, in which case it |
| 938 | 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] | 939 | backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select |
| 940 | this. |
Simon Glass | 233a26a9 | 2019-07-08 14:25:49 -0600 | [diff] [blame] | 941 | |
| 942 | Internally binman logs some output while it is running. This can be displayed |
| 943 | by increasing the -v/--verbosity from the default of 1: |
| 944 | |
| 945 | 0: silent |
| 946 | 1: warnings only |
| 947 | 2: notices (important messages) |
| 948 | 3: info about major operations |
| 949 | 4: detailed information about each operation |
| 950 | 5: debug (all output) |
| 951 | |
Simon Glass | caa5f18 | 2021-02-06 09:57:28 -0700 | [diff] [blame] | 952 | 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] | 953 | |
Simon Glass | 7223245 | 2016-11-25 20:15:53 -0700 | [diff] [blame] | 954 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 955 | Technical details |
| 956 | ================= |
Simon Glass | 7223245 | 2016-11-25 20:15:53 -0700 | [diff] [blame] | 957 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 958 | Order of image creation |
| 959 | ----------------------- |
| 960 | |
| 961 | Image creation proceeds in the following order, for each entry in the image. |
| 962 | |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 963 | 1. AddMissingProperties() - binman can add calculated values to the device |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 964 | 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] | 965 | entry. This method adds any properties associated with this, expanding the |
| 966 | device tree as needed. These properties can have placeholder values which are |
| 967 | set later by SetCalculatedProperties(). By that stage the size of sections |
| 968 | cannot be changed (since it would cause the images to need to be repacked), |
| 969 | but the correct values can be inserted. |
| 970 | |
| 971 | 2. ProcessFdt() - process the device tree information as required by the |
Simon Glass | 9230773 | 2018-07-06 10:27:40 -0600 | [diff] [blame] | 972 | particular entry. This may involve adding or deleting properties. If the |
| 973 | processing is complete, this method should return True. If the processing |
| 974 | cannot complete because it needs the ProcessFdt() method of another entry to |
| 975 | run first, this method should return False, in which case it will be called |
| 976 | again later. |
| 977 | |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 978 | 3. GetEntryContents() - the contents of each entry are obtained, normally by |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 979 | reading from a file. This calls the Entry.ObtainContents() to read the |
| 980 | contents. The default version of Entry.ObtainContents() calls |
| 981 | Entry.GetDefaultFilename() and then reads that file. So a common mechanism |
| 982 | to select a file to read is to override that function in the subclass. The |
| 983 | functions must return True when they have read the contents. Binman will |
| 984 | retry calling the functions a few times if False is returned, allowing |
| 985 | dependencies between the contents of different entries. |
| 986 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 987 | 4. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 988 | 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] | 989 | entry name and the value is a tuple (offset, size). This allows an entry to |
| 990 | provide the offset and size for other entries. The default implementation |
| 991 | of GetEntryOffsets() returns {}. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 992 | |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 993 | 5. PackEntries() - calls Entry.Pack() which figures out the offset and |
| 994 | size of an entry. The 'current' image offset is passed in, and the function |
| 995 | returns the offset immediately after the entry being packed. The default |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 996 | implementation of Pack() is usually sufficient. |
| 997 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 998 | Note: for sections, this also checks that the entries do not overlap, nor extend |
| 999 | outside the section. If the section does not have a defined size, the size is |
| 1000 | set large enough to hold all the entries. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1001 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1002 | 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] | 1003 | position 'image-pos', as opposed to 'offset' which is relative to the containing |
| 1004 | section. This must be done after all offsets are known, which is why it is quite |
| 1005 | late in the ordering. |
| 1006 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1007 | 7. SetCalculatedProperties() - update any calculated properties in the device |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 1008 | tree. This sets the correct 'offset' and 'size' vaues, for example. |
Simon Glass | e22f8fa | 2018-07-06 10:27:41 -0600 | [diff] [blame] | 1009 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1010 | 8. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1011 | The default implementatoin does nothing. This can be overriden to adjust the |
| 1012 | contents of an entry in some way. For example, it would be possible to create |
| 1013 | 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] | 1014 | stage the offset and size of entries should not be adjusted unless absolutely |
| 1015 | necessary, since it requires a repack (going back to PackEntries()). |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1016 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1017 | 9. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry |
Simon Glass | 4b05b2d | 2019-07-20 12:23:52 -0600 | [diff] [blame] | 1018 | has changed its size, then there is no alternative but to go back to step 5 and |
| 1019 | try again, repacking the entries with the updated size. ResetForPack() removes |
| 1020 | the fixed offset/size values added by binman, so that the packing can start from |
| 1021 | scratch. |
| 1022 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1023 | 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] | 1024 | 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] | 1025 | what happens in this stage. |
Simon Glass | be83bc7 | 2017-11-13 18:55:05 -0700 | [diff] [blame] | 1026 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1027 | 11. BuildImage() - builds the image and writes it to a file |
Simon Glass | 4b05b2d | 2019-07-20 12:23:52 -0600 | [diff] [blame] | 1028 | |
Simon Glass | 2d9570d | 2020-10-26 17:40:22 -0600 | [diff] [blame] | 1029 | 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] | 1030 | final step. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1031 | |
| 1032 | |
Simon Glass | 6244fa4 | 2019-07-08 13:18:28 -0600 | [diff] [blame] | 1033 | External tools |
| 1034 | -------------- |
| 1035 | |
| 1036 | Binman can make use of external command-line tools to handle processing of |
| 1037 | entry contents or to generate entry contents. These tools are executed using |
| 1038 | the 'tools' module's Run() method. The tools generally must exist on the PATH, |
| 1039 | but the --toolpath option can be used to specify additional search paths to |
| 1040 | use. This option can be specified multiple times to add more than one path. |
| 1041 | |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 1042 | For some compile tools binman will use the versions specified by commonly-used |
| 1043 | environment variables like CC and HOSTCC for the C compiler, based on whether |
| 1044 | the tool's output will be used for the target or for the host machine. If those |
| 1045 | aren't given, it will also try to derive target-specific versions from the |
| 1046 | CROSS_COMPILE environment variable during a cross-compilation. |
| 1047 | |
Simon Glass | 6244fa4 | 2019-07-08 13:18:28 -0600 | [diff] [blame] | 1048 | |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 1049 | Code coverage |
| 1050 | ------------- |
| 1051 | |
| 1052 | 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] | 1053 | implementations target 100% test coverage. Run 'binman test -T' to check this. |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 1054 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1055 | To enable Python test coverage on Debian-type distributions (e.g. Ubuntu):: |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 1056 | |
Simon Glass | a16dd6e | 2019-07-08 13:18:26 -0600 | [diff] [blame] | 1057 | $ sudo apt-get install python-coverage python3-coverage python-pytest |
Simon Glass | 52debad | 2016-11-25 20:15:59 -0700 | [diff] [blame] | 1058 | |
| 1059 | |
Simon Glass | 1aeb751 | 2019-05-17 22:00:52 -0600 | [diff] [blame] | 1060 | Concurrent tests |
| 1061 | ---------------- |
| 1062 | |
| 1063 | Binman tries to run tests concurrently. This means that the tests make use of |
| 1064 | all available CPUs to run. |
| 1065 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1066 | To enable this:: |
Simon Glass | 1aeb751 | 2019-05-17 22:00:52 -0600 | [diff] [blame] | 1067 | |
| 1068 | $ sudo apt-get install python-subunit python3-subunit |
| 1069 | |
| 1070 | Use '-P 1' to disable this. It is automatically disabled when code coverage is |
| 1071 | being used (-T) since they are incompatible. |
| 1072 | |
| 1073 | |
Simon Glass | 1c420c9 | 2019-07-08 13:18:49 -0600 | [diff] [blame] | 1074 | Debugging tests |
| 1075 | --------------- |
| 1076 | |
| 1077 | Sometimes when debugging tests it is useful to keep the input and output |
| 1078 | directories so they can be examined later. Use -X or --test-preserve-dirs for |
| 1079 | this. |
| 1080 | |
| 1081 | |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 1082 | Running tests on non-x86 architectures |
| 1083 | -------------------------------------- |
| 1084 | |
| 1085 | Binman's tests have been written under the assumption that they'll be run on a |
| 1086 | x86-like host and there hasn't been an attempt to make them portable yet. |
| 1087 | However, it's possible to run the tests by cross-compiling to x86. |
| 1088 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1089 | 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] | 1090 | |
| 1091 | $ sudo apt-get install gcc-x86-64-linux-gnu |
| 1092 | |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1093 | Then, you can run the tests under cross-compilation:: |
Alper Nebi Yasak | fb4e538 | 2020-09-06 14:46:07 +0300 | [diff] [blame] | 1094 | |
| 1095 | $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T |
| 1096 | |
| 1097 | You can also use gcc-i686-linux-gnu similar to the above. |
| 1098 | |
| 1099 | |
Simon Glass | fa88828 | 2021-03-18 20:25:14 +1300 | [diff] [blame] | 1100 | Writing new entries and debugging |
| 1101 | --------------------------------- |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1102 | |
| 1103 | The behaviour of entries is defined by the Entry class. All other entries are |
| 1104 | a subclass of this. An important subclass is Entry_blob which takes binary |
| 1105 | data from a file and places it in the entry. In fact most entry types are |
| 1106 | subclasses of Entry_blob. |
| 1107 | |
| 1108 | Each entry type is a separate file in the tools/binman/etype directory. Each |
| 1109 | file contains a class called Entry_<type> where <type> is the entry type. |
| 1110 | New entry types can be supported by adding new files in that directory. |
| 1111 | These will automatically be detected by binman when needed. |
| 1112 | |
| 1113 | Entry properties are documented in entry.py. The entry subclasses are free |
| 1114 | to change the values of properties to support special behaviour. For example, |
| 1115 | when Entry_blob loads a file, it sets content_size to the size of the file. |
| 1116 | Entry classes can adjust other entries. For example, an entry that knows |
Simon Glass | e8561af | 2018-08-01 15:22:37 -0600 | [diff] [blame] | 1117 | where other entries should be positioned can set up those entries' offsets |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1118 | so they don't need to be set in the binman decription. It can also adjust |
| 1119 | entry contents. |
| 1120 | |
| 1121 | Most of the time such essoteric behaviour is not needed, but it can be |
| 1122 | essential for complex images. |
| 1123 | |
Simon Glass | ade2ef6 | 2017-12-24 12:12:07 -0700 | [diff] [blame] | 1124 | If you need to specify a particular device-tree compiler to use, you can define |
| 1125 | the DTC environment variable. This can be useful when the system dtc is too |
| 1126 | old. |
| 1127 | |
Simon Glass | e64a092 | 2018-11-06 15:21:31 -0700 | [diff] [blame] | 1128 | To enable a full backtrace and other debugging features in binman, pass |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1129 | BINMAN_DEBUG=1 to your build:: |
Simon Glass | e64a092 | 2018-11-06 15:21:31 -0700 | [diff] [blame] | 1130 | |
Bin Meng | a089c41 | 2019-10-02 19:07:29 -0700 | [diff] [blame] | 1131 | make qemu-x86_defconfig |
Simon Glass | e64a092 | 2018-11-06 15:21:31 -0700 | [diff] [blame] | 1132 | make BINMAN_DEBUG=1 |
| 1133 | |
Simon Glass | 03b1d8f | 2019-09-25 08:11:11 -0600 | [diff] [blame] | 1134 | 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] | 1135 | adds a -v<level> option to the call to binman:: |
Simon Glass | 03b1d8f | 2019-09-25 08:11:11 -0600 | [diff] [blame] | 1136 | |
Bin Meng | a089c41 | 2019-10-02 19:07:29 -0700 | [diff] [blame] | 1137 | make qemu-x86_defconfig |
Simon Glass | 03b1d8f | 2019-09-25 08:11:11 -0600 | [diff] [blame] | 1138 | make BINMAN_VERBOSE=5 |
| 1139 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1140 | |
Simon Glass | 76f496d | 2021-07-06 10:36:37 -0600 | [diff] [blame] | 1141 | Building sections in parallel |
| 1142 | ----------------------------- |
| 1143 | |
| 1144 | By default binman uses multiprocessing to speed up compilation of large images. |
| 1145 | This works at a section level, with one thread for each entry in the section. |
| 1146 | This can speed things up if the entries are large and use compression. |
| 1147 | |
| 1148 | This feature can be disabled with the '-T' flag, which defaults to a suitable |
| 1149 | value for your machine. This depends on the Python version, e.g on v3.8 it uses |
| 1150 | 12 threads on an 8-core machine. See ConcurrentFutures_ for more details. |
| 1151 | |
| 1152 | The special value -T0 selects single-threaded mode, useful for debugging during |
| 1153 | development, since dealing with exceptions and problems in threads is more |
| 1154 | difficult. This avoids any use of ThreadPoolExecutor. |
| 1155 | |
| 1156 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1157 | History / Credits |
| 1158 | ----------------- |
| 1159 | |
| 1160 | Binman takes a lot of inspiration from a Chrome OS tool called |
| 1161 | 'cros_bundle_firmware', which I wrote some years ago. That tool was based on |
| 1162 | a reasonably simple and sound design but has expanded greatly over the |
| 1163 | years. In particular its handling of x86 images is convoluted. |
| 1164 | |
Simon Glass | 1e32400 | 2018-06-01 09:38:19 -0600 | [diff] [blame] | 1165 | Quite a few lessons have been learned which are hopefully applied here. |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1166 | |
| 1167 | |
| 1168 | Design notes |
| 1169 | ------------ |
| 1170 | |
| 1171 | On the face of it, a tool to create firmware images should be fairly simple: |
| 1172 | just find all the input binaries and place them at the right place in the |
| 1173 | image. The difficulty comes from the wide variety of input types (simple |
| 1174 | flat binaries containing code, packaged data with various headers), packing |
| 1175 | requirments (alignment, spacing, device boundaries) and other required |
| 1176 | features such as hierarchical images. |
| 1177 | |
| 1178 | The design challenge is to make it easy to create simple images, while |
| 1179 | allowing the more complex cases to be supported. For example, for most |
| 1180 | images we don't much care exactly where each binary ends up, so we should |
| 1181 | not have to specify that unnecessarily. |
| 1182 | |
| 1183 | New entry types should aim to provide simple usage where possible. If new |
| 1184 | core features are needed, they can be added in the Entry base class. |
| 1185 | |
| 1186 | |
| 1187 | To do |
| 1188 | ----- |
| 1189 | |
| 1190 | Some ideas: |
Simon Glass | 75ead66 | 2021-03-18 20:25:13 +1300 | [diff] [blame] | 1191 | |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1192 | - 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] | 1193 | to use device tree (such as a very small SPL image). For now, limited info is |
| 1194 | available via linker symbols |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1195 | - Allow easy building of images by specifying just the board name |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1196 | - Support building an image for a board (-b) more completely, with a |
| 1197 | configurable build directory |
Simon Glass | 8100a8e | 2019-07-20 12:24:02 -0600 | [diff] [blame] | 1198 | - Detect invalid properties in nodes |
| 1199 | - Sort the fdtmap by offset |
Simon Glass | 01ab229 | 2021-01-06 21:35:12 -0700 | [diff] [blame] | 1200 | - Output temporary files to a different directory |
Simon Glass | 2574ef6 | 2016-11-25 20:15:51 -0700 | [diff] [blame] | 1201 | |
| 1202 | -- |
| 1203 | Simon Glass <sjg@chromium.org> |
| 1204 | 7/7/2016 |
Simon Glass | 76f496d | 2021-07-06 10:36:37 -0600 | [diff] [blame] | 1205 | |
| 1206 | .. _ConcurrentFutures: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor |