blob: 1cdc9de752a576fefd6f77b3db62d1f0f8d9244a [file] [log] [blame]
Simon Glass61adb2d2021-03-18 20:25:13 +13001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (c) 2016 Google, Inc
Simon Glassbf7fd502016-11-25 20:15:51 -07003
4Introduction
Simon Glass072026e2021-03-18 20:25:14 +13005============
Simon Glassbf7fd502016-11-25 20:15:51 -07006
7Firmware often consists of several components which must be packaged together.
8For example, we may have SPL, U-Boot, a device tree and an environment area
9grouped together and placed in MMC flash. When the system starts, it must be
10able to find these pieces.
11
12So far U-Boot has not provided a way to handle creating such images in a
13general way. Each SoC does what it needs to build an image, often packing or
14concatenating images in the U-Boot build system.
15
16Binman aims to provide a mechanism for building images, from simple
17SPL + U-Boot combinations, to more complex arrangements with many parts.
18
19
20What it does
21------------
22
23Binman reads your board's device tree and finds a node which describes the
24required image layout. It uses this to work out what to place where. The
25output file normally contains the device tree, so it is in principle possible
26to read an image and extract its constituent parts.
27
28
29Features
30--------
31
32So far binman is pretty simple. It supports binary blobs, such as 'u-boot',
33'spl' and 'fdt'. It supports empty entries (such as setting to 0xff). It can
34place entries at a fixed location in the image, or fit them together with
35suitable padding and alignment. It provides a way to process binaries before
36they are included, by adding a Python plug-in. The device tree is available
37to U-Boot at run-time so that the images can be interpreted.
38
Simon Glass57460182019-07-08 14:25:25 -060039Binman can update the device tree with the final location of everything when it
40is done. Entry positions can be provided to U-Boot SPL as run-time symbols,
41avoiding device-tree code overhead.
Simon Glassbf7fd502016-11-25 20:15:51 -070042
43Binman can also support incorporating filesystems in the image if required.
44For example x86 platforms may use CBFS in some cases.
45
46Binman is intended for use with U-Boot but is designed to be general enough
47to be useful in other image-packaging situations.
48
49
50Motivation
51----------
52
53Packaging of firmware is quite a different task from building the various
54parts. In many cases the various binaries which go into the image come from
55separate build systems. For example, ARM Trusted Firmware is used on ARMv8
56devices but is not built in the U-Boot tree. If a Linux kernel is included
57in the firmware image, it is built elsewhere.
58
59It is of course possible to add more and more build rules to the U-Boot
60build system to cover these cases. It can shell out to other Makefiles and
61build scripts. But it seems better to create a clear divide between building
62software and packaging it.
63
64At present this is handled by manual instructions, different for each board,
65on how to create images that will boot. By turning these instructions into a
66standard format, we can support making valid images for any board without
67manual effort, lots of READMEs, etc.
68
69Benefits:
Simon Glass61adb2d2021-03-18 20:25:13 +130070
71 - Each binary can have its own build system and tool chain without creating
72 any dependencies between them
73 - Avoids the need for a single-shot build: individual parts can be updated
74 and brought in as needed
75 - Provides for a standard image description available in the build and at
76 run-time
77 - SoC-specific image-signing tools can be accommodated
78 - Avoids cluttering the U-Boot build system with image-building code
79 - The image description is automatically available at run-time in U-Boot,
80 SPL. It can be made available to other software also
81 - The image description is easily readable (it's a text file in device-tree
82 format) and permits flexible packing of binaries
Simon Glassbf7fd502016-11-25 20:15:51 -070083
84
85Terminology
86-----------
87
88Binman uses the following terms:
89
90- image - an output file containing a firmware image
91- binary - an input binary that goes into the image
92
93
94Relationship to FIT
95-------------------
96
97FIT is U-Boot's official image format. It supports multiple binaries with
98load / execution addresses, compression. It also supports verification
99through hashing and RSA signatures.
100
101FIT was originally designed to support booting a Linux kernel (with an
102optional ramdisk) and device tree chosen from various options in the FIT.
103Now that U-Boot supports configuration via device tree, it is possible to
104load U-Boot from a FIT, with the device tree chosen by SPL.
105
106Binman considers FIT to be one of the binaries it can place in the image.
107
108Where possible it is best to put as much as possible in the FIT, with binman
109used to deal with cases not covered by FIT. Examples include initial
110execution (since FIT itself does not have an executable header) and dealing
111with device boundaries, such as the read-only/read-write separation in SPI
112flash.
113
114For U-Boot, binman should not be used to create ad-hoc images in place of
115FIT.
116
117
118Relationship to mkimage
119-----------------------
120
121The mkimage tool provides a means to create a FIT. Traditionally it has
122needed an image description file: a device tree, like binman, but in a
123different format. More recently it has started to support a '-f auto' mode
124which can generate that automatically.
125
126More relevant to binman, mkimage also permits creation of many SoC-specific
127image types. These can be listed by running 'mkimage -T list'. Examples
128include 'rksd', the Rockchip SD/MMC boot format. The mkimage tool is often
129called from the U-Boot build system for this reason.
130
131Binman considers the output files created by mkimage to be binary blobs
132which it can place in an image. Binman does not replace the mkimage tool or
Michael Heimpold383d2562018-08-22 22:01:24 +0200133this purpose. It would be possible in some situations to create a new entry
Simon Glassbf7fd502016-11-25 20:15:51 -0700134type for the images in mkimage, but this would not add functionality. It
Michael Heimpold383d2562018-08-22 22:01:24 +0200135seems better to use the mkimage tool to generate binaries and avoid blurring
Simon Glassbf7fd502016-11-25 20:15:51 -0700136the boundaries between building input files (mkimage) and packaging then
137into a final image (binman).
138
139
Simon Glass072026e2021-03-18 20:25:14 +1300140Using binman
141============
142
Simon Glassbf7fd502016-11-25 20:15:51 -0700143Example use of binman in U-Boot
144-------------------------------
145
146Binman aims to replace some of the ad-hoc image creation in the U-Boot
147build system.
148
149Consider sunxi. It has the following steps:
150
Simon Glass61adb2d2021-03-18 20:25:13 +1300151 #. It uses a custom mksunxiboot tool to build an SPL image called
152 sunxi-spl.bin. This should probably move into mkimage.
Simon Glassbf7fd502016-11-25 20:15:51 -0700153
Simon Glass61adb2d2021-03-18 20:25:13 +1300154 #. It uses mkimage to package U-Boot into a legacy image file (so that it can
155 hold the load and execution address) called u-boot.img.
Simon Glassbf7fd502016-11-25 20:15:51 -0700156
Simon Glass61adb2d2021-03-18 20:25:13 +1300157 #. It builds a final output image called u-boot-sunxi-with-spl.bin which
158 consists of sunxi-spl.bin, some padding and u-boot.img.
Simon Glassbf7fd502016-11-25 20:15:51 -0700159
160Binman is intended to replace the last step. The U-Boot build system builds
161u-boot.bin and sunxi-spl.bin. Binman can then take over creation of
162sunxi-spl.bin (by calling mksunxiboot, or hopefully one day mkimage). In any
163case, it would then create the image from the component parts.
164
165This simplifies the U-Boot Makefile somewhat, since various pieces of logic
166can be replaced by a call to binman.
167
168
169Example use of binman for x86
170-----------------------------
171
172In most cases x86 images have a lot of binary blobs, 'black-box' code
173provided by Intel which must be run for the platform to work. Typically
174these blobs are not relocatable and must be placed at fixed areas in the
Michael Heimpold383d2562018-08-22 22:01:24 +0200175firmware image.
Simon Glassbf7fd502016-11-25 20:15:51 -0700176
177Currently this is handled by ifdtool, which places microcode, FSP, MRC, VGA
178BIOS, reference code and Intel ME binaries into a u-boot.rom file.
179
180Binman is intended to replace all of this, with ifdtool left to handle only
181the configuration of the Intel-format descriptor.
182
183
184Running binman
185--------------
186
Simon Glass61adb2d2021-03-18 20:25:13 +1300187First install prerequisites, e.g::
Simon Glassd8d40742019-07-08 13:18:35 -0600188
Simon Glass61adb2d2021-03-18 20:25:13 +1300189 sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \
190 liblz4-tool
Simon Glassd8d40742019-07-08 13:18:35 -0600191
Simon Glass61adb2d2021-03-18 20:25:13 +1300192Type::
Simon Glassbf7fd502016-11-25 20:15:51 -0700193
Simon Glass61adb2d2021-03-18 20:25:13 +1300194 binman build -b <board_name>
Simon Glassbf7fd502016-11-25 20:15:51 -0700195
196to build an image for a board. The board name is the same name used when
197configuring U-Boot (e.g. for sandbox_defconfig the board name is 'sandbox').
198Binman assumes that the input files for the build are in ../b/<board_name>.
199
Simon Glass61adb2d2021-03-18 20:25:13 +1300200Or you can specify this explicitly::
Simon Glassbf7fd502016-11-25 20:15:51 -0700201
Simon Glass61adb2d2021-03-18 20:25:13 +1300202 binman build -I <build_path>
Simon Glassbf7fd502016-11-25 20:15:51 -0700203
204where <build_path> is the build directory containing the output of the U-Boot
205build.
206
207(Future work will make this more configurable)
208
209In either case, binman picks up the device tree file (u-boot.dtb) and looks
210for its instructions in the 'binman' node.
211
212Binman has a few other options which you can see by running 'binman -h'.
213
214
Simon Glass9c0a8b12017-11-12 21:52:06 -0700215Enabling binman for a board
216---------------------------
217
218At present binman is invoked from a rule in the main Makefile. Typically you
Simon Glass61adb2d2021-03-18 20:25:13 +1300219will have a rule like::
Simon Glass9c0a8b12017-11-12 21:52:06 -0700220
Simon Glass61adb2d2021-03-18 20:25:13 +1300221 ifneq ($(CONFIG_ARCH_<something>),)
222 u-boot-<your_suffix>.bin: <input_file_1> <input_file_2> checkbinman FORCE
223 $(call if_changed,binman)
224 endif
Simon Glass9c0a8b12017-11-12 21:52:06 -0700225
226This assumes that u-boot-<your_suffix>.bin is a target, and is the final file
Simon Glasse6385c72020-07-19 13:56:01 -0600227that you need to produce. You can make it a target by adding it to INPUTS-y
Simon Glass9c0a8b12017-11-12 21:52:06 -0700228either in the main Makefile or in a config.mk file in your arch subdirectory.
229
230Once binman is executed it will pick up its instructions from a device-tree
231file, typically <soc>-u-boot.dtsi, where <soc> is your CONFIG_SYS_SOC value.
232You can use other, more specific CONFIG options - see 'Automatic .dtsi
233inclusion' below.
234
235
Simon Glass072026e2021-03-18 20:25:14 +1300236Access to binman entry offsets at run time (symbols)
237----------------------------------------------------
238
239Binman assembles images and determines where each entry is placed in the image.
240This information may be useful to U-Boot at run time. For example, in SPL it
241is useful to be able to find the location of U-Boot so that it can be executed
242when SPL is finished.
243
244Binman allows you to declare symbols in the SPL image which are filled in
245with their correct values during the build. For example::
246
247 binman_sym_declare(ulong, u_boot_any, image_pos);
248
249declares a ulong value which will be assigned to the image-pos of any U-Boot
250image (u-boot.bin, u-boot.img, u-boot-nodtb.bin) that is present in the image.
251You can access this value with something like::
252
253 ulong u_boot_offset = binman_sym(ulong, u_boot_any, image_pos);
254
255Thus u_boot_offset will be set to the image-pos of U-Boot in memory, assuming
256that the whole image has been loaded, or is available in flash. You can then
257jump to that address to start U-Boot.
258
259At present this feature is only supported in SPL and TPL. In principle it is
260possible to fill in such symbols in U-Boot proper, as well, but a future C
261library is planned for this instead, to read from the device tree.
262
263As well as image-pos, it is possible to read the size of an entry and its
264offset (which is the start position of the entry within its parent).
265
266A small technical note: Binman automatically adds the base address of the image
267(i.e. __image_copy_start) to the value of the image-pos symbol, so that when the
268image is loaded to its linked address, the value will be correct and actually
269point into the image.
270
271For example, say SPL is at the start of the image and linked to start at address
27280108000. If U-Boot's image-pos is 0x8000 then binman will write an image-pos
273for U-Boot of 80110000 into the SPL binary, since it assumes the image is loaded
274to 80108000, with SPL at 80108000 and U-Boot at 80110000.
275
276For x86 devices (with the end-at-4gb property) this base address is not added
277since it is assumed that images are XIP and the offsets already include the
278address.
279
280
281Access to binman entry offsets at run time (fdt)
282------------------------------------------------
283
284Binman can update the U-Boot FDT to include the final position and size of
285each entry in the images it processes. The option to enable this is -u and it
286causes binman to make sure that the 'offset', 'image-pos' and 'size' properties
287are set correctly for every entry. Since it is not necessary to specify these in
288the image definition, binman calculates the final values and writes these to
289the device tree. These can be used by U-Boot at run-time to find the location
290of each entry.
291
292Alternatively, an FDT map entry can be used to add a special FDT containing
293just the information about the image. This is preceded by a magic string so can
294be located anywhere in the image. An image header (typically at the start or end
295of the image) can be used to point to the FDT map. See fdtmap and image-header
296entries for more information.
297
298
299Map files
300---------
301
302The -m option causes binman to output a .map file for each image that it
303generates. This shows the offset and size of each entry. For example::
304
305 Offset Size Name
306 00000000 00000028 main-section
307 00000000 00000010 section@0
308 00000000 00000004 u-boot
309 00000010 00000010 section@1
310 00000000 00000004 u-boot
311
312This shows a hierarchical image with two sections, each with a single entry. The
313offsets of the sections are absolute hex byte offsets within the image. The
314offsets of the entries are relative to their respective sections. The size of
315each entry is also shown, in bytes (hex). The indentation shows the entries
316nested inside their sections.
317
318
319Passing command-line arguments to entries
320-----------------------------------------
321
322Sometimes it is useful to pass binman the value of an entry property from the
323command line. For example some entries need access to files and it is not
324always convenient to put these filenames in the image definition (device tree).
325
326The-a option supports this::
327
328 -a<prop>=<value>
329
330where::
331
332 <prop> is the property to set
333 <value> is the value to set it to
334
335Not all properties can be provided this way. Only some entries support it,
336typically for filenames.
337
338
Simon Glassbf7fd502016-11-25 20:15:51 -0700339Image description format
Simon Glass072026e2021-03-18 20:25:14 +1300340========================
Simon Glassbf7fd502016-11-25 20:15:51 -0700341
342The binman node is called 'binman'. An example image description is shown
Simon Glass61adb2d2021-03-18 20:25:13 +1300343below::
Simon Glassbf7fd502016-11-25 20:15:51 -0700344
Simon Glass61adb2d2021-03-18 20:25:13 +1300345 binman {
346 filename = "u-boot-sunxi-with-spl.bin";
347 pad-byte = <0xff>;
348 blob {
349 filename = "spl/sunxi-spl.bin";
350 };
351 u-boot {
352 offset = <CONFIG_SPL_PAD_TO>;
353 };
354 };
Simon Glassbf7fd502016-11-25 20:15:51 -0700355
356
357This requests binman to create an image file called u-boot-sunxi-with-spl.bin
358consisting of a specially formatted SPL (spl/sunxi-spl.bin, built by the
359normal U-Boot Makefile), some 0xff padding, and a U-Boot legacy image. The
360padding comes from the fact that the second binary is placed at
361CONFIG_SPL_PAD_TO. If that line were omitted then the U-Boot binary would
362immediately follow the SPL binary.
363
364The binman node describes an image. The sub-nodes describe entries in the
365image. Each entry represents a region within the overall image. The name of
366the entry (blob, u-boot) tells binman what to put there. For 'blob' we must
367provide a filename. For 'u-boot', binman knows that this means 'u-boot.bin'.
368
369Entries are normally placed into the image sequentially, one after the other.
370The image size is the total size of all entries. As you can see, you can
Simon Glass3ab95982018-08-01 15:22:37 -0600371specify the start offset of an entry using the 'offset' property.
Simon Glassbf7fd502016-11-25 20:15:51 -0700372
373Note that due to a device tree requirement, all entries must have a unique
374name. If you want to put the same binary in the image multiple times, you can
375use any unique name, with the 'type' property providing the type.
376
377The attributes supported for entries are described below.
378
Simon Glass3ab95982018-08-01 15:22:37 -0600379offset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300380 This sets the offset of an entry within the image or section containing
381 it. The first byte of the image is normally at offset 0. If 'offset' is
382 not provided, binman sets it to the end of the previous region, or the
383 start of the image's entry area (normally 0) if there is no previous
384 region.
Simon Glassbf7fd502016-11-25 20:15:51 -0700385
386align:
Simon Glass61adb2d2021-03-18 20:25:13 +1300387 This sets the alignment of the entry. The entry offset is adjusted
388 so that the entry starts on an aligned boundary within the containing
389 section or image. For example 'align = <16>' means that the entry will
390 start on a 16-byte boundary. This may mean that padding is added before
391 the entry. The padding is part of the containing section but is not
392 included in the entry, meaning that an empty space may be created before
393 the entry starts. Alignment should be a power of 2. If 'align' is not
394 provided, no alignment is performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700395
396size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300397 This sets the size of the entry. The contents will be padded out to
398 this size. If this is not provided, it will be set to the size of the
399 contents.
Simon Glassbf7fd502016-11-25 20:15:51 -0700400
401pad-before:
Simon Glass61adb2d2021-03-18 20:25:13 +1300402 Padding before the contents of the entry. Normally this is 0, meaning
403 that the contents start at the beginning of the entry. This can be used
404 to offset the entry contents a little. While this does not affect the
405 contents of the entry within binman itself (the padding is performed
406 only when its parent section is assembled), the end result will be that
407 the entry starts with the padding bytes, so may grow. Defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700408
409pad-after:
Simon Glass61adb2d2021-03-18 20:25:13 +1300410 Padding after the contents of the entry. Normally this is 0, meaning
411 that the entry ends at the last byte of content (unless adjusted by
412 other properties). This allows room to be created in the image for
413 this entry to expand later. While this does not affect the contents of
414 the entry within binman itself (the padding is performed only when its
415 parent section is assembled), the end result will be that the entry ends
416 with the padding bytes, so may grow. Defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700417
418align-size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300419 This sets the alignment of the entry size. For example, to ensure
420 that the size of an entry is a multiple of 64 bytes, set this to 64.
421 While this does not affect the contents of the entry within binman
422 itself (the padding is performed only when its parent section is
423 assembled), the end result is that the entry ends with the padding
424 bytes, so may grow. If 'align-size' is not provided, no alignment is
425 performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700426
427align-end:
Simon Glass61adb2d2021-03-18 20:25:13 +1300428 This sets the alignment of the end of an entry with respect to the
429 containing section. Some entries require that they end on an alignment
430 boundary, regardless of where they start. This does not move the start
431 of the entry, so the contents of the entry will still start at the
432 beginning. But there may be padding at the end. While this does not
433 affect the contents of the entry within binman itself (the padding is
434 performed only when its parent section is assembled), the end result
435 is that the entry ends with the padding bytes, so may grow.
436 If 'align-end' is not provided, no alignment is performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700437
438filename:
Simon Glass61adb2d2021-03-18 20:25:13 +1300439 For 'blob' types this provides the filename containing the binary to
440 put into the entry. If binman knows about the entry type (like
441 u-boot-bin), then there is no need to specify this.
Simon Glassbf7fd502016-11-25 20:15:51 -0700442
443type:
Simon Glass61adb2d2021-03-18 20:25:13 +1300444 Sets the type of an entry. This defaults to the entry name, but it is
445 possible to use any name, and then add (for example) 'type = "u-boot"'
446 to specify the type.
Simon Glassbf7fd502016-11-25 20:15:51 -0700447
Simon Glass3ab95982018-08-01 15:22:37 -0600448offset-unset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300449 Indicates that the offset of this entry should not be set by placing
450 it immediately after the entry before. Instead, is set by another
451 entry which knows where this entry should go. When this boolean
452 property is present, binman will give an error if another entry does
453 not set the offset (with the GetOffsets() method).
Simon Glass258fb0e2018-06-01 09:38:17 -0600454
Simon Glassdbf6be92018-08-01 15:22:42 -0600455image-pos:
Simon Glass61adb2d2021-03-18 20:25:13 +1300456 This cannot be set on entry (or at least it is ignored if it is), but
457 with the -u option, binman will set it to the absolute image position
458 for each entry. This makes it easy to find out exactly where the entry
459 ended up in the image, regardless of parent sections, etc.
Simon Glassdbf6be92018-08-01 15:22:42 -0600460
Simon Glassba64a0b2018-09-14 04:57:29 -0600461expand-size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300462 Expand the size of this entry to fit available space. This space is only
463 limited by the size of the image/section and the position of the next
464 entry.
Simon Glassbf7fd502016-11-25 20:15:51 -0700465
Simon Glass8287ee82019-07-08 14:25:30 -0600466compress:
Simon Glass61adb2d2021-03-18 20:25:13 +1300467 Sets the compression algortihm to use (for blobs only). See the entry
468 documentation for details.
Simon Glass8287ee82019-07-08 14:25:30 -0600469
Simon Glassb2381432020-09-06 10:39:09 -0600470missing-msg:
Simon Glass61adb2d2021-03-18 20:25:13 +1300471 Sets the tag of the message to show if this entry is missing. This is
472 used for external blobs. When they are missing it is helpful to show
473 information about what needs to be fixed. See missing-blob-help for the
474 message for each tag.
Simon Glassb2381432020-09-06 10:39:09 -0600475
Simon Glass9c888cc2018-09-14 04:57:30 -0600476The attributes supported for images and sections are described below. Several
477are similar to those for entries.
Simon Glassbf7fd502016-11-25 20:15:51 -0700478
479size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300480 Sets the image size in bytes, for example 'size = <0x100000>' for a
481 1MB image.
Simon Glassbf7fd502016-11-25 20:15:51 -0700482
Simon Glass9481c802019-04-25 21:58:39 -0600483offset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300484 This is similar to 'offset' in entries, setting the offset of a section
485 within the image or section containing it. The first byte of the section
486 is normally at offset 0. If 'offset' is not provided, binman sets it to
487 the end of the previous region, or the start of the image's entry area
488 (normally 0) if there is no previous region.
Simon Glass9481c802019-04-25 21:58:39 -0600489
Simon Glassbf7fd502016-11-25 20:15:51 -0700490align-size:
Simon Glass61adb2d2021-03-18 20:25:13 +1300491 This sets the alignment of the image size. For example, to ensure
492 that the image ends on a 512-byte boundary, use 'align-size = <512>'.
493 If 'align-size' is not provided, no alignment is performed.
Simon Glassbf7fd502016-11-25 20:15:51 -0700494
495pad-before:
Simon Glass61adb2d2021-03-18 20:25:13 +1300496 This sets the padding before the image entries. The first entry will
497 be positioned after the padding. This defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700498
499pad-after:
Simon Glass61adb2d2021-03-18 20:25:13 +1300500 This sets the padding after the image entries. The padding will be
501 placed after the last entry. This defaults to 0.
Simon Glassbf7fd502016-11-25 20:15:51 -0700502
503pad-byte:
Simon Glass61adb2d2021-03-18 20:25:13 +1300504 This specifies the pad byte to use when padding in the image. It
505 defaults to 0. To use 0xff, you would add 'pad-byte = <0xff>'.
Simon Glassbf7fd502016-11-25 20:15:51 -0700506
507filename:
Simon Glass61adb2d2021-03-18 20:25:13 +1300508 This specifies the image filename. It defaults to 'image.bin'.
Simon Glassbf7fd502016-11-25 20:15:51 -0700509
Simon Glass3ab95982018-08-01 15:22:37 -0600510sort-by-offset:
Simon Glass61adb2d2021-03-18 20:25:13 +1300511 This causes binman to reorder the entries as needed to make sure they
512 are in increasing positional order. This can be used when your entry
513 order may not match the positional order. A common situation is where
514 the 'offset' properties are set by CONFIG options, so their ordering is
515 not known a priori.
Simon Glassbf7fd502016-11-25 20:15:51 -0700516
Simon Glass61adb2d2021-03-18 20:25:13 +1300517 This is a boolean property so needs no value. To enable it, add a
518 line 'sort-by-offset;' to your description.
Simon Glassbf7fd502016-11-25 20:15:51 -0700519
520multiple-images:
Simon Glass61adb2d2021-03-18 20:25:13 +1300521 Normally only a single image is generated. To create more than one
522 image, put this property in the binman node. For example, this will
523 create image1.bin containing u-boot.bin, and image2.bin containing
524 both spl/u-boot-spl.bin and u-boot.bin::
Simon Glassbf7fd502016-11-25 20:15:51 -0700525
Simon Glass61adb2d2021-03-18 20:25:13 +1300526 binman {
527 multiple-images;
528 image1 {
529 u-boot {
530 };
531 };
Simon Glassbf7fd502016-11-25 20:15:51 -0700532
Simon Glass61adb2d2021-03-18 20:25:13 +1300533 image2 {
534 spl {
535 };
536 u-boot {
537 };
538 };
539 };
Simon Glassbf7fd502016-11-25 20:15:51 -0700540
541end-at-4gb:
Simon Glass61adb2d2021-03-18 20:25:13 +1300542 For x86 machines the ROM offsets start just before 4GB and extend
543 up so that the image finished at the 4GB boundary. This boolean
544 option can be enabled to support this. The image size must be
545 provided so that binman knows when the image should start. For an
546 8MB ROM, the offset of the first entry would be 0xfff80000 with
547 this option, instead of 0 without this option.
Simon Glassbf7fd502016-11-25 20:15:51 -0700548
Jagdish Gediya94b57db2018-09-03 21:35:07 +0530549skip-at-start:
Simon Glass61adb2d2021-03-18 20:25:13 +1300550 This property specifies the entry offset of the first entry.
Jagdish Gediya94b57db2018-09-03 21:35:07 +0530551
Simon Glass61adb2d2021-03-18 20:25:13 +1300552 For PowerPC mpc85xx based CPU, CONFIG_SYS_TEXT_BASE is the entry
553 offset of the first entry. It can be 0xeff40000 or 0xfff40000 for
554 nor flash boot, 0x201000 for sd boot etc.
Jagdish Gediya94b57db2018-09-03 21:35:07 +0530555
Simon Glass61adb2d2021-03-18 20:25:13 +1300556 'end-at-4gb' property is not applicable where CONFIG_SYS_TEXT_BASE +
557 Image size != 4gb.
Simon Glassbf7fd502016-11-25 20:15:51 -0700558
559Examples of the above options can be found in the tests. See the
560tools/binman/test directory.
561
Simon Glassdd57c132018-06-01 09:38:11 -0600562It is possible to have the same binary appear multiple times in the image,
563either by using a unit number suffix (u-boot@0, u-boot@1) or by using a
564different name for each and specifying the type with the 'type' attribute.
565
Simon Glassbf7fd502016-11-25 20:15:51 -0700566
Michael Heimpold383d2562018-08-22 22:01:24 +0200567Sections and hierachical images
Simon Glass18546952018-06-01 09:38:16 -0600568-------------------------------
569
570Sometimes it is convenient to split an image into several pieces, each of which
571contains its own set of binaries. An example is a flash device where part of
572the image is read-only and part is read-write. We can set up sections for each
573of these, and place binaries in them independently. The image is still produced
574as a single output file.
575
576This feature provides a way of creating hierarchical images. For example here
Simon Glass7ae5f312018-06-01 09:38:19 -0600577is an example image with two copies of U-Boot. One is read-only (ro), intended
578to be written only in the factory. Another is read-write (rw), so that it can be
Simon Glass18546952018-06-01 09:38:16 -0600579upgraded in the field. The sizes are fixed so that the ro/rw boundary is known
Simon Glass61adb2d2021-03-18 20:25:13 +1300580and can be programmed::
Simon Glass18546952018-06-01 09:38:16 -0600581
Simon Glass61adb2d2021-03-18 20:25:13 +1300582 binman {
583 section@0 {
584 read-only;
585 name-prefix = "ro-";
586 size = <0x100000>;
587 u-boot {
588 };
589 };
590 section@1 {
591 name-prefix = "rw-";
592 size = <0x100000>;
593 u-boot {
594 };
595 };
596 };
Simon Glass18546952018-06-01 09:38:16 -0600597
598This image could be placed into a SPI flash chip, with the protection boundary
599set at 1MB.
600
601A few special properties are provided for sections:
602
603read-only:
Simon Glass61adb2d2021-03-18 20:25:13 +1300604 Indicates that this section is read-only. This has no impact on binman's
605 operation, but his property can be read at run time.
Simon Glass18546952018-06-01 09:38:16 -0600606
Simon Glassc8d48ef2018-06-01 09:38:21 -0600607name-prefix:
Simon Glass61adb2d2021-03-18 20:25:13 +1300608 This string is prepended to all the names of the binaries in the
609 section. In the example above, the 'u-boot' binaries which actually be
610 renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to
611 distinguish binaries with otherwise identical names.
Simon Glassc8d48ef2018-06-01 09:38:21 -0600612
Simon Glass18546952018-06-01 09:38:16 -0600613
Simon Glass12bb1a92019-07-20 12:23:51 -0600614Image Properties
615----------------
616
617Image nodes act like sections but also have a few extra properties:
618
619filename:
Simon Glass61adb2d2021-03-18 20:25:13 +1300620 Output filename for the image. This defaults to image.bin (or in the
621 case of multiple images <nodename>.bin where <nodename> is the name of
622 the image node.
Simon Glass12bb1a92019-07-20 12:23:51 -0600623
624allow-repack:
Simon Glass61adb2d2021-03-18 20:25:13 +1300625 Create an image that can be repacked. With this option it is possible
626 to change anything in the image after it is created, including updating
627 the position and size of image components. By default this is not
628 permitted since it is not possibly to know whether this might violate a
629 constraint in the image description. For example, if a section has to
630 increase in size to hold a larger binary, that might cause the section
631 to fall out of its allow region (e.g. read-only portion of flash).
Simon Glass12bb1a92019-07-20 12:23:51 -0600632
Simon Glass61adb2d2021-03-18 20:25:13 +1300633 Adding this property causes the original offset and size values in the
634 image description to be stored in the FDT and fdtmap.
Simon Glass12bb1a92019-07-20 12:23:51 -0600635
636
Simon Glass072026e2021-03-18 20:25:14 +1300637Hashing Entries
638---------------
639
640It is possible to ask binman to hash the contents of an entry and write that
641value back to the device-tree node. For example::
642
643 binman {
644 u-boot {
645 hash {
646 algo = "sha256";
647 };
648 };
649 };
650
651Here, a new 'value' property will be written to the 'hash' node containing
652the hash of the 'u-boot' entry. Only SHA256 is supported at present. Whole
653sections can be hased if desired, by adding the 'hash' node to the section.
654
655The has value can be chcked at runtime by hashing the data actually read and
656comparing this has to the value in the device tree.
657
658
659Expanded entries
660----------------
661
662Binman automatically replaces 'u-boot' with an expanded version of that, i.e.
663'u-boot-expanded'. This means that when you write::
664
665 u-boot {
666 };
667
668you actually get::
669
670 u-boot {
671 type = "u-boot-expanded';
672 };
673
674which in turn expands to::
675
676 u-boot {
677 type = "section";
678
679 u-boot-nodtb {
680 };
681
682 u-boot-dtb {
683 };
684 };
685
686U-Boot's various phase binaries actually comprise two or three pieces.
687For example, u-boot.bin has the executable followed by a devicetree.
688
689With binman we want to be able to update that devicetree with full image
690information so that it is accessible to the executable. This is tricky
691if it is not clear where the devicetree starts.
692
693The above feature ensures that the devicetree is clearly separated from the
694U-Boot executable and can be updated separately by binman as needed. It can be
695disabled with the --no-expanded flag if required.
696
697The same applies for u-boot-spl and u-boot-spl. In those cases, the expansion
698includes the BSS padding, so for example::
699
700 spl {
701 type = "u-boot-spl"
702 };
703
704you actually get::
705
706 spl {
707 type = "u-boot-expanded';
708 };
709
710which in turn expands to::
711
712 spl {
713 type = "section";
714
715 u-boot-spl-nodtb {
716 };
717
718 u-boot-spl-bss-pad {
719 };
720
721 u-boot-spl-dtb {
722 };
723 };
724
725Of course we should not expand SPL if it has no devicetree. Also if the BSS
726padding is not needed (because BSS is in RAM as with CONFIG_SPL_SEPARATE_BSS),
727the 'u-boot-spl-bss-pad' subnode should not be created. The use of the expaned
728entry type is controlled by the UseExpanded() method. In the SPL case it checks
729the 'spl-dtb' entry arg, which is 'y' or '1' if SPL has a devicetree.
730
731For the BSS case, a 'spl-bss-pad' entry arg controls whether it is present. All
732entry args are provided by the U-Boot Makefile.
733
734
735Compression
736-----------
737
738Binman support compression for 'blob' entries (those of type 'blob' and
739derivatives). To enable this for an entry, add a 'compress' property::
740
741 blob {
742 filename = "datafile";
743 compress = "lz4";
744 };
745
746The entry will then contain the compressed data, using the 'lz4' compression
747algorithm. Currently this is the only one that is supported. The uncompressed
748size is written to the node in an 'uncomp-size' property, if -u is used.
749
750Compression is also supported for sections. In that case the entire section is
751compressed in one block, including all its contents. This means that accessing
752an entry from the section required decompressing the entire section. Also, the
753size of a section indicates the space that it consumes in its parent section
754(and typically the image). With compression, the section may contain more data,
755and the uncomp-size property indicates that, as above. The contents of the
756section is compressed first, before any padding is added. This ensures that the
757padding itself is not compressed, which would be a waste of time.
758
759
760Automatic .dtsi inclusion
761-------------------------
762
763It is sometimes inconvenient to add a 'binman' node to the .dts file for each
764board. This can be done by using #include to bring in a common file. Another
765approach supported by the U-Boot build system is to automatically include
766a common header. You can then put the binman node (and anything else that is
767specific to U-Boot, such as u-boot,dm-pre-reloc properies) in that header
768file.
769
770Binman will search for the following files in arch/<arch>/dts::
771
772 <dts>-u-boot.dtsi where <dts> is the base name of the .dts file
773 <CONFIG_SYS_SOC>-u-boot.dtsi
774 <CONFIG_SYS_CPU>-u-boot.dtsi
775 <CONFIG_SYS_VENDOR>-u-boot.dtsi
776 u-boot.dtsi
777
778U-Boot will only use the first one that it finds. If you need to include a
779more general file you can do that from the more specific file using #include.
780If you are having trouble figuring out what is going on, you can uncomment
781the 'warning' line in scripts/Makefile.lib to see what it has found::
782
783 # Uncomment for debugging
784 # This shows all the files that were considered and the one that we chose.
785 # u_boot_dtsi_options_debug = $(u_boot_dtsi_options_raw)
786
787
Simon Glass5a5da7c2018-07-17 13:25:37 -0600788Entry Documentation
789-------------------
790
791For details on the various entry types supported by binman and how to use them,
792see README.entries. This is generated from the source code using:
793
Simon Glass61adb2d2021-03-18 20:25:13 +1300794 binman entry-docs >tools/binman/README.entries
Simon Glass5a5da7c2018-07-17 13:25:37 -0600795
796
Simon Glass072026e2021-03-18 20:25:14 +1300797Managing images
798===============
799
Simon Glass61f564d2019-07-08 14:25:48 -0600800Listing images
801--------------
802
803It is possible to list the entries in an existing firmware image created by
Simon Glass61adb2d2021-03-18 20:25:13 +1300804binman, provided that there is an 'fdtmap' entry in the image. For example::
Simon Glass61f564d2019-07-08 14:25:48 -0600805
806 $ binman ls -i image.bin
807 Name Image-pos Size Entry-type Offset Uncomp-size
808 ----------------------------------------------------------------------
809 main-section c00 section 0
810 u-boot 0 4 u-boot 0
811 section 5fc section 4
812 cbfs 100 400 cbfs 0
813 u-boot 138 4 u-boot 38
814 u-boot-dtb 180 108 u-boot-dtb 80 3b5
815 u-boot-dtb 500 1ff u-boot-dtb 400 3b5
816 fdtmap 6fc 381 fdtmap 6fc
817 image-header bf8 8 image-header bf8
818
819This shows the hierarchy of the image, the position, size and type of each
820entry, the offset of each entry within its parent and the uncompressed size if
821the entry is compressed.
822
Simon Glass61adb2d2021-03-18 20:25:13 +1300823It is also possible to list just some files in an image, e.g.::
Simon Glass61f564d2019-07-08 14:25:48 -0600824
825 $ binman ls -i image.bin section/cbfs
826 Name Image-pos Size Entry-type Offset Uncomp-size
827 --------------------------------------------------------------------
828 cbfs 100 400 cbfs 0
829 u-boot 138 4 u-boot 38
830 u-boot-dtb 180 108 u-boot-dtb 80 3b5
831
Simon Glass61adb2d2021-03-18 20:25:13 +1300832or with wildcards::
Simon Glass61f564d2019-07-08 14:25:48 -0600833
834 $ binman ls -i image.bin "*cb*" "*head*"
835 Name Image-pos Size Entry-type Offset Uncomp-size
836 ----------------------------------------------------------------------
837 cbfs 100 400 cbfs 0
838 u-boot 138 4 u-boot 38
839 u-boot-dtb 180 108 u-boot-dtb 80 3b5
840 image-header bf8 8 image-header bf8
841
842
Simon Glass71ce0ba2019-07-08 14:25:52 -0600843Extracting files from images
844----------------------------
845
846You can extract files from an existing firmware image created by binman,
Simon Glass61adb2d2021-03-18 20:25:13 +1300847provided that there is an 'fdtmap' entry in the image. For example::
Simon Glass71ce0ba2019-07-08 14:25:52 -0600848
849 $ binman extract -i image.bin section/cbfs/u-boot
850
851which will write the uncompressed contents of that entry to the file 'u-boot' in
852the current directory. You can also extract to a particular file, in this case
Simon Glass61adb2d2021-03-18 20:25:13 +1300853u-boot.bin::
Simon Glass71ce0ba2019-07-08 14:25:52 -0600854
855 $ binman extract -i image.bin section/cbfs/u-boot -f u-boot.bin
856
857It is possible to extract all files into a destination directory, which will
Simon Glass61adb2d2021-03-18 20:25:13 +1300858put files in subdirectories matching the entry hierarchy::
Simon Glass71ce0ba2019-07-08 14:25:52 -0600859
860 $ binman extract -i image.bin -O outdir
861
Simon Glass61adb2d2021-03-18 20:25:13 +1300862or just a selection::
Simon Glass71ce0ba2019-07-08 14:25:52 -0600863
864 $ binman extract -i image.bin "*u-boot*" -O outdir
865
866
Simon Glass10f9d002019-07-20 12:23:50 -0600867Replacing files in an image
868---------------------------
869
870You can replace files in an existing firmware image created by binman, provided
871that there is an 'fdtmap' entry in the image. For example:
872
873 $ binman replace -i image.bin section/cbfs/u-boot
874
875which will write the contents of the file 'u-boot' from the current directory
Simon Glassa6cb9952019-07-20 12:24:15 -0600876to the that entry, compressing if necessary. If the entry size changes, you must
877add the 'allow-repack' property to the original image before generating it (see
878above), otherwise you will get an error.
879
Simon Glass61adb2d2021-03-18 20:25:13 +1300880You can also use a particular file, in this case u-boot.bin::
Simon Glassa6cb9952019-07-20 12:24:15 -0600881
882 $ binman replace -i image.bin section/cbfs/u-boot -f u-boot.bin
883
884It is possible to replace all files from a source directory which uses the same
Simon Glass61adb2d2021-03-18 20:25:13 +1300885hierarchy as the entries::
Simon Glassa6cb9952019-07-20 12:24:15 -0600886
887 $ binman replace -i image.bin -I indir
888
889Files that are missing will generate a warning.
890
Simon Glass61adb2d2021-03-18 20:25:13 +1300891You can also replace just a selection of entries::
Simon Glassa6cb9952019-07-20 12:24:15 -0600892
893 $ binman replace -i image.bin "*u-boot*" -I indir
Simon Glass10f9d002019-07-20 12:23:50 -0600894
895
Simon Glasseea264e2019-07-08 14:25:49 -0600896Logging
897-------
898
899Binman normally operates silently unless there is an error, in which case it
900just displays the error. The -D/--debug option can be used to create a full
Simon Glassef108042021-02-06 09:57:28 -0700901backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select
902this.
Simon Glasseea264e2019-07-08 14:25:49 -0600903
904Internally binman logs some output while it is running. This can be displayed
905by increasing the -v/--verbosity from the default of 1:
906
907 0: silent
908 1: warnings only
909 2: notices (important messages)
910 3: info about major operations
911 4: detailed information about each operation
912 5: debug (all output)
913
Simon Glassef108042021-02-06 09:57:28 -0700914You can use BINMAN_VERBOSE=5 (for example) when building to select this.
Simon Glasseea264e2019-07-08 14:25:49 -0600915
Simon Glasse0ff8552016-11-25 20:15:53 -0700916
Simon Glass072026e2021-03-18 20:25:14 +1300917Technical details
918=================
Simon Glasse0ff8552016-11-25 20:15:53 -0700919
Simon Glassbf7fd502016-11-25 20:15:51 -0700920Order of image creation
921-----------------------
922
923Image creation proceeds in the following order, for each entry in the image.
924
Simon Glass078ab1a2018-07-06 10:27:41 -06009251. AddMissingProperties() - binman can add calculated values to the device
Simon Glass3ab95982018-08-01 15:22:37 -0600926tree as part of its processing, for example the offset and size of each
Simon Glass078ab1a2018-07-06 10:27:41 -0600927entry. This method adds any properties associated with this, expanding the
928device tree as needed. These properties can have placeholder values which are
929set later by SetCalculatedProperties(). By that stage the size of sections
930cannot be changed (since it would cause the images to need to be repacked),
931but the correct values can be inserted.
932
9332. ProcessFdt() - process the device tree information as required by the
Simon Glassecab8972018-07-06 10:27:40 -0600934particular entry. This may involve adding or deleting properties. If the
935processing is complete, this method should return True. If the processing
936cannot complete because it needs the ProcessFdt() method of another entry to
937run first, this method should return False, in which case it will be called
938again later.
939
Simon Glass078ab1a2018-07-06 10:27:41 -06009403. GetEntryContents() - the contents of each entry are obtained, normally by
Simon Glassbf7fd502016-11-25 20:15:51 -0700941reading from a file. This calls the Entry.ObtainContents() to read the
942contents. The default version of Entry.ObtainContents() calls
943Entry.GetDefaultFilename() and then reads that file. So a common mechanism
944to select a file to read is to override that function in the subclass. The
945functions must return True when they have read the contents. Binman will
946retry calling the functions a few times if False is returned, allowing
947dependencies between the contents of different entries.
948
Simon Glass3ab95982018-08-01 15:22:37 -06009494. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can
Simon Glassbf7fd502016-11-25 20:15:51 -0700950return a dict containing entries that need updating. The key should be the
Simon Glass3ab95982018-08-01 15:22:37 -0600951entry name and the value is a tuple (offset, size). This allows an entry to
952provide the offset and size for other entries. The default implementation
953of GetEntryOffsets() returns {}.
Simon Glassbf7fd502016-11-25 20:15:51 -0700954
Simon Glass3ab95982018-08-01 15:22:37 -06009555. PackEntries() - calls Entry.Pack() which figures out the offset and
956size of an entry. The 'current' image offset is passed in, and the function
957returns the offset immediately after the entry being packed. The default
Simon Glassbf7fd502016-11-25 20:15:51 -0700958implementation of Pack() is usually sufficient.
959
Simon Glass0b657692020-10-26 17:40:22 -0600960Note: for sections, this also checks that the entries do not overlap, nor extend
961outside the section. If the section does not have a defined size, the size is
962set large enough to hold all the entries.
Simon Glassbf7fd502016-11-25 20:15:51 -0700963
Simon Glass0b657692020-10-26 17:40:22 -06009646. SetImagePos() - sets the image position of every entry. This is the absolute
Simon Glass4ab88b62019-07-20 12:23:52 -0600965position 'image-pos', as opposed to 'offset' which is relative to the containing
966section. This must be done after all offsets are known, which is why it is quite
967late in the ordering.
968
Simon Glass0b657692020-10-26 17:40:22 -06009697. SetCalculatedProperties() - update any calculated properties in the device
Simon Glass3ab95982018-08-01 15:22:37 -0600970tree. This sets the correct 'offset' and 'size' vaues, for example.
Simon Glass078ab1a2018-07-06 10:27:41 -0600971
Simon Glass0b657692020-10-26 17:40:22 -06009728. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry.
Simon Glassbf7fd502016-11-25 20:15:51 -0700973The default implementatoin does nothing. This can be overriden to adjust the
974contents of an entry in some way. For example, it would be possible to create
975an entry containing a hash of the contents of some other entries. At this
Simon Glassc52c9e72019-07-08 14:25:37 -0600976stage the offset and size of entries should not be adjusted unless absolutely
977necessary, since it requires a repack (going back to PackEntries()).
Simon Glassbf7fd502016-11-25 20:15:51 -0700978
Simon Glass0b657692020-10-26 17:40:22 -06009799. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry
Simon Glass4ab88b62019-07-20 12:23:52 -0600980has changed its size, then there is no alternative but to go back to step 5 and
981try again, repacking the entries with the updated size. ResetForPack() removes
982the fixed offset/size values added by binman, so that the packing can start from
983scratch.
984
Simon Glass0b657692020-10-26 17:40:22 -060098510. WriteSymbols() - write the value of symbols into the U-Boot SPL binary.
Simon Glass3ab95982018-08-01 15:22:37 -0600986See 'Access to binman entry offsets at run time' below for a description of
Simon Glass0a4357c2018-07-06 10:27:39 -0600987what happens in this stage.
Simon Glass39c15022017-11-13 18:55:05 -0700988
Simon Glass0b657692020-10-26 17:40:22 -060098911. BuildImage() - builds the image and writes it to a file
Simon Glass4ab88b62019-07-20 12:23:52 -0600990
Simon Glass0b657692020-10-26 17:40:22 -060099112. WriteMap() - writes a text file containing a map of the image. This is the
Simon Glass4ab88b62019-07-20 12:23:52 -0600992final step.
Simon Glassbf7fd502016-11-25 20:15:51 -0700993
994
Simon Glassc7d80352019-07-08 13:18:28 -0600995External tools
996--------------
997
998Binman can make use of external command-line tools to handle processing of
999entry contents or to generate entry contents. These tools are executed using
1000the 'tools' module's Run() method. The tools generally must exist on the PATH,
1001but the --toolpath option can be used to specify additional search paths to
1002use. This option can be specified multiple times to add more than one path.
1003
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03001004For some compile tools binman will use the versions specified by commonly-used
1005environment variables like CC and HOSTCC for the C compiler, based on whether
1006the tool's output will be used for the target or for the host machine. If those
1007aren't given, it will also try to derive target-specific versions from the
1008CROSS_COMPILE environment variable during a cross-compilation.
1009
Simon Glassc7d80352019-07-08 13:18:28 -06001010
Simon Glass6d427c62016-11-25 20:15:59 -07001011Code coverage
1012-------------
1013
1014Binman is a critical tool and is designed to be very testable. Entry
Simon Glass53cd5d92019-07-08 14:25:29 -06001015implementations target 100% test coverage. Run 'binman test -T' to check this.
Simon Glass6d427c62016-11-25 20:15:59 -07001016
Simon Glass61adb2d2021-03-18 20:25:13 +13001017To enable Python test coverage on Debian-type distributions (e.g. Ubuntu)::
Simon Glass6d427c62016-11-25 20:15:59 -07001018
Simon Glass45f449b2019-07-08 13:18:26 -06001019 $ sudo apt-get install python-coverage python3-coverage python-pytest
Simon Glass6d427c62016-11-25 20:15:59 -07001020
1021
Simon Glass55660d02019-05-17 22:00:52 -06001022Concurrent tests
1023----------------
1024
1025Binman tries to run tests concurrently. This means that the tests make use of
1026all available CPUs to run.
1027
Simon Glass61adb2d2021-03-18 20:25:13 +13001028 To enable this::
Simon Glass55660d02019-05-17 22:00:52 -06001029
1030 $ sudo apt-get install python-subunit python3-subunit
1031
1032Use '-P 1' to disable this. It is automatically disabled when code coverage is
1033being used (-T) since they are incompatible.
1034
1035
Simon Glassd5164a72019-07-08 13:18:49 -06001036Debugging tests
1037---------------
1038
1039Sometimes when debugging tests it is useful to keep the input and output
1040directories so they can be examined later. Use -X or --test-preserve-dirs for
1041this.
1042
1043
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03001044Running tests on non-x86 architectures
1045--------------------------------------
1046
1047Binman's tests have been written under the assumption that they'll be run on a
1048x86-like host and there hasn't been an attempt to make them portable yet.
1049However, it's possible to run the tests by cross-compiling to x86.
1050
Simon Glass61adb2d2021-03-18 20:25:13 +13001051To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu)::
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03001052
1053 $ sudo apt-get install gcc-x86-64-linux-gnu
1054
Simon Glass61adb2d2021-03-18 20:25:13 +13001055Then, you can run the tests under cross-compilation::
Alper Nebi Yasak4ec40a72020-09-06 14:46:07 +03001056
1057 $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T
1058
1059You can also use gcc-i686-linux-gnu similar to the above.
1060
1061
Simon Glass072026e2021-03-18 20:25:14 +13001062Writing new entries and debugging
1063---------------------------------
Simon Glassbf7fd502016-11-25 20:15:51 -07001064
1065The behaviour of entries is defined by the Entry class. All other entries are
1066a subclass of this. An important subclass is Entry_blob which takes binary
1067data from a file and places it in the entry. In fact most entry types are
1068subclasses of Entry_blob.
1069
1070Each entry type is a separate file in the tools/binman/etype directory. Each
1071file contains a class called Entry_<type> where <type> is the entry type.
1072New entry types can be supported by adding new files in that directory.
1073These will automatically be detected by binman when needed.
1074
1075Entry properties are documented in entry.py. The entry subclasses are free
1076to change the values of properties to support special behaviour. For example,
1077when Entry_blob loads a file, it sets content_size to the size of the file.
1078Entry classes can adjust other entries. For example, an entry that knows
Simon Glass3ab95982018-08-01 15:22:37 -06001079where other entries should be positioned can set up those entries' offsets
Simon Glassbf7fd502016-11-25 20:15:51 -07001080so they don't need to be set in the binman decription. It can also adjust
1081entry contents.
1082
1083Most of the time such essoteric behaviour is not needed, but it can be
1084essential for complex images.
1085
Simon Glass3ed0de32017-12-24 12:12:07 -07001086If you need to specify a particular device-tree compiler to use, you can define
1087the DTC environment variable. This can be useful when the system dtc is too
1088old.
1089
Simon Glassa3c00552018-11-06 15:21:31 -07001090To enable a full backtrace and other debugging features in binman, pass
Simon Glass61adb2d2021-03-18 20:25:13 +13001091BINMAN_DEBUG=1 to your build::
Simon Glassa3c00552018-11-06 15:21:31 -07001092
Bin Mengc443f562019-10-02 19:07:29 -07001093 make qemu-x86_defconfig
Simon Glassa3c00552018-11-06 15:21:31 -07001094 make BINMAN_DEBUG=1
1095
Simon Glass1f338e02019-09-25 08:11:11 -06001096To enable verbose logging from binman, base BINMAN_VERBOSE to your build, which
Simon Glass61adb2d2021-03-18 20:25:13 +13001097adds a -v<level> option to the call to binman::
Simon Glass1f338e02019-09-25 08:11:11 -06001098
Bin Mengc443f562019-10-02 19:07:29 -07001099 make qemu-x86_defconfig
Simon Glass1f338e02019-09-25 08:11:11 -06001100 make BINMAN_VERBOSE=5
1101
Simon Glassbf7fd502016-11-25 20:15:51 -07001102
1103History / Credits
1104-----------------
1105
1106Binman takes a lot of inspiration from a Chrome OS tool called
1107'cros_bundle_firmware', which I wrote some years ago. That tool was based on
1108a reasonably simple and sound design but has expanded greatly over the
1109years. In particular its handling of x86 images is convoluted.
1110
Simon Glass7ae5f312018-06-01 09:38:19 -06001111Quite a few lessons have been learned which are hopefully applied here.
Simon Glassbf7fd502016-11-25 20:15:51 -07001112
1113
1114Design notes
1115------------
1116
1117On the face of it, a tool to create firmware images should be fairly simple:
1118just find all the input binaries and place them at the right place in the
1119image. The difficulty comes from the wide variety of input types (simple
1120flat binaries containing code, packaged data with various headers), packing
1121requirments (alignment, spacing, device boundaries) and other required
1122features such as hierarchical images.
1123
1124The design challenge is to make it easy to create simple images, while
1125allowing the more complex cases to be supported. For example, for most
1126images we don't much care exactly where each binary ends up, so we should
1127not have to specify that unnecessarily.
1128
1129New entry types should aim to provide simple usage where possible. If new
1130core features are needed, they can be added in the Entry base class.
1131
1132
1133To do
1134-----
1135
1136Some ideas:
Simon Glass61adb2d2021-03-18 20:25:13 +13001137
Simon Glassbf7fd502016-11-25 20:15:51 -07001138- Use of-platdata to make the information available to code that is unable
1139 to use device tree (such as a very small SPL image)
Simon Glassbf7fd502016-11-25 20:15:51 -07001140- Allow easy building of images by specifying just the board name
Simon Glassbf7fd502016-11-25 20:15:51 -07001141- Support building an image for a board (-b) more completely, with a
1142 configurable build directory
Simon Glass513c53e2019-07-20 12:24:02 -06001143- Detect invalid properties in nodes
1144- Sort the fdtmap by offset
Simon Glass397a7702021-01-06 21:35:12 -07001145- Output temporary files to a different directory
Simon Glassbf7fd502016-11-25 20:15:51 -07001146
1147--
1148Simon Glass <sjg@chromium.org>
11497/7/2016