Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 1 | # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 2 | # Distributed under the terms of the GNU General Public License v2 |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 3 | # |
| 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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 8 | # TODO(hungte) Remove cros-binary when BCS_OVERLAY transition is ready. |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 9 | inherit cros-workon cros-binary |
| 10 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 11 | # @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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 16 | # @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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 20 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Dave Parker | 7a882f0 | 2011-11-10 01:12:51 +0000 | [diff] [blame] | 21 | # @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_OVERLAY_NAME |
| 22 | # @DESCRIPTION: (Optional) Name of the ebuild overlay. |
| 23 | : ${CROS_FIRMWARE_BCS_OVERLAY_NAME:=} |
| 24 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 25 | # @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_IMAGE |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 26 | # @DESCRIPTION: (Optional) Location of system firmware (BIOS) image |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 27 | : ${CROS_FIRMWARE_MAIN_IMAGE:=} |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 28 | |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 29 | # @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 Lin | 20c5123 | 2013-05-02 12:44:11 +0800 | [diff] [blame] | 33 | # @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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 37 | # @ECLASS-VARIABLE: CROS_FIRMWARE_EC_IMAGE |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 38 | # @DESCRIPTION: (Optional) Location of EC firmware image |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 39 | : ${CROS_FIRMWARE_EC_IMAGE:=} |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 40 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 41 | # @ECLASS-VARIABLE: CROS_FIRMWARE_EC_VERSION |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 42 | # @DESCRIPTION: (Optional) Version name of EC firmware |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 43 | : ${CROS_FIRMWARE_EC_VERSION:=} |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 44 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 45 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 46 | # @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_SUM |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 47 | # @DESCRIPTION: (Optional) SHA-1 checksum of system firmware (BIOS) image |
Bernie Thompson | 6b030c3 | 2013-01-11 14:46:13 -0800 | [diff] [blame] | 48 | : ${CROS_FIRMWARE_MAIN_SUM:=} |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 49 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 50 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Bernie Thompson | 6b030c3 | 2013-01-11 14:46:13 -0800 | [diff] [blame] | 51 | # @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_RW_SUM |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 52 | # @DESCRIPTION: (Optional) SHA-1 checksum of RW system firmware image |
Bernie Thompson | 6b030c3 | 2013-01-11 14:46:13 -0800 | [diff] [blame] | 53 | : ${CROS_FIRMWARE_MAIN_RW_SUM:=} |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 54 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 55 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 56 | # @ECLASS-VARIABLE: CROS_FIRMWARE_EC_SUM |
| 57 | # @DESCRIPTION: (Optional) SHA-1 checksum of EC firmware image on BCS |
Bernie Thompson | 6b030c3 | 2013-01-11 14:46:13 -0800 | [diff] [blame] | 58 | : ${CROS_FIRMWARE_EC_SUM:=} |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 59 | |
Hung-Te Lin | 890a226 | 2011-05-19 20:22:41 +0800 | [diff] [blame] | 60 | # @ECLASS-VARIABLE: CROS_FIRMWARE_PLATFORM |
| 61 | # @DESCRIPTION: (Optional) Platform name of firmware |
| 62 | : ${CROS_FIRMWARE_PLATFORM:=} |
| 63 | |
Hung-Te Lin | 35cf1a1 | 2011-07-21 23:16:35 +0800 | [diff] [blame] | 64 | # @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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 69 | # @DESCRIPTION: (Optional) Mark firmware as unstable (always RO+RW update) |
Hung-Te Lin | 35cf1a1 | 2011-07-21 23:16:35 +0800 | [diff] [blame] | 70 | : ${CROS_FIRMWARE_UNSTABLE:=} |
| 71 | |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 72 | # @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 Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 77 | # @DESCRIPTION: (Optional) Semi-colon separated list of additional resources |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 78 | : ${CROS_FIRMWARE_EXTRA_LIST:=} |
| 79 | |
Hung-Te Lin | 0c59d0a | 2012-08-16 13:18:09 +0800 | [diff] [blame] | 80 | # @ECLASS-VARIABLE: CROS_FIRMWARE_FORCE_UPDATE |
| 81 | # @DESCRIPTION: (Optional) Always add "force update firmware" tag. |
| 82 | : ${CROS_FIRMWARE_FORCE_UPDATE:=} |
| 83 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 84 | # Check for EAPI 2+ |
| 85 | case "${EAPI:-0}" in |
| 86 | 4|3|2) ;; |
| 87 | *) die "unsupported EAPI" ;; |
| 88 | esac |
| 89 | |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 90 | # $board-overlay/make.conf may contain these flags to always create "firmware |
| 91 | # from source". |
Gabe Black | 1515661 | 2013-03-16 02:47:57 -0700 | [diff] [blame] | 92 | IUSE="bootimage cros_ec depthcharge" |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 93 | |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 94 | # 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 97 | DEPEND=" |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 98 | >=chromeos-base/vboot_reference-1.0-r230 |
Mike Frysinger | 2d94c62 | 2012-09-13 23:59:17 -0400 | [diff] [blame] | 99 | chromeos-base/vpd |
Mike Frysinger | 877662c | 2011-10-19 10:45:46 -0400 | [diff] [blame] | 100 | dev-util/shflags |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 101 | >=sys-apps/flashrom-0.9.3-r36 |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 102 | sys-apps/mosys |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 103 | " |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 104 | |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 105 | # Build firmware from source. |
| 106 | DEPEND="$DEPEND |
| 107 | bootimage? ( sys-boot/chromeos-bootimage ) |
| 108 | cros_ec? ( chromeos-base/chromeos-ec ) |
| 109 | " |
| 110 | |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 111 | # 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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 120 | # TODO(hungte) remove gzip/tar if we have busybox |
| 121 | RDEPEND=" |
| 122 | app-arch/gzip |
| 123 | app-arch/sharutils |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 124 | app-arch/tar |
| 125 | chromeos-base/vboot_reference |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 126 | sys-apps/util-linux" |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 127 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 128 | RESTRICT="mirror" |
| 129 | |
| 130 | # Local variables. |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 131 | |
| 132 | UPDATE_SCRIPT="chromeos-firmwareupdate" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 133 | FW_IMAGE_LOCATION="" |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 134 | FW_RW_IMAGE_LOCATION="" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 135 | EC_IMAGE_LOCATION="" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 136 | EXTRA_LOCATIONS=() |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 137 | |
| 138 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 139 | RETURN_VALUE="" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 140 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 141 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 142 | # Returns true (0) if parameter starts with "bcs://" |
| 143 | _is_on_bcs() { |
| 144 | [[ "${1%%://*}" = "bcs" ]] |
| 145 | } |
| 146 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 147 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 148 | # 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 Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 154 | # Parameters: URI of file "bcs://filename.tbz2", checksum of file. |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 155 | # Returns: Nothing |
| 156 | _bcs_fetch() { |
Brian Harring | cf0c766 | 2012-12-19 23:06:44 -0800 | [diff] [blame] | 157 | ${CROS_BINARY_FETCH_REQUIRED} || return 0 |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 158 | local filename="${1##*://}" |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 159 | local checksum="$2" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 160 | |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 161 | 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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 172 | CROS_BINARY_URI="${URI_BASE}/${filename}" |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 173 | CROS_BINARY_SUM="${checksum}" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 174 | cros-binary_fetch |
| 175 | } |
| 176 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 177 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 178 | # 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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 186 | cd "${S}" || die "Can't change directory to ${S}" |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 187 | tar -axpf "${filename}" || |
| 188 | die "Failed to unpack ${filename}" |
Hung-Te Lin | 9c85e0b | 2012-12-10 12:26:32 +0800 | [diff] [blame] | 189 | 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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 196 | } |
| 197 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 198 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 199 | # 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 Harring | cf0c766 | 2012-12-19 23:06:44 -0800 | [diff] [blame] | 204 | if ${CROS_BINARY_FETCH_REQUIRED}; then |
| 205 | _src_unpack "${CROS_BINARY_STORE_DIR}/${filename}" |
| 206 | else |
| 207 | _src_unpack "${DISTDIR}/${filename}" |
| 208 | fi |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 209 | RETURN_VALUE="${RETURN_VALUE}" |
| 210 | } |
| 211 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 212 | # TODO(hungte) Remove when BCS_OVERLAY transition is ready. |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 213 | # 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 Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 226 | 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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 234 | } |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 235 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 236 | # New SRC_URI based approach. |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 237 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 238 | _add_source() { |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 239 | local var="$1" |
| 240 | local input="${!var}" |
| 241 | local protocol="${input%%://*}" |
| 242 | local uri="${input#*://}" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 243 | 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 246 | |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 247 | # Input without ${protocol} are local files (ex, ${FILESDIR}/file). |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 248 | case "${protocol}" in |
| 249 | bcs) |
| 250 | SRC_URI+=" ${bcs_url}/${CATEGORY}/${PN}/${uri}" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 251 | ;; |
| 252 | http|https) |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 253 | SRC_URI+=" ${input}" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 254 | ;; |
| 255 | esac |
| 256 | } |
| 257 | |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 258 | _unpack_archive() { |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 259 | local var="$1" |
| 260 | local input="${!var}" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 261 | local archive="${input##*/}" |
| 262 | local folder="${S}/.dist/${archive}" |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 263 | |
| 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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 272 | |
| 273 | case "${input##*.}" in |
| 274 | tar|tbz2|tbz|bz|gz|tgz|zip|xz) ;; |
| 275 | *) |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 276 | eval ${var}="'${input}'" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 277 | 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 Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 289 | eval ${var}="'${folder}/${contents}'" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 290 | } |
| 291 | |
| 292 | _legacy_src_unpack() { |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 293 | # 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 Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 296 | _bcs_fetch "${CROS_FIRMWARE_MAIN_IMAGE}" \ |
| 297 | "${CROS_FIRMWARE_MAIN_SUM}" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 298 | _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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 304 | fi |
| 305 | |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 306 | # 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 Thompson | 6b030c3 | 2013-01-11 14:46:13 -0800 | [diff] [blame] | 310 | "${CROS_FIRMWARE_MAIN_RW_SUM}" |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 311 | _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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 319 | # Fetch and unpack the EC image |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 320 | if [[ -n "${CROS_FIRMWARE_EC_IMAGE}" ]]; then |
| 321 | if _is_on_bcs "${CROS_FIRMWARE_EC_IMAGE}"; then |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 322 | _bcs_fetch "${CROS_FIRMWARE_EC_IMAGE}"\ |
| 323 | "${CROS_FIRMWARE_EC_SUM}" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 324 | _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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 330 | fi |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 331 | |
| 332 | # Fetch and unpack BCS resources in CROS_FIRMWARE_EXTRA_LIST |
| 333 | local extra extra_list |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 334 | # For backward compatibility, colon is still supported when there is no |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 335 | # 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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 343 | EXTRA_LOCATIONS=() |
| 344 | for extra in ${extra_list}; do |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 345 | if _is_on_bcs "${extra}"; then |
Hung-Te Lin | 5083f07 | 2012-02-01 14:19:53 +0800 | [diff] [blame] | 346 | _bcs_fetch "${extra}" "" |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 347 | _bcs_src_unpack "${extra}" |
| 348 | RETURN_VALUE="${RETURN_VALUE}" |
| 349 | else |
| 350 | RETURN_VALUE="${extra}" |
| 351 | fi |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 352 | EXTRA_LOCATIONS+=(${RETURN_VALUE}) |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 353 | done |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 354 | } |
| 355 | |
| 356 | cros-firmware_src_unpack() { |
| 357 | cros-workon_src_unpack |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 358 | local i |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 359 | |
| 360 | if [[ -n "${CROS_FIRMWARE_BCS_OVERLAY_NAME}" ]]; then |
| 361 | _legacy_src_unpack |
| 362 | return |
| 363 | fi |
| 364 | |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 365 | for i in {FW,FW_RW,EC}_IMAGE_LOCATION; do |
| 366 | _unpack_archive ${i} |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 367 | done |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 368 | |
| 369 | for ((i = 0; i < ${#EXTRA_LOCATIONS[@]}; i++)); do |
| 370 | _unpack_archive "EXTRA_LOCATIONS[$i]" |
| 371 | done |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 372 | } |
| 373 | |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 374 | _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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 392 | cros-firmware_src_compile() { |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 393 | local image_cmd="" ext_cmd="" local_image_cmd="" |
| 394 | local root="${ROOT%/}" |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 395 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 396 | # Prepare images |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 397 | image_cmd+="$(_add_param -b "${FW_IMAGE_LOCATION}")" |
| 398 | image_cmd+="$(_add_param -e "${EC_IMAGE_LOCATION}")" |
Hung-Te Lin | c8c15d9 | 2013-01-10 16:19:40 +0800 | [diff] [blame] | 399 | image_cmd+="$(_add_param -w "${FW_RW_IMAGE_LOCATION}")" |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 400 | image_cmd+="$(_add_param --ec_version "${CROS_FIRMWARE_EC_VERSION}")" |
Hung-Te Lin | 20c5123 | 2013-05-02 12:44:11 +0800 | [diff] [blame] | 401 | image_cmd+="$(_add_bool_param --create_bios_rw_image \ |
| 402 | "${CROS_FIRMWARE_BUILD_MAIN_RW_IMAGE}")" |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 403 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 404 | # Prepare extra commands |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 405 | ext_cmd+="$(_add_bool_param --unstable "${CROS_FIRMWARE_UNSTABLE}")" |
Hung-Te Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 406 | ext_cmd+="$(_add_param --extra "$(IFS=:; echo "${EXTRA_LOCATIONS[*]}")")" |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 407 | 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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 412 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 413 | # Pack firmware update script! |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 414 | if [ -z "$image_cmd" ]; then |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 415 | # Create an empty update script for the generic case |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 416 | # (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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 421 | einfo "Build ${BOARD_USE} firmware updater: $image_cmd $ext_cmd" |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 422 | ./pack_firmware.sh $image_cmd $ext_cmd -o $UPDATE_SCRIPT || |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 423 | die "Cannot pack firmware." |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 424 | fi |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 425 | |
| 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 Black | 1515661 | 2013-03-16 02:47:57 -0700 | [diff] [blame] | 432 | 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 Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 436 | die "Cannot pack local firmware." |
Gabe Black | 1515661 | 2013-03-16 02:47:57 -0700 | [diff] [blame] | 437 | 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 Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 448 | 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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 453 | } |
| 454 | |
| 455 | cros-firmware_src_install() { |
| 456 | # install the main updater program |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 457 | dosbin $UPDATE_SCRIPT || die "Failed to install update script." |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 458 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 459 | # install factory wipe script |
| 460 | dosbin firmware-factory-wipe |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 461 | |
| 462 | # install updaters for firmware-from-source archive. |
| 463 | if use bootimage; then |
| 464 | exeinto /firmware |
Gabe Black | 1515661 | 2013-03-16 02:47:57 -0700 | [diff] [blame] | 465 | doexe updater*.sh |
Hung-Te Lin | 0cde8bf | 2012-08-07 18:22:26 +0800 | [diff] [blame] | 466 | fi |
Hung-Te Lin | 0c59d0a | 2012-08-16 13:18:09 +0800 | [diff] [blame] | 467 | |
| 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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 474 | } |
| 475 | |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 476 | # @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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 484 | |
Hung-Te Lin | bcecb3e | 2013-03-13 13:42:56 +0800 | [diff] [blame] | 485 | # @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. |
| 490 | cros-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 Lin | 5febb1e | 2013-03-12 17:56:35 +0800 | [diff] [blame] | 504 | 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 512 | EXPORT_FUNCTIONS src_unpack src_compile src_install |