blob: 8dc9775361fd29cbd9c1f100713bbdc307b47a4e [file] [log] [blame]
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
#
# Original Author: The Chromium OS Authors <chromium-os-dev@chromium.org>
# Purpose: Generate shell script containing firmware update bundle.
#
inherit cros-workon cros-binary
# @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_USER_NAME
# @DESCRIPTION: (Optional) Name of user on BCS server
: ${CROS_FIRMWARE_BCS_USER_NAME:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_OVERLAY_NAME
# @DESCRIPTION: (Optional) Name of the ebuild overlay.
: ${CROS_FIRMWARE_BCS_OVERLAY_NAME:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_IMAGE
# @DESCRIPTION: (Optional) Location of system bios image
: ${CROS_FIRMWARE_MAIN_IMAGE:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_IMAGE
# @DESCRIPTION: (Optional) Location of EC firmware image
: ${CROS_FIRMWARE_EC_IMAGE:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_VERSION
# @DESCRIPTION: (Optional) Version name of EC firmware
: ${CROS_FIRMWARE_EC_VERSION:="IGNORE"}
# @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_SUM
# @DESCRIPTION: (Optional) SHA-1 checksum of system bios image
: ${CROS_FIRMWARE_MAIN_IMAGE_SUM:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_EC_SUM
# @DESCRIPTION: (Optional) SHA-1 checksum of EC firmware image on BCS
: ${CROS_FIRMWARE_EC_IMAGE_SUM:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_PLATFORM
# @DESCRIPTION: (Optional) Platform name of firmware
: ${CROS_FIRMWARE_PLATFORM:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_SCRIPT
# @DESCRIPTION: (Optional) Entry script file name of updater
: ${CROS_FIRMWARE_SCRIPT:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_UNSTABLE
# @DESCRIPTION: (Optional) Mark firmrware as unstable (always RO+RW update)
: ${CROS_FIRMWARE_UNSTABLE:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_BINARY
# @DESCRIPTION: (Optional) location of custom flashrom tool
: ${CROS_FIRMWARE_FLASHROM_BINARY:=}
# @ECLASS-VARIABLE: CROS_FIRMWARE_EXTRA_LIST
# @DESCRIPTION: (Optional) Semi-colon separated list of additional resources
: ${CROS_FIRMWARE_EXTRA_LIST:=}
# Some tools (flashrom, iotools, mosys, ...) were bundled in the updater so we
# don't write RDEPEND=$DEPEND. RDEPEND should have an explicit list of what it
# needs to extract and execute the updater.
DEPEND="
>=chromeos-base/vboot_reference-1.0-r230
dev-util/shflags
>=sys-apps/flashrom-0.9.3-r36
sys-apps/mosys
"
# Maintenance note: The factory install shim downloads and executes
# the firmware updater. Consequently, runtime dependencies for the
# updater are also runtime dependencies for the install shim.
#
# The contents of RDEPEND below must also be present in the
# chromeos-base/chromeos-factoryinstall ebuild in PROVIDED_DEPEND.
# If you make any change to the list below, you may need to make a
# matching change in the factory install ebuild.
#
# TODO(hungte) remove gzip/tar if we have busybox
RDEPEND="
app-arch/gzip
app-arch/sharutils
app-arch/tar
chromeos-base/vboot_reference
sys-apps/mosys
sys-apps/util-linux"
# Check for EAPI 2 or 3
case "${EAPI:-0}" in
3|2) ;;
1|0|:) DEPEND="EAPI-UNSUPPORTED" ;;
esac
UPDATE_SCRIPT="chromeos-firmwareupdate"
FW_IMAGE_LOCATION=""
EC_IMAGE_LOCATION=""
EXTRA_LOCATIONS=""
# Returns true (0) if parameter starts with "bcs://"
_is_on_bcs() {
[[ "${1%%://*}" = "bcs" ]]
}
# Returns true (0) if parameter starts with "file://"
_is_in_files() {
[[ "${1%%://*}" = "file" ]]
}
# Fetch a file from the Binary Component Server
# Parameters: URI of file "bcs://filename.tbz2", checksum of file.
# Returns: Nothing
_bcs_fetch() {
local filename="${1##*://}"
local checksum="$2"
# Support both old and new locations for BCS binaries.
# TODO(dparker@chromium.org): Remove after all binaries are using the new
# location. crosbug.com/22789
if [ -z "${CROS_FIRMWARE_BCS_OVERLAY_NAME}" ]; then
URI_BASE="ssh://${CROS_FIRMWARE_BCS_USER_NAME}@git.chromium.org:6222"\
"/home/${CROS_FIRMWARE_BCS_USER_NAME}/${CATEGORY}/${PN}"
else
URI_BASE="ssh://${CROS_FIRMWARE_BCS_USER_NAME}@git.chromium.org:6222"\
"/${CROS_FIRMWARE_BCS_OVERLAY_NAME}/${CATEGORY}/${PN}"
fi
CROS_BINARY_URI="${URI_BASE}/${filename}"
CROS_BINARY_SUM="${checksum}"
cros-binary_fetch
}
# Unpack a tbz2 firmware archive to ${S}
# Parameters: Location of archived firmware
# Returns: Location of unpacked firmware as $RETURN_VALUE
_src_unpack() {
local filepath="${1}"
local filename="$(basename ${filepath})"
mkdir -p "${S}" || die "Not able to create ${S}"
cp "${filepath}" "${S}" || die "Can't copy ${filepath} to ${S}"
cd "${S}" || die "Can't change directory to ${S}"
tar -axpf "${filename}" ||
die "Failed to unpack ${filename}"
RETURN_VALUE="${S}/$(tar tf ${filename})"
}
# Unpack a tbz2 archive fetched from the BCS to ${S}
# Parameters: URI of file. Example: "bcs://filename.tbz2"
# Returns: Location of unpacked firmware as $RETURN_VALUE
_bcs_src_unpack() {
local filename="${1##*://}"
_src_unpack "${CROS_BINARY_STORE_DIR}/${filename}"
RETURN_VALUE="${RETURN_VALUE}"
}
# Provides the location of a firmware image given a URI.
# Unpacks the firmware image if necessary.
# Parameters: URI of file.
# Example: "file://filename.ext" or an absolute filepath.
# Returns the absolute filepath of the unpacked firmware as $RETURN_VALUE
_firmware_image_location() {
local source_uri=$1
if _is_in_files "${source_uri}"; then
local image_location="${FILESDIR}/${source_uri#*://}"
else
local image_location="${source_uri}"
fi
[[ -f "${image_location}" ]] || die "File not found: ${image_location}"
case "${image_location}" in
*.tbz2 | *.tbz | *.tar.bz2 | *.tgz | *.tar.gz )
_src_unpack "${image_location}"
RETURN_VALUE="${RETURN_VALUE}"
;;
* )
RETURN_VALUE="${image_location}"
esac
}
cros-firmware_src_unpack() {
cros-workon_src_unpack
# Backwards compatibility with the older naming convention.
if [[ -n "${CROS_FIRMWARE_BIOS_ARCHIVE}" ]]; then
CROS_FIRMWARE_MAIN_IMAGE="bcs://${CROS_FIRMWARE_BIOS_ARCHIVE}"
fi
if [[ -n "${CROS_FIRMWARE_EC_ARCHIVE}" ]]; then
CROS_FIRMWARE_EC_IMAGE="bcs://${CROS_FIRMWARE_EC_ARCHIVE}"
fi
# Fetch and unpack the system firmware image
if [[ -n "${CROS_FIRMWARE_MAIN_IMAGE}" ]]; then
if _is_on_bcs "${CROS_FIRMWARE_MAIN_IMAGE}"; then
_bcs_fetch "${CROS_FIRMWARE_MAIN_IMAGE}" \
"${CROS_FIRMWARE_MAIN_SUM}"
_bcs_src_unpack "${CROS_FIRMWARE_MAIN_IMAGE}"
FW_IMAGE_LOCATION="${RETURN_VALUE}"
else
_firmware_image_location "${CROS_FIRMWARE_MAIN_IMAGE}"
FW_IMAGE_LOCATION="${RETURN_VALUE}"
fi
fi
# Fetch and unpack the EC image
if [[ -n "${CROS_FIRMWARE_EC_IMAGE}" ]]; then
if _is_on_bcs "${CROS_FIRMWARE_EC_IMAGE}"; then
_bcs_fetch "${CROS_FIRMWARE_EC_IMAGE}"\
"${CROS_FIRMWARE_EC_SUM}"
_bcs_src_unpack "${CROS_FIRMWARE_EC_IMAGE}"
EC_IMAGE_LOCATION="${RETURN_VALUE}"
else
_firmware_image_location "${CROS_FIRMWARE_EC_IMAGE}"
EC_IMAGE_LOCATION="${RETURN_VALUE}"
fi
fi
# Fetch and unpack BCS resources in CROS_FIRMWARE_EXTRA_LIST
local extra extra_list
# For backward compatibility, ':' is still supported if there's no
# special URL (bcs://, file://).
local tr_source=';:' tr_target='\n\n'
if echo "${CROS_FIRMWARE_EXTRA_LIST}" | grep -q '://'; then
tr_source=';'
tr_target='\n'
fi
extra_list="$(echo "${CROS_FIRMWARE_EXTRA_LIST}" |
tr "$tr_source" "$tr_target")"
for extra in $extra_list; do
if _is_on_bcs "${extra}"; then
_bcs_fetch "${extra}" ""
_bcs_src_unpack "${extra}"
RETURN_VALUE="${RETURN_VALUE}"
else
RETURN_VALUE="${extra}"
fi
EXTRA_LOCATIONS="${EXTRA_LOCATIONS}:${RETURN_VALUE}"
done
EXTRA_LOCATIONS="${EXTRA_LOCATIONS#:}"
}
cros-firmware_src_compile() {
local image_cmd="" ext_cmd=""
# Prepare images
if [ -n "${FW_IMAGE_LOCATION}" ]; then
image_cmd="$image_cmd -b ${FW_IMAGE_LOCATION}"
fi
if [ -n "${EC_IMAGE_LOCATION}" ]; then
image_cmd="$image_cmd -e ${EC_IMAGE_LOCATION}"
fi
# Prepare extra commands
if [ -n "$CROS_FIRMWARE_UNSTABLE" ]; then
ext_cmd="$ext_cmd --unstable"
fi
if [ -n "$CROS_FIRMWARE_SCRIPT" ]; then
ext_cmd="$ext_cmd --script $CROS_FIRMWARE_SCRIPT"
fi
if [ -n "$CROS_FIRMWARE_FLASHROM_BINARY" ]; then
ext_cmd="$ext_cmd --flashrom $CROS_FIRMWARE_FLASHROM_BINARY"
fi
if [ -n "$EXTRA_LOCATIONS" ]; then
ext_cmd="$ext_cmd --extra $EXTRA_LOCATIONS"
fi
# Pack firmware update script!
if [ -z "$image_cmd" ]; then
# Create an empty update script for the generic case
# (no need to update)
einfo "Building empty firmware update script"
echo -n > ${UPDATE_SCRIPT}
else
# create a new script
einfo "Building ${BOARD} firmware updater: $image_cmd $ext_cmd"
"${WORKDIR}/${CROS_WORKON_LOCALNAME}"/pack_firmware.sh \
--ec_version "${CROS_FIRMWARE_EC_VERSION}" \
--platform "${CROS_FIRMWARE_PLATFORM}" \
-o ${UPDATE_SCRIPT} $image_cmd $ext_cmd \
--tool_base="$ROOT/usr/sbin:$ROOT/usr/bin" ||
die "Cannot pack firmware."
fi
chmod +x ${UPDATE_SCRIPT}
}
cros-firmware_src_install() {
# install the main updater program
dosbin $UPDATE_SCRIPT || die "Failed to install update script."
# install factory wipe script
dosbin firmware-factory-wipe
}
EXPORT_FUNCTIONS src_unpack src_compile src_install