Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: host/cros_write_firmware

Issue 6594134: Create new cros_write_firmware tool based on write_tegra_bios. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/dev-util.git@master
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 #!/bin/bash
2
3 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 # This utility writes a firmware image to a tegra based board.
8
9 # Include common CrOS utilities.
10 . "/usr/lib/crosutils/common.sh"
11
12 get_default_board
13
14 # Command line options
15 DEFINE_string board "${DEFAULT_BOARD}" "The name of the board to flash."
16 DEFINE_string variant "" "Board variant."
17 DEFINE_string firmware "" "Path to firmware image to write."
18 DEFINE_string flasher "" "Path to flasher image to use."
19 DEFINE_string bct "" "Path to bct image to write."
20 DEFINE_string map "" "Path to System.map file to read for load address."
21 DEFINE_string flash "" "Boot flash parameter file."
22 DEFINE_string config "" "Directory for temporary configuration files."
23 DEFINE_boolean sign $FLAGS_FALSE "Sign and append a BCT to the firmware image."
24
25 # Parse command line.
26 FLAGS "$@" || exit 1
27 eval set -- "${FLAGS_ARGV}"
28
29 # Die on errors.
30 set -e
31
32 CROS_LOG_PREFIX="cros_write_firmware"
33
34 if [ -z "${FLAGS_board}" ]; then
35 error "--board required."
36 exit 1
37 fi
38
39 get_board_and_variant $FLAGS_board $FLAGS_variant
40
41 # Display the U-Boot version string.
42 function show_u_boot_info() {
43 local firmware=$1
44 local header=$(strings "${firmware}" | grep "U-Boot" | head -1 )
45
46 info "Using ${header}"
47 }
48
49 # Given two values in decimal format return the first value rounded up to a
50 # multiple of the second value. The second value must be a power of two.
51 function round() {
52 awk "BEGIN { print and(($1 + $2 - 1), compl($2 - 1)) }"
53 }
54
55 # Given a value in decimal format return that value converted to hexidecimal
56 # and formatted as 0xXXXXXXXX.
57 function to_hex() {
58 awk "BEGIN { printf \"0x%x\", $1 }"
59 }
60
61 # Create the flashing script. This script will be loaded and run by the flasher
62 # build of U-Boot. Most of the script is constant, we just need to append the
63 # sizes and address of the payload.
64 #
65 # TODO(robotboy): Compute the address from the text_base (0xe08000) +
66 # flasher image size (0x40000) + script block (0x1000)
67 function make_flashing_script() {
68 local firmware=$1
69 local firmware_size=$(stat -c"%s" "${firmware}")
70
71 echo "setenv address 0xe49000"
vb 2011/03/04 00:58:31 where does this number come from? Can it be derive
robotboy 2011/03/04 16:58:57 The TODO in the description of the function above
72 echo "setenv firmware_size $(to_hex ${firmware_size})"
73 echo "setenv length $(to_hex $(round ${firmware_size} 4096))"
74
75 cat /usr/share/cros_write_firmware/spi.script
76 }
77
78 # Parse the System.map file generated by the U-Boot build to get the entry
79 # point address.
80 function get_text_base() {
81 local map=$1
82
83 grep -m1 -E "^[0-9a-fA-F]{8} T _start$" ${map} | cut -d " " -f 1
84 }
85
86 ###############################################################################
87
88 u_boot="/build/${BOARD_VARIANT}/u-boot"
89
90 # Generate default values for the firmware, flasher, BCT, map and flash config
91 # file paths from the board and variant information provided.
92 firmware=${FLAGS_firmware:-"${u_boot}/image.bin"}
93 flasher=${FLAGS_flasher:-"${u_boot}/u-boot-flasher.bin"}
94 bct=${FLAGS_bct:-"${u_boot}/board.bct"}
95 map=${FLAGS_map:-"${u_boot}/System.map"}
96 flash=${FLAGS_flash:-"${u_boot}/flash.cfg"}
97
98 # Extract the load and entry point for U-Boot.
99 text_base="0x$(get_text_base "${map}")"
100
101 # Verify that all of the files and tools we will need are present.
102 check_for_file "firmware" " " "${firmware}"
103 check_for_file "flasher" " " "${flasher}"
104 check_for_file "BCT" " " "${bct}"
105 check_for_file "map" " " "${map}"
106 check_for_file "flash" " " "${flash}"
107
108 check_for_tool "nvflash" "nvflash"
109
110 show_u_boot_info "${firmware}"
111
112 # If the user has not specified a config directory then create one on the fly
113 # and remove it when we are done.
114 if [ -z "${FLAGS_config}" ]; then
115 config=$(mktemp -d)
116
117 trap "rm -rf ${config}" EXIT
118 else
119 mkdir -p "${FLAGS_config}"
120
121 config=${FLAGS_config}
122 fi
123
124 # Optionally sign the firmware. This is usefull if you want to write a bare
125 # U-Boot to SPI and boot with that instead of a fully build ChromiumOS firmware
126 # image.
127 if [ $FLAGS_sign -eq $FLAGS_TRUE ]; then
128 signed_firmware=${config}/signed.bin
129
130 cros_sign_bootstub \
131 --bct "${bct}" \
132 --flash "${flash}" \
133 --bootstub "${firmware}" \
134 --output "${signed_firmware}" \
135 --config "${config}" \
136 --text_base "${text_base}"
137 else
138 signed_firmware=${firmware}
139 fi
140
141 # Create the flashing script and turn it into a U-Boot uImage.
142 make_flashing_script "${signed_firmware}" > ${config}/script
143
144 mkimage -A arm -T script -d ${config}/script ${config}/script.uimg > /dev/null
145
146 # Construct RAM image of flasher + script + firmware. The firmware should
147 # already be signed by cbootimage. The RAM image has a fixed 256K partition
148 # for the flasher, followed by the script and payload to be written.
149 dd if="${flasher}" of="${config}/image" &> /dev/null
150 dd if="${config}/script.uimg" of="${config}/image" seek=512 &> /dev/null
151 dd if="${signed_firmware}" of="${config}/image" seek=520 &> /dev/null
152
153 # Write the RAM image image to the board. The flasher will write the payload
154 # into the boot device. The warning below about the failure is due to the
155 # way that we are using nvflash. It expects to be able to talk to the flashing
156 # bootloader that is passed down, but U-Boot doesn't talk back the way
157 # bootloader.bin did, and nvflash complains.
158 sudo nvflash \
159 --configfile /usr/share/cros_write_firmware/nvflash-spi.cfg \
160 --bct "${bct}" \
161 --setbct \
162 --bl "${config}/image" \
163 --go \
164 --setentry "${text_base}" "${text_base}" ||
165 warn "The above 'command failure: go failed' can be ignored."
166
167 # TODO(robotboy): Make a U-Boot tool that can compute the same checksum on
168 # the host and display it here. Unfortunately U-Boot uses a slightly different
169 # crc32 than zlib, so it's not possible to use zlib's crc32 to do this. It has
170 # to be done by building a tool that uses U-Boots version.
171 info "The serial terminal or LCD panel should show before and after CRCs of"
172 info "the image written to the boot flash. If these values match each other"
173 info "your flash was probably successful."
vb 2011/03/04 00:58:31 are you being too conservative here when you say '
robotboy 2011/03/04 16:58:57 Because there could have been a transmission failu
OLDNEW
« no previous file with comments | « no previous file | host/share/cros_write_firmware/nvflash-spi.cfg » ('j') | host/share/cros_write_firmware/spi.script » ('J')

Powered by Google App Engine
This is Rietveld 408576698