blob: 40266598eaf5f7daabcbad318cde303881473aab [file] [log] [blame]
Hung-Te Lin5febb1e2013-03-12 17:56:35 +08001# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
Dave Parker515cdcd2011-03-08 17:58:43 -08002# 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
Hung-Te Lin5febb1e2013-03-12 17:56:35 +08008# TODO(hungte) Remove cros-binary when BCS_OVERLAY transition is ready.
Dave Parkerd7d4c402011-04-15 08:01:34 -07009inherit cros-workon cros-binary
10
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080011# @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_OVERLAY
12# @DESCRIPTION: (Optional) Name of board overlay on Binary Component Server
13: ${CROS_FIRMWARE_BCS_OVERLAY:=${BOARD_OVERLAY##*/}}
14
15# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parkerd7d4c402011-04-15 08:01:34 -070016# @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_USER_NAME
17# @DESCRIPTION: (Optional) Name of user on BCS server
18: ${CROS_FIRMWARE_BCS_USER_NAME:=}
19
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080020# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parker7a882f02011-11-10 01:12:51 +000021# @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_OVERLAY_NAME
22# @DESCRIPTION: (Optional) Name of the ebuild overlay.
23: ${CROS_FIRMWARE_BCS_OVERLAY_NAME:=}
24
Dave Parker914ef512011-05-10 09:55:05 -070025# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_IMAGE
Hung-Te Linc8c15d92013-01-10 16:19:40 +080026# @DESCRIPTION: (Optional) Location of system firmware (BIOS) image
Dave Parker914ef512011-05-10 09:55:05 -070027: ${CROS_FIRMWARE_MAIN_IMAGE:=}
Dave Parker515cdcd2011-03-08 17:58:43 -080028
Hung-Te Linc8c15d92013-01-10 16:19:40 +080029# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_RW_IMAGE
30# @DESCRIPTION: (Optional) Location of RW system firmware image
31: ${CROS_FIRMWARE_MAIN_RW_IMAGE:=}
32
Hung-Te Lin20c51232013-05-02 12:44:11 +080033# @ECLASS-VARIABLE: CROS_FIRMWARE_BUILD_MAIN_RW_IMAGE
34# @DESCRIPTION: (Optional) Re-sign and generate a RW system firmware image.
35: ${CROS_FIRMWARE_BUILD_MAIN_RW_IMAGE:=}
36
Dave Parker914ef512011-05-10 09:55:05 -070037# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_IMAGE
Dave Parker515cdcd2011-03-08 17:58:43 -080038# @DESCRIPTION: (Optional) Location of EC firmware image
Dave Parker914ef512011-05-10 09:55:05 -070039: ${CROS_FIRMWARE_EC_IMAGE:=}
Dave Parker515cdcd2011-03-08 17:58:43 -080040
Dave Parkerd7d4c402011-04-15 08:01:34 -070041# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_VERSION
Dave Parker914ef512011-05-10 09:55:05 -070042# @DESCRIPTION: (Optional) Version name of EC firmware
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +080043: ${CROS_FIRMWARE_EC_VERSION:=}
Dave Parker515cdcd2011-03-08 17:58:43 -080044
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080045# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Hung-Te Lin5083f072012-02-01 14:19:53 +080046# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_SUM
Hung-Te Linc8c15d92013-01-10 16:19:40 +080047# @DESCRIPTION: (Optional) SHA-1 checksum of system firmware (BIOS) image
Bernie Thompson6b030c32013-01-11 14:46:13 -080048: ${CROS_FIRMWARE_MAIN_SUM:=}
Hung-Te Lin5083f072012-02-01 14:19:53 +080049
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080050# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Bernie Thompson6b030c32013-01-11 14:46:13 -080051# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_RW_SUM
Hung-Te Linc8c15d92013-01-10 16:19:40 +080052# @DESCRIPTION: (Optional) SHA-1 checksum of RW system firmware image
Bernie Thompson6b030c32013-01-11 14:46:13 -080053: ${CROS_FIRMWARE_MAIN_RW_SUM:=}
Hung-Te Linc8c15d92013-01-10 16:19:40 +080054
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080055# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Hung-Te Lin5083f072012-02-01 14:19:53 +080056# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_SUM
57# @DESCRIPTION: (Optional) SHA-1 checksum of EC firmware image on BCS
Bernie Thompson6b030c32013-01-11 14:46:13 -080058: ${CROS_FIRMWARE_EC_SUM:=}
Hung-Te Lin5083f072012-02-01 14:19:53 +080059
Hung-Te Lin890a2262011-05-19 20:22:41 +080060# @ECLASS-VARIABLE: CROS_FIRMWARE_PLATFORM
61# @DESCRIPTION: (Optional) Platform name of firmware
62: ${CROS_FIRMWARE_PLATFORM:=}
63
Hung-Te Lin35cf1a12011-07-21 23:16:35 +080064# @ECLASS-VARIABLE: CROS_FIRMWARE_SCRIPT
65# @DESCRIPTION: (Optional) Entry script file name of updater
66: ${CROS_FIRMWARE_SCRIPT:=}
67
68# @ECLASS-VARIABLE: CROS_FIRMWARE_UNSTABLE
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080069# @DESCRIPTION: (Optional) Mark firmware as unstable (always RO+RW update)
Hung-Te Lin35cf1a12011-07-21 23:16:35 +080070: ${CROS_FIRMWARE_UNSTABLE:=}
71
Dave Parker515cdcd2011-03-08 17:58:43 -080072# @ECLASS-VARIABLE: CROS_FIRMWARE_BINARY
73# @DESCRIPTION: (Optional) location of custom flashrom tool
74: ${CROS_FIRMWARE_FLASHROM_BINARY:=}
75
76# @ECLASS-VARIABLE: CROS_FIRMWARE_EXTRA_LIST
Hung-Te Line2e4a6b2011-08-31 18:57:26 +080077# @DESCRIPTION: (Optional) Semi-colon separated list of additional resources
Dave Parker515cdcd2011-03-08 17:58:43 -080078: ${CROS_FIRMWARE_EXTRA_LIST:=}
79
Hung-Te Lin0c59d0a2012-08-16 13:18:09 +080080# @ECLASS-VARIABLE: CROS_FIRMWARE_FORCE_UPDATE
81# @DESCRIPTION: (Optional) Always add "force update firmware" tag.
82: ${CROS_FIRMWARE_FORCE_UPDATE:=}
83
Hung-Te Lin5febb1e2013-03-12 17:56:35 +080084# Check for EAPI 2+
85case "${EAPI:-0}" in
86 4|3|2) ;;
87 *) die "unsupported EAPI" ;;
88esac
89
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +080090# $board-overlay/make.conf may contain these flags to always create "firmware
91# from source".
Gabe Black15156612013-03-16 02:47:57 -070092IUSE="bootimage cros_ec depthcharge"
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +080093
Dave Parker515cdcd2011-03-08 17:58:43 -080094# Some tools (flashrom, iotools, mosys, ...) were bundled in the updater so we
95# don't write RDEPEND=$DEPEND. RDEPEND should have an explicit list of what it
96# needs to extract and execute the updater.
Dave Parkerd7d4c402011-04-15 08:01:34 -070097DEPEND="
Dave Parkerd7d4c402011-04-15 08:01:34 -070098 >=chromeos-base/vboot_reference-1.0-r230
Mike Frysinger2d94c622012-09-13 23:59:17 -040099 chromeos-base/vpd
Mike Frysinger877662c2011-10-19 10:45:46 -0400100 dev-util/shflags
J. Richard Barnette7a4385c2011-05-03 16:54:57 -0700101 >=sys-apps/flashrom-0.9.3-r36
Dave Parker914ef512011-05-10 09:55:05 -0700102 sys-apps/mosys
Dave Parkerd7d4c402011-04-15 08:01:34 -0700103 "
Dave Parker515cdcd2011-03-08 17:58:43 -0800104
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800105# Build firmware from source.
106DEPEND="$DEPEND
107 bootimage? ( sys-boot/chromeos-bootimage )
108 cros_ec? ( chromeos-base/chromeos-ec )
109 "
110
J. Richard Barnette7a4385c2011-05-03 16:54:57 -0700111# Maintenance note: The factory install shim downloads and executes
112# the firmware updater. Consequently, runtime dependencies for the
113# updater are also runtime dependencies for the install shim.
114#
115# The contents of RDEPEND below must also be present in the
116# chromeos-base/chromeos-factoryinstall ebuild in PROVIDED_DEPEND.
117# If you make any change to the list below, you may need to make a
118# matching change in the factory install ebuild.
119#
Dave Parker515cdcd2011-03-08 17:58:43 -0800120# TODO(hungte) remove gzip/tar if we have busybox
121RDEPEND="
122 app-arch/gzip
123 app-arch/sharutils
J. Richard Barnette7a4385c2011-05-03 16:54:57 -0700124 app-arch/tar
125 chromeos-base/vboot_reference
J. Richard Barnette7a4385c2011-05-03 16:54:57 -0700126 sys-apps/util-linux"
Dave Parker515cdcd2011-03-08 17:58:43 -0800127
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800128RESTRICT="mirror"
129
130# Local variables.
Dave Parker515cdcd2011-03-08 17:58:43 -0800131
132UPDATE_SCRIPT="chromeos-firmwareupdate"
Dave Parker914ef512011-05-10 09:55:05 -0700133FW_IMAGE_LOCATION=""
Hung-Te Linc8c15d92013-01-10 16:19:40 +0800134FW_RW_IMAGE_LOCATION=""
Dave Parker914ef512011-05-10 09:55:05 -0700135EC_IMAGE_LOCATION=""
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800136EXTRA_LOCATIONS=()
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800137
138# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800139RETURN_VALUE=""
Dave Parker914ef512011-05-10 09:55:05 -0700140
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800141# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parker914ef512011-05-10 09:55:05 -0700142# Returns true (0) if parameter starts with "bcs://"
143_is_on_bcs() {
144 [[ "${1%%://*}" = "bcs" ]]
145}
146
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800147# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parker914ef512011-05-10 09:55:05 -0700148# Returns true (0) if parameter starts with "file://"
149_is_in_files() {
150 [[ "${1%%://*}" = "file" ]]
151}
152
153# Fetch a file from the Binary Component Server
Hung-Te Lin5083f072012-02-01 14:19:53 +0800154# Parameters: URI of file "bcs://filename.tbz2", checksum of file.
Dave Parker914ef512011-05-10 09:55:05 -0700155# Returns: Nothing
156_bcs_fetch() {
Brian Harringcf0c7662012-12-19 23:06:44 -0800157 ${CROS_BINARY_FETCH_REQUIRED} || return 0
Dave Parker914ef512011-05-10 09:55:05 -0700158 local filename="${1##*://}"
Hung-Te Lin5083f072012-02-01 14:19:53 +0800159 local checksum="$2"
Dave Parker914ef512011-05-10 09:55:05 -0700160
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800161 local bcs_host="git.chromium.org:6222"
162 local bcs_user="${CROS_FIRMWARE_BCS_USER_NAME}"
163 local bcs_pkgdir="${CATEGORY}/${PN}"
164 local bcs_root="$CROS_FIRMWARE_BCS_OVERLAY_NAME"
165
166 # Support both old and new locations for BCS binaries.
167 # TODO(dparker@chromium.org): Remove after all binaries are using the
168 # new location. crosbug.com/22789
169 [ -z "$bcs_root" ] && bcs_root="home/$CROS_FIRMWARE_BCS_USER_NAME"
170
171 URI_BASE="ssh://$bcs_user@$bcs_host/$bcs_root/$bcs_pkgdir"
Dave Parker914ef512011-05-10 09:55:05 -0700172 CROS_BINARY_URI="${URI_BASE}/${filename}"
Hung-Te Lin5083f072012-02-01 14:19:53 +0800173 CROS_BINARY_SUM="${checksum}"
Dave Parker914ef512011-05-10 09:55:05 -0700174 cros-binary_fetch
175}
176
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800177# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parker914ef512011-05-10 09:55:05 -0700178# Unpack a tbz2 firmware archive to ${S}
179# Parameters: Location of archived firmware
180# Returns: Location of unpacked firmware as $RETURN_VALUE
181_src_unpack() {
182 local filepath="${1}"
183 local filename="$(basename ${filepath})"
184 mkdir -p "${S}" || die "Not able to create ${S}"
185 cp "${filepath}" "${S}" || die "Can't copy ${filepath} to ${S}"
Dave Parker914ef512011-05-10 09:55:05 -0700186 cd "${S}" || die "Can't change directory to ${S}"
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800187 tar -axpf "${filename}" ||
188 die "Failed to unpack ${filename}"
Hung-Te Lin9c85e0b2012-12-10 12:26:32 +0800189 local contents="$(tar -atf "${filename}")"
190 if [ "$(echo "$contents" | wc -l)" -gt 1 ]; then
191 # Currently we can only serve one file (or directory).
192 ewarn "WARNING: package $filename contains multiple files."
193 contents="$(echo "$contents" | head -n 1)"
194 fi
195 RETURN_VALUE="${S}/$contents"
Dave Parker914ef512011-05-10 09:55:05 -0700196}
197
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800198# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parker914ef512011-05-10 09:55:05 -0700199# Unpack a tbz2 archive fetched from the BCS to ${S}
200# Parameters: URI of file. Example: "bcs://filename.tbz2"
201# Returns: Location of unpacked firmware as $RETURN_VALUE
202_bcs_src_unpack() {
203 local filename="${1##*://}"
Brian Harringcf0c7662012-12-19 23:06:44 -0800204 if ${CROS_BINARY_FETCH_REQUIRED}; then
205 _src_unpack "${CROS_BINARY_STORE_DIR}/${filename}"
206 else
207 _src_unpack "${DISTDIR}/${filename}"
208 fi
Dave Parker914ef512011-05-10 09:55:05 -0700209 RETURN_VALUE="${RETURN_VALUE}"
210}
211
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800212# TODO(hungte) Remove when BCS_OVERLAY transition is ready.
Dave Parker914ef512011-05-10 09:55:05 -0700213# Provides the location of a firmware image given a URI.
214# Unpacks the firmware image if necessary.
215# Parameters: URI of file.
216# Example: "file://filename.ext" or an absolute filepath.
217# Returns the absolute filepath of the unpacked firmware as $RETURN_VALUE
218_firmware_image_location() {
219 local source_uri=$1
220 if _is_in_files "${source_uri}"; then
221 local image_location="${FILESDIR}/${source_uri#*://}"
222 else
223 local image_location="${source_uri}"
224 fi
225 [[ -f "${image_location}" ]] || die "File not found: ${image_location}"
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800226 case "${image_location}" in
227 *.tbz2 | *.tbz | *.tar.bz2 | *.tgz | *.tar.gz )
228 _src_unpack "${image_location}"
229 RETURN_VALUE="${RETURN_VALUE}"
230 ;;
231 * )
232 RETURN_VALUE="${image_location}"
233 esac
Dave Parker914ef512011-05-10 09:55:05 -0700234}
Dave Parker515cdcd2011-03-08 17:58:43 -0800235
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800236# New SRC_URI based approach.
Dave Parkerd7d4c402011-04-15 08:01:34 -0700237
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800238_add_source() {
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800239 local var="$1"
240 local input="${!var}"
241 local protocol="${input%%://*}"
242 local uri="${input#*://}"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800243 local overlay="${CROS_FIRMWARE_BCS_OVERLAY#overlay-}"
244 local user="bcs-${overlay#variant-*-}"
245 local bcs_url="gs://chromeos-binaries/HOME/${user}/overlay-${overlay}"
Dave Parkerd7d4c402011-04-15 08:01:34 -0700246
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800247 # Input without ${protocol} are local files (ex, ${FILESDIR}/file).
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800248 case "${protocol}" in
249 bcs)
250 SRC_URI+=" ${bcs_url}/${CATEGORY}/${PN}/${uri}"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800251 ;;
252 http|https)
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800253 SRC_URI+=" ${input}"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800254 ;;
255 esac
256}
257
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800258_unpack_archive() {
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800259 local var="$1"
260 local input="${!var}"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800261 local archive="${input##*/}"
262 local folder="${S}/.dist/${archive}"
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800263
264 # Remote source files (bcs://, http://, ...) are downloaded into
265 # ${DISTDIR}, which is the default location for command 'unpack'.
266 # For any other files (ex, ${FILESDIR}/file), use complete file path.
267 local unpack_name="${input}"
268 if [[ "${unpack_name}" =~ "://" ]]; then
269 input="${DISTDIR}/${archive}"
270 unpack_name="${archive}"
271 fi
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800272
273 case "${input##*.}" in
274 tar|tbz2|tbz|bz|gz|tgz|zip|xz) ;;
275 *)
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800276 eval ${var}="'${input}'"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800277 return
278 ;;
279 esac
280
281 mkdir -p "${folder}" || die "Not able to create ${folder}"
282 (cd "${folder}" && unpack "${unpack_name}") ||
283 die "Failed to unpack ${unpack_name}."
284 local contents=($(ls "${folder}"))
285 if [[ ${#contents[@]} -gt 1 ]]; then
286 # Currently we can only serve one file (or directory).
287 ewarn "WARNING: package ${input} contains multiple files."
288 fi
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800289 eval ${var}="'${folder}/${contents}'"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800290}
291
292_legacy_src_unpack() {
Dave Parker914ef512011-05-10 09:55:05 -0700293 # Fetch and unpack the system firmware image
294 if [[ -n "${CROS_FIRMWARE_MAIN_IMAGE}" ]]; then
295 if _is_on_bcs "${CROS_FIRMWARE_MAIN_IMAGE}"; then
Hung-Te Lin5083f072012-02-01 14:19:53 +0800296 _bcs_fetch "${CROS_FIRMWARE_MAIN_IMAGE}" \
297 "${CROS_FIRMWARE_MAIN_SUM}"
Dave Parker914ef512011-05-10 09:55:05 -0700298 _bcs_src_unpack "${CROS_FIRMWARE_MAIN_IMAGE}"
299 FW_IMAGE_LOCATION="${RETURN_VALUE}"
300 else
301 _firmware_image_location "${CROS_FIRMWARE_MAIN_IMAGE}"
302 FW_IMAGE_LOCATION="${RETURN_VALUE}"
303 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700304 fi
305
Hung-Te Linc8c15d92013-01-10 16:19:40 +0800306 # Fetch and unpack the system RW firmware image
307 if [[ -n "${CROS_FIRMWARE_MAIN_RW_IMAGE}" ]]; then
308 if _is_on_bcs "${CROS_FIRMWARE_MAIN_RW_IMAGE}"; then
309 _bcs_fetch "${CROS_FIRMWARE_MAIN_RW_IMAGE}" \
Bernie Thompson6b030c32013-01-11 14:46:13 -0800310 "${CROS_FIRMWARE_MAIN_RW_SUM}"
Hung-Te Linc8c15d92013-01-10 16:19:40 +0800311 _bcs_src_unpack "${CROS_FIRMWARE_MAIN_RW_IMAGE}"
312 FW_RW_IMAGE_LOCATION="${RETURN_VALUE}"
313 else
314 _firmware_image_location "${CROS_FIRMWARE_MAIN_RW_IMAGE}"
315 FW_RW_IMAGE_LOCATION="${RETURN_VALUE}"
316 fi
317 fi
318
Dave Parkerd7d4c402011-04-15 08:01:34 -0700319 # Fetch and unpack the EC image
Dave Parker914ef512011-05-10 09:55:05 -0700320 if [[ -n "${CROS_FIRMWARE_EC_IMAGE}" ]]; then
321 if _is_on_bcs "${CROS_FIRMWARE_EC_IMAGE}"; then
Hung-Te Lin5083f072012-02-01 14:19:53 +0800322 _bcs_fetch "${CROS_FIRMWARE_EC_IMAGE}"\
323 "${CROS_FIRMWARE_EC_SUM}"
Dave Parker914ef512011-05-10 09:55:05 -0700324 _bcs_src_unpack "${CROS_FIRMWARE_EC_IMAGE}"
325 EC_IMAGE_LOCATION="${RETURN_VALUE}"
326 else
327 _firmware_image_location "${CROS_FIRMWARE_EC_IMAGE}"
328 EC_IMAGE_LOCATION="${RETURN_VALUE}"
329 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700330 fi
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800331
332 # Fetch and unpack BCS resources in CROS_FIRMWARE_EXTRA_LIST
333 local extra extra_list
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800334 # For backward compatibility, colon is still supported when there is no
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800335 # special URL (bcs://, file://).
336 local tr_source=';:' tr_target='\n\n'
337 if echo "${CROS_FIRMWARE_EXTRA_LIST}" | grep -q '://'; then
338 tr_source=';'
339 tr_target='\n'
340 fi
341 extra_list="$(echo "${CROS_FIRMWARE_EXTRA_LIST}" |
342 tr "$tr_source" "$tr_target")"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800343 EXTRA_LOCATIONS=()
344 for extra in ${extra_list}; do
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800345 if _is_on_bcs "${extra}"; then
Hung-Te Lin5083f072012-02-01 14:19:53 +0800346 _bcs_fetch "${extra}" ""
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800347 _bcs_src_unpack "${extra}"
348 RETURN_VALUE="${RETURN_VALUE}"
349 else
350 RETURN_VALUE="${extra}"
351 fi
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800352 EXTRA_LOCATIONS+=(${RETURN_VALUE})
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800353 done
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800354}
355
356cros-firmware_src_unpack() {
357 cros-workon_src_unpack
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800358 local i
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800359
360 if [[ -n "${CROS_FIRMWARE_BCS_OVERLAY_NAME}" ]]; then
361 _legacy_src_unpack
362 return
363 fi
364
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800365 for i in {FW,FW_RW,EC}_IMAGE_LOCATION; do
366 _unpack_archive ${i}
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800367 done
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800368
369 for ((i = 0; i < ${#EXTRA_LOCATIONS[@]}; i++)); do
370 _unpack_archive "EXTRA_LOCATIONS[$i]"
371 done
Dave Parkerd7d4c402011-04-15 08:01:34 -0700372}
373
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800374_add_param() {
375 local prefix="$1"
376 local value="$2"
377
378 if [[ -n "$value" ]]; then
379 echo "$prefix '$value' "
380 fi
381}
382
383_add_bool_param() {
384 local prefix="$1"
385 local value="$2"
386
387 if [[ -n "$value" ]]; then
388 echo "$prefix "
389 fi
390}
391
Dave Parker515cdcd2011-03-08 17:58:43 -0800392cros-firmware_src_compile() {
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800393 local image_cmd="" ext_cmd="" local_image_cmd=""
394 local root="${ROOT%/}"
Dave Parkerd7d4c402011-04-15 08:01:34 -0700395
Dave Parker914ef512011-05-10 09:55:05 -0700396 # Prepare images
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800397 image_cmd+="$(_add_param -b "${FW_IMAGE_LOCATION}")"
398 image_cmd+="$(_add_param -e "${EC_IMAGE_LOCATION}")"
Hung-Te Linc8c15d92013-01-10 16:19:40 +0800399 image_cmd+="$(_add_param -w "${FW_RW_IMAGE_LOCATION}")"
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800400 image_cmd+="$(_add_param --ec_version "${CROS_FIRMWARE_EC_VERSION}")"
Hung-Te Lin20c51232013-05-02 12:44:11 +0800401 image_cmd+="$(_add_bool_param --create_bios_rw_image \
402 "${CROS_FIRMWARE_BUILD_MAIN_RW_IMAGE}")"
Dave Parker515cdcd2011-03-08 17:58:43 -0800403
Dave Parker914ef512011-05-10 09:55:05 -0700404 # Prepare extra commands
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800405 ext_cmd+="$(_add_bool_param --unstable "${CROS_FIRMWARE_UNSTABLE}")"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800406 ext_cmd+="$(_add_param --extra "$(IFS=:; echo "${EXTRA_LOCATIONS[*]}")")"
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800407 ext_cmd+="$(_add_param --script "${CROS_FIRMWARE_SCRIPT}")"
408 ext_cmd+="$(_add_param --platform "${CROS_FIRMWARE_PLATFORM}")"
409 ext_cmd+="$(_add_param --flashrom "${CROS_FIRMWARE_FLASHROM_BINARY}")"
410 ext_cmd+="$(_add_param --tool_base \
411 "$root/firmware/utils:$root/usr/sbin:$root/usr/bin")"
Dave Parker515cdcd2011-03-08 17:58:43 -0800412
Dave Parker914ef512011-05-10 09:55:05 -0700413 # Pack firmware update script!
Dave Parker515cdcd2011-03-08 17:58:43 -0800414 if [ -z "$image_cmd" ]; then
Dave Parker914ef512011-05-10 09:55:05 -0700415 # Create an empty update script for the generic case
Dave Parker515cdcd2011-03-08 17:58:43 -0800416 # (no need to update)
417 einfo "Building empty firmware update script"
418 echo -n > ${UPDATE_SCRIPT}
419 else
420 # create a new script
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800421 einfo "Build ${BOARD_USE} firmware updater: $image_cmd $ext_cmd"
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800422 ./pack_firmware.sh $image_cmd $ext_cmd -o $UPDATE_SCRIPT ||
Dave Parker914ef512011-05-10 09:55:05 -0700423 die "Cannot pack firmware."
Dave Parker515cdcd2011-03-08 17:58:43 -0800424 fi
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800425
426 # Create local updaters
427 local local_image_cmd="" output_bom output_file
428 if use cros_ec; then
429 local_image_cmd+="-e $root/firmware/ec.bin "
430 fi
431 if use bootimage; then
Gabe Black15156612013-03-16 02:47:57 -0700432 if use depthcharge; then
433 einfo "Updater for local fw"
434 ./pack_firmware.sh -b $root/firmware/image.bin \
435 -o updater.sh $local_image_cmd $ext_cmd ||
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800436 die "Cannot pack local firmware."
Gabe Black15156612013-03-16 02:47:57 -0700437 else
438 for fw_file in $root/firmware/image-*.bin; do
439 einfo "Updater for local fw - $fw_file"
440 output_bom=${fw_file##*/image-}
441 output_bom=${output_bom%%.bin}
442 output_file=updater-$output_bom.sh
443 ./pack_firmware.sh -b $fw_file -o $output_file \
444 $local_image_cmd $ext_cmd ||
445 die "Cannot pack local firmware."
446 done
447 fi
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800448 elif use cros_ec; then
449 # TODO(hungte) Deal with a platform that has only EC and no
450 # BIOS, which is usually incorrect configuration.
451 die "Sorry, platform without local BIOS EC is not supported."
452 fi
Dave Parker515cdcd2011-03-08 17:58:43 -0800453}
454
455cros-firmware_src_install() {
456 # install the main updater program
Dave Parker914ef512011-05-10 09:55:05 -0700457 dosbin $UPDATE_SCRIPT || die "Failed to install update script."
Dave Parker515cdcd2011-03-08 17:58:43 -0800458
Dave Parkerd7d4c402011-04-15 08:01:34 -0700459 # install factory wipe script
460 dosbin firmware-factory-wipe
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800461
462 # install updaters for firmware-from-source archive.
463 if use bootimage; then
464 exeinto /firmware
Gabe Black15156612013-03-16 02:47:57 -0700465 doexe updater*.sh
Hung-Te Lin0cde8bf2012-08-07 18:22:26 +0800466 fi
Hung-Te Lin0c59d0a2012-08-16 13:18:09 +0800467
468 # The "force_update_firmware" tag file is used by chromeos-installer.
469 if [ -n "$CROS_FIRMWARE_FORCE_UPDATE" ]; then
470 insinto /root
471 touch .force_update_firmware
472 doins .force_update_firmware
473 fi
Dave Parker515cdcd2011-03-08 17:58:43 -0800474}
475
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800476# @FUNCTION: _expand_list
477# @USAGE <var> <ifs> <string>
478# @DESCRIPTION:
479# Internal function to expand a string (separated by ifs) into bash array.
480_expand_list() {
481 local var="$1" ifs="$2"
482 IFS="${ifs}" read -r -a ${var} <<<"${*:3}"
483}
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800484
Hung-Te Linbcecb3e2013-03-13 13:42:56 +0800485# @FUNCTION: cros-firmware_setup_source
486# @DESCRIPTION:
487# Configures all firmware binary source files to SRC_URI, and updates local
488# destination mapping (*_LOCATION). Must be invoked after CROS_FIRMWARE_*_IMAGE
489# are set.
490cros-firmware_setup_source() {
491 local i
492
493 FW_IMAGE_LOCATION="${CROS_FIRMWARE_MAIN_IMAGE}"
494 FW_RW_IMAGE_LOCATION="${CROS_FIRMWARE_MAIN_RW_IMAGE}"
495 EC_IMAGE_LOCATION="${CROS_FIRMWARE_EC_IMAGE}"
496 _expand_list EXTRA_LOCATIONS ";" "${CROS_FIRMWARE_EXTRA_LIST}"
497
498 for i in {FW,FW_RW,EC}_IMAGE_LOCATION; do
499 _add_source ${i}
500 done
501
502 for ((i = 0; i < ${#EXTRA_LOCATIONS[@]}; i++)); do
503 _add_source "EXTRA_LOCATIONS[$i]"
Hung-Te Lin5febb1e2013-03-12 17:56:35 +0800504 done
505}
506
507# If "inherit cros-firmware" appears at end of ebuild file, build source URI
508# automatically. Otherwise, you have to put an explicit call to
509# "cros-firmware_setup_source" at end of ebuild file.
510[[ -n "${CROS_FIRMWARE_MAIN_IMAGE}" ]] && cros-firmware_setup_source
511
Dave Parkerd7d4c402011-04-15 08:01:34 -0700512EXPORT_FUNCTIONS src_unpack src_compile src_install