Index: host/cros_write_firmware |
diff --git a/host/cros_write_firmware b/host/cros_write_firmware |
new file mode 100755 |
index 0000000000000000000000000000000000000000..ff93af80e1e0858f975c62e62b8e752e86efb226 |
--- /dev/null |
+++ b/host/cros_write_firmware |
@@ -0,0 +1,173 @@ |
+#!/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 firmware 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 firmware "" "Path to firmware image to write." |
+DEFINE_string flasher "" "Path to flasher image to use." |
+DEFINE_string bct "" "Path to bct image to write." |
+DEFINE_string map "" "Path to System.map file to read for load address." |
+DEFINE_string flash "" "Boot flash parameter file." |
+DEFINE_string config "" "Directory for temporary configuration files." |
+DEFINE_boolean sign $FLAGS_FALSE "Sign and append a BCT to the firmware image." |
+ |
+# Parse command line. |
+FLAGS "$@" || exit 1 |
+eval set -- "${FLAGS_ARGV}" |
+ |
+# Die on errors. |
+set -e |
+ |
+CROS_LOG_PREFIX="cros_write_firmware" |
+ |
+if [ -z "${FLAGS_board}" ]; then |
+ error "--board required." |
+ exit 1 |
+fi |
+ |
+get_board_and_variant $FLAGS_board $FLAGS_variant |
+ |
+# Display the U-Boot version string. |
+function show_u_boot_info() { |
+ local firmware=$1 |
+ local header=$(strings "${firmware}" | grep "U-Boot" | head -1 ) |
+ |
+ info "Using ${header}" |
+} |
+ |
+# Given two values in decimal format return the first value rounded up to a |
+# multiple of the second value. The second value must be a power of two. |
+function round() { |
+ awk "BEGIN { print and(($1 + $2 - 1), compl($2 - 1)) }" |
+} |
+ |
+# Given a value in decimal format return that value converted to hexidecimal |
+# and formatted as 0xXXXXXXXX. |
+function to_hex() { |
+ awk "BEGIN { printf \"0x%x\", $1 }" |
+} |
+ |
+# Create the flashing script. This script will be loaded and run by the flasher |
+# build of U-Boot. Most of the script is constant, we just need to append the |
+# sizes and address of the payload. |
+# |
+# TODO(robotboy): Compute the address from the text_base (0xe08000) + |
+# flasher image size (0x40000) + script block (0x1000) |
+function make_flashing_script() { |
+ local firmware=$1 |
+ local firmware_size=$(stat -c"%s" "${firmware}") |
+ |
+ echo "setenv address 0xe49000" |
+ echo "setenv firmware_size $(to_hex ${firmware_size})" |
+ echo "setenv length $(to_hex $(round ${firmware_size} 4096))" |
+ |
+ cat /usr/share/cros_write_firmware/spi.script |
+} |
+ |
+# Parse the System.map file generated by the U-Boot build to get the entry |
+# point address. |
+function get_text_base() { |
+ local map=$1 |
+ |
+ grep -m1 -E "^[0-9a-fA-F]{8} T _start$" ${map} | cut -d " " -f 1 |
+} |
+ |
+############################################################################### |
+ |
+u_boot="/build/${BOARD_VARIANT}/u-boot" |
+ |
+# Generate default values for the firmware, flasher, BCT, map and flash config |
+# file paths from the board and variant information provided. |
+firmware=${FLAGS_firmware:-"${u_boot}/image.bin"} |
+flasher=${FLAGS_flasher:-"${u_boot}/u-boot-flasher.bin"} |
+bct=${FLAGS_bct:-"${u_boot}/board.bct"} |
+map=${FLAGS_map:-"${u_boot}/System.map"} |
+flash=${FLAGS_flash:-"${u_boot}/flash.cfg"} |
+ |
+# Extract the load and entry point for U-Boot. |
+text_base="0x$(get_text_base "${map}")" |
+ |
+# Verify that all of the files and tools we will need are present. |
+check_for_file "firmware" " " "${firmware}" |
+check_for_file "flasher" " " "${flasher}" |
+check_for_file "BCT" " " "${bct}" |
+check_for_file "map" " " "${map}" |
+check_for_file "flash" " " "${flash}" |
+ |
+check_for_tool "nvflash" "nvflash" |
+ |
+show_u_boot_info "${firmware}" |
+ |
+# If the user has not specified a config directory then create one on the fly |
+# and remove it when we are done. |
+if [ -z "${FLAGS_config}" ]; then |
+ config=$(mktemp -d) |
+ |
+ trap "rm -rf ${config}" EXIT |
+else |
+ mkdir -p "${FLAGS_config}" |
+ |
+ config=${FLAGS_config} |
+fi |
+ |
+# Optionally sign the firmware. This is usefull if you want to write a bare |
+# U-Boot to SPI and boot with that instead of a fully build ChromiumOS firmware |
+# image. |
+if [ $FLAGS_sign -eq $FLAGS_TRUE ]; then |
+ signed_firmware=${config}/signed.bin |
+ |
+ cros_sign_bootstub \ |
+ --bct "${bct}" \ |
+ --flash "${flash}" \ |
+ --bootstub "${firmware}" \ |
+ --output "${signed_firmware}" \ |
+ --config "${config}" \ |
+ --text_base "${text_base}" |
+else |
+ signed_firmware=${firmware} |
+fi |
+ |
+# Create the flashing script and turn it into a U-Boot uImage. |
+make_flashing_script "${signed_firmware}" > ${config}/script |
+ |
+mkimage -A arm -T script -d ${config}/script ${config}/script.uimg > /dev/null |
+ |
+# Construct RAM image of flasher + script + firmware. The firmware should |
+# already be signed by cbootimage. The RAM image has a fixed 256K partition |
+# for the flasher, followed by the script and payload to be written. |
+dd if="${flasher}" of="${config}/image" &> /dev/null |
+dd if="${config}/script.uimg" of="${config}/image" seek=512 &> /dev/null |
+dd if="${signed_firmware}" of="${config}/image" seek=520 &> /dev/null |
+ |
+# Write the RAM image image to the board. The flasher will write the payload |
+# into the boot device. The warning below about the failure is due to the |
+# way that we are using nvflash. It expects to be able to talk to the flashing |
+# bootloader that is passed down, but U-Boot doesn't talk back the way |
+# bootloader.bin did, and nvflash complains. |
+sudo nvflash \ |
+ --configfile /usr/share/cros_write_firmware/nvflash-spi.cfg \ |
+ --bct "${bct}" \ |
+ --setbct \ |
+ --bl "${config}/image" \ |
+ --go \ |
+ --setentry "${text_base}" "${text_base}" || |
+ warn "The above 'command failure: go failed' can be ignored." |
+ |
+# TODO(robotboy): Make a U-Boot tool that can compute the same checksum on |
+# the host and display it here. Unfortunately U-Boot uses a slightly different |
+# crc32 than zlib, so it's not possible to use zlib's crc32 to do this. It has |
+# to be done by building a tool that uses U-Boots version. |
+info "The serial terminal or LCD panel should show before and after CRCs of" |
+info "the image written to the boot flash. If these values match each other" |
+info "your flash was probably successful." |