summaryrefslogtreecommitdiff
path: root/util/chromeos/crosfirmware.sh
diff options
context:
space:
mode:
Diffstat (limited to 'util/chromeos/crosfirmware.sh')
-rw-r--r--util/chromeos/crosfirmware.sh140
1 files changed, 140 insertions, 0 deletions
diff --git a/util/chromeos/crosfirmware.sh b/util/chromeos/crosfirmware.sh
new file mode 100644
index 0000000000..a4cb487c2c
--- /dev/null
+++ b/util/chromeos/crosfirmware.sh
@@ -0,0 +1,140 @@
+#!/bin/bash -x
+#
+# This file is part of the coreboot project.
+#
+# Copyright (C) 2016 Joe Pillow
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+
+# This script needs
+# * sharutils
+
+#DEBUG=1
+
+debug()
+{
+ test "$DEBUG" == "1" && echo "$*"
+}
+
+get_inventory()
+{
+ _conf=$1
+ _url=https://dl.google.com/dl/edgedl/chromeos/recovery/recovery.conf
+
+ debug "Downloading recovery image inventory..."
+
+ curl -s "$_url" > $_conf
+}
+
+download_image()
+{
+ _url=$1
+ _file=$2
+
+ debug "Downloading recovery image"
+ curl -s "$_url" > "$_file.zip"
+ debug "Decompressing recovery image"
+ unzip -q "$_file.zip"
+ rm "$_file.zip"
+}
+
+extract_partition()
+{
+ NAME=$1
+ FILE=$2
+ ROOTFS=$3
+ _bs=1024
+
+ debug "Extracting ROOT-A partition"
+ ROOTP=$( printf "unit\nB\nprint\nquit\n" | parted $FILE | grep $NAME )
+
+ START=$(( $( echo $ROOTP | cut -f2 -d\ | tr -d "B" ) ))
+ SIZE=$(( $( echo $ROOTP | cut -f4 -d\ | tr -d "B" ) ))
+
+ dd if=$FILE of=$ROOTFS bs=$_bs skip=$(( $START / $_bs )) \
+ count=$(( $SIZE / $_bs )) > /dev/null 2>&1
+}
+
+extract_shellball()
+{
+ ROOTFS=$1
+ SHELLBALL=$2
+
+ debug "Extracting chromeos-firmwareupdate"
+ printf "cd /usr/sbin\ndump chromeos-firmwareupdate $SHELLBALL\nquit" | \
+ debugfs $ROOTFS > /dev/null 2>&1
+}
+
+extract_coreboot()
+{
+ _shellball=$1
+ _unpacked=$( mktemp -d )
+
+ debug "Extracting coreboot image"
+ sh $_shellball --sb_extract $_unpacked > /dev/null
+
+ _version=$( cat $_unpacked/VERSION | grep BIOS\ version: | \
+ cut -f2 -d: | tr -d \ )
+
+ cp $_unpacked/bios.bin coreboot-$_version.bin
+ rm -r "$_unpacked"
+}
+
+do_one_board()
+{
+ _board=$1
+ _url=$2
+ _file=$3
+
+ download_image $_url $_file
+
+ extract_partition ROOT-A $_file root-a.ext2
+ extract_shellball root-a.ext2 chromeos-firmwareupdate-$_board
+ rm $_file root-a.ext2
+
+ extract_coreboot chromeos-firmwareupdate-$_board
+}
+
+#
+# Main
+#
+
+BOARD=$1
+
+if [ "$BOARD" == "all" ]; then
+ CONF=$( mktemp )
+ get_inventory $CONF
+
+ grep ^name= $CONF| while read _line; do
+ name=$( echo $_line | cut -f2 -d= )
+ echo Processing board $name
+ eval $( grep -v hwid= $CONF | grep -A11 "$_line" | \
+ grep '\(url=\|file=\)' )
+ BOARD=$( echo $url | cut -f3 -d_ )
+ do_one_board $BOARD $url $file
+ done
+
+ rm "$CONF"
+elif [ "$BOARD" != "" ]; then
+ CONF=$( mktemp )
+ get_inventory $CONF
+
+ echo Processing board $BOARD
+ eval $( grep $BOARD $CONF | grep '\(url=\|file=\)' )
+ do_one_board $BOARD $url $file
+
+ rm "$CONF"
+else
+ echo "Usage: $0 <boardname>"
+ echo " $0 all"
+ echo
+ exit 1
+fi