blob: 8182b76dc743cfee653e69f4be606849fce559ef [file] [log] [blame]
Dave Parker515cdcd2011-03-08 17:58:43 -08001# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2# Distributed under the terms of the GNU General Public License v2
Dave Parker515cdcd2011-03-08 17:58:43 -08003#
4# Original Author: The Chromium OS Authors <chromium-os-dev@chromium.org>
5# Purpose: Generate shell script containing firmware update bundle.
6#
7
Dave Parkerd7d4c402011-04-15 08:01:34 -07008inherit cros-workon cros-binary
9
Dave Parkerd7d4c402011-04-15 08:01:34 -070010# @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_USER_NAME
11# @DESCRIPTION: (Optional) Name of user on BCS server
12: ${CROS_FIRMWARE_BCS_USER_NAME:=}
13
Dave Parker914ef512011-05-10 09:55:05 -070014# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_IMAGE
Dave Parker515cdcd2011-03-08 17:58:43 -080015# @DESCRIPTION: (Optional) Location of system bios image
Dave Parker914ef512011-05-10 09:55:05 -070016: ${CROS_FIRMWARE_MAIN_IMAGE:=}
Dave Parker515cdcd2011-03-08 17:58:43 -080017
Dave Parker914ef512011-05-10 09:55:05 -070018# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_IMAGE
Dave Parker515cdcd2011-03-08 17:58:43 -080019# @DESCRIPTION: (Optional) Location of EC firmware image
Dave Parker914ef512011-05-10 09:55:05 -070020: ${CROS_FIRMWARE_EC_IMAGE:=}
Dave Parker515cdcd2011-03-08 17:58:43 -080021
Dave Parkerd7d4c402011-04-15 08:01:34 -070022# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_VERSION
Dave Parker914ef512011-05-10 09:55:05 -070023# @DESCRIPTION: (Optional) Version name of EC firmware
Dave Parkerd7d4c402011-04-15 08:01:34 -070024: ${CROS_FIRMWARE_EC_VERSION:="IGNORE"}
Dave Parker515cdcd2011-03-08 17:58:43 -080025
Hung-Te Lin890a2262011-05-19 20:22:41 +080026# @ECLASS-VARIABLE: CROS_FIRMWARE_PLATFORM
27# @DESCRIPTION: (Optional) Platform name of firmware
28: ${CROS_FIRMWARE_PLATFORM:=}
29
Hung-Te Lin35cf1a12011-07-21 23:16:35 +080030# @ECLASS-VARIABLE: CROS_FIRMWARE_SCRIPT
31# @DESCRIPTION: (Optional) Entry script file name of updater
32: ${CROS_FIRMWARE_SCRIPT:=}
33
34# @ECLASS-VARIABLE: CROS_FIRMWARE_UNSTABLE
35# @DESCRIPTION: (Optional) Mark firmrware as unstable (always RO+RW update)
36: ${CROS_FIRMWARE_UNSTABLE:=}
37
Dave Parker515cdcd2011-03-08 17:58:43 -080038# @ECLASS-VARIABLE: CROS_FIRMWARE_BINARY
39# @DESCRIPTION: (Optional) location of custom flashrom tool
40: ${CROS_FIRMWARE_FLASHROM_BINARY:=}
41
42# @ECLASS-VARIABLE: CROS_FIRMWARE_EXTRA_LIST
Hung-Te Line2e4a6b2011-08-31 18:57:26 +080043# @DESCRIPTION: (Optional) Semi-colon separated list of additional resources
Dave Parker515cdcd2011-03-08 17:58:43 -080044: ${CROS_FIRMWARE_EXTRA_LIST:=}
45
46# Some tools (flashrom, iotools, mosys, ...) were bundled in the updater so we
47# don't write RDEPEND=$DEPEND. RDEPEND should have an explicit list of what it
48# needs to extract and execute the updater.
Dave Parkerd7d4c402011-04-15 08:01:34 -070049DEPEND="
Dave Parkerd7d4c402011-04-15 08:01:34 -070050 >=chromeos-base/vboot_reference-1.0-r230
J. Richard Barnette7a4385c2011-05-03 16:54:57 -070051 dev-libs/shflags
52 >=sys-apps/flashrom-0.9.3-r36
Dave Parker914ef512011-05-10 09:55:05 -070053 sys-apps/mosys
Dave Parkerd7d4c402011-04-15 08:01:34 -070054 "
Dave Parker515cdcd2011-03-08 17:58:43 -080055
J. Richard Barnette7a4385c2011-05-03 16:54:57 -070056# Maintenance note: The factory install shim downloads and executes
57# the firmware updater. Consequently, runtime dependencies for the
58# updater are also runtime dependencies for the install shim.
59#
60# The contents of RDEPEND below must also be present in the
61# chromeos-base/chromeos-factoryinstall ebuild in PROVIDED_DEPEND.
62# If you make any change to the list below, you may need to make a
63# matching change in the factory install ebuild.
64#
Dave Parker515cdcd2011-03-08 17:58:43 -080065# TODO(hungte) remove gzip/tar if we have busybox
66RDEPEND="
67 app-arch/gzip
68 app-arch/sharutils
J. Richard Barnette7a4385c2011-05-03 16:54:57 -070069 app-arch/tar
70 chromeos-base/vboot_reference
71 sys-apps/mosys
72 sys-apps/util-linux"
Dave Parker515cdcd2011-03-08 17:58:43 -080073
74# Check for EAPI 2 or 3
75case "${EAPI:-0}" in
76 3|2) ;;
77 1|0|:) DEPEND="EAPI-UNSUPPORTED" ;;
78esac
79
80UPDATE_SCRIPT="chromeos-firmwareupdate"
Dave Parker914ef512011-05-10 09:55:05 -070081FW_IMAGE_LOCATION=""
82EC_IMAGE_LOCATION=""
Hung-Te Line2e4a6b2011-08-31 18:57:26 +080083EXTRA_LOCATIONS=""
Dave Parker914ef512011-05-10 09:55:05 -070084
85# Returns true (0) if parameter starts with "bcs://"
86_is_on_bcs() {
87 [[ "${1%%://*}" = "bcs" ]]
88}
89
90# Returns true (0) if parameter starts with "file://"
91_is_in_files() {
92 [[ "${1%%://*}" = "file" ]]
93}
94
95# Fetch a file from the Binary Component Server
96# Parameters: URI of file "bcs://filename.tbz2"
97# Returns: Nothing
98_bcs_fetch() {
99 local filename="${1##*://}"
100
101 URI_BASE="ssh://${CROS_FIRMWARE_BCS_USER_NAME}@git.chromium.org:6222"\
102"/home/${CROS_FIRMWARE_BCS_USER_NAME}/${CATEGORY}/${PN}"
103 CROS_BINARY_URI="${URI_BASE}/${filename}"
104 cros-binary_fetch
105}
106
107# Unpack a tbz2 firmware archive to ${S}
108# Parameters: Location of archived firmware
109# Returns: Location of unpacked firmware as $RETURN_VALUE
110_src_unpack() {
111 local filepath="${1}"
112 local filename="$(basename ${filepath})"
113 mkdir -p "${S}" || die "Not able to create ${S}"
114 cp "${filepath}" "${S}" || die "Can't copy ${filepath} to ${S}"
Dave Parker914ef512011-05-10 09:55:05 -0700115 cd "${S}" || die "Can't change directory to ${S}"
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800116 tar -axpf "${filename}" ||
117 die "Failed to unpack ${filename}"
Dave Parker914ef512011-05-10 09:55:05 -0700118 RETURN_VALUE="${S}/$(tar tf ${filename})"
119}
120
121# Unpack a tbz2 archive fetched from the BCS to ${S}
122# Parameters: URI of file. Example: "bcs://filename.tbz2"
123# Returns: Location of unpacked firmware as $RETURN_VALUE
124_bcs_src_unpack() {
125 local filename="${1##*://}"
126 _src_unpack "${CROS_BINARY_STORE_DIR}/${filename}"
127 RETURN_VALUE="${RETURN_VALUE}"
128}
129
130# Provides the location of a firmware image given a URI.
131# Unpacks the firmware image if necessary.
132# Parameters: URI of file.
133# Example: "file://filename.ext" or an absolute filepath.
134# Returns the absolute filepath of the unpacked firmware as $RETURN_VALUE
135_firmware_image_location() {
136 local source_uri=$1
137 if _is_in_files "${source_uri}"; then
138 local image_location="${FILESDIR}/${source_uri#*://}"
139 else
140 local image_location="${source_uri}"
141 fi
142 [[ -f "${image_location}" ]] || die "File not found: ${image_location}"
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800143 case "${image_location}" in
144 *.tbz2 | *.tbz | *.tar.bz2 | *.tgz | *.tar.gz )
145 _src_unpack "${image_location}"
146 RETURN_VALUE="${RETURN_VALUE}"
147 ;;
148 * )
149 RETURN_VALUE="${image_location}"
150 esac
Dave Parker914ef512011-05-10 09:55:05 -0700151}
Dave Parker515cdcd2011-03-08 17:58:43 -0800152
Dave Parkerd7d4c402011-04-15 08:01:34 -0700153cros-firmware_src_unpack() {
154 cros-workon_src_unpack
155
Dave Parker914ef512011-05-10 09:55:05 -0700156 # Backwards compatibility with the older naming convention.
157 if [[ -n "${CROS_FIRMWARE_BIOS_ARCHIVE}" ]]; then
158 CROS_FIRMWARE_MAIN_IMAGE="bcs://${CROS_FIRMWARE_BIOS_ARCHIVE}"
159 fi
160 if [[ -n "${CROS_FIRMWARE_EC_ARCHIVE}" ]]; then
161 CROS_FIRMWARE_EC_IMAGE="bcs://${CROS_FIRMWARE_EC_ARCHIVE}"
162 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700163
Dave Parker914ef512011-05-10 09:55:05 -0700164 # Fetch and unpack the system firmware image
165 if [[ -n "${CROS_FIRMWARE_MAIN_IMAGE}" ]]; then
166 if _is_on_bcs "${CROS_FIRMWARE_MAIN_IMAGE}"; then
167 _bcs_fetch "${CROS_FIRMWARE_MAIN_IMAGE}"
168 _bcs_src_unpack "${CROS_FIRMWARE_MAIN_IMAGE}"
169 FW_IMAGE_LOCATION="${RETURN_VALUE}"
170 else
171 _firmware_image_location "${CROS_FIRMWARE_MAIN_IMAGE}"
172 FW_IMAGE_LOCATION="${RETURN_VALUE}"
173 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700174 fi
175
176 # Fetch and unpack the EC image
Dave Parker914ef512011-05-10 09:55:05 -0700177 if [[ -n "${CROS_FIRMWARE_EC_IMAGE}" ]]; then
178 if _is_on_bcs "${CROS_FIRMWARE_EC_IMAGE}"; then
179 _bcs_fetch "${CROS_FIRMWARE_EC_IMAGE}"
180 _bcs_src_unpack "${CROS_FIRMWARE_EC_IMAGE}"
181 EC_IMAGE_LOCATION="${RETURN_VALUE}"
182 else
183 _firmware_image_location "${CROS_FIRMWARE_EC_IMAGE}"
184 EC_IMAGE_LOCATION="${RETURN_VALUE}"
185 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700186 fi
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800187
188 # Fetch and unpack BCS resources in CROS_FIRMWARE_EXTRA_LIST
189 local extra extra_list
190 # For backward compatibility, ':' is still supported if there's no
191 # special URL (bcs://, file://).
192 local tr_source=';:' tr_target='\n\n'
193 if echo "${CROS_FIRMWARE_EXTRA_LIST}" | grep -q '://'; then
194 tr_source=';'
195 tr_target='\n'
196 fi
197 extra_list="$(echo "${CROS_FIRMWARE_EXTRA_LIST}" |
198 tr "$tr_source" "$tr_target")"
199 for extra in $extra_list; do
200 if _is_on_bcs "${extra}"; then
201 _bcs_fetch "${extra}"
202 _bcs_src_unpack "${extra}"
203 RETURN_VALUE="${RETURN_VALUE}"
204 else
205 RETURN_VALUE="${extra}"
206 fi
207 EXTRA_LOCATIONS="${EXTRA_LOCATIONS}:${RETURN_VALUE}"
208 done
209 EXTRA_LOCATIONS="${EXTRA_LOCATIONS#:}"
Dave Parkerd7d4c402011-04-15 08:01:34 -0700210}
211
Dave Parker515cdcd2011-03-08 17:58:43 -0800212cros-firmware_src_compile() {
213 local image_cmd="" ext_cmd=""
Dave Parkerd7d4c402011-04-15 08:01:34 -0700214
Dave Parker914ef512011-05-10 09:55:05 -0700215 # Prepare images
216 if [ -n "${FW_IMAGE_LOCATION}" ]; then
217 image_cmd="$image_cmd -b ${FW_IMAGE_LOCATION}"
Dave Parkerd7d4c402011-04-15 08:01:34 -0700218 fi
Dave Parker914ef512011-05-10 09:55:05 -0700219 if [ -n "${EC_IMAGE_LOCATION}" ]; then
220 image_cmd="$image_cmd -e ${EC_IMAGE_LOCATION}"
Dave Parker515cdcd2011-03-08 17:58:43 -0800221 fi
222
Dave Parker914ef512011-05-10 09:55:05 -0700223 # Prepare extra commands
Hung-Te Lin35cf1a12011-07-21 23:16:35 +0800224 if [ -n "$CROS_FIRMWARE_UNSTABLE" ]; then
225 ext_cmd="$ext_cmd --unstable"
226 fi
227 if [ -n "$CROS_FIRMWARE_SCRIPT" ]; then
228 ext_cmd="$ext_cmd --script $CROS_FIRMWARE_SCRIPT"
229 fi
Dave Parker515cdcd2011-03-08 17:58:43 -0800230 if [ -n "$CROS_FIRMWARE_FLASHROM_BINARY" ]; then
231 ext_cmd="$ext_cmd --flashrom $CROS_FIRMWARE_FLASHROM_BINARY"
232 fi
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800233 if [ -n "$EXTRA_LOCATIONS" ]; then
234 ext_cmd="$ext_cmd --extra $EXTRA_LOCATIONS"
Dave Parker515cdcd2011-03-08 17:58:43 -0800235 fi
236
Dave Parker914ef512011-05-10 09:55:05 -0700237 # Pack firmware update script!
Dave Parker515cdcd2011-03-08 17:58:43 -0800238 if [ -z "$image_cmd" ]; then
Dave Parker914ef512011-05-10 09:55:05 -0700239 # Create an empty update script for the generic case
Dave Parker515cdcd2011-03-08 17:58:43 -0800240 # (no need to update)
241 einfo "Building empty firmware update script"
242 echo -n > ${UPDATE_SCRIPT}
243 else
244 # create a new script
245 einfo "Building ${BOARD} firmware updater: $image_cmd $ext_cmd"
Dave Parkerb0f1af82011-04-18 11:14:53 -0700246 "${WORKDIR}/${CROS_WORKON_LOCALNAME}"/pack_firmware.sh \
Dave Parkerd7d4c402011-04-15 08:01:34 -0700247 --ec_version "${CROS_FIRMWARE_EC_VERSION}" \
Hung-Te Lin890a2262011-05-19 20:22:41 +0800248 --platform "${CROS_FIRMWARE_PLATFORM}" \
Dave Parker515cdcd2011-03-08 17:58:43 -0800249 -o ${UPDATE_SCRIPT} $image_cmd $ext_cmd \
Hung-Te Lin49a94862011-04-19 09:20:55 +0800250 --tool_base="$ROOT/usr/sbin:$ROOT/usr/bin" ||
Dave Parker914ef512011-05-10 09:55:05 -0700251 die "Cannot pack firmware."
Dave Parker515cdcd2011-03-08 17:58:43 -0800252 fi
253 chmod +x ${UPDATE_SCRIPT}
254}
255
256cros-firmware_src_install() {
257 # install the main updater program
Dave Parker914ef512011-05-10 09:55:05 -0700258 dosbin $UPDATE_SCRIPT || die "Failed to install update script."
Dave Parker515cdcd2011-03-08 17:58:43 -0800259
Dave Parkerd7d4c402011-04-15 08:01:34 -0700260 # install factory wipe script
261 dosbin firmware-factory-wipe
Dave Parker515cdcd2011-03-08 17:58:43 -0800262}
263
Dave Parkerd7d4c402011-04-15 08:01:34 -0700264EXPORT_FUNCTIONS src_unpack src_compile src_install