Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 1 | # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| 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 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 8 | inherit cros-workon cros-binary |
| 9 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 10 | # @ECLASS-VARIABLE: CROS_FIRMWARE_BCS_USER_NAME |
| 11 | # @DESCRIPTION: (Optional) Name of user on BCS server |
| 12 | : ${CROS_FIRMWARE_BCS_USER_NAME:=} |
| 13 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 14 | # @ECLASS-VARIABLE: CROS_FIRMWARE_MAIN_IMAGE |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 15 | # @DESCRIPTION: (Optional) Location of system bios image |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 16 | : ${CROS_FIRMWARE_MAIN_IMAGE:=} |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 17 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 18 | # @ECLASS-VARIABLE: CROS_FIRMWARE_EC_IMAGE |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 19 | # @DESCRIPTION: (Optional) Location of EC firmware image |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 20 | : ${CROS_FIRMWARE_EC_IMAGE:=} |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 21 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 22 | # @ECLASS-VARIABLE: CROS_FIRMWARE_EC_VERSION |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 23 | # @DESCRIPTION: (Optional) Version name of EC firmware |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 24 | : ${CROS_FIRMWARE_EC_VERSION:="IGNORE"} |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 25 | |
Hung-Te Lin | 890a226 | 2011-05-19 20:22:41 +0800 | [diff] [blame] | 26 | # @ECLASS-VARIABLE: CROS_FIRMWARE_PLATFORM |
| 27 | # @DESCRIPTION: (Optional) Platform name of firmware |
| 28 | : ${CROS_FIRMWARE_PLATFORM:=} |
| 29 | |
Hung-Te Lin | 35cf1a1 | 2011-07-21 23:16:35 +0800 | [diff] [blame] | 30 | # @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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 38 | # @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 Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 43 | # @DESCRIPTION: (Optional) Semi-colon separated list of additional resources |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 44 | : ${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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 49 | DEPEND=" |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 50 | >=chromeos-base/vboot_reference-1.0-r230 |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 51 | dev-libs/shflags |
Mike Frysinger | 877662c | 2011-10-19 10:45:46 -0400 | [diff] [blame^] | 52 | dev-util/shflags |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 53 | >=sys-apps/flashrom-0.9.3-r36 |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 54 | sys-apps/mosys |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 55 | " |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 56 | |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 57 | # 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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 66 | # TODO(hungte) remove gzip/tar if we have busybox |
| 67 | RDEPEND=" |
| 68 | app-arch/gzip |
| 69 | app-arch/sharutils |
J. Richard Barnette | 7a4385c | 2011-05-03 16:54:57 -0700 | [diff] [blame] | 70 | app-arch/tar |
| 71 | chromeos-base/vboot_reference |
| 72 | sys-apps/mosys |
| 73 | sys-apps/util-linux" |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 74 | |
| 75 | # Check for EAPI 2 or 3 |
| 76 | case "${EAPI:-0}" in |
| 77 | 3|2) ;; |
| 78 | 1|0|:) DEPEND="EAPI-UNSUPPORTED" ;; |
| 79 | esac |
| 80 | |
| 81 | UPDATE_SCRIPT="chromeos-firmwareupdate" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 82 | FW_IMAGE_LOCATION="" |
| 83 | EC_IMAGE_LOCATION="" |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 84 | EXTRA_LOCATIONS="" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 85 | |
| 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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 116 | cd "${S}" || die "Can't change directory to ${S}" |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 117 | tar -axpf "${filename}" || |
| 118 | die "Failed to unpack ${filename}" |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 119 | 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 Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 144 | 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 Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 152 | } |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 153 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 154 | cros-firmware_src_unpack() { |
| 155 | cros-workon_src_unpack |
| 156 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 157 | # 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 164 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 165 | # 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 175 | fi |
| 176 | |
| 177 | # Fetch and unpack the EC image |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 178 | 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 187 | fi |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 188 | |
| 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 Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 211 | } |
| 212 | |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 213 | cros-firmware_src_compile() { |
| 214 | local image_cmd="" ext_cmd="" |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 215 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 216 | # Prepare images |
| 217 | if [ -n "${FW_IMAGE_LOCATION}" ]; then |
| 218 | image_cmd="$image_cmd -b ${FW_IMAGE_LOCATION}" |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 219 | fi |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 220 | if [ -n "${EC_IMAGE_LOCATION}" ]; then |
| 221 | image_cmd="$image_cmd -e ${EC_IMAGE_LOCATION}" |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 222 | fi |
| 223 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 224 | # Prepare extra commands |
Hung-Te Lin | 35cf1a1 | 2011-07-21 23:16:35 +0800 | [diff] [blame] | 225 | 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 Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 231 | if [ -n "$CROS_FIRMWARE_FLASHROM_BINARY" ]; then |
| 232 | ext_cmd="$ext_cmd --flashrom $CROS_FIRMWARE_FLASHROM_BINARY" |
| 233 | fi |
Hung-Te Lin | e2e4a6b | 2011-08-31 18:57:26 +0800 | [diff] [blame] | 234 | if [ -n "$EXTRA_LOCATIONS" ]; then |
| 235 | ext_cmd="$ext_cmd --extra $EXTRA_LOCATIONS" |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 236 | fi |
| 237 | |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 238 | # Pack firmware update script! |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 239 | if [ -z "$image_cmd" ]; then |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 240 | # Create an empty update script for the generic case |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 241 | # (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 Parker | b0f1af8 | 2011-04-18 11:14:53 -0700 | [diff] [blame] | 247 | "${WORKDIR}/${CROS_WORKON_LOCALNAME}"/pack_firmware.sh \ |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 248 | --ec_version "${CROS_FIRMWARE_EC_VERSION}" \ |
Hung-Te Lin | 890a226 | 2011-05-19 20:22:41 +0800 | [diff] [blame] | 249 | --platform "${CROS_FIRMWARE_PLATFORM}" \ |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 250 | -o ${UPDATE_SCRIPT} $image_cmd $ext_cmd \ |
Hung-Te Lin | 49a9486 | 2011-04-19 09:20:55 +0800 | [diff] [blame] | 251 | --tool_base="$ROOT/usr/sbin:$ROOT/usr/bin" || |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 252 | die "Cannot pack firmware." |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 253 | fi |
| 254 | chmod +x ${UPDATE_SCRIPT} |
| 255 | } |
| 256 | |
| 257 | cros-firmware_src_install() { |
| 258 | # install the main updater program |
Dave Parker | 914ef51 | 2011-05-10 09:55:05 -0700 | [diff] [blame] | 259 | dosbin $UPDATE_SCRIPT || die "Failed to install update script." |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 260 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 261 | # install factory wipe script |
| 262 | dosbin firmware-factory-wipe |
Dave Parker | 515cdcd | 2011-03-08 17:58:43 -0800 | [diff] [blame] | 263 | } |
| 264 | |
Dave Parker | d7d4c40 | 2011-04-15 08:01:34 -0700 | [diff] [blame] | 265 | EXPORT_FUNCTIONS src_unpack src_compile src_install |