| #!/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 |