Permalink
Browse files

Merge pull request #51 from nylen/pull1

A bunch of changes (v2)
  • Loading branch information...
2 parents de54b22 + 6f68015 commit 31292f70fcdcafaefbed1ebfb7361d13a0f9904b @Hexxeh committed Jan 3, 2013
Showing with 116 additions and 84 deletions.
  1. +50 −32 README.md
  2. +66 −52 rpi-update
View
@@ -1,56 +1,74 @@
-rpi-update
-==========
+# rpi-update
-An easier way to update the firmware of your Raspberry Pi
+An easier way to update the firmware of your Raspberry Pi.
-Instructions
-------------
+## Preparations
+
+There are two possible problems related to SSL certificates that may prevent
+this tool from working.
+
+- The time may be set incorrectly on your Raspberry Pi, which you can fix
+ by setting the time using NTP.
+
+ sudo ntpdate -u ntp.ubuntu.com
+
+- The other possible issue is that you might not have the `ca-certificates`
+ package installed, and so GitHub's SSL certificate isn't trusted. If you are
+ on Debian, you can resolve this by typing:
+
+ sudo apt-get install ca-certificates
+
+## Installing
To install the tool, run the following command:
-<pre>
-sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
-</pre>
+ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
+
+## Updating
-If you get errors relating to certificates, then the problem is likely due to one of two things. Either the time is set incorrectly on your Raspberry Pi, which you can fix by simply setting the time using NTP. The other possible issue is that you might not have the ca-certificates package installed, and so GitHub's SSL certificate isn't trusted. If you're on Debian, you can resolve this by typing:
+Then, to update your firmware, just run the following command:
-<pre>
-sudo apt-get install ca-certificates
-</pre>
+ sudo rpi-update
-To then update your firmware, simply run the following command:
+## Activating
-<pre>
-sudo rpi-update
-</pre>
+After the firmware has been sucessfully updated, you'll need to reboot to load
+the new firmware.
-To upgrade/downgrade to a specific firmware revision, specify it's Git hash as follows:
+## Options
- rpi-update <git hash>
+If you'd like to set a different GPU/ARM memory split, then define `gpu_mem` in
+`/boot/config.txt`.
-If you'd like to set a different GPU/ARM memory split, then define gpu_mem in /boot/config.txt.
+To upgrade/downgrade to a specific firmware revision, specify its Git hash
+(from the https://github.com/Hexxeh/rpi-firmware repository) as follows:
-Expert options
---------------
+ sudo rpi-update fab7796df0cf29f9563b507a59ce5b17d93e0390
-There are a number of options for experts you might like to use, these are all environment variables you must set if you wish to use them.
+### Expert options
-### SKIP_KERNEL
+There are a number of options for experts you might like to use. These are all
+environment variables you must set if you wish to use them.
-#### Usage
+#### `UPDATE_SELF`
-SKIP_KERNEL=1 rpi-update
+By default, `rpi-update` will attempt to update itself each time it is run.
+You can disable this behavior by:
-#### Effect
+ sudo UPDATE_SELF=0 rpi-update
-Will update everything EXCEPT the kernel.img files and the kernel modules. Use with caution, some firmware updates might depend a kernel update.
+#### `SKIP_KERNEL`
-### ROOT_PATH/BOOT_PATH
+ sudo SKIP_KERNEL=1 rpi-update
-#### Usage
+Will update everything **except** the `kernel.img` files and the kernel modules.
+Use with caution, some firmware updates might depend on a kernel update.
-ROOT_PATH=/media/root BOOT_PATH=/media/boot rpi-update
+#### `ROOT_PATH` and `BOOT_PATH`
-#### Effect
+ sudo ROOT_PATH=/media/root BOOT_PATH=/media/boot rpi-update
-Allows you to perform an "offline" update, ie update firmware on an SD card you're not currently booted from. Useful for installing firmware/kernel to a non-RPI customised image. Be careful, you must specify both options or neither. Specifying only one will not work.
+Allows you to perform an "offline" update, ie update firmware on an SD card you
+are not currently booted from. Useful for installing firmware/kernel to a
+non-RPI customised image. Be careful, you must specify both options or neither.
+Specifying only one will not work.
View
@@ -5,12 +5,12 @@ set -o errexit
REPO_URI="http://github.com/Hexxeh/rpi-firmware"
-UPDATE2=${UPDATE2:-1}
+UPDATE_SELF=${UPDATE_SELF:-1}
UPDATE_URI="https://github.com/Hexxeh/rpi-update/raw/master/rpi-update"
if [[ ${BOOT_PATH:-"unset"} == "unset" && ${ROOT_PATH:-"unset"} != "unset" ]] ||
[[ ${BOOT_PATH:-"unset"} != "unset" && ${ROOT_PATH:-"unset"} == "unset" ]]; then
- echo "You need to specify both ROOT_PATH and BOOT_PATH, or neither"
+ echo " *** You need to specify both ROOT_PATH and BOOT_PATH, or neither"
exit 1
fi
@@ -27,191 +27,205 @@ GITCMD="git --git-dir=\"${FW_REPOLOCAL}/.git\" --work-tree=\"${FW_REPOLOCAL}\""
[ "${RPI_UPDATE_UNSUPPORTED}" -ne 0 ] && echo -e "You appear to be trying to update firmware on an incompatible distribution. To force update, run the following:\nsudo -E RPI_UPDATE_UNSUPPORTED=0 ./rpi-update" && exit 1
function update_self() {
- echo "Performing self-update"
+ echo " *** Performing self-update"
_tempFileName="$0.tmp"
- if ! wget --quiet --output-document="${_tempFileName}" "${UPDATE_URI}"; then
- echo "Failed to download update for rpi-update!"
- echo "Make sure you have ca-certificates installed and that the time is set correctly"
+ if ! wget --output-document="${_tempFileName}" "${UPDATE_URI}"; then
+ echo " !!! Failed to download update for rpi-update!"
+ echo " !!! Make sure you have ca-certificates installed and that the time is set correctly"
exit 1
fi
OCTAL_MODE=$(stat -c '%a' "$0")
if ! chmod ${OCTAL_MODE} "${_tempFileName}" ; then
- echo "Failed: Error while trying to set mode on ${_tempFileName}"
+ echo " !!! Failed: Error while trying to set mode on ${_tempFileName}"
exit 1
fi
cat > /tmp/updateScript.sh << EOF
#!/bin/bash
if mv "${_tempFileName}" "$0"; then
rm -- "\$0"
- exec env UPDATE2=0 /bin/bash "$0" "${FW_REV}"
+ exec env UPDATE_SELF=0 /bin/bash "$0" "${FW_REV}"
else
- echo "Failed!"
+ echo " !!! Failed!"
fi
EOF
+ echo " *** Relaunching after update"
exec /bin/bash /tmp/updateScript.sh
}
function update_modules {
if [[ ${SKIP_KERNEL} -eq 0 ]]; then
- cp -R "${FW_REPOLOCAL}/modules/"* "${FW_MODPATH}/"
+ echo " *** Updating modules"
+ cp -vR "${FW_REPOLOCAL}/modules/"* "${FW_MODPATH}/"
find "${FW_REPOLOCAL}/modules" -mindepth 1 -maxdepth 1 -type d | while read DIR; do
+ echo " *** depmod $(basename "${DIR}")"
depmod -b "${ROOT_PATH}" -a $(basename "${DIR}")
done
+ else
+ echo " *** As requested, not updating modules"
fi
}
function update_sdk {
+ echo " *** Updating SDK"
+
if [[ -f /etc/init.d/vcfiled ]]; then
/etc/init.d/vcfiled stop
fi
ELFOUTPUT=$(readelf -a "${ROOT_PATH}/bin/bash")
if [ "${ELFOUTPUT}" != "${ELFOUTPUT/VFP_args/}" ]; then
- echo "Using HardFP libraries"
- cp -R "${FW_REPOLOCAL}/vc/hardfp/"* "${ROOT_PATH}/"
+ echo " *** Using HardFP libraries"
+ cp -vR "${FW_REPOLOCAL}/vc/hardfp/"* "${ROOT_PATH}/"
else
- echo "Using SoftFP libraries"
- cp -R "${FW_REPOLOCAL}/vc/softfp/"* "${ROOT_PATH}/"
+ echo " *** Using SoftFP libraries"
+ cp -vR "${FW_REPOLOCAL}/vc/softfp/"* "${ROOT_PATH}/"
fi
- cp -R "${FW_REPOLOCAL}/vc/sdk/"* "${ROOT_PATH}/"
+ cp -vR "${FW_REPOLOCAL}/vc/sdk/"* "${ROOT_PATH}/"
if [[ -f /etc/init.d/vcfiled ]]; then
/etc/init.d/vcfiled start
fi
}
function update_firmware {
+ echo " *** Updating firmware"
rm -rf ${FW_PATH}/*.elf
rm -rf ${FW_PATH}/*.bin
- cp ${FW_REPOLOCAL}/*.elf "${FW_PATH}/"
- cp ${FW_REPOLOCAL}/*.bin "${FW_PATH}/"
- cp ${FW_REPOLOCAL}/*.dat "${FW_PATH}/"
+ cp -v ${FW_REPOLOCAL}/*.elf "${FW_PATH}/"
+ cp -v ${FW_REPOLOCAL}/*.bin "${FW_PATH}/"
+ cp -v ${FW_REPOLOCAL}/*.dat "${FW_PATH}/"
if [[ ${SKIP_KERNEL} -eq 0 ]]; then
- cp "${FW_REPOLOCAL}/"*.img "${FW_PATH}/"
+ cp -v "${FW_REPOLOCAL}/"*.img "${FW_PATH}/"
else
- echo "Skipping kernel/modules updated as requested"
+ echo " *** As requested, not updating kernel"
fi
}
function finalise {
if [[ -f "${FW_PATH}/arm192_start.elf" ]]; then
- cp "${FW_PATH}/arm192_start.elf" "${FW_PATH}/start.elf"
+ echo " *** Setting 192M ARM split"
+ cp -v "${FW_PATH}/arm192_start.elf" "${FW_PATH}/start.elf"
fi
+ echo " *** Running ldconfig"
ldconfig -r "${ROOT_PATH}"
if [[ ${FW_REV} == "" ]]; then
+ echo " *** Storing current firmware revision"
eval ${GITCMD} rev-parse master > "${FW_PATH}/.firmware_revision"
fi
+ echo " *** Syncing changes to disk"
sync
}
function download_repo {
- echo "Setting up firmware (this will take a few minutes)"
+ echo " *** Setting up firmware (this may take a few minutes)"
mkdir -p "${FW_REPOLOCAL}"
- git clone "${FW_REPO}" "${FW_REPOLOCAL}" --depth=1 --quiet
+ git clone "${FW_REPO}" "${FW_REPOLOCAL}" --depth=1
RETVAL=$?
if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to download new firmware files"
+ echo " !!! Failed to download new firmware files"
exit 1
fi
}
function update_repo {
- echo "Updating firmware (this will take a few minutes)"
- eval ${GITCMD} fetch --quiet
+ echo " *** Updating firmware (this may take a few minutes)"
+ eval ${GITCMD} fetch
RETVAL=$?
if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to download updated firmware files"
+ echo " !!! Failed to download updated firmware files"
exit 1
fi
- eval ${GITCMD} reset --hard --quiet
- eval ${GITCMD} clean -f -d --quiet
- eval ${GITCMD} merge origin/master -m "automerge" --quiet
+ eval ${GITCMD} reset --hard
+ eval ${GITCMD} clean -f -d
+ eval ${GITCMD} merge origin/master -m "automerge"
RETVAL=$?
if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to download updated firmware files"
+ echo " !!! Failed to download updated firmware files"
exit 1
fi
}
function do_backup {
- cp -a "${FW_PATH}" "${FW_PATH}.bak"
- cp -a "${FW_MODPATH}" "${FW_MODPATH}.bak"
+ echo " *** Backing up files"
+ cp -va "${FW_PATH}" "${FW_PATH}.bak"
+ cp -va "${FW_MODPATH}" "${FW_MODPATH}.bak"
}
function do_update {
update_firmware
update_modules
update_sdk
finalise
- echo "If no errors appeared, your firmware was successfully $1"
+ echo " *** If no errors appeared, your firmware was successfully $1"
if [[ "${ROOT_PATH}" == "/" ]]; then
- echo "A reboot is needed to activate the new firmware"
+ echo " *** A reboot is needed to activate the new firmware"
fi
}
function download_rev {
- echo "Downloading specific firmware revision (this will take a few minutes)"
+ echo " *** Downloading specific firmware revision (this will take a few minutes)"
mkdir -p "${FW_REPOLOCAL}"
- wget -q "${REPO_URI}/tarball/${FW_REV}" -O "${FW_REPOLOCAL}/${FW_REV}.tar.gz"
+ wget "${REPO_URI}/tarball/${FW_REV}" -O "${FW_REPOLOCAL}/${FW_REV}.tar.gz"
tar xzf "${FW_REPOLOCAL}/${FW_REV}.tar.gz" -C "${FW_REPOLOCAL}" --strip-components=1
rm "${FW_REPOLOCAL}/${FW_REV}.tar.gz"
}
if [[ ${EUID} -ne 0 ]]; then
- echo "This tool must be run as root"
+ echo " !!! This tool must be run as root"
exit 1
fi
-if [[ ${UPDATE2} -ne 0 ]]; then
- echo "Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS"
+echo " *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS"
+
+if [[ ${UPDATE_SELF} -ne 0 ]]; then
update_self
fi
if [[ ! -d "${FW_PATH}" ]]; then
- echo "${FW_PATH} doesn't exist"
+ echo " !!! ${FW_PATH} doesn't exist"
exit 1
fi
if [[ ! -f "${FW_PATH}/start.elf" ]]; then
- echo "${FW_PATH}/start.elf doesn't exist."
+ echo " !!! ${FW_PATH}/start.elf doesn't exist."
exit 1
fi
if [[ ! -d "${FW_MODPATH}" ]]; then
- echo "${FW_MODPATH} doesn't exist"
+ echo " !!! ${FW_MODPATH} doesn't exist"
exit 1
fi
command -v git >/dev/null 2>&1 || {
- echo "This tool requires you have Git installed, please install it first"
- echo "In Debian, try: sudo apt-get install git-core"
- echo "In Arch, try: pacman -S git"
+ echo " !!! This tool requires you have Git installed, please install it first"
+ echo " In Debian, try: sudo apt-get install git-core"
+ echo " In Arch, try: pacman -S git"
exit 1
}
command -v readelf >/dev/null 2>&1 || {
- echo "This tool requires you have readelf installed, please install it first"
- echo "In Debian, try: sudo apt-get install binutils"
- echo "In Arch, try: pacman -S binutils"
+ echo " !!! This tool requires you have readelf installed, please install it first"
+ echo " In Debian, try: sudo apt-get install binutils"
+ echo " In Arch, try: pacman -S binutils"
exit 1
}
-echo "ARM/GPU split is now defined in /boot/config.txt using the gpu_mem option!"
+echo " *** ARM/GPU split is now defined in /boot/config.txt using the gpu_mem option!"
if [[ ${FW_REV} != "" ]]; then
download_rev
do_update "updated to revision ${FW_REV}"
elif [[ -f "${FW_REPOLOCAL}/.git/config" ]]; then
update_repo
if [[ -f "${FW_PATH}/.firmware_revision" ]] && [[ $(cat "${FW_PATH}/.firmware_revision") == $(eval ${GITCMD} rev-parse master) ]]; then
- echo "Your firmware is already up to date"
+ echo " *** Your firmware is already up to date"
finalise
else
do_update "updated"
fi
else
- echo "We're running for the first time"
+ echo " *** We're running for the first time"
download_repo
do_backup
do_update "setup"

0 comments on commit 31292f7

Please sign in to comment.