blob: fd6308b6e42df1c8855148df119fd671a95c7045 [file] [log] [blame]
Simon Glass75ead662021-03-18 20:25:13 +13001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (c) 2016 Google, Inc
Simon Glass2574ef62016-11-25 20:15:51 -07003
4Introduction
5------------
6
7Firmware often consists of several components which must be packaged together.
8For example, we may have SPL, U-Boot, a device tree and an environment area
9grouped together and placed in MMC flash. When the system starts, it must be
10able to find these pieces.
11
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 Glass43062bc2019-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 Glass2574ef62016-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 Glass2574ef62016-11-25 20:15:51 -070070
Simon Glass75ead662021-03-18 20:25:13 +130071 - 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
83
Simon Glass2574ef62016-11-25 20:15:51 -070084
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 Heimpold55c822d2018-08-22 22:01:24 +0200133this purpose. It would be possible in some situations to create a new entry
Simon Glass2574ef62016-11-25 20:15:51 -0700134type for the images in mkimage, but this would not add functionality. It
Michael Heimpold55c822d2018-08-22 22:01:24 +0200135seems better to use the mkimage tool to generate binaries and avoid blurring
Simon Glass2574ef62016-11-25 20:15:51 -0700136the boundaries between building input files (mkimage) and packaging then
137into a final image (binman).
138
139
140Example use of binman in U-Boot
141-------------------------------
142
143Binman aims to replace some of the ad-hoc image creation in the U-Boot
144build system.
145
146Consider sunxi. It has the following steps:
147
Simon Glass75ead662021-03-18 20:25:13 +1300148 #. It uses a custom mksunxiboot tool to build an SPL image called
149 sunxi-spl.bin. This should probably move into mkimage.
Simon Glass2574ef62016-11-25 20:15:51 -0700150
Simon Glass75ead662021-03-18 20:25:13 +1300151 #. It uses mkimage to package U-Boot into a legacy image file (so that it can
152 hold the load and execution address) called u-boot.img.
Simon Glass2574ef62016-11-25 20:15:51 -0700153
Simon Glass75ead662021-03-18 20:25:13 +1300154 #. It builds a final output image called u-boot-sunxi-with-spl.bin which
155 consists of sunxi-spl.bin, some padding and u-boot.img.
Simon Glass2574ef62016-11-25 20:15:51 -0700156
157Binman is intended to replace the last step. The U-Boot build system builds
158u-boot.bin and sunxi-spl.bin. Binman can then take over creation of
159sunxi-spl.bin (by calling mksunxiboot, or hopefully one day mkimage). In any
160case, it would then create the image from the component parts.
161
162This simplifies the U-Boot Makefile somewhat, since various pieces of logic
163can be replaced by a call to binman.
164
165
166Example use of binman for x86
167-----------------------------
168
169In most cases x86 images have a lot of binary blobs, 'black-box' code
170provided by Intel which must be run for the platform to work. Typically
171these blobs are not relocatable and must be placed at fixed areas in the
Michael Heimpold55c822d2018-08-22 22:01:24 +0200172firmware image.
Simon Glass2574ef62016-11-25 20:15:51 -0700173
174Currently this is handled by ifdtool, which places microcode, FSP, MRC, VGA
175BIOS, reference code and Intel ME binaries into a u-boot.rom file.
176
177Binman is intended to replace all of this, with ifdtool left to handle only
178the configuration of the Intel-format descriptor.
179
180
181Running binman
182--------------
183
Simon Glass75ead662021-03-18 20:25:13 +1300184First install prerequisites, e.g::
Simon Glass567b6822019-07-08 13:18:35 -0600185
Simon Glass75ead662021-03-18 20:25:13 +1300186 sudo apt-get install python-pyelftools python3-pyelftools lzma-alone \
187 liblz4-tool
Simon Glass567b6822019-07-08 13:18:35 -0600188
Simon Glass75ead662021-03-18 20:25:13 +1300189Type::
Simon Glass2574ef62016-11-25 20:15:51 -0700190
Simon Glass75ead662021-03-18 20:25:13 +1300191 binman build -b <board_name>
Simon Glass2574ef62016-11-25 20:15:51 -0700192
193to build an image for a board. The board name is the same name used when
194configuring U-Boot (e.g. for sandbox_defconfig the board name is 'sandbox').
195Binman assumes that the input files for the build are in ../b/<board_name>.
196
Simon Glass75ead662021-03-18 20:25:13 +1300197Or you can specify this explicitly::
Simon Glass2574ef62016-11-25 20:15:51 -0700198
Simon Glass75ead662021-03-18 20:25:13 +1300199 binman build -I <build_path>
Simon Glass2574ef62016-11-25 20:15:51 -0700200
201where <build_path> is the build directory containing the output of the U-Boot
202build.
203
204(Future work will make this more configurable)
205
206In either case, binman picks up the device tree file (u-boot.dtb) and looks
207for its instructions in the 'binman' node.
208
209Binman has a few other options which you can see by running 'binman -h'.
210
211
Simon Glass4b94ac92017-11-12 21:52:06 -0700212Enabling binman for a board
213---------------------------
214
215At present binman is invoked from a rule in the main Makefile. Typically you
Simon Glass75ead662021-03-18 20:25:13 +1300216will have a rule like::
Simon Glass4b94ac92017-11-12 21:52:06 -0700217
Simon Glass75ead662021-03-18 20:25:13 +1300218 ifneq ($(CONFIG_ARCH_<something>),)
219 u-boot-<your_suffix>.bin: <input_file_1> <input_file_2> checkbinman FORCE
220 $(call if_changed,binman)
221 endif
Simon Glass4b94ac92017-11-12 21:52:06 -0700222
223This assumes that u-boot-<your_suffix>.bin is a target, and is the final file
Simon Glassc46090d2020-07-19 13:56:01 -0600224that you need to produce. You can make it a target by adding it to INPUTS-y
Simon Glass4b94ac92017-11-12 21:52:06 -0700225either in the main Makefile or in a config.mk file in your arch subdirectory.
226
227Once binman is executed it will pick up its instructions from a device-tree
228file, typically <soc>-u-boot.dtsi, where <soc> is your CONFIG_SYS_SOC value.
229You can use other, more specific CONFIG options - see 'Automatic .dtsi
230inclusion' below.
231
232
Simon Glass2574ef62016-11-25 20:15:51 -0700233Image description format
234------------------------
235
236The binman node is called 'binman'. An example image description is shown
Simon Glass75ead662021-03-18 20:25:13 +1300237below::
Simon Glass2574ef62016-11-25 20:15:51 -0700238
Simon Glass75ead662021-03-18 20:25:13 +1300239 binman {
240 filename = "u-boot-sunxi-with-spl.bin";
241 pad-byte = <0xff>;
242 blob {
243 filename = "spl/sunxi-spl.bin";
244 };
245 u-boot {
246 offset = <CONFIG_SPL_PAD_TO>;
247 };
248 };
Simon Glass2574ef62016-11-25 20:15:51 -0700249
250
251This requests binman to create an image file called u-boot-sunxi-with-spl.bin
252consisting of a specially formatted SPL (spl/sunxi-spl.bin, built by the
253normal U-Boot Makefile), some 0xff padding, and a U-Boot legacy image. The
254padding comes from the fact that the second binary is placed at
255CONFIG_SPL_PAD_TO. If that line were omitted then the U-Boot binary would
256immediately follow the SPL binary.
257
258The binman node describes an image. The sub-nodes describe entries in the
259image. Each entry represents a region within the overall image. The name of
260the entry (blob, u-boot) tells binman what to put there. For 'blob' we must
261provide a filename. For 'u-boot', binman knows that this means 'u-boot.bin'.
262
263Entries are normally placed into the image sequentially, one after the other.
264The image size is the total size of all entries. As you can see, you can
Simon Glasse8561af2018-08-01 15:22:37 -0600265specify the start offset of an entry using the 'offset' property.
Simon Glass2574ef62016-11-25 20:15:51 -0700266
267Note that due to a device tree requirement, all entries must have a unique
268name. If you want to put the same binary in the image multiple times, you can
269use any unique name, with the 'type' property providing the type.
270
271The attributes supported for entries are described below.
272
Simon Glasse8561af2018-08-01 15:22:37 -0600273offset:
Simon Glass75ead662021-03-18 20:25:13 +1300274 This sets the offset of an entry within the image or section containing
275 it. The first byte of the image is normally at offset 0. If 'offset' is
276 not provided, binman sets it to the end of the previous region, or the
277 start of the image's entry area (normally 0) if there is no previous
278 region.
Simon Glass2574ef62016-11-25 20:15:51 -0700279
280align:
Simon Glass75ead662021-03-18 20:25:13 +1300281 This sets the alignment of the entry. The entry offset is adjusted
282 so that the entry starts on an aligned boundary within the containing
283 section or image. For example 'align = <16>' means that the entry will
284 start on a 16-byte boundary. This may mean that padding is added before
285 the entry. The padding is part of the containing section but is not
286 included in the entry, meaning that an empty space may be created before
287 the entry starts. Alignment should be a power of 2. If 'align' is not
288 provided, no alignment is performed.
Simon Glass2574ef62016-11-25 20:15:51 -0700289
290size:
Simon Glass75ead662021-03-18 20:25:13 +1300291 This sets the size of the entry. The contents will be padded out to
292 this size. If this is not provided, it will be set to the size of the
293 contents.
Simon Glass2574ef62016-11-25 20:15:51 -0700294
295pad-before:
Simon Glass75ead662021-03-18 20:25:13 +1300296 Padding before the contents of the entry. Normally this is 0, meaning
297 that the contents start at the beginning of the entry. This can be used
298 to offset the entry contents a little. While this does not affect the
299 contents of the entry within binman itself (the padding is performed
300 only when its parent section is assembled), the end result will be that
301 the entry starts with the padding bytes, so may grow. Defaults to 0.
Simon Glass2574ef62016-11-25 20:15:51 -0700302
303pad-after:
Simon Glass75ead662021-03-18 20:25:13 +1300304 Padding after the contents of the entry. Normally this is 0, meaning
305 that the entry ends at the last byte of content (unless adjusted by
306 other properties). This allows room to be created in the image for
307 this entry to expand later. While this does not affect the contents of
308 the entry within binman itself (the padding is performed only when its
309 parent section is assembled), the end result will be that the entry ends
310 with the padding bytes, so may grow. Defaults to 0.
Simon Glass2574ef62016-11-25 20:15:51 -0700311
312align-size:
Simon Glass75ead662021-03-18 20:25:13 +1300313 This sets the alignment of the entry size. For example, to ensure
314 that the size of an entry is a multiple of 64 bytes, set this to 64.
315 While this does not affect the contents of the entry within binman
316 itself (the padding is performed only when its parent section is
317 assembled), the end result is that the entry ends with the padding
318 bytes, so may grow. If 'align-size' is not provided, no alignment is
319 performed.
Simon Glass2574ef62016-11-25 20:15:51 -0700320
321align-end:
Simon Glass75ead662021-03-18 20:25:13 +1300322 This sets the alignment of the end of an entry with respect to the
323 containing section. Some entries require that they end on an alignment
324 boundary, regardless of where they start. This does not move the start
325 of the entry, so the contents of the entry will still start at the
326 beginning. But there may be padding at the end. While this does not
327 affect the contents of the entry within binman itself (the padding is
328 performed only when its parent section is assembled), the end result
329 is that the entry ends with the padding bytes, so may grow.
330 If 'align-end' is not provided, no alignment is performed.
Simon Glass2574ef62016-11-25 20:15:51 -0700331
332filename:
Simon Glass75ead662021-03-18 20:25:13 +1300333 For 'blob' types this provides the filename containing the binary to
334 put into the entry. If binman knows about the entry type (like
335 u-boot-bin), then there is no need to specify this.
Simon Glass2574ef62016-11-25 20:15:51 -0700336
337type:
Simon Glass75ead662021-03-18 20:25:13 +1300338 Sets the type of an entry. This defaults to the entry name, but it is
339 possible to use any name, and then add (for example) 'type = "u-boot"'
340 to specify the type.
Simon Glass2574ef62016-11-25 20:15:51 -0700341
Simon Glasse8561af2018-08-01 15:22:37 -0600342offset-unset:
Simon Glass75ead662021-03-18 20:25:13 +1300343 Indicates that the offset of this entry should not be set by placing
344 it immediately after the entry before. Instead, is set by another
345 entry which knows where this entry should go. When this boolean
346 property is present, binman will give an error if another entry does
347 not set the offset (with the GetOffsets() method).
Simon Glass4ba8d502018-06-01 09:38:17 -0600348
Simon Glass9dcc8612018-08-01 15:22:42 -0600349image-pos:
Simon Glass75ead662021-03-18 20:25:13 +1300350 This cannot be set on entry (or at least it is ignored if it is), but
351 with the -u option, binman will set it to the absolute image position
352 for each entry. This makes it easy to find out exactly where the entry
353 ended up in the image, regardless of parent sections, etc.
Simon Glass9dcc8612018-08-01 15:22:42 -0600354
Simon Glassfa79a812018-09-14 04:57:29 -0600355expand-size:
Simon Glass75ead662021-03-18 20:25:13 +1300356 Expand the size of this entry to fit available space. This space is only
357 limited by the size of the image/section and the position of the next
358 entry.
Simon Glass2574ef62016-11-25 20:15:51 -0700359
Simon Glassaa2fcf92019-07-08 14:25:30 -0600360compress:
Simon Glass75ead662021-03-18 20:25:13 +1300361 Sets the compression algortihm to use (for blobs only). See the entry
362 documentation for details.
Simon Glassaa2fcf92019-07-08 14:25:30 -0600363
Simon Glassa820af72020-09-06 10:39:09 -0600364missing-msg:
Simon Glass75ead662021-03-18 20:25:13 +1300365 Sets the tag of the message to show if this entry is missing. This is
366 used for external blobs. When they are missing it is helpful to show
367 information about what needs to be fixed. See missing-blob-help for the
368 message for each tag.
Simon Glassa820af72020-09-06 10:39:09 -0600369
Simon Glass80045812018-09-14 04:57:30 -0600370The attributes supported for images and sections are described below. Several
371are similar to those for entries.
Simon Glass2574ef62016-11-25 20:15:51 -0700372
373size:
Simon Glass75ead662021-03-18 20:25:13 +1300374 Sets the image size in bytes, for example 'size = <0x100000>' for a
375 1MB image.
Simon Glass2574ef62016-11-25 20:15:51 -0700376
Simon Glasseb023b32019-04-25 21:58:39 -0600377offset:
Simon Glass75ead662021-03-18 20:25:13 +1300378 This is similar to 'offset' in entries, setting the offset of a section
379 within the image or section containing it. The first byte of the section
380 is normally at offset 0. If 'offset' is not provided, binman sets it to
381 the end of the previous region, or the start of the image's entry area
382 (normally 0) if there is no previous region.
Simon Glasseb023b32019-04-25 21:58:39 -0600383
Simon Glass2574ef62016-11-25 20:15:51 -0700384align-size:
Simon Glass75ead662021-03-18 20:25:13 +1300385 This sets the alignment of the image size. For example, to ensure
386 that the image ends on a 512-byte boundary, use 'align-size = <512>'.
387 If 'align-size' is not provided, no alignment is performed.
Simon Glass2574ef62016-11-25 20:15:51 -0700388
389pad-before:
Simon Glass75ead662021-03-18 20:25:13 +1300390 This sets the padding before the image entries. The first entry will
391 be positioned after the padding. This defaults to 0.
Simon Glass2574ef62016-11-25 20:15:51 -0700392
393pad-after:
Simon Glass75ead662021-03-18 20:25:13 +1300394 This sets the padding after the image entries. The padding will be
395 placed after the last entry. This defaults to 0.
Simon Glass2574ef62016-11-25 20:15:51 -0700396
397pad-byte:
Simon Glass75ead662021-03-18 20:25:13 +1300398 This specifies the pad byte to use when padding in the image. It
399 defaults to 0. To use 0xff, you would add 'pad-byte = <0xff>'.
Simon Glass2574ef62016-11-25 20:15:51 -0700400
401filename:
Simon Glass75ead662021-03-18 20:25:13 +1300402 This specifies the image filename. It defaults to 'image.bin'.
Simon Glass2574ef62016-11-25 20:15:51 -0700403
Simon Glasse8561af2018-08-01 15:22:37 -0600404sort-by-offset:
Simon Glass75ead662021-03-18 20:25:13 +1300405 This causes binman to reorder the entries as needed to make sure they
406 are in increasing positional order. This can be used when your entry
407 order may not match the positional order. A common situation is where
408 the 'offset' properties are set by CONFIG options, so their ordering is
409 not known a priori.
Simon Glass2574ef62016-11-25 20:15:51 -0700410
Simon Glass75ead662021-03-18 20:25:13 +1300411 This is a boolean property so needs no value. To enable it, add a
412 line 'sort-by-offset;' to your description.
Simon Glass2574ef62016-11-25 20:15:51 -0700413
414multiple-images:
Simon Glass75ead662021-03-18 20:25:13 +1300415 Normally only a single image is generated. To create more than one
416 image, put this property in the binman node. For example, this will
417 create image1.bin containing u-boot.bin, and image2.bin containing
418 both spl/u-boot-spl.bin and u-boot.bin::
Simon Glass2574ef62016-11-25 20:15:51 -0700419
Simon Glass75ead662021-03-18 20:25:13 +1300420 binman {
421 multiple-images;
422 image1 {
423 u-boot {
424 };
425 };
Simon Glass2574ef62016-11-25 20:15:51 -0700426
Simon Glass75ead662021-03-18 20:25:13 +1300427 image2 {
428 spl {
429 };
430 u-boot {
431 };
432 };
433 };
Simon Glass2574ef62016-11-25 20:15:51 -0700434
435end-at-4gb:
Simon Glass75ead662021-03-18 20:25:13 +1300436 For x86 machines the ROM offsets start just before 4GB and extend
437 up so that the image finished at the 4GB boundary. This boolean
438 option can be enabled to support this. The image size must be
439 provided so that binman knows when the image should start. For an
440 8MB ROM, the offset of the first entry would be 0xfff80000 with
441 this option, instead of 0 without this option.
Simon Glass2574ef62016-11-25 20:15:51 -0700442
Jagdish Gediya0fb978c2018-09-03 21:35:07 +0530443skip-at-start:
Simon Glass75ead662021-03-18 20:25:13 +1300444 This property specifies the entry offset of the first entry.
Jagdish Gediya0fb978c2018-09-03 21:35:07 +0530445
Simon Glass75ead662021-03-18 20:25:13 +1300446 For PowerPC mpc85xx based CPU, CONFIG_SYS_TEXT_BASE is the entry
447 offset of the first entry. It can be 0xeff40000 or 0xfff40000 for
448 nor flash boot, 0x201000 for sd boot etc.
Jagdish Gediya0fb978c2018-09-03 21:35:07 +0530449
Simon Glass75ead662021-03-18 20:25:13 +1300450 'end-at-4gb' property is not applicable where CONFIG_SYS_TEXT_BASE +
451 Image size != 4gb.
Simon Glass2574ef62016-11-25 20:15:51 -0700452
453Examples of the above options can be found in the tests. See the
454tools/binman/test directory.
455
Simon Glasse76a3e62018-06-01 09:38:11 -0600456It is possible to have the same binary appear multiple times in the image,
457either by using a unit number suffix (u-boot@0, u-boot@1) or by using a
458different name for each and specifying the type with the 'type' attribute.
459
Simon Glass2574ef62016-11-25 20:15:51 -0700460
Michael Heimpold55c822d2018-08-22 22:01:24 +0200461Sections and hierachical images
Simon Glassa91e1152018-06-01 09:38:16 -0600462-------------------------------
463
464Sometimes it is convenient to split an image into several pieces, each of which
465contains its own set of binaries. An example is a flash device where part of
466the image is read-only and part is read-write. We can set up sections for each
467of these, and place binaries in them independently. The image is still produced
468as a single output file.
469
470This feature provides a way of creating hierarchical images. For example here
Simon Glass1e324002018-06-01 09:38:19 -0600471is an example image with two copies of U-Boot. One is read-only (ro), intended
472to be written only in the factory. Another is read-write (rw), so that it can be
Simon Glassa91e1152018-06-01 09:38:16 -0600473upgraded in the field. The sizes are fixed so that the ro/rw boundary is known
Simon Glass75ead662021-03-18 20:25:13 +1300474and can be programmed::
Simon Glassa91e1152018-06-01 09:38:16 -0600475
Simon Glass75ead662021-03-18 20:25:13 +1300476 binman {
477 section@0 {
478 read-only;
479 name-prefix = "ro-";
480 size = <0x100000>;
481 u-boot {
482 };
483 };
484 section@1 {
485 name-prefix = "rw-";
486 size = <0x100000>;
487 u-boot {
488 };
489 };
490 };
Simon Glassa91e1152018-06-01 09:38:16 -0600491
492This image could be placed into a SPI flash chip, with the protection boundary
493set at 1MB.
494
495A few special properties are provided for sections:
496
497read-only:
Simon Glass75ead662021-03-18 20:25:13 +1300498 Indicates that this section is read-only. This has no impact on binman's
499 operation, but his property can be read at run time.
Simon Glassa91e1152018-06-01 09:38:16 -0600500
Simon Glass3b78d532018-06-01 09:38:21 -0600501name-prefix:
Simon Glass75ead662021-03-18 20:25:13 +1300502 This string is prepended to all the names of the binaries in the
503 section. In the example above, the 'u-boot' binaries which actually be
504 renamed to 'ro-u-boot' and 'rw-u-boot'. This can be useful to
505 distinguish binaries with otherwise identical names.
Simon Glass3b78d532018-06-01 09:38:21 -0600506
Simon Glassa91e1152018-06-01 09:38:16 -0600507
Simon Glassfb30e292019-07-20 12:23:51 -0600508Image Properties
509----------------
510
511Image nodes act like sections but also have a few extra properties:
512
513filename:
Simon Glass75ead662021-03-18 20:25:13 +1300514 Output filename for the image. This defaults to image.bin (or in the
515 case of multiple images <nodename>.bin where <nodename> is the name of
516 the image node.
Simon Glassfb30e292019-07-20 12:23:51 -0600517
518allow-repack:
Simon Glass75ead662021-03-18 20:25:13 +1300519 Create an image that can be repacked. With this option it is possible
520 to change anything in the image after it is created, including updating
521 the position and size of image components. By default this is not
522 permitted since it is not possibly to know whether this might violate a
523 constraint in the image description. For example, if a section has to
524 increase in size to hold a larger binary, that might cause the section
525 to fall out of its allow region (e.g. read-only portion of flash).
Simon Glassfb30e292019-07-20 12:23:51 -0600526
Simon Glass75ead662021-03-18 20:25:13 +1300527 Adding this property causes the original offset and size values in the
528 image description to be stored in the FDT and fdtmap.
Simon Glassfb30e292019-07-20 12:23:51 -0600529
530
Simon Glass7a61c6b2018-07-17 13:25:37 -0600531Entry Documentation
532-------------------
533
534For details on the various entry types supported by binman and how to use them,
535see README.entries. This is generated from the source code using:
536
Simon Glass75ead662021-03-18 20:25:13 +1300537 binman entry-docs >tools/binman/README.entries
Simon Glass7a61c6b2018-07-17 13:25:37 -0600538
539
Simon Glassb2fd11d2019-07-08 14:25:48 -0600540Listing images
541--------------
542
543It is possible to list the entries in an existing firmware image created by
Simon Glass75ead662021-03-18 20:25:13 +1300544binman, provided that there is an 'fdtmap' entry in the image. For example::
Simon Glassb2fd11d2019-07-08 14:25:48 -0600545
546 $ binman ls -i image.bin
547 Name Image-pos Size Entry-type Offset Uncomp-size
548 ----------------------------------------------------------------------
549 main-section c00 section 0
550 u-boot 0 4 u-boot 0
551 section 5fc section 4
552 cbfs 100 400 cbfs 0
553 u-boot 138 4 u-boot 38
554 u-boot-dtb 180 108 u-boot-dtb 80 3b5
555 u-boot-dtb 500 1ff u-boot-dtb 400 3b5
556 fdtmap 6fc 381 fdtmap 6fc
557 image-header bf8 8 image-header bf8
558
559This shows the hierarchy of the image, the position, size and type of each
560entry, the offset of each entry within its parent and the uncompressed size if
561the entry is compressed.
562
Simon Glass75ead662021-03-18 20:25:13 +1300563It is also possible to list just some files in an image, e.g.::
Simon Glassb2fd11d2019-07-08 14:25:48 -0600564
565 $ binman ls -i image.bin section/cbfs
566 Name Image-pos Size Entry-type Offset Uncomp-size
567 --------------------------------------------------------------------
568 cbfs 100 400 cbfs 0
569 u-boot 138 4 u-boot 38
570 u-boot-dtb 180 108 u-boot-dtb 80 3b5
571
Simon Glass75ead662021-03-18 20:25:13 +1300572or with wildcards::
Simon Glassb2fd11d2019-07-08 14:25:48 -0600573
574 $ binman ls -i image.bin "*cb*" "*head*"
575 Name Image-pos Size Entry-type Offset Uncomp-size
576 ----------------------------------------------------------------------
577 cbfs 100 400 cbfs 0
578 u-boot 138 4 u-boot 38
579 u-boot-dtb 180 108 u-boot-dtb 80 3b5
580 image-header bf8 8 image-header bf8
581
582
Simon Glass980a2842019-07-08 14:25:52 -0600583Extracting files from images
584----------------------------
585
586You can extract files from an existing firmware image created by binman,
Simon Glass75ead662021-03-18 20:25:13 +1300587provided that there is an 'fdtmap' entry in the image. For example::
Simon Glass980a2842019-07-08 14:25:52 -0600588
589 $ binman extract -i image.bin section/cbfs/u-boot
590
591which will write the uncompressed contents of that entry to the file 'u-boot' in
592the current directory. You can also extract to a particular file, in this case
Simon Glass75ead662021-03-18 20:25:13 +1300593u-boot.bin::
Simon Glass980a2842019-07-08 14:25:52 -0600594
595 $ binman extract -i image.bin section/cbfs/u-boot -f u-boot.bin
596
597It is possible to extract all files into a destination directory, which will
Simon Glass75ead662021-03-18 20:25:13 +1300598put files in subdirectories matching the entry hierarchy::
Simon Glass980a2842019-07-08 14:25:52 -0600599
600 $ binman extract -i image.bin -O outdir
601
Simon Glass75ead662021-03-18 20:25:13 +1300602or just a selection::
Simon Glass980a2842019-07-08 14:25:52 -0600603
604 $ binman extract -i image.bin "*u-boot*" -O outdir
605
606
Simon Glass072959a2019-07-20 12:23:50 -0600607Replacing files in an image
608---------------------------
609
610You can replace files in an existing firmware image created by binman, provided
611that there is an 'fdtmap' entry in the image. For example:
612
613 $ binman replace -i image.bin section/cbfs/u-boot
614
615which will write the contents of the file 'u-boot' from the current directory
Simon Glass30033c22019-07-20 12:24:15 -0600616to the that entry, compressing if necessary. If the entry size changes, you must
617add the 'allow-repack' property to the original image before generating it (see
618above), otherwise you will get an error.
Simon Glass072959a2019-07-20 12:23:50 -0600619
Simon Glass75ead662021-03-18 20:25:13 +1300620You can also use a particular file, in this case u-boot.bin::
Simon Glass30033c22019-07-20 12:24:15 -0600621
622 $ binman replace -i image.bin section/cbfs/u-boot -f u-boot.bin
623
624It is possible to replace all files from a source directory which uses the same
Simon Glass75ead662021-03-18 20:25:13 +1300625hierarchy as the entries::
Simon Glass30033c22019-07-20 12:24:15 -0600626
627 $ binman replace -i image.bin -I indir
628
629Files that are missing will generate a warning.
630
Simon Glass75ead662021-03-18 20:25:13 +1300631You can also replace just a selection of entries::
Simon Glass30033c22019-07-20 12:24:15 -0600632
633 $ binman replace -i image.bin "*u-boot*" -I indir
634
Simon Glass072959a2019-07-20 12:23:50 -0600635
Simon Glass233a26a92019-07-08 14:25:49 -0600636Logging
637-------
638
639Binman normally operates silently unless there is an error, in which case it
640just displays the error. The -D/--debug option can be used to create a full
Simon Glasscaa5f182021-02-06 09:57:28 -0700641backtrace when errors occur. You can use BINMAN_DEBUG=1 when building to select
642this.
Simon Glass233a26a92019-07-08 14:25:49 -0600643
644Internally binman logs some output while it is running. This can be displayed
645by increasing the -v/--verbosity from the default of 1:
646
647 0: silent
648 1: warnings only
649 2: notices (important messages)
650 3: info about major operations
651 4: detailed information about each operation
652 5: debug (all output)
653
Simon Glasscaa5f182021-02-06 09:57:28 -0700654You can use BINMAN_VERBOSE=5 (for example) when building to select this.
Simon Glass233a26a92019-07-08 14:25:49 -0600655
Simon Glassae7cf032018-09-14 04:57:31 -0600656Hashing Entries
657---------------
Simon Glass72232452016-11-25 20:15:53 -0700658
Simon Glassae7cf032018-09-14 04:57:31 -0600659It is possible to ask binman to hash the contents of an entry and write that
Simon Glass75ead662021-03-18 20:25:13 +1300660value back to the device-tree node. For example::
Simon Glass72232452016-11-25 20:15:53 -0700661
Simon Glass75ead662021-03-18 20:25:13 +1300662 binman {
663 u-boot {
664 hash {
665 algo = "sha256";
666 };
667 };
668 };
Simon Glassae7cf032018-09-14 04:57:31 -0600669
670Here, a new 'value' property will be written to the 'hash' node containing
671the hash of the 'u-boot' entry. Only SHA256 is supported at present. Whole
672sections can be hased if desired, by adding the 'hash' node to the section.
673
674The has value can be chcked at runtime by hashing the data actually read and
675comparing this has to the value in the device tree.
Simon Glass72232452016-11-25 20:15:53 -0700676
677
Simon Glass2574ef62016-11-25 20:15:51 -0700678Order of image creation
679-----------------------
680
681Image creation proceeds in the following order, for each entry in the image.
682
Simon Glasse22f8fa2018-07-06 10:27:41 -06006831. AddMissingProperties() - binman can add calculated values to the device
Simon Glasse8561af2018-08-01 15:22:37 -0600684tree as part of its processing, for example the offset and size of each
Simon Glasse22f8fa2018-07-06 10:27:41 -0600685entry. This method adds any properties associated with this, expanding the
686device tree as needed. These properties can have placeholder values which are
687set later by SetCalculatedProperties(). By that stage the size of sections
688cannot be changed (since it would cause the images to need to be repacked),
689but the correct values can be inserted.
690
6912. ProcessFdt() - process the device tree information as required by the
Simon Glass92307732018-07-06 10:27:40 -0600692particular entry. This may involve adding or deleting properties. If the
693processing is complete, this method should return True. If the processing
694cannot complete because it needs the ProcessFdt() method of another entry to
695run first, this method should return False, in which case it will be called
696again later.
697
Simon Glasse22f8fa2018-07-06 10:27:41 -06006983. GetEntryContents() - the contents of each entry are obtained, normally by
Simon Glass2574ef62016-11-25 20:15:51 -0700699reading from a file. This calls the Entry.ObtainContents() to read the
700contents. The default version of Entry.ObtainContents() calls
701Entry.GetDefaultFilename() and then reads that file. So a common mechanism
702to select a file to read is to override that function in the subclass. The
703functions must return True when they have read the contents. Binman will
704retry calling the functions a few times if False is returned, allowing
705dependencies between the contents of different entries.
706
Simon Glasse8561af2018-08-01 15:22:37 -06007074. GetEntryOffsets() - calls Entry.GetOffsets() for each entry. This can
Simon Glass2574ef62016-11-25 20:15:51 -0700708return a dict containing entries that need updating. The key should be the
Simon Glasse8561af2018-08-01 15:22:37 -0600709entry name and the value is a tuple (offset, size). This allows an entry to
710provide the offset and size for other entries. The default implementation
711of GetEntryOffsets() returns {}.
Simon Glass2574ef62016-11-25 20:15:51 -0700712
Simon Glasse8561af2018-08-01 15:22:37 -06007135. PackEntries() - calls Entry.Pack() which figures out the offset and
714size of an entry. The 'current' image offset is passed in, and the function
715returns the offset immediately after the entry being packed. The default
Simon Glass2574ef62016-11-25 20:15:51 -0700716implementation of Pack() is usually sufficient.
717
Simon Glass2d9570d2020-10-26 17:40:22 -0600718Note: for sections, this also checks that the entries do not overlap, nor extend
719outside the section. If the section does not have a defined size, the size is
720set large enough to hold all the entries.
Simon Glass2574ef62016-11-25 20:15:51 -0700721
Simon Glass2d9570d2020-10-26 17:40:22 -06007226. SetImagePos() - sets the image position of every entry. This is the absolute
Simon Glass4b05b2d2019-07-20 12:23:52 -0600723position 'image-pos', as opposed to 'offset' which is relative to the containing
724section. This must be done after all offsets are known, which is why it is quite
725late in the ordering.
726
Simon Glass2d9570d2020-10-26 17:40:22 -06007277. SetCalculatedProperties() - update any calculated properties in the device
Simon Glasse8561af2018-08-01 15:22:37 -0600728tree. This sets the correct 'offset' and 'size' vaues, for example.
Simon Glasse22f8fa2018-07-06 10:27:41 -0600729
Simon Glass2d9570d2020-10-26 17:40:22 -06007308. ProcessEntryContents() - this calls Entry.ProcessContents() on each entry.
Simon Glass2574ef62016-11-25 20:15:51 -0700731The default implementatoin does nothing. This can be overriden to adjust the
732contents of an entry in some way. For example, it would be possible to create
733an entry containing a hash of the contents of some other entries. At this
Simon Glasse61b6f62019-07-08 14:25:37 -0600734stage the offset and size of entries should not be adjusted unless absolutely
735necessary, since it requires a repack (going back to PackEntries()).
Simon Glass2574ef62016-11-25 20:15:51 -0700736
Simon Glass2d9570d2020-10-26 17:40:22 -06007379. ResetForPack() - if the ProcessEntryContents() step failed, in that an entry
Simon Glass4b05b2d2019-07-20 12:23:52 -0600738has changed its size, then there is no alternative but to go back to step 5 and
739try again, repacking the entries with the updated size. ResetForPack() removes
740the fixed offset/size values added by binman, so that the packing can start from
741scratch.
742
Simon Glass2d9570d2020-10-26 17:40:22 -060074310. WriteSymbols() - write the value of symbols into the U-Boot SPL binary.
Simon Glasse8561af2018-08-01 15:22:37 -0600744See 'Access to binman entry offsets at run time' below for a description of
Simon Glass29dae672018-07-06 10:27:39 -0600745what happens in this stage.
Simon Glassbe83bc72017-11-13 18:55:05 -0700746
Simon Glass2d9570d2020-10-26 17:40:22 -060074711. BuildImage() - builds the image and writes it to a file
Simon Glass4b05b2d2019-07-20 12:23:52 -0600748
Simon Glass2d9570d2020-10-26 17:40:22 -060074912. WriteMap() - writes a text file containing a map of the image. This is the
Simon Glass4b05b2d2019-07-20 12:23:52 -0600750final step.
Simon Glass2574ef62016-11-25 20:15:51 -0700751
752
Simon Glass52debad2016-11-25 20:15:59 -0700753Automatic .dtsi inclusion
754-------------------------
755
756It is sometimes inconvenient to add a 'binman' node to the .dts file for each
757board. This can be done by using #include to bring in a common file. Another
758approach supported by the U-Boot build system is to automatically include
759a common header. You can then put the binman node (and anything else that is
760specific to U-Boot, such as u-boot,dm-pre-reloc properies) in that header
761file.
762
Simon Glass75ead662021-03-18 20:25:13 +1300763Binman will search for the following files in arch/<arch>/dts::
Simon Glass52debad2016-11-25 20:15:59 -0700764
765 <dts>-u-boot.dtsi where <dts> is the base name of the .dts file
766 <CONFIG_SYS_SOC>-u-boot.dtsi
767 <CONFIG_SYS_CPU>-u-boot.dtsi
768 <CONFIG_SYS_VENDOR>-u-boot.dtsi
769 u-boot.dtsi
770
771U-Boot will only use the first one that it finds. If you need to include a
772more general file you can do that from the more specific file using #include.
773If you are having trouble figuring out what is going on, you can uncomment
Simon Glass75ead662021-03-18 20:25:13 +1300774the 'warning' line in scripts/Makefile.lib to see what it has found::
Simon Glass52debad2016-11-25 20:15:59 -0700775
776 # Uncomment for debugging
Simon Glass2eee32b2017-11-12 21:52:05 -0700777 # This shows all the files that were considered and the one that we chose.
778 # u_boot_dtsi_options_debug = $(u_boot_dtsi_options_raw)
Simon Glass52debad2016-11-25 20:15:59 -0700779
Simon Glassbe83bc72017-11-13 18:55:05 -0700780
Simon Glass9dcc8612018-08-01 15:22:42 -0600781Access to binman entry offsets at run time (symbols)
782----------------------------------------------------
Simon Glassbe83bc72017-11-13 18:55:05 -0700783
784Binman assembles images and determines where each entry is placed in the image.
785This information may be useful to U-Boot at run time. For example, in SPL it
786is useful to be able to find the location of U-Boot so that it can be executed
787when SPL is finished.
788
789Binman allows you to declare symbols in the SPL image which are filled in
Simon Glass75ead662021-03-18 20:25:13 +1300790with their correct values during the build. For example::
Simon Glassbe83bc72017-11-13 18:55:05 -0700791
Simon Glass72555fa2019-11-06 17:22:44 -0700792 binman_sym_declare(ulong, u_boot_any, image_pos);
Simon Glassbe83bc72017-11-13 18:55:05 -0700793
Simon Glass72555fa2019-11-06 17:22:44 -0700794declares a ulong value which will be assigned to the image-pos of any U-Boot
Simon Glassbe83bc72017-11-13 18:55:05 -0700795image (u-boot.bin, u-boot.img, u-boot-nodtb.bin) that is present in the image.
Simon Glass75ead662021-03-18 20:25:13 +1300796You can access this value with something like::
Simon Glassbe83bc72017-11-13 18:55:05 -0700797
Simon Glass72555fa2019-11-06 17:22:44 -0700798 ulong u_boot_offset = binman_sym(ulong, u_boot_any, image_pos);
Simon Glassbe83bc72017-11-13 18:55:05 -0700799
Simon Glass72555fa2019-11-06 17:22:44 -0700800Thus u_boot_offset will be set to the image-pos of U-Boot in memory, assuming
801that the whole image has been loaded, or is available in flash. You can then
802jump to that address to start U-Boot.
803
804At present this feature is only supported in SPL and TPL. In principle it is
805possible to fill in such symbols in U-Boot proper, as well, but a future C
806library is planned for this instead, to read from the device tree.
807
808As well as image-pos, it is possible to read the size of an entry and its
809offset (which is the start position of the entry within its parent).
810
811A small technical note: Binman automatically adds the base address of the image
812(i.e. __image_copy_start) to the value of the image-pos symbol, so that when the
813image is loaded to its linked address, the value will be correct and actually
814point into the image.
815
816For example, say SPL is at the start of the image and linked to start at address
81780108000. If U-Boot's image-pos is 0x8000 then binman will write an image-pos
818for U-Boot of 80110000 into the SPL binary, since it assumes the image is loaded
819to 80108000, with SPL at 80108000 and U-Boot at 80110000.
Simon Glassbe83bc72017-11-13 18:55:05 -0700820
Simon Glass72555fa2019-11-06 17:22:44 -0700821For x86 devices (with the end-at-4gb property) this base address is not added
822since it is assumed that images are XIP and the offsets already include the
823address.
Simon Glassbe83bc72017-11-13 18:55:05 -0700824
Simon Glass52debad2016-11-25 20:15:59 -0700825
Simon Glass9dcc8612018-08-01 15:22:42 -0600826Access to binman entry offsets at run time (fdt)
827------------------------------------------------
828
829Binman can update the U-Boot FDT to include the final position and size of
830each entry in the images it processes. The option to enable this is -u and it
831causes binman to make sure that the 'offset', 'image-pos' and 'size' properties
832are set correctly for every entry. Since it is not necessary to specify these in
833the image definition, binman calculates the final values and writes these to
834the device tree. These can be used by U-Boot at run-time to find the location
835of each entry.
836
Simon Glass0f621332019-07-08 14:25:27 -0600837Alternatively, an FDT map entry can be used to add a special FDT containing
838just the information about the image. This is preceded by a magic string so can
Simon Glasscec34ba2019-07-08 14:25:28 -0600839be located anywhere in the image. An image header (typically at the start or end
840of the image) can be used to point to the FDT map. See fdtmap and image-header
841entries for more information.
Simon Glass0f621332019-07-08 14:25:27 -0600842
Simon Glass9dcc8612018-08-01 15:22:42 -0600843
Simon Glass718b5292021-03-18 20:25:07 +1300844Expanded entries
845----------------
846
847Binman automatically replaces 'u-boot' with an expanded version of that, i.e.
Simon Glass75ead662021-03-18 20:25:13 +1300848'u-boot-expanded'. This means that when you write::
Simon Glass718b5292021-03-18 20:25:07 +1300849
850 u-boot {
851 };
852
Simon Glass75ead662021-03-18 20:25:13 +1300853you actually get::
Simon Glass718b5292021-03-18 20:25:07 +1300854
855 u-boot {
856 type = "u-boot-expanded';
857 };
858
Simon Glass75ead662021-03-18 20:25:13 +1300859which in turn expands to::
Simon Glass718b5292021-03-18 20:25:07 +1300860
861 u-boot {
862 type = "section";
863
864 u-boot-nodtb {
865 };
866
867 u-boot-dtb {
868 };
869 };
870
871U-Boot's various phase binaries actually comprise two or three pieces.
872For example, u-boot.bin has the executable followed by a devicetree.
873
874With binman we want to be able to update that devicetree with full image
875information so that it is accessible to the executable. This is tricky
876if it is not clear where the devicetree starts.
877
878The above feature ensures that the devicetree is clearly separated from the
879U-Boot executable and can be updated separately by binman as needed. It can be
880disabled with the --no-expanded flag if required.
881
882The same applies for u-boot-spl and u-boot-spl. In those cases, the expansion
Simon Glass75ead662021-03-18 20:25:13 +1300883includes the BSS padding, so for example::
Simon Glass718b5292021-03-18 20:25:07 +1300884
885 spl {
886 type = "u-boot-spl"
887 };
888
Simon Glass75ead662021-03-18 20:25:13 +1300889you actually get::
Simon Glass718b5292021-03-18 20:25:07 +1300890
891 spl {
892 type = "u-boot-expanded';
893 };
894
Simon Glass75ead662021-03-18 20:25:13 +1300895which in turn expands to::
Simon Glass718b5292021-03-18 20:25:07 +1300896
897 spl {
898 type = "section";
899
900 u-boot-spl-nodtb {
901 };
902
903 u-boot-spl-bss-pad {
904 };
905
906 u-boot-spl-dtb {
907 };
908 };
909
910
911Of course we should not expand SPL if it has no devicetree. Also if the BSS
912padding is not needed (because BSS is in RAM as with CONFIG_SPL_SEPARATE_BSS),
913the 'u-boot-spl-bss-pad' subnode should not be created. The use of the expaned
914entry type is controlled by the UseExpanded() method. In the SPL case it checks
915the 'spl-dtb' entry arg, which is 'y' or '1' if SPL has a devicetree.
916
917For the BSS case, a 'spl-bss-pad' entry arg controls whether it is present. All
918entry args are provided by the U-Boot Makefile.
919
920
Simon Glass7ba33592018-09-14 04:57:26 -0600921Compression
922-----------
923
924Binman support compression for 'blob' entries (those of type 'blob' and
Simon Glass75ead662021-03-18 20:25:13 +1300925derivatives). To enable this for an entry, add a 'compress' property::
Simon Glass7ba33592018-09-14 04:57:26 -0600926
927 blob {
928 filename = "datafile";
Simon Glassaa2fcf92019-07-08 14:25:30 -0600929 compress = "lz4";
Simon Glass7ba33592018-09-14 04:57:26 -0600930 };
931
932The entry will then contain the compressed data, using the 'lz4' compression
Simon Glassaa2fcf92019-07-08 14:25:30 -0600933algorithm. Currently this is the only one that is supported. The uncompressed
934size is written to the node in an 'uncomp-size' property, if -u is used.
Simon Glass7ba33592018-09-14 04:57:26 -0600935
Simon Glassd92c8362020-10-26 17:40:25 -0600936Compression is also supported for sections. In that case the entire section is
937compressed in one block, including all its contents. This means that accessing
938an entry from the section required decompressing the entire section. Also, the
939size of a section indicates the space that it consumes in its parent section
940(and typically the image). With compression, the section may contain more data,
941and the uncomp-size property indicates that, as above. The contents of the
942section is compressed first, before any padding is added. This ensures that the
943padding itself is not compressed, which would be a waste of time.
Simon Glass7ba33592018-09-14 04:57:26 -0600944
945
Simon Glass30732662018-06-01 09:38:20 -0600946Map files
947---------
948
949The -m option causes binman to output a .map file for each image that it
Simon Glass75ead662021-03-18 20:25:13 +1300950generates. This shows the offset and size of each entry. For example::
Simon Glass30732662018-06-01 09:38:20 -0600951
Simon Glasse8561af2018-08-01 15:22:37 -0600952 Offset Size Name
Simon Glass3a9a2b82018-07-17 13:25:28 -0600953 00000000 00000028 main-section
954 00000000 00000010 section@0
955 00000000 00000004 u-boot
956 00000010 00000010 section@1
957 00000000 00000004 u-boot
Simon Glass30732662018-06-01 09:38:20 -0600958
959This shows a hierarchical image with two sections, each with a single entry. The
Simon Glasse8561af2018-08-01 15:22:37 -0600960offsets of the sections are absolute hex byte offsets within the image. The
961offsets of the entries are relative to their respective sections. The size of
Simon Glass30732662018-06-01 09:38:20 -0600962each entry is also shown, in bytes (hex). The indentation shows the entries
963nested inside their sections.
964
965
Simon Glass91710b32018-07-17 13:25:32 -0600966Passing command-line arguments to entries
967-----------------------------------------
968
969Sometimes it is useful to pass binman the value of an entry property from the
970command line. For example some entries need access to files and it is not
971always convenient to put these filenames in the image definition (device tree).
972
Simon Glass75ead662021-03-18 20:25:13 +1300973The-a option supports this::
Simon Glass91710b32018-07-17 13:25:32 -0600974
975 -a<prop>=<value>
976
Simon Glass75ead662021-03-18 20:25:13 +1300977where::
Simon Glass91710b32018-07-17 13:25:32 -0600978
979 <prop> is the property to set
980 <value> is the value to set it to
981
982Not all properties can be provided this way. Only some entries support it,
983typically for filenames.
984
985
Simon Glass6244fa42019-07-08 13:18:28 -0600986External tools
987--------------
988
989Binman can make use of external command-line tools to handle processing of
990entry contents or to generate entry contents. These tools are executed using
991the 'tools' module's Run() method. The tools generally must exist on the PATH,
992but the --toolpath option can be used to specify additional search paths to
993use. This option can be specified multiple times to add more than one path.
994
Alper Nebi Yasakfb4e5382020-09-06 14:46:07 +0300995For some compile tools binman will use the versions specified by commonly-used
996environment variables like CC and HOSTCC for the C compiler, based on whether
997the tool's output will be used for the target or for the host machine. If those
998aren't given, it will also try to derive target-specific versions from the
999CROSS_COMPILE environment variable during a cross-compilation.
1000
Simon Glass6244fa42019-07-08 13:18:28 -06001001
Simon Glass52debad2016-11-25 20:15:59 -07001002Code coverage
1003-------------
1004
1005Binman is a critical tool and is designed to be very testable. Entry
Simon Glassf46732a2019-07-08 14:25:29 -06001006implementations target 100% test coverage. Run 'binman test -T' to check this.
Simon Glass52debad2016-11-25 20:15:59 -07001007
Simon Glass75ead662021-03-18 20:25:13 +13001008To enable Python test coverage on Debian-type distributions (e.g. Ubuntu)::
Simon Glass52debad2016-11-25 20:15:59 -07001009
Simon Glassa16dd6e2019-07-08 13:18:26 -06001010 $ sudo apt-get install python-coverage python3-coverage python-pytest
Simon Glass52debad2016-11-25 20:15:59 -07001011
1012
Simon Glass1aeb7512019-05-17 22:00:52 -06001013Concurrent tests
1014----------------
1015
1016Binman tries to run tests concurrently. This means that the tests make use of
1017all available CPUs to run.
1018
Simon Glass75ead662021-03-18 20:25:13 +13001019 To enable this::
Simon Glass1aeb7512019-05-17 22:00:52 -06001020
1021 $ sudo apt-get install python-subunit python3-subunit
1022
1023Use '-P 1' to disable this. It is automatically disabled when code coverage is
1024being used (-T) since they are incompatible.
1025
1026
Simon Glass1c420c92019-07-08 13:18:49 -06001027Debugging tests
1028---------------
1029
1030Sometimes when debugging tests it is useful to keep the input and output
1031directories so they can be examined later. Use -X or --test-preserve-dirs for
1032this.
1033
1034
Alper Nebi Yasakfb4e5382020-09-06 14:46:07 +03001035Running tests on non-x86 architectures
1036--------------------------------------
1037
1038Binman's tests have been written under the assumption that they'll be run on a
1039x86-like host and there hasn't been an attempt to make them portable yet.
1040However, it's possible to run the tests by cross-compiling to x86.
1041
Simon Glass75ead662021-03-18 20:25:13 +13001042To install an x86 cross-compiler on Debian-type distributions (e.g. Ubuntu)::
Alper Nebi Yasakfb4e5382020-09-06 14:46:07 +03001043
1044 $ sudo apt-get install gcc-x86-64-linux-gnu
1045
Simon Glass75ead662021-03-18 20:25:13 +13001046Then, you can run the tests under cross-compilation::
Alper Nebi Yasakfb4e5382020-09-06 14:46:07 +03001047
1048 $ CROSS_COMPILE=x86_64-linux-gnu- binman test -T
1049
1050You can also use gcc-i686-linux-gnu similar to the above.
1051
1052
Simon Glass2574ef62016-11-25 20:15:51 -07001053Advanced Features / Technical docs
1054----------------------------------
1055
1056The behaviour of entries is defined by the Entry class. All other entries are
1057a subclass of this. An important subclass is Entry_blob which takes binary
1058data from a file and places it in the entry. In fact most entry types are
1059subclasses of Entry_blob.
1060
1061Each entry type is a separate file in the tools/binman/etype directory. Each
1062file contains a class called Entry_<type> where <type> is the entry type.
1063New entry types can be supported by adding new files in that directory.
1064These will automatically be detected by binman when needed.
1065
1066Entry properties are documented in entry.py. The entry subclasses are free
1067to change the values of properties to support special behaviour. For example,
1068when Entry_blob loads a file, it sets content_size to the size of the file.
1069Entry classes can adjust other entries. For example, an entry that knows
Simon Glasse8561af2018-08-01 15:22:37 -06001070where other entries should be positioned can set up those entries' offsets
Simon Glass2574ef62016-11-25 20:15:51 -07001071so they don't need to be set in the binman decription. It can also adjust
1072entry contents.
1073
1074Most of the time such essoteric behaviour is not needed, but it can be
1075essential for complex images.
1076
Simon Glassade2ef62017-12-24 12:12:07 -07001077If you need to specify a particular device-tree compiler to use, you can define
1078the DTC environment variable. This can be useful when the system dtc is too
1079old.
1080
Simon Glasse64a0922018-11-06 15:21:31 -07001081To enable a full backtrace and other debugging features in binman, pass
Simon Glass75ead662021-03-18 20:25:13 +13001082BINMAN_DEBUG=1 to your build::
Simon Glasse64a0922018-11-06 15:21:31 -07001083
Bin Menga089c412019-10-02 19:07:29 -07001084 make qemu-x86_defconfig
Simon Glasse64a0922018-11-06 15:21:31 -07001085 make BINMAN_DEBUG=1
1086
Simon Glass03b1d8f2019-09-25 08:11:11 -06001087To enable verbose logging from binman, base BINMAN_VERBOSE to your build, which
Simon Glass75ead662021-03-18 20:25:13 +13001088adds a -v<level> option to the call to binman::
Simon Glass03b1d8f2019-09-25 08:11:11 -06001089
Bin Menga089c412019-10-02 19:07:29 -07001090 make qemu-x86_defconfig
Simon Glass03b1d8f2019-09-25 08:11:11 -06001091 make BINMAN_VERBOSE=5
1092
Simon Glass2574ef62016-11-25 20:15:51 -07001093
1094History / Credits
1095-----------------
1096
1097Binman takes a lot of inspiration from a Chrome OS tool called
1098'cros_bundle_firmware', which I wrote some years ago. That tool was based on
1099a reasonably simple and sound design but has expanded greatly over the
1100years. In particular its handling of x86 images is convoluted.
1101
Simon Glass1e324002018-06-01 09:38:19 -06001102Quite a few lessons have been learned which are hopefully applied here.
Simon Glass2574ef62016-11-25 20:15:51 -07001103
1104
1105Design notes
1106------------
1107
1108On the face of it, a tool to create firmware images should be fairly simple:
1109just find all the input binaries and place them at the right place in the
1110image. The difficulty comes from the wide variety of input types (simple
1111flat binaries containing code, packaged data with various headers), packing
1112requirments (alignment, spacing, device boundaries) and other required
1113features such as hierarchical images.
1114
1115The design challenge is to make it easy to create simple images, while
1116allowing the more complex cases to be supported. For example, for most
1117images we don't much care exactly where each binary ends up, so we should
1118not have to specify that unnecessarily.
1119
1120New entry types should aim to provide simple usage where possible. If new
1121core features are needed, they can be added in the Entry base class.
1122
1123
1124To do
1125-----
1126
1127Some ideas:
Simon Glass75ead662021-03-18 20:25:13 +13001128
Simon Glass2574ef62016-11-25 20:15:51 -07001129- Use of-platdata to make the information available to code that is unable
1130 to use device tree (such as a very small SPL image)
Simon Glass2574ef62016-11-25 20:15:51 -07001131- Allow easy building of images by specifying just the board name
Simon Glass2574ef62016-11-25 20:15:51 -07001132- Support building an image for a board (-b) more completely, with a
1133 configurable build directory
Simon Glass8100a8e2019-07-20 12:24:02 -06001134- Detect invalid properties in nodes
1135- Sort the fdtmap by offset
Simon Glass01ab2292021-01-06 21:35:12 -07001136- Output temporary files to a different directory
Simon Glass2574ef62016-11-25 20:15:51 -07001137
1138--
1139Simon Glass <sjg@chromium.org>
11407/7/2016