blob: 1556afeac426a34617fd68a5a1711ce7314935f3 [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
Mike Frysinger877662c2011-10-19 10:45:46 -040052 dev-util/shflags
J. Richard Barnette7a4385c2011-05-03 16:54:57 -070053 >=sys-apps/flashrom-0.9.3-r36
Dave Parker914ef512011-05-10 09:55:05 -070054 sys-apps/mosys
Dave Parkerd7d4c402011-04-15 08:01:34 -070055 "
Dave Parker515cdcd2011-03-08 17:58:43 -080056
J. Richard Barnette7a4385c2011-05-03 16:54:57 -070057# Maintenance note: The factory install shim downloads and executes
58# the firmware updater. Consequently, runtime dependencies for the
59# updater are also runtime dependencies for the install shim.
60#
61# The contents of RDEPEND below must also be present in the
62# chromeos-base/chromeos-factoryinstall ebuild in PROVIDED_DEPEND.
63# If you make any change to the list below, you may need to make a
64# matching change in the factory install ebuild.
65#
Dave Parker515cdcd2011-03-08 17:58:43 -080066# TODO(hungte) remove gzip/tar if we have busybox
67RDEPEND="
68 app-arch/gzip
69 app-arch/sharutils
J. Richard Barnette7a4385c2011-05-03 16:54:57 -070070 app-arch/tar
71 chromeos-base/vboot_reference
72 sys-apps/mosys
73 sys-apps/util-linux"
Dave Parker515cdcd2011-03-08 17:58:43 -080074
75# Check for EAPI 2 or 3
76case "${EAPI:-0}" in
77 3|2) ;;
78 1|0|:) DEPEND="EAPI-UNSUPPORTED" ;;
79esac
80
81UPDATE_SCRIPT="chromeos-firmwareupdate"
Dave Parker914ef512011-05-10 09:55:05 -070082FW_IMAGE_LOCATION=""
83EC_IMAGE_LOCATION=""
Hung-Te Line2e4a6b2011-08-31 18:57:26 +080084EXTRA_LOCATIONS=""
Dave Parker914ef512011-05-10 09:55:05 -070085
86# Returns true (0) if parameter starts with "bcs://"
87_is_on_bcs() {
88 [[ "${1%%://*}" = "bcs" ]]
89}
90
91# Returns true (0) if parameter starts with "file://"
92_is_in_files() {
93 [[ "${1%%://*}" = "file" ]]
94}
95
96# Fetch a file from the Binary Component Server
97# Parameters: URI of file "bcs://filename.tbz2"
98# Returns: Nothing
99_bcs_fetch() {
100 local filename="${1##*://}"
101
102 URI_BASE="ssh://${CROS_FIRMWARE_BCS_USER_NAME}@git.chromium.org:6222"\
103"/home/${CROS_FIRMWARE_BCS_USER_NAME}/${CATEGORY}/${PN}"
104 CROS_BINARY_URI="${URI_BASE}/${filename}"
105 cros-binary_fetch
106}
107
108# Unpack a tbz2 firmware archive to ${S}
109# Parameters: Location of archived firmware
110# Returns: Location of unpacked firmware as $RETURN_VALUE
111_src_unpack() {
112 local filepath="${1}"
113 local filename="$(basename ${filepath})"
114 mkdir -p "${S}" || die "Not able to create ${S}"
115 cp "${filepath}" "${S}" || die "Can't copy ${filepath} to ${S}"
Dave Parker914ef512011-05-10 09:55:05 -0700116 cd "${S}" || die "Can't change directory to ${S}"
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800117 tar -axpf "${filename}" ||
118 die "Failed to unpack ${filename}"
Dave Parker914ef512011-05-10 09:55:05 -0700119 RETURN_VALUE="${S}/$(tar tf ${filename})"
120}
121
122# Unpack a tbz2 archive fetched from the BCS to ${S}
123# Parameters: URI of file. Example: "bcs://filename.tbz2"
124# Returns: Location of unpacked firmware as $RETURN_VALUE
125_bcs_src_unpack() {
126 local filename="${1##*://}"
127 _src_unpack "${CROS_BINARY_STORE_DIR}/${filename}"
128 RETURN_VALUE="${RETURN_VALUE}"
129}
130
131# Provides the location of a firmware image given a URI.
132# Unpacks the firmware image if necessary.
133# Parameters: URI of file.
134# Example: "file://filename.ext" or an absolute filepath.
135# Returns the absolute filepath of the unpacked firmware as $RETURN_VALUE
136_firmware_image_location() {
137 local source_uri=$1
138 if _is_in_files "${source_uri}"; then
139 local image_location="${FILESDIR}/${source_uri#*://}"
140 else
141 local image_location="${source_uri}"
142 fi
143 [[ -f "${image_location}" ]] || die "File not found: ${image_location}"
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800144 case "${image_location}" in
145 *.tbz2 | *.tbz | *.tar.bz2 | *.tgz | *.tar.gz )
146 _src_unpack "${image_location}"
147 RETURN_VALUE="${RETURN_VALUE}"
148 ;;
149 * )
150 RETURN_VALUE="${image_location}"
151 esac
Dave Parker914ef512011-05-10 09:55:05 -0700152}
Dave Parker515cdcd2011-03-08 17:58:43 -0800153
Dave Parkerd7d4c402011-04-15 08:01:34 -0700154cros-firmware_src_unpack() {
155 cros-workon_src_unpack
156
Dave Parker914ef512011-05-10 09:55:05 -0700157 # Backwards compatibility with the older naming convention.
158 if [[ -n "${CROS_FIRMWARE_BIOS_ARCHIVE}" ]]; then
159 CROS_FIRMWARE_MAIN_IMAGE="bcs://${CROS_FIRMWARE_BIOS_ARCHIVE}"
160 fi
161 if [[ -n "${CROS_FIRMWARE_EC_ARCHIVE}" ]]; then
162 CROS_FIRMWARE_EC_IMAGE="bcs://${CROS_FIRMWARE_EC_ARCHIVE}"
163 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700164
Dave Parker914ef512011-05-10 09:55:05 -0700165 # Fetch and unpack the system firmware image
166 if [[ -n "${CROS_FIRMWARE_MAIN_IMAGE}" ]]; then
167 if _is_on_bcs "${CROS_FIRMWARE_MAIN_IMAGE}"; then
168 _bcs_fetch "${CROS_FIRMWARE_MAIN_IMAGE}"
169 _bcs_src_unpack "${CROS_FIRMWARE_MAIN_IMAGE}"
170 FW_IMAGE_LOCATION="${RETURN_VALUE}"
171 else
172 _firmware_image_location "${CROS_FIRMWARE_MAIN_IMAGE}"
173 FW_IMAGE_LOCATION="${RETURN_VALUE}"
174 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700175 fi
176
177 # Fetch and unpack the EC image
Dave Parker914ef512011-05-10 09:55:05 -0700178 if [[ -n "${CROS_FIRMWARE_EC_IMAGE}" ]]; then
179 if _is_on_bcs "${CROS_FIRMWARE_EC_IMAGE}"; then
180 _bcs_fetch "${CROS_FIRMWARE_EC_IMAGE}"
181 _bcs_src_unpack "${CROS_FIRMWARE_EC_IMAGE}"
182 EC_IMAGE_LOCATION="${RETURN_VALUE}"
183 else
184 _firmware_image_location "${CROS_FIRMWARE_EC_IMAGE}"
185 EC_IMAGE_LOCATION="${RETURN_VALUE}"
186 fi
Dave Parkerd7d4c402011-04-15 08:01:34 -0700187 fi
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800188
189 # Fetch and unpack BCS resources in CROS_FIRMWARE_EXTRA_LIST
190 local extra extra_list
191 # For backward compatibility, ':' is still supported if there's no
192 # special URL (bcs://, file://).
193 local tr_source=';:' tr_target='\n\n'
194 if echo "${CROS_FIRMWARE_EXTRA_LIST}" | grep -q '://'; then
195 tr_source=';'
196 tr_target='\n'
197 fi
198 extra_list="$(echo "${CROS_FIRMWARE_EXTRA_LIST}" |
199 tr "$tr_source" "$tr_target")"
200 for extra in $extra_list; do
201 if _is_on_bcs "${extra}"; then
202 _bcs_fetch "${extra}"
203 _bcs_src_unpack "${extra}"
204 RETURN_VALUE="${RETURN_VALUE}"
205 else
206 RETURN_VALUE="${extra}"
207 fi
208 EXTRA_LOCATIONS="${EXTRA_LOCATIONS}:${RETURN_VALUE}"
209 done
210 EXTRA_LOCATIONS="${EXTRA_LOCATIONS#:}"
Dave Parkerd7d4c402011-04-15 08:01:34 -0700211}
212
Dave Parker515cdcd2011-03-08 17:58:43 -0800213cros-firmware_src_compile() {
214 local image_cmd="" ext_cmd=""
Dave Parkerd7d4c402011-04-15 08:01:34 -0700215
Dave Parker914ef512011-05-10 09:55:05 -0700216 # Prepare images
217 if [ -n "${FW_IMAGE_LOCATION}" ]; then
218 image_cmd="$image_cmd -b ${FW_IMAGE_LOCATION}"
Dave Parkerd7d4c402011-04-15 08:01:34 -0700219 fi
Dave Parker914ef512011-05-10 09:55:05 -0700220 if [ -n "${EC_IMAGE_LOCATION}" ]; then
221 image_cmd="$image_cmd -e ${EC_IMAGE_LOCATION}"
Dave Parker515cdcd2011-03-08 17:58:43 -0800222 fi
223
Dave Parker914ef512011-05-10 09:55:05 -0700224 # Prepare extra commands
Hung-Te Lin35cf1a12011-07-21 23:16:35 +0800225 if [ -n "$CROS_FIRMWARE_UNSTABLE" ]; then
226 ext_cmd="$ext_cmd --unstable"
227 fi
228 if [ -n "$CROS_FIRMWARE_SCRIPT" ]; then
229 ext_cmd="$ext_cmd --script $CROS_FIRMWARE_SCRIPT"
230 fi
Dave Parker515cdcd2011-03-08 17:58:43 -0800231 if [ -n "$CROS_FIRMWARE_FLASHROM_BINARY" ]; then
232 ext_cmd="$ext_cmd --flashrom $CROS_FIRMWARE_FLASHROM_BINARY"
233 fi
Hung-Te Line2e4a6b2011-08-31 18:57:26 +0800234 if [ -n "$EXTRA_LOCATIONS" ]; then
235 ext_cmd="$ext_cmd --extra $EXTRA_LOCATIONS"
Dave Parker515cdcd2011-03-08 17:58:43 -0800236 fi
237
Dave Parker914ef512011-05-10 09:55:05 -0700238 # Pack firmware update script!
Dave Parker515cdcd2011-03-08 17:58:43 -0800239 if [ -z "$image_cmd" ]; then
Dave Parker914ef512011-05-10 09:55:05 -0700240 # Create an empty update script for the generic case
Dave Parker515cdcd2011-03-08 17:58:43 -0800241 # (no need to update)
242 einfo "Building empty firmware update script"
243 echo -n > ${UPDATE_SCRIPT}
244 else
245 # create a new script
246 einfo "Building ${BOARD} firmware updater: $image_cmd $ext_cmd"
Dave Parkerb0f1af82011-04-18 11:14:53 -0700247 "${WORKDIR}/${CROS_WORKON_LOCALNAME}"/pack_firmware.sh \
Dave Parkerd7d4c402011-04-15 08:01:34 -0700248 --ec_version "${CROS_FIRMWARE_EC_VERSION}" \
Hung-Te Lin890a2262011-05-19 20:22:41 +0800249 --platform "${CROS_FIRMWARE_PLATFORM}" \
Dave Parker515cdcd2011-03-08 17:58:43 -0800250 -o ${UPDATE_SCRIPT} $image_cmd $ext_cmd \
Hung-Te Lin49a94862011-04-19 09:20:55 +0800251 --tool_base="$ROOT/usr/sbin:$ROOT/usr/bin" ||
Dave Parker914ef512011-05-10 09:55:05 -0700252 die "Cannot pack firmware."
Dave Parker515cdcd2011-03-08 17:58:43 -0800253 fi
254 chmod +x ${UPDATE_SCRIPT}
255}
256
257cros-firmware_src_install() {
258 # install the main updater program
Dave Parker914ef512011-05-10 09:55:05 -0700259 dosbin $UPDATE_SCRIPT || die "Failed to install update script."
Dave Parker515cdcd2011-03-08 17:58:43 -0800260
Dave Parkerd7d4c402011-04-15 08:01:34 -0700261 # install factory wipe script
262 dosbin firmware-factory-wipe
Dave Parker515cdcd2011-03-08 17:58:43 -0800263}
264
Dave Parkerd7d4c402011-04-15 08:01:34 -0700265EXPORT_FUNCTIONS src_unpack src_compile src_install