blob: 87ee2541c1dde2415918563be047c2dbba704edb [file] [log] [blame]
#!/bin/bash
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# This utility writes a BIOS image to a tegra based board.
#
# Include common CrOS utilities.
. "/usr/lib/crosutils/common.sh"
get_default_board
# Command line options
DEFINE_string board "$DEFAULT_BOARD" "The name of the board to flash."
DEFINE_string variant "" "Board variant."
DEFINE_string bios "" "Path to bios image to write."
# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# Die on errors.
set -e
if [ -z "${FLAGS_board}" ]; then
error "--board required."
exit 1
fi
get_board_and_variant $FLAGS_board $FLAGS_variant
# If the user didn't specify a BIOS image to load then build the path from
# the chroot directory and the board/variant information provided. This works
# both inside and outside the chroot.
if [ -z "${FLAGS_bios}" ]; then
FLAGS_bios="/build/${BOARD_VARIANT}/u-boot/u-boot.bin"
info "Using BIOS image: ${FLAGS_bios}"
fi
if [ ! -e "${FLAGS_bios}" ]; then
error "No BIOS image found at: ${FLAGS_bios}"
exit
fi
# Search for the burn-u-boot directory in our overlay list. The first directory
# found should be sufficient because there should only be burn-u-boot
# directories at the board level.
OVERLAY_LIST=$(cros_overlay_list --board "${BOARD}" --variant "${VARIANT}")
for overlay in ${OVERLAY_LIST} ; do
if [ -d "${overlay}/burn-u-boot" ]; then
burn_u_boot="${overlay}/burn-u-boot"
break
fi
done
# Make sure that we have found a burn-u-boot directory and that the nvflash
# tool has been installed.
if [ ! -d "${burn_u_boot}" ]; then
error "No burn-u-boot directory found in the overlay list for this board:"
error "${OVERLAY_LIST}"
fi
if ! which nvflash >/dev/null ; then
error "The nvflash utility was not found. Run the following command in your"
error "chroot: sudo -E emerge nvflash"
exit
fi
# bootloader.bin is a special program used to burn things into flash
bin="${burn_u_boot}/bin/bootloader.bin"
# The BCT file contains memory timings, firmware offset and length and a
# checksum of the firmware image. The BCT file is the first data read out
# of reset by the masked ROM.
bct="${burn_u_boot}/bct/default.bct"
# this file describes the flash layout - it pulls in the boot loader file
cfg="${burn_u_boot}/flash.cfg"
# extract the ODM data from the <overlay>/burn-u-boot/data.odm file
odm=$(cat "${burn_u_boot}/data.odm")
# try to print a helpful name - the U-Boot version string
header=$(strings $FLAGS_bios | grep "U-Boot" | head -1 )
info "Using: $header"
# insert the correct file to flash into the nvflash configuration file.
temp=$(mktemp)
trap "rm -f ${temp}" EXIT
sed "s#^filename=.*\$#filename=${FLAGS_bios}#" $cfg > $temp
# Write the BCT + U-Boot + FDT Blob image to the boot device specified in the
# flash.cfg from the burn-u-boot directory.
sudo nvflash \
--bct "${bct}" \
--setbct \
--odmdata "${odm}" \
--configfile "${temp}" \
--create \
--bl "${bin}" \
--go
if [ $? != 0 ]; then
echo
error "Burn failed"
error "Please check that your board is connected via the A-to-A USB cable"
error "correctly. Also ensure that your board is in the NVIDIA force"
error "recovery mode. This is accomplished by holding down the 'recovery'"
error "button while resetting the board (either by power cycling or pressing"
error "'reset'. More information for your specific board can be found in"
error "the README.txt file in your boards overlay."
else
info "$header written"
info "Press reset to start your new U-Boot"
fi