blob: d2dfe5327f2e239340e6e86e6e50b266decf78d9 [file] [log] [blame]
Simon Glass02741682013-05-26 07:07:58 -07001# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""crosfw - Chrome OS Firmware build/flash script.
6
7Builds a firmware image for any board and writes it to the board. The image
8can be pure upstream or include Chrome OS components (-V). Some device
9tree parameters can be provided, including silent console (-C) and secure
10boot (-S). Use -i for a faster incremental build. The image is written to
11the board by default using USB/em100 (or sdcard with -x). Use -b to specify
12the board to build. Options can be added to ~/.crosfwrc - see the script for
13details.
14
15It can also flash SPI by writing a 'magic flasher' U-Boot with a payload
16to the board.
17
Simon Glass02741682013-05-26 07:07:58 -070018The script is normally run from within the U-Boot directory which is
19.../src/third_party/u-boot/files
20
21Example 1: Build upstream image for coreboot and write to a 'link':
22
23 crosfw -b link
24
25Example 2: Build verified boot image (V) for daisy/snow and boot in secure
26 mode (S) so that breaking in on boot is not possible.
27
28 crosfw -b daisy -VS
29 crosfw -b daisy -VSC (no console output)
30
31Example 3: Build a magic flasher (F) with full verified boot for peach_pit,
32 but with console enabled, write to SD card (x)
33
34 crosfw -b peach_pit -VSFx
35
36This sript does not use an ebuild. It does a similar thing to the
37chromeos-u-boot ebuild, and runs cros_bundle_firmware to produce various
38types of image, a little like the chromeos-bootimage ebuild.
39
40The purpose of this script is to make it easier and faster to perform
41common firmware build tasks without changing boards, manually updating
42device tree files or lots of USE flags and complexity in the ebuilds.
43
44This script has been tested with snow, link and peach_pit. It builds for
45peach_pit by default. Note that it will also build any upstream ARM
46board - e.g. "-b snapper9260" will build an image for that board.
47
48Mostly you can use the script inside and outside the chroot. The main
49limitation is that dut-control doesn't really work outside the chroot,
50so writing the image to the board over USB is not possible, nor can the
51board be automatically reset on x86 platforms.
52
53For an incremental build (faster), run with -i
54
55To get faster clean builds, install ccache, and create ~/.crosfwrc with
56this line:
57
Simon Glass6ddc7f12013-07-18 15:22:41 -060058 USE_CCACHE = True
Simon Glass02741682013-05-26 07:07:58 -070059
60(make sure ~/.ccache is not on NFS, or set CCACHE_DIR)
61
62Other options are the default board to build, and verbosity (0-4), e.g.:
63
Simon Glass6ddc7f12013-07-18 15:22:41 -060064 DEFAULT_BOARD = 'daisy'
65 VERBOSE = 1
Simon Glass02741682013-05-26 07:07:58 -070066
67It is possible to use multiple servo boards, each on its own port. Add
68these lines to your ~/.crosfwrc to set the servo port to use for each
69board:
70
71 SERVO_PORT['link'] = 8888
72 SERVO_PORT['daisy'] = 9999
73 SERVO_PORT['peach_pit'] = 7777
74
Simon Glassb89ae892013-07-18 15:23:35 -060075All builds appear in the <outdir>/<board> subdirectory and images are written
76to <outdir>/<uboard>/out, where <uboard> is the U-Boot name for the board (in
77the U-Boot boards.cfg file)
78
79The value for <outdir> defaults to /tmp/crosfw but can be configured in your
80~/.crosfwrc file, e.g.:"
81
82 OUT_DIR = '/tmp/u-boot'
Simon Glass02741682013-05-26 07:07:58 -070083
84For the -a option here are some useful options:
85
86--add-blob cros-splash /dev/null
87--gbb-flags -force-dev-switch-on
88--add-node-enable /spi@131b0000/cros-ecp@0 1
89--verify --full-erase
90--bootcmd "cros_test sha"
91--gbb-flags -force-dev-switch-on
92--bmpblk ~/trunk/src/third_party/u-boot/bmp.bin
93
94For example: -a "--gbb-flags -force-dev-switch-on"
95
96Note the standard bmpblk is at:
97 /home/$USER/trunk/src/third_party/chromiumos-overlay/sys-boot/
98 chromeos-bootimage/files/bmpblk.bin"
99"""
100
Mike Frysinger383367e2014-09-16 15:06:17 -0400101from __future__ import print_function
102
Simon Glass02741682013-05-26 07:07:58 -0700103import glob
Simon Glass02741682013-05-26 07:07:58 -0700104import multiprocessing
105import os
106import re
107import sys
108
Don Garrett88b8d782014-05-13 17:30:55 -0700109from chromite.cbuildbot import constants
Simon Glass02741682013-05-26 07:07:58 -0700110from chromite.lib import commandline
111from chromite.lib import cros_build_lib
Ralph Nathan91874ca2015-03-19 13:29:41 -0700112from chromite.lib import cros_logging as logging
Simon Glass02741682013-05-26 07:07:58 -0700113from chromite.lib import osutils
114from chromite.lib import parallel
115
116
117arch = None
118board = None
119compiler = None
120default_board = None
121family = None
122in_chroot = True
123
Simon Glass02741682013-05-26 07:07:58 -0700124logging.basicConfig(format='%(message)s')
125kwargs = {'print_cmd': False, 'error_code_ok': True,
Ralph Nathan23a12212015-03-25 10:27:54 -0700126 'debug_level': logging.getLogger().getEffectiveLevel()}
Simon Glass02741682013-05-26 07:07:58 -0700127
128outdir = ''
129
130 # If you have multiple boards connected on different servo ports, put lines
131# like 'SERVO_PORT{"peach_pit"} = 7777' in your ~/.crosfwrc
132SERVO_PORT = {}
133
134smdk = None
135src_root = os.path.join(constants.SOURCE_ROOT, 'src')
136in_chroot = cros_build_lib.IsInsideChroot()
137
138uboard = ''
139
140default_board = 'peach_pit'
141use_ccache = False
142vendor = None
143verbose = False
144
145# Special cases for the U-Boot board config, the SOCs and default device tree
146# since the naming is not always consistent.
147# x86 has a lot of boards, but to U-Boot they are all the same
148UBOARDS = {
149 'daisy': 'smdk5250',
150 'peach': 'smdk5420',
151}
152for b in ['alex', 'butterfly', 'emeraldlake2', 'link', 'lumpy', 'parrot',
153 'stout', 'stumpy']:
154 UBOARDS[b] = 'coreboot-x86'
155 UBOARDS['chromeos_%s' % b] = 'chromeos_coreboot'
156
157SOCS = {
158 'coreboot-x86': '',
159 'chromeos_coreboot': '',
160 'daisy': 'exynos5250-',
161 'peach': 'exynos5420-',
162}
163
164DEFAULT_DTS = {
165 'daisy': 'snow',
166 'daisy_spring': 'spring',
167 'peach_pit': 'peach-pit',
168}
169
Simon Glassb89ae892013-07-18 15:23:35 -0600170OUT_DIR = '/tmp/crosfw'
171
Simon Glass02741682013-05-26 07:07:58 -0700172rc_file = os.path.expanduser('~/.crosfwrc')
173if os.path.exists(rc_file):
174 execfile(rc_file)
175
176
177def Log(msg):
178 """Print out a message if we are in verbose mode.
179
180 Args:
181 msg: Message to print
182 """
183 if verbose:
Ralph Nathan03047282015-03-23 11:09:32 -0700184 logging.info(msg)
Simon Glass02741682013-05-26 07:07:58 -0700185
186
187def Dumper(flag, infile, outfile):
188 """Run objdump on an input file.
189
190 Args:
191 flag: Flag to pass objdump (e.g. '-d').
192 infile: Input file to process.
193 outfile: Output file to write to.
194 """
195 result = cros_build_lib.RunCommand(
196 [CompilerTool('objdump'), flag, infile],
197 log_stdout_to_file=outfile, **kwargs)
198 if result.returncode:
199 sys.exit()
200
201
202def CompilerTool(tool):
203 """Returns the cross-compiler tool filename.
204
205 Args:
206 tool: Tool name to return, e.g. 'size'.
207
208 Returns:
209 Filename of requested tool.
210 """
211 return '%s%s' % (compiler, tool)
212
213
214def ParseCmdline(argv):
215 """Parse all command line options.
216
217 Args:
218 argv: Arguments to parse.
219
220 Returns:
Mike Frysinger4e91d822015-06-04 02:01:40 -0400221 The parsed options object
Simon Glass02741682013-05-26 07:07:58 -0700222 """
Mike Frysinger4e91d822015-06-04 02:01:40 -0400223 parser = commandline.ArgumentParser(description=__doc__)
224 parser.add_argument('-a', '--cbfargs', action='append',
225 help='Pass extra arguments to cros_bundle_firmware')
226 parser.add_argument('-b', '--board', type=str, default=default_board,
227 help='Select board to build (daisy/peach_pit/link)')
228 parser.add_argument('-B', '--build', action='store_false', default=True,
229 help="Don't build U-Boot, just configure device tree")
230 parser.add_argument('-C', '--console', action='store_false', default=True,
231 help='Permit console output')
232 parser.add_argument('-d', '--dt', default='seaboard',
233 help='Select name of device tree file to use')
234 parser.add_argument('-D', '--nodefaults', dest='use_defaults',
235 action='store_false', default=True,
236 help="Don't select default filenames for those not given")
237 parser.add_argument('-F', '--flash', action='store_true', default=False,
238 help='Create magic flasher for SPI flash')
239 parser.add_argument('-M', '--mmc', action='store_true', default=False,
240 help='Create magic flasher for eMMC')
241 parser.add_argument('-i', '--incremental', action='store_true', default=False,
242 help="Don't reconfigure and clean")
243 parser.add_argument('-k', '--kernel', action='store_true', default=False,
244 help='Send kernel to board also')
245 parser.add_argument('-O', '--objdump', action='store_true', default=False,
246 help='Write disassembly output')
247 parser.add_argument('-r', '--run', action='store_false', default=True,
248 help='Run the boot command')
249 parser.add_argument('--ro', action='store_true', default=False,
250 help='Create Chrome OS read-only image')
251 parser.add_argument('--rw', action='store_true', default=False,
252 help='Create Chrome OS read-write image')
253 parser.add_argument('-s', '--separate', action='store_false', default=True,
254 help='Link device tree into U-Boot, instead of separate')
255 parser.add_argument('-S', '--secure', action='store_true', default=False,
256 help='Use vboot_twostop secure boot')
257 parser.add_argument('--small', action='store_true', default=False,
258 help='Create Chrome OS small image')
259 parser.add_argument('-t', '--trace', action='store_true', default=False,
260 help='Enable trace support')
261 parser.add_argument('-v', '--verbose', type=int, default=0,
262 help='Make cros_bundle_firmware verbose')
263 parser.add_argument('-V', '--verified', action='store_true', default=False,
264 help='Include Chrome OS verified boot components')
265 parser.add_argument('-w', '--write', action='store_false', default=True,
266 help="Don't write image to board using usb/em100")
267 parser.add_argument('-x', '--sdcard', action='store_true', default=False,
268 help='Write to SD card instead of USB/em100')
269 parser.add_argument('-z', '--size', action='store_true', default=False,
270 help='Display U-Boot image size')
Simon Glassf67f93e2016-08-04 20:29:51 -0600271 parser.add_argument('target', nargs='?', default='all',
Mike Frysinger4e91d822015-06-04 02:01:40 -0400272 help='The target to work on')
Simon Glass02741682013-05-26 07:07:58 -0700273 return parser.parse_args(argv)
274
275
276def SetupBuild(options):
277 """Set up parameters needed for the build.
278
279 This checks the current environment and options and sets up various things
280 needed for the build, including 'base' which holds the base flags for
281 passing to the U-Boot Makefile.
282
283 Args:
284 options: Command line options
285
286 Returns:
287 Base flags to use for U-Boot, as a list.
288 """
Don Garrett25f309a2014-03-19 14:02:12 -0700289 # pylint: disable=W0603
Simon Glass02741682013-05-26 07:07:58 -0700290 global arch, board, compiler, family, outdir, smdk, uboard, vendor, verbose
291
292 if not verbose:
293 verbose = options.verbose != 0
294
Ralph Nathan23a12212015-03-25 10:27:54 -0700295 logging.getLogger().setLevel(options.verbose)
Simon Glass02741682013-05-26 07:07:58 -0700296
297 Log('Building for %s' % options.board)
298
Simon Glass9d9bf942013-07-10 16:32:42 -0700299 # Separate out board_variant string: "peach_pit" becomes "peach", "pit".
300 # But don't mess up upstream boards which use _ in their name.
Simon Glass02741682013-05-26 07:07:58 -0700301 parts = options.board.split('_')
Simon Glass9d9bf942013-07-10 16:32:42 -0700302 if parts[0] in ['daisy', 'peach']:
303 board = parts[0]
304 else:
305 board = options.board
Simon Glass02741682013-05-26 07:07:58 -0700306
307 # To allow this to be run from 'cros_sdk'
308 if in_chroot:
309 os.chdir(os.path.join(src_root, 'third_party', 'u-boot', 'files'))
310
311 base_board = board
312
313 if options.verified:
314 base_board = 'chromeos_%s' % base_board
315
316 uboard = UBOARDS.get(base_board, base_board)
317 Log('U-Boot board is %s' % uboard)
318
319 # Pull out some information from the U-Boot boards config file
320 family = None
Simon Glasseb0c5352016-07-20 09:29:34 -0600321 (PRE_KBUILD, PRE_KCONFIG, KCONFIG) = range(3)
322 if os.path.exists('MAINTAINERS'):
323 board_format = PRE_KBUILD
324 else:
325 board_format = PRE_KCONFIG
Simon Glass02741682013-05-26 07:07:58 -0700326 with open('boards.cfg') as f:
327 for line in f:
Simon Glasseb0c5352016-07-20 09:29:34 -0600328 if 'genboardscfg' in line:
329 board_format = KCONFIG
Simon Glass02741682013-05-26 07:07:58 -0700330 if uboard in line:
331 if line[0] == '#':
332 continue
333 fields = line.split()
334 if not fields:
335 continue
336 arch = fields[1]
337 fields += [None, None, None]
Simon Glasseb0c5352016-07-20 09:29:34 -0600338 if board_format == PRE_KBUILD:
339 smdk = fields[3]
340 vendor = fields[4]
341 family = fields[5]
342 elif board_format in (PRE_KCONFIG, KCONFIG):
343 smdk = fields[5]
344 vendor = fields[4]
345 family = fields[3]
Simon Glass02741682013-05-26 07:07:58 -0700346 break
347 if not arch:
348 cros_build_lib.Die("Selected board '%s' not found in boards.cfg." % board)
349
350 vboot = os.path.join('build', board, 'usr')
351 if arch == 'x86':
352 family = 'em100'
353 if in_chroot:
354 compiler = 'i686-pc-linux-gnu-'
355 else:
356 compiler = '/opt/i686/bin/i686-unknown-elf-'
357 elif arch == 'arm':
358 if in_chroot:
359 # Use the Chrome OS toolchain
360 compiler = 'armv7a-cros-linux-gnueabi-'
361 else:
362 compiler = glob.glob('/opt/linaro/gcc-linaro-arm-linux-*/bin/*gcc')
363 if not compiler:
364 cros_build_lib.Die("""Please install an ARM toolchain for your machine.
365'Install a Linaro toolchain from:'
366'https://launchpad.net/linaro-toolchain-binaries'
367'or see cros/commands/cros_chrome_sdk.py.""")
368 compiler = compiler[0]
369 compiler = re.sub('gcc$', '', compiler)
370 elif arch == 'sandbox':
371 compiler = ''
372 else:
373 cros_build_lib.Die("Selected arch '%s' not supported." % arch)
374
375 if not options.build:
376 options.incremental = True
377
378 cpus = multiprocessing.cpu_count()
379
Simon Glassb89ae892013-07-18 15:23:35 -0600380 outdir = os.path.join(OUT_DIR, uboard)
Simon Glass02741682013-05-26 07:07:58 -0700381 base = [
382 'make',
383 '-j%d' % cpus,
384 'O=%s' % outdir,
385 'ARCH=%s' % arch,
386 'CROSS_COMPILE=%s' % compiler,
387 '--no-print-directory',
388 'HOSTSTRIP=true',
389 'DEV_TREE_SRC=%s-%s' % (family, options.dt),
390 'QEMU_ARCH=']
391
392 if options.verbose < 2:
393 base.append('-s')
Simon Glass234e5f32016-07-20 09:11:59 -0600394 elif options.verbose > 2:
395 base.append('V=1')
Simon Glass02741682013-05-26 07:07:58 -0700396
397 if options.ro and options.rw:
398 cros_build_lib.Die('Cannot specify both --ro and --rw options')
399 if options.ro:
400 base.append('CROS_RO=1')
401 options.small = True
402
403 if options.rw:
404 base.append('CROS_RW=1')
405 options.small = True
406
407 if options.small:
408 base.append('CROS_SMALL=1')
409 else:
410 base.append('CROS_FULL=1')
411
412 if options.verified:
413 base += [
414 'VBOOT=%s' % vboot,
415 'MAKEFLAGS_VBOOT=DEBUG=1',
416 'QUIET=1',
417 'CFLAGS_EXTRA_VBOOT=-DUNROLL_LOOPS',
418 'VBOOT_SOURCE=%s/platform/vboot_reference' % src_root]
Simon Glass9d9bf942013-07-10 16:32:42 -0700419 base.append('VBOOT_DEBUG=1')
Simon Glass02741682013-05-26 07:07:58 -0700420
421 # Handle the Chrome OS USE_STDINT workaround. Vboot needs <stdint.h> due
422 # to a recent change, the need for which I didn't fully understand. But
423 # U-Boot doesn't normally use this. We have added an option to U-Boot to
424 # enable use of <stdint.h> and without it vboot will fail to build. So we
425 # need to enable it where ww can. We can't just enable it always since
426 # that would prevent this script from building other non-Chrome OS boards
427 # with a different (older) toolchain, or Chrome OS boards without vboot.
428 # So use USE_STDINT if the toolchain supports it, and not if not. This
429 # file was originally part of glibc but has recently migrated to the
430 # compiler so it is reasonable to use it with a stand-alone program like
431 # U-Boot. At this point the comment has got long enough that we may as
432 # well include some poetry which seems to be sorely lacking the code base,
433 # so this is from Ogden Nash:
434 # To keep your marriage brimming
435 # With love in the loving cup,
436 # Whenever you're wrong, admit it;
437 # Whenever you're right, shut up.
438 cmd = [CompilerTool('gcc'), '-ffreestanding', '-x', 'c', '-c', '-']
Yu-Ju Hong3add4432014-01-30 11:46:15 -0800439 result = cros_build_lib.RunCommand(cmd,
440 input='#include <stdint.h>',
441 capture_output=True,
442 **kwargs)
Simon Glass02741682013-05-26 07:07:58 -0700443 if result.returncode == 0:
444 base.append('USE_STDINT=1')
445
446 if options.trace:
447 base.append('FTRACE=1')
448 if options.separate:
449 base.append('DEV_TREE_SEPARATE=1')
450
451 if options.incremental:
452 # Get the correct board for cros_write_firmware
Simon Glassef7e4372016-07-20 09:38:47 -0600453 config_mk = '%s/include/autoconf.mk' % outdir
Simon Glass02741682013-05-26 07:07:58 -0700454 if not os.path.exists(config_mk):
Ralph Nathan446aee92015-03-23 14:44:56 -0700455 logging.warning('No build found for %s - dropping -i' % board)
Simon Glass02741682013-05-26 07:07:58 -0700456 options.incremental = False
457
Simon Glassef7e4372016-07-20 09:38:47 -0600458 config_mk = 'include/autoconf.mk'
Simon Glass02741682013-05-26 07:07:58 -0700459 if os.path.exists(config_mk):
Ralph Nathan446aee92015-03-23 14:44:56 -0700460 logging.warning("Warning: '%s' exists, try 'make distclean'" % config_mk)
Simon Glass02741682013-05-26 07:07:58 -0700461
462 # For when U-Boot supports ccache
463 # See http://patchwork.ozlabs.org/patch/245079/
464 if use_ccache:
465 os.environ['CCACHE'] = 'ccache'
466
467 return base
468
469
470def RunBuild(options, base, target, queue):
471 """Run the U-Boot build.
472
473 Args:
474 options: Command line options.
475 base: Base U-Boot flags.
476 target: Target to build.
477 queue: A parallel queue to add jobs to.
478 """
479 Log('U-Boot build flags: %s' % ' '.join(base))
480
481 # Reconfigure U-Boot.
482 if not options.incremental:
483 # Ignore any error from this, some older U-Boots fail on this.
484 cros_build_lib.RunCommand(base + ['distclean'], **kwargs)
485 result = cros_build_lib.RunCommand(base + ['%s_config' % uboard], **kwargs)
486 if result.returncode:
487 sys.exit()
488
489 # Do the actual build.
490 if options.build:
491 result = cros_build_lib.RunCommand(base + [target], **kwargs)
492 if result.returncode:
493 sys.exit()
494
495 files = ['%s/u-boot' % outdir]
496 spl = glob.glob('%s/spl/u-boot-spl' % outdir)
497 if spl:
498 files += spl
499 if options.size:
Simon Glassc7d266d2013-07-18 15:15:57 -0600500 result = cros_build_lib.RunCommand([CompilerTool('size')] + files,
501 **kwargs)
Simon Glass02741682013-05-26 07:07:58 -0700502 if result.returncode:
503 sys.exit()
504
505 # Create disassembly files .dis and .Dis (full dump)
506 for f in files:
507 base = os.path.splitext(f)[0]
508 if options.objdump:
509 queue.put(('-d', f, base + '.dis'))
510 queue.put(('-D', f, base + '.Dis'))
511 else:
512 # Remove old files which otherwise might be confusing
513 osutils.SafeUnlink(base + '.dis')
514 osutils.SafeUnlink(base + '.Dis')
515
516 Log('Output directory %s' % outdir)
517
518
519def WriteFirmware(options):
520 """Write firmware to the board.
521
522 This uses cros_bundle_firmware to create a firmware image and write it to
523 the board.
524
525 Args:
526 options: Command line options
527 """
528 flash = []
529 kernel = []
530 run = []
531 secure = []
532 servo = []
533 silent = []
534 verbose_arg = []
Simon Glass46411592013-07-22 22:35:01 -0600535 ro_uboot = []
Simon Glass02741682013-05-26 07:07:58 -0700536
537 bl2 = ['--bl2', '%s/spl/%s-spl.bin' % (outdir, smdk)]
538
539 if options.use_defaults:
540 bl1 = []
541 bmpblk = []
542 ecro = []
543 ecrw = []
544 defaults = []
545 else:
546 bl1 = ['--bl1', '##/build/%s/firmware/u-boot.bl1.bin' % options.board]
547 bmpblk = ['--bmpblk', '##/build/%s/firmware/bmpblk.bin' % options.board]
548 ecro = ['--ecro', '##/build/%s/firmware/ec.RO.bin' % options.board]
549 ecrw = ['--ec', '##/build/%s/firmware/ec.RW.bin' % options.board]
550 defaults = ['-D']
551
552 if arch == 'x86':
553 seabios = ['--seabios',
554 '##/build/%s/firmware/seabios.cbfs' % options.board]
555 else:
556 seabios = []
557
558 if options.sdcard:
559 dest = 'sd:.'
560 elif arch == 'x86':
561 dest = 'em100'
562 elif arch == 'sandbox':
563 dest = ''
564 else:
565 dest = 'usb'
566
567 port = SERVO_PORT.get(options.board, '')
568 if port:
569 servo = ['--servo', '%d' % port]
570
571 if options.flash:
572 flash = ['-F', 'spi']
573
Simon Glass46411592013-07-22 22:35:01 -0600574 # The small builds don't have the command line interpreter so cannot
575 # run the magic flasher script. So use the standard U-Boot in this
576 # case.
577 if options.small:
Ralph Nathan446aee92015-03-23 14:44:56 -0700578 logging.warning('Using standard U-Boot as flasher')
Simon Glass46411592013-07-22 22:35:01 -0600579 flash += ['-U', '##/build/%s/firmware/u-boot.bin' % options.board]
580
Michael Prattc88035d2013-07-31 16:27:29 -0700581 if options.mmc:
582 flash = ['-F', 'sdmmc']
583
Simon Glass02741682013-05-26 07:07:58 -0700584 if options.verbose:
585 verbose_arg = ['-v', '%s' % options.verbose]
586
587 if options.secure:
588 secure += ['--bootsecure', '--bootcmd', 'vboot_twostop']
589
590 if not options.verified:
591 # Make a small image, without GBB, etc.
592 secure.append('-s')
593
594 if options.kernel:
595 kernel = ['--kernel', '##/build/%s/boot/vmlinux.uimg' % options.board]
596
597 if not options.console:
598 silent = ['--add-config-int', 'silent-console', '1']
599
600 if not options.run:
601 run = ['--bootcmd', 'none']
602
603 if arch != 'sandbox' and not in_chroot and servo:
604 if dest == 'usb':
Ralph Nathan446aee92015-03-23 14:44:56 -0700605 logging.warning('Image cannot be written to board')
Simon Glass02741682013-05-26 07:07:58 -0700606 dest = ''
607 servo = []
608 elif dest == 'em100':
Ralph Nathan446aee92015-03-23 14:44:56 -0700609 logging.warning('Please reset the board manually to boot firmware')
Simon Glass02741682013-05-26 07:07:58 -0700610 servo = []
611
612 if not servo:
Ralph Nathan446aee92015-03-23 14:44:56 -0700613 logging.warning('(sadly dut-control does not work outside chroot)')
Simon Glass02741682013-05-26 07:07:58 -0700614
615 if dest:
616 dest = ['-w', dest]
617 else:
618 dest = []
619
620 soc = SOCS.get(board)
621 if not soc:
622 soc = SOCS.get(uboard, '')
623 dt_name = DEFAULT_DTS.get(options.board, options.board)
624 dts_file = 'board/%s/dts/%s%s.dts' % (vendor, soc, dt_name)
625 Log('Device tree: %s' % dts_file)
626
627 if arch == 'sandbox':
628 uboot_fname = '%s/u-boot' % outdir
629 else:
630 uboot_fname = '%s/u-boot.bin' % outdir
631
Simon Glass46411592013-07-22 22:35:01 -0600632 if options.ro:
633 # RO U-Boot is passed through as blob 'ro-boot'. We use the standard
634 # ebuild one as RW.
635 # TODO(sjg@chromium.org): Option to build U-Boot a second time to get
636 # a fresh RW U-Boot.
Ralph Nathan446aee92015-03-23 14:44:56 -0700637 logging.warning('Using standard U-Boot for RW')
Simon Glass46411592013-07-22 22:35:01 -0600638 ro_uboot = ['--add-blob', 'ro-boot', uboot_fname]
639 uboot_fname = '##/build/%s/firmware/u-boot.bin' % options.board
Simon Glass02741682013-05-26 07:07:58 -0700640 cbf = ['%s/platform/dev/host/cros_bundle_firmware' % src_root,
641 '-b', options.board,
642 '-d', dts_file,
643 '-I', 'arch/%s/dts' % arch, '-I', 'cros/dts',
644 '-u', uboot_fname,
645 '-O', '%s/out' % outdir,
646 '-M', family]
647
648 for other in [bl1, bl2, bmpblk, defaults, dest, ecro, ecrw, flash, kernel,
Simon Glass46411592013-07-22 22:35:01 -0600649 run, seabios, secure, servo, silent, verbose_arg, ro_uboot]:
Simon Glass02741682013-05-26 07:07:58 -0700650 if other:
651 cbf += other
652 if options.cbfargs:
653 for item in options.cbfargs:
654 cbf += item.split(' ')
655 os.environ['PYTHONPATH'] = ('%s/platform/dev/host/lib:%s/..' %
656 (src_root, src_root))
657 Log(' '.join(cbf))
658 result = cros_build_lib.RunCommand(cbf, **kwargs)
659 if result.returncode:
660 cros_build_lib.Die('cros_bundle_firmware failed')
661
662 if not dest or not result.returncode:
Ralph Nathan03047282015-03-23 11:09:32 -0700663 logging.info('Image is available at %s/out/image.bin' % outdir)
Simon Glass02741682013-05-26 07:07:58 -0700664 else:
665 if result.returncode:
666 cros_build_lib.Die('Failed to write image to board')
667 else:
Ralph Nathan03047282015-03-23 11:09:32 -0700668 logging.info('Image written to board with %s' % ' '.join(dest + servo))
Simon Glass02741682013-05-26 07:07:58 -0700669
670
671def main(argv):
672 """Main function for script to build/write firmware.
673
674 Args:
675 argv: Program arguments.
676 """
Mike Frysinger4e91d822015-06-04 02:01:40 -0400677 options = ParseCmdline(argv)
Simon Glass02741682013-05-26 07:07:58 -0700678 base = SetupBuild(options)
679
680 with parallel.BackgroundTaskRunner(Dumper) as queue:
Mike Frysinger4e91d822015-06-04 02:01:40 -0400681 RunBuild(options, base, options.target, queue)
Simon Glass02741682013-05-26 07:07:58 -0700682
683 if options.write:
684 WriteFirmware(options)
685
686 if options.objdump:
687 Log('Writing diasssembly files')