blob: ebf1d0a6388292348e5edfe09b34a884f19d18a7 [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
321 with open('boards.cfg') as f:
322 for line in f:
323 if uboard in line:
324 if line[0] == '#':
325 continue
326 fields = line.split()
327 if not fields:
328 continue
329 arch = fields[1]
330 fields += [None, None, None]
331 smdk = fields[3]
332 vendor = fields[4]
333 family = fields[5]
334 break
335 if not arch:
336 cros_build_lib.Die("Selected board '%s' not found in boards.cfg." % board)
337
338 vboot = os.path.join('build', board, 'usr')
339 if arch == 'x86':
340 family = 'em100'
341 if in_chroot:
342 compiler = 'i686-pc-linux-gnu-'
343 else:
344 compiler = '/opt/i686/bin/i686-unknown-elf-'
345 elif arch == 'arm':
346 if in_chroot:
347 # Use the Chrome OS toolchain
348 compiler = 'armv7a-cros-linux-gnueabi-'
349 else:
350 compiler = glob.glob('/opt/linaro/gcc-linaro-arm-linux-*/bin/*gcc')
351 if not compiler:
352 cros_build_lib.Die("""Please install an ARM toolchain for your machine.
353'Install a Linaro toolchain from:'
354'https://launchpad.net/linaro-toolchain-binaries'
355'or see cros/commands/cros_chrome_sdk.py.""")
356 compiler = compiler[0]
357 compiler = re.sub('gcc$', '', compiler)
358 elif arch == 'sandbox':
359 compiler = ''
360 else:
361 cros_build_lib.Die("Selected arch '%s' not supported." % arch)
362
363 if not options.build:
364 options.incremental = True
365
366 cpus = multiprocessing.cpu_count()
367
Simon Glassb89ae892013-07-18 15:23:35 -0600368 outdir = os.path.join(OUT_DIR, uboard)
Simon Glass02741682013-05-26 07:07:58 -0700369 base = [
370 'make',
371 '-j%d' % cpus,
372 'O=%s' % outdir,
373 'ARCH=%s' % arch,
374 'CROSS_COMPILE=%s' % compiler,
375 '--no-print-directory',
376 'HOSTSTRIP=true',
377 'DEV_TREE_SRC=%s-%s' % (family, options.dt),
378 'QEMU_ARCH=']
379
380 if options.verbose < 2:
381 base.append('-s')
382
383 if options.ro and options.rw:
384 cros_build_lib.Die('Cannot specify both --ro and --rw options')
385 if options.ro:
386 base.append('CROS_RO=1')
387 options.small = True
388
389 if options.rw:
390 base.append('CROS_RW=1')
391 options.small = True
392
393 if options.small:
394 base.append('CROS_SMALL=1')
395 else:
396 base.append('CROS_FULL=1')
397
398 if options.verified:
399 base += [
400 'VBOOT=%s' % vboot,
401 'MAKEFLAGS_VBOOT=DEBUG=1',
402 'QUIET=1',
403 'CFLAGS_EXTRA_VBOOT=-DUNROLL_LOOPS',
404 'VBOOT_SOURCE=%s/platform/vboot_reference' % src_root]
Simon Glass9d9bf942013-07-10 16:32:42 -0700405 base.append('VBOOT_DEBUG=1')
Simon Glass02741682013-05-26 07:07:58 -0700406
407 # Handle the Chrome OS USE_STDINT workaround. Vboot needs <stdint.h> due
408 # to a recent change, the need for which I didn't fully understand. But
409 # U-Boot doesn't normally use this. We have added an option to U-Boot to
410 # enable use of <stdint.h> and without it vboot will fail to build. So we
411 # need to enable it where ww can. We can't just enable it always since
412 # that would prevent this script from building other non-Chrome OS boards
413 # with a different (older) toolchain, or Chrome OS boards without vboot.
414 # So use USE_STDINT if the toolchain supports it, and not if not. This
415 # file was originally part of glibc but has recently migrated to the
416 # compiler so it is reasonable to use it with a stand-alone program like
417 # U-Boot. At this point the comment has got long enough that we may as
418 # well include some poetry which seems to be sorely lacking the code base,
419 # so this is from Ogden Nash:
420 # To keep your marriage brimming
421 # With love in the loving cup,
422 # Whenever you're wrong, admit it;
423 # Whenever you're right, shut up.
424 cmd = [CompilerTool('gcc'), '-ffreestanding', '-x', 'c', '-c', '-']
Yu-Ju Hong3add4432014-01-30 11:46:15 -0800425 result = cros_build_lib.RunCommand(cmd,
426 input='#include <stdint.h>',
427 capture_output=True,
428 **kwargs)
Simon Glass02741682013-05-26 07:07:58 -0700429 if result.returncode == 0:
430 base.append('USE_STDINT=1')
431
432 if options.trace:
433 base.append('FTRACE=1')
434 if options.separate:
435 base.append('DEV_TREE_SEPARATE=1')
436
437 if options.incremental:
438 # Get the correct board for cros_write_firmware
439 config_mk = '%s/include/config.mk' % outdir
440 if not os.path.exists(config_mk):
Ralph Nathan446aee92015-03-23 14:44:56 -0700441 logging.warning('No build found for %s - dropping -i' % board)
Simon Glass02741682013-05-26 07:07:58 -0700442 options.incremental = False
443
444 config_mk = 'include/config.mk'
445 if os.path.exists(config_mk):
Ralph Nathan446aee92015-03-23 14:44:56 -0700446 logging.warning("Warning: '%s' exists, try 'make distclean'" % config_mk)
Simon Glass02741682013-05-26 07:07:58 -0700447
448 # For when U-Boot supports ccache
449 # See http://patchwork.ozlabs.org/patch/245079/
450 if use_ccache:
451 os.environ['CCACHE'] = 'ccache'
452
453 return base
454
455
456def RunBuild(options, base, target, queue):
457 """Run the U-Boot build.
458
459 Args:
460 options: Command line options.
461 base: Base U-Boot flags.
462 target: Target to build.
463 queue: A parallel queue to add jobs to.
464 """
465 Log('U-Boot build flags: %s' % ' '.join(base))
466
467 # Reconfigure U-Boot.
468 if not options.incremental:
469 # Ignore any error from this, some older U-Boots fail on this.
470 cros_build_lib.RunCommand(base + ['distclean'], **kwargs)
471 result = cros_build_lib.RunCommand(base + ['%s_config' % uboard], **kwargs)
472 if result.returncode:
473 sys.exit()
474
475 # Do the actual build.
476 if options.build:
477 result = cros_build_lib.RunCommand(base + [target], **kwargs)
478 if result.returncode:
479 sys.exit()
480
481 files = ['%s/u-boot' % outdir]
482 spl = glob.glob('%s/spl/u-boot-spl' % outdir)
483 if spl:
484 files += spl
485 if options.size:
Simon Glassc7d266d2013-07-18 15:15:57 -0600486 result = cros_build_lib.RunCommand([CompilerTool('size')] + files,
487 **kwargs)
Simon Glass02741682013-05-26 07:07:58 -0700488 if result.returncode:
489 sys.exit()
490
491 # Create disassembly files .dis and .Dis (full dump)
492 for f in files:
493 base = os.path.splitext(f)[0]
494 if options.objdump:
495 queue.put(('-d', f, base + '.dis'))
496 queue.put(('-D', f, base + '.Dis'))
497 else:
498 # Remove old files which otherwise might be confusing
499 osutils.SafeUnlink(base + '.dis')
500 osutils.SafeUnlink(base + '.Dis')
501
502 Log('Output directory %s' % outdir)
503
504
505def WriteFirmware(options):
506 """Write firmware to the board.
507
508 This uses cros_bundle_firmware to create a firmware image and write it to
509 the board.
510
511 Args:
512 options: Command line options
513 """
514 flash = []
515 kernel = []
516 run = []
517 secure = []
518 servo = []
519 silent = []
520 verbose_arg = []
Simon Glass46411592013-07-22 22:35:01 -0600521 ro_uboot = []
Simon Glass02741682013-05-26 07:07:58 -0700522
523 bl2 = ['--bl2', '%s/spl/%s-spl.bin' % (outdir, smdk)]
524
525 if options.use_defaults:
526 bl1 = []
527 bmpblk = []
528 ecro = []
529 ecrw = []
530 defaults = []
531 else:
532 bl1 = ['--bl1', '##/build/%s/firmware/u-boot.bl1.bin' % options.board]
533 bmpblk = ['--bmpblk', '##/build/%s/firmware/bmpblk.bin' % options.board]
534 ecro = ['--ecro', '##/build/%s/firmware/ec.RO.bin' % options.board]
535 ecrw = ['--ec', '##/build/%s/firmware/ec.RW.bin' % options.board]
536 defaults = ['-D']
537
538 if arch == 'x86':
539 seabios = ['--seabios',
540 '##/build/%s/firmware/seabios.cbfs' % options.board]
541 else:
542 seabios = []
543
544 if options.sdcard:
545 dest = 'sd:.'
546 elif arch == 'x86':
547 dest = 'em100'
548 elif arch == 'sandbox':
549 dest = ''
550 else:
551 dest = 'usb'
552
553 port = SERVO_PORT.get(options.board, '')
554 if port:
555 servo = ['--servo', '%d' % port]
556
557 if options.flash:
558 flash = ['-F', 'spi']
559
Simon Glass46411592013-07-22 22:35:01 -0600560 # The small builds don't have the command line interpreter so cannot
561 # run the magic flasher script. So use the standard U-Boot in this
562 # case.
563 if options.small:
Ralph Nathan446aee92015-03-23 14:44:56 -0700564 logging.warning('Using standard U-Boot as flasher')
Simon Glass46411592013-07-22 22:35:01 -0600565 flash += ['-U', '##/build/%s/firmware/u-boot.bin' % options.board]
566
Michael Prattc88035d2013-07-31 16:27:29 -0700567 if options.mmc:
568 flash = ['-F', 'sdmmc']
569
Simon Glass02741682013-05-26 07:07:58 -0700570 if options.verbose:
571 verbose_arg = ['-v', '%s' % options.verbose]
572
573 if options.secure:
574 secure += ['--bootsecure', '--bootcmd', 'vboot_twostop']
575
576 if not options.verified:
577 # Make a small image, without GBB, etc.
578 secure.append('-s')
579
580 if options.kernel:
581 kernel = ['--kernel', '##/build/%s/boot/vmlinux.uimg' % options.board]
582
583 if not options.console:
584 silent = ['--add-config-int', 'silent-console', '1']
585
586 if not options.run:
587 run = ['--bootcmd', 'none']
588
589 if arch != 'sandbox' and not in_chroot and servo:
590 if dest == 'usb':
Ralph Nathan446aee92015-03-23 14:44:56 -0700591 logging.warning('Image cannot be written to board')
Simon Glass02741682013-05-26 07:07:58 -0700592 dest = ''
593 servo = []
594 elif dest == 'em100':
Ralph Nathan446aee92015-03-23 14:44:56 -0700595 logging.warning('Please reset the board manually to boot firmware')
Simon Glass02741682013-05-26 07:07:58 -0700596 servo = []
597
598 if not servo:
Ralph Nathan446aee92015-03-23 14:44:56 -0700599 logging.warning('(sadly dut-control does not work outside chroot)')
Simon Glass02741682013-05-26 07:07:58 -0700600
601 if dest:
602 dest = ['-w', dest]
603 else:
604 dest = []
605
606 soc = SOCS.get(board)
607 if not soc:
608 soc = SOCS.get(uboard, '')
609 dt_name = DEFAULT_DTS.get(options.board, options.board)
610 dts_file = 'board/%s/dts/%s%s.dts' % (vendor, soc, dt_name)
611 Log('Device tree: %s' % dts_file)
612
613 if arch == 'sandbox':
614 uboot_fname = '%s/u-boot' % outdir
615 else:
616 uboot_fname = '%s/u-boot.bin' % outdir
617
Simon Glass46411592013-07-22 22:35:01 -0600618 if options.ro:
619 # RO U-Boot is passed through as blob 'ro-boot'. We use the standard
620 # ebuild one as RW.
621 # TODO(sjg@chromium.org): Option to build U-Boot a second time to get
622 # a fresh RW U-Boot.
Ralph Nathan446aee92015-03-23 14:44:56 -0700623 logging.warning('Using standard U-Boot for RW')
Simon Glass46411592013-07-22 22:35:01 -0600624 ro_uboot = ['--add-blob', 'ro-boot', uboot_fname]
625 uboot_fname = '##/build/%s/firmware/u-boot.bin' % options.board
Simon Glass02741682013-05-26 07:07:58 -0700626 cbf = ['%s/platform/dev/host/cros_bundle_firmware' % src_root,
627 '-b', options.board,
628 '-d', dts_file,
629 '-I', 'arch/%s/dts' % arch, '-I', 'cros/dts',
630 '-u', uboot_fname,
631 '-O', '%s/out' % outdir,
632 '-M', family]
633
634 for other in [bl1, bl2, bmpblk, defaults, dest, ecro, ecrw, flash, kernel,
Simon Glass46411592013-07-22 22:35:01 -0600635 run, seabios, secure, servo, silent, verbose_arg, ro_uboot]:
Simon Glass02741682013-05-26 07:07:58 -0700636 if other:
637 cbf += other
638 if options.cbfargs:
639 for item in options.cbfargs:
640 cbf += item.split(' ')
641 os.environ['PYTHONPATH'] = ('%s/platform/dev/host/lib:%s/..' %
642 (src_root, src_root))
643 Log(' '.join(cbf))
644 result = cros_build_lib.RunCommand(cbf, **kwargs)
645 if result.returncode:
646 cros_build_lib.Die('cros_bundle_firmware failed')
647
648 if not dest or not result.returncode:
Ralph Nathan03047282015-03-23 11:09:32 -0700649 logging.info('Image is available at %s/out/image.bin' % outdir)
Simon Glass02741682013-05-26 07:07:58 -0700650 else:
651 if result.returncode:
652 cros_build_lib.Die('Failed to write image to board')
653 else:
Ralph Nathan03047282015-03-23 11:09:32 -0700654 logging.info('Image written to board with %s' % ' '.join(dest + servo))
Simon Glass02741682013-05-26 07:07:58 -0700655
656
657def main(argv):
658 """Main function for script to build/write firmware.
659
660 Args:
661 argv: Program arguments.
662 """
Mike Frysinger4e91d822015-06-04 02:01:40 -0400663 options = ParseCmdline(argv)
Simon Glass02741682013-05-26 07:07:58 -0700664 base = SetupBuild(options)
665
666 with parallel.BackgroundTaskRunner(Dumper) as queue:
Mike Frysinger4e91d822015-06-04 02:01:40 -0400667 RunBuild(options, base, options.target, queue)
Simon Glass02741682013-05-26 07:07:58 -0700668
669 if options.write:
670 WriteFirmware(options)
671
672 if options.objdump:
673 Log('Writing diasssembly files')