blob: 5bc590c21c380708fb636f57ff2a9f460be4454b [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')
271 parser.add_argument('target', nargs='?',
272 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')
394
395 if options.ro and options.rw:
396 cros_build_lib.Die('Cannot specify both --ro and --rw options')
397 if options.ro:
398 base.append('CROS_RO=1')
399 options.small = True
400
401 if options.rw:
402 base.append('CROS_RW=1')
403 options.small = True
404
405 if options.small:
406 base.append('CROS_SMALL=1')
407 else:
408 base.append('CROS_FULL=1')
409
410 if options.verified:
411 base += [
412 'VBOOT=%s' % vboot,
413 'MAKEFLAGS_VBOOT=DEBUG=1',
414 'QUIET=1',
415 'CFLAGS_EXTRA_VBOOT=-DUNROLL_LOOPS',
416 'VBOOT_SOURCE=%s/platform/vboot_reference' % src_root]
Simon Glass9d9bf942013-07-10 16:32:42 -0700417 base.append('VBOOT_DEBUG=1')
Simon Glass02741682013-05-26 07:07:58 -0700418
419 # Handle the Chrome OS USE_STDINT workaround. Vboot needs <stdint.h> due
420 # to a recent change, the need for which I didn't fully understand. But
421 # U-Boot doesn't normally use this. We have added an option to U-Boot to
422 # enable use of <stdint.h> and without it vboot will fail to build. So we
423 # need to enable it where ww can. We can't just enable it always since
424 # that would prevent this script from building other non-Chrome OS boards
425 # with a different (older) toolchain, or Chrome OS boards without vboot.
426 # So use USE_STDINT if the toolchain supports it, and not if not. This
427 # file was originally part of glibc but has recently migrated to the
428 # compiler so it is reasonable to use it with a stand-alone program like
429 # U-Boot. At this point the comment has got long enough that we may as
430 # well include some poetry which seems to be sorely lacking the code base,
431 # so this is from Ogden Nash:
432 # To keep your marriage brimming
433 # With love in the loving cup,
434 # Whenever you're wrong, admit it;
435 # Whenever you're right, shut up.
436 cmd = [CompilerTool('gcc'), '-ffreestanding', '-x', 'c', '-c', '-']
Yu-Ju Hong3add4432014-01-30 11:46:15 -0800437 result = cros_build_lib.RunCommand(cmd,
438 input='#include <stdint.h>',
439 capture_output=True,
440 **kwargs)
Simon Glass02741682013-05-26 07:07:58 -0700441 if result.returncode == 0:
442 base.append('USE_STDINT=1')
443
444 if options.trace:
445 base.append('FTRACE=1')
446 if options.separate:
447 base.append('DEV_TREE_SEPARATE=1')
448
449 if options.incremental:
450 # Get the correct board for cros_write_firmware
451 config_mk = '%s/include/config.mk' % outdir
452 if not os.path.exists(config_mk):
Ralph Nathan446aee92015-03-23 14:44:56 -0700453 logging.warning('No build found for %s - dropping -i' % board)
Simon Glass02741682013-05-26 07:07:58 -0700454 options.incremental = False
455
456 config_mk = 'include/config.mk'
457 if os.path.exists(config_mk):
Ralph Nathan446aee92015-03-23 14:44:56 -0700458 logging.warning("Warning: '%s' exists, try 'make distclean'" % config_mk)
Simon Glass02741682013-05-26 07:07:58 -0700459
460 # For when U-Boot supports ccache
461 # See http://patchwork.ozlabs.org/patch/245079/
462 if use_ccache:
463 os.environ['CCACHE'] = 'ccache'
464
465 return base
466
467
468def RunBuild(options, base, target, queue):
469 """Run the U-Boot build.
470
471 Args:
472 options: Command line options.
473 base: Base U-Boot flags.
474 target: Target to build.
475 queue: A parallel queue to add jobs to.
476 """
477 Log('U-Boot build flags: %s' % ' '.join(base))
478
479 # Reconfigure U-Boot.
480 if not options.incremental:
481 # Ignore any error from this, some older U-Boots fail on this.
482 cros_build_lib.RunCommand(base + ['distclean'], **kwargs)
483 result = cros_build_lib.RunCommand(base + ['%s_config' % uboard], **kwargs)
484 if result.returncode:
485 sys.exit()
486
487 # Do the actual build.
488 if options.build:
489 result = cros_build_lib.RunCommand(base + [target], **kwargs)
490 if result.returncode:
491 sys.exit()
492
493 files = ['%s/u-boot' % outdir]
494 spl = glob.glob('%s/spl/u-boot-spl' % outdir)
495 if spl:
496 files += spl
497 if options.size:
Simon Glassc7d266d2013-07-18 15:15:57 -0600498 result = cros_build_lib.RunCommand([CompilerTool('size')] + files,
499 **kwargs)
Simon Glass02741682013-05-26 07:07:58 -0700500 if result.returncode:
501 sys.exit()
502
503 # Create disassembly files .dis and .Dis (full dump)
504 for f in files:
505 base = os.path.splitext(f)[0]
506 if options.objdump:
507 queue.put(('-d', f, base + '.dis'))
508 queue.put(('-D', f, base + '.Dis'))
509 else:
510 # Remove old files which otherwise might be confusing
511 osutils.SafeUnlink(base + '.dis')
512 osutils.SafeUnlink(base + '.Dis')
513
514 Log('Output directory %s' % outdir)
515
516
517def WriteFirmware(options):
518 """Write firmware to the board.
519
520 This uses cros_bundle_firmware to create a firmware image and write it to
521 the board.
522
523 Args:
524 options: Command line options
525 """
526 flash = []
527 kernel = []
528 run = []
529 secure = []
530 servo = []
531 silent = []
532 verbose_arg = []
Simon Glass46411592013-07-22 22:35:01 -0600533 ro_uboot = []
Simon Glass02741682013-05-26 07:07:58 -0700534
535 bl2 = ['--bl2', '%s/spl/%s-spl.bin' % (outdir, smdk)]
536
537 if options.use_defaults:
538 bl1 = []
539 bmpblk = []
540 ecro = []
541 ecrw = []
542 defaults = []
543 else:
544 bl1 = ['--bl1', '##/build/%s/firmware/u-boot.bl1.bin' % options.board]
545 bmpblk = ['--bmpblk', '##/build/%s/firmware/bmpblk.bin' % options.board]
546 ecro = ['--ecro', '##/build/%s/firmware/ec.RO.bin' % options.board]
547 ecrw = ['--ec', '##/build/%s/firmware/ec.RW.bin' % options.board]
548 defaults = ['-D']
549
550 if arch == 'x86':
551 seabios = ['--seabios',
552 '##/build/%s/firmware/seabios.cbfs' % options.board]
553 else:
554 seabios = []
555
556 if options.sdcard:
557 dest = 'sd:.'
558 elif arch == 'x86':
559 dest = 'em100'
560 elif arch == 'sandbox':
561 dest = ''
562 else:
563 dest = 'usb'
564
565 port = SERVO_PORT.get(options.board, '')
566 if port:
567 servo = ['--servo', '%d' % port]
568
569 if options.flash:
570 flash = ['-F', 'spi']
571
Simon Glass46411592013-07-22 22:35:01 -0600572 # The small builds don't have the command line interpreter so cannot
573 # run the magic flasher script. So use the standard U-Boot in this
574 # case.
575 if options.small:
Ralph Nathan446aee92015-03-23 14:44:56 -0700576 logging.warning('Using standard U-Boot as flasher')
Simon Glass46411592013-07-22 22:35:01 -0600577 flash += ['-U', '##/build/%s/firmware/u-boot.bin' % options.board]
578
Michael Prattc88035d2013-07-31 16:27:29 -0700579 if options.mmc:
580 flash = ['-F', 'sdmmc']
581
Simon Glass02741682013-05-26 07:07:58 -0700582 if options.verbose:
583 verbose_arg = ['-v', '%s' % options.verbose]
584
585 if options.secure:
586 secure += ['--bootsecure', '--bootcmd', 'vboot_twostop']
587
588 if not options.verified:
589 # Make a small image, without GBB, etc.
590 secure.append('-s')
591
592 if options.kernel:
593 kernel = ['--kernel', '##/build/%s/boot/vmlinux.uimg' % options.board]
594
595 if not options.console:
596 silent = ['--add-config-int', 'silent-console', '1']
597
598 if not options.run:
599 run = ['--bootcmd', 'none']
600
601 if arch != 'sandbox' and not in_chroot and servo:
602 if dest == 'usb':
Ralph Nathan446aee92015-03-23 14:44:56 -0700603 logging.warning('Image cannot be written to board')
Simon Glass02741682013-05-26 07:07:58 -0700604 dest = ''
605 servo = []
606 elif dest == 'em100':
Ralph Nathan446aee92015-03-23 14:44:56 -0700607 logging.warning('Please reset the board manually to boot firmware')
Simon Glass02741682013-05-26 07:07:58 -0700608 servo = []
609
610 if not servo:
Ralph Nathan446aee92015-03-23 14:44:56 -0700611 logging.warning('(sadly dut-control does not work outside chroot)')
Simon Glass02741682013-05-26 07:07:58 -0700612
613 if dest:
614 dest = ['-w', dest]
615 else:
616 dest = []
617
618 soc = SOCS.get(board)
619 if not soc:
620 soc = SOCS.get(uboard, '')
621 dt_name = DEFAULT_DTS.get(options.board, options.board)
622 dts_file = 'board/%s/dts/%s%s.dts' % (vendor, soc, dt_name)
623 Log('Device tree: %s' % dts_file)
624
625 if arch == 'sandbox':
626 uboot_fname = '%s/u-boot' % outdir
627 else:
628 uboot_fname = '%s/u-boot.bin' % outdir
629
Simon Glass46411592013-07-22 22:35:01 -0600630 if options.ro:
631 # RO U-Boot is passed through as blob 'ro-boot'. We use the standard
632 # ebuild one as RW.
633 # TODO(sjg@chromium.org): Option to build U-Boot a second time to get
634 # a fresh RW U-Boot.
Ralph Nathan446aee92015-03-23 14:44:56 -0700635 logging.warning('Using standard U-Boot for RW')
Simon Glass46411592013-07-22 22:35:01 -0600636 ro_uboot = ['--add-blob', 'ro-boot', uboot_fname]
637 uboot_fname = '##/build/%s/firmware/u-boot.bin' % options.board
Simon Glass02741682013-05-26 07:07:58 -0700638 cbf = ['%s/platform/dev/host/cros_bundle_firmware' % src_root,
639 '-b', options.board,
640 '-d', dts_file,
641 '-I', 'arch/%s/dts' % arch, '-I', 'cros/dts',
642 '-u', uboot_fname,
643 '-O', '%s/out' % outdir,
644 '-M', family]
645
646 for other in [bl1, bl2, bmpblk, defaults, dest, ecro, ecrw, flash, kernel,
Simon Glass46411592013-07-22 22:35:01 -0600647 run, seabios, secure, servo, silent, verbose_arg, ro_uboot]:
Simon Glass02741682013-05-26 07:07:58 -0700648 if other:
649 cbf += other
650 if options.cbfargs:
651 for item in options.cbfargs:
652 cbf += item.split(' ')
653 os.environ['PYTHONPATH'] = ('%s/platform/dev/host/lib:%s/..' %
654 (src_root, src_root))
655 Log(' '.join(cbf))
656 result = cros_build_lib.RunCommand(cbf, **kwargs)
657 if result.returncode:
658 cros_build_lib.Die('cros_bundle_firmware failed')
659
660 if not dest or not result.returncode:
Ralph Nathan03047282015-03-23 11:09:32 -0700661 logging.info('Image is available at %s/out/image.bin' % outdir)
Simon Glass02741682013-05-26 07:07:58 -0700662 else:
663 if result.returncode:
664 cros_build_lib.Die('Failed to write image to board')
665 else:
Ralph Nathan03047282015-03-23 11:09:32 -0700666 logging.info('Image written to board with %s' % ' '.join(dest + servo))
Simon Glass02741682013-05-26 07:07:58 -0700667
668
669def main(argv):
670 """Main function for script to build/write firmware.
671
672 Args:
673 argv: Program arguments.
674 """
Mike Frysinger4e91d822015-06-04 02:01:40 -0400675 options = ParseCmdline(argv)
Simon Glass02741682013-05-26 07:07:58 -0700676 base = SetupBuild(options)
677
678 with parallel.BackgroundTaskRunner(Dumper) as queue:
Mike Frysinger4e91d822015-06-04 02:01:40 -0400679 RunBuild(options, base, options.target, queue)
Simon Glass02741682013-05-26 07:07:58 -0700680
681 if options.write:
682 WriteFirmware(options)
683
684 if options.objdump:
685 Log('Writing diasssembly files')