blob: 6771b7a184c225038e8131766c195eeb4a04ba6a [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2017 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
set -e
MEMBASE=0x00000000
KERNEL_OFFSET=0x00080000
RAMDISK_OFFSET=0x07c00000
DT_OFFSET=0x07a00000
CMDLINE="TERM=uart"
SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ZIRCON_DIR="${SCRIPTS_DIR}/.."
FIRMWARE_DIR=/tmp/hikey/hikey-firmware
FIRMWARE_GIT=https://android.googlesource.com/device/linaro/hikey
FIRMWARE_TAG=android-o-iot-preview-5
TOOLS_GIT=https://github.com/96boards-hikey/tools-images-hikey960.git
TOOLS_DIR=/tmp/hikey/tools
RECOVERY_PORT=/dev/serial/by-id/usb-HISILICON_USB_SER-if00-port0
UEFI_DIR=/tmp/hikey/uefi
UEFI_URL=https://builds.96boards.org/snapshots/reference-platform/components/uefi-staging/48/hikey960/release/
MKBOOTIMG="${ZIRCON_DIR}/third_party/tools/android/mkbootimg"
MKDTIMG="${ZIRCON_DIR}/third_party/tools/android/mkdtimg"
help() {
echo "usage: ${0} [options]"
echo " -f Download and flash firmware."
echo " -b [build-dir] Use specified build directory."
echo " Defaults to build-hikey960/."
echo " -d [ramdisk] Use specified ramdisk file."
echo " Defaults to BUILD_DIR/bootdata.bin."
echo " -m Add mexec option to kernel command line to enable netboot."
echo " -n No flash. Boot image without flashing it to the device (UEFI only)."
echo " -p [port] Port used for recovery."
echo " Defaults to ${RECOVERY_PORT}."
echo " -r Recover device from a bad state or swap to UEFI (with -u)."
echo " -u UEFI mode. This flag is required if your device has UEFI firmware."
echo " Combine with -r and/or -f to install UEFI support."
echo " -h Show this help message."
echo
echo "See docs/targets/hikey960.md for more details."
exit 1
}
help_recovery() {
echo
echo "Check that the device is in recovery mode and that ${RECOVERY_PORT} is the recovery port."
echo "Recovery mode switch configuration is:"
echo " Auto Power up(Switch 1) closed/ON"
echo " Recovery(Switch 2) closed/ON"
echo " Fastboot(Switch 3) open/OFF"
echo "You can alter the recovery port with the -p option."
echo "NOTE: the recovery utility may require root permissions. If so rerun the script under sudo."
# TODO(alexlegg): Check that ${RECOVERY_PORT} exists and give options if it doesn't.
read -p "Proceed (y|n)? " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
}
help_fastboot() {
echo
echo "Check that the device is in fastboot mode:"
echo " Auto Power up(Switch 1) closed/ON"
echo " Recovery(Switch 2) open/OFF"
echo " Fastboot(Switch 3) closed/ON"
read -p "Proceed (y|n)? " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
}
git_clone() {
git clone --depth 1 $@
}
recover_device() {
if [[ ! -d $TOOLS_DIR ]]; then
git_clone $TOOLS_GIT $TOOLS_DIR
fi
pushd $TOOLS_DIR
chmod +x hikey_idt
help_recovery
./hikey_idt -c config -p $RECOVERY_PORT
popd
}
flash_firmware() {
if [[ ! -d $FIRMWARE_DIR ]]; then
git_clone -b $FIRMWARE_TAG $FIRMWARE_GIT $FIRMWARE_DIR
fi
help_fastboot
fastboot flash ptable ${FIRMWARE_DIR}/installer/hikey960/ptable.img
fastboot flash xloader ${FIRMWARE_DIR}/installer/hikey960/sec_xloader.img
fastboot flash fastboot ${FIRMWARE_DIR}/installer/hikey960/fastboot.img
fastboot flash nvme ${FIRMWARE_DIR}/installer/hikey960/nvme.img
fastboot flash fw_lpm3 ${FIRMWARE_DIR}/installer/hikey960/lpm3.img
fastboot flash trustfirmware ${FIRMWARE_DIR}/installer/hikey960/bl31.bin
}
recover_uefi() {
echo Creating $UEFI_DIR...
if [[ ! -d $UEFI_DIR ]]; then
mkdir -p ${UEFI_DIR}
pushd ${UEFI_DIR}
echo Fetching $UEFI_URL...
wget -A bin,config,efi,hikey_idt,img,txt -m -nd -np ${UEFI_URL}
else
pushd ${UEFI_DIR}
fi
chmod +x hikey_idt
help_recovery
./hikey_idt -c config -p $RECOVERY_PORT
popd
}
flash_firmware_uefi() {
if [[ ! -d $FIRMWARE_DIR ]]; then
git_clone -b $FIRMWARE_TAG $FIRMWARE_GIT $FIRMWARE_DIR
fi
echo Creating $UEFI_DIR...
if [[ ! -d $UEFI_DIR ]]; then
mkdir -p ${UEFI_DIR}
pushd ${UEFI_DIR}
echo Fetching $UEFI_URL...
wget -A bin,config,efi,hikey_idt,img,txt -m -nd -np ${UEFI_URL}
popd
fi
help_fastboot
fastboot flash ptable ${UEFI_DIR}/prm_ptable.img
fastboot flash xloader ${UEFI_DIR}/sec_xloader.img
fastboot flash fastboot ${UEFI_DIR}/l-loader.bin
fastboot flash fip ${UEFI_DIR}/fip.bin
fastboot flash nvme ${FIRMWARE_DIR}/installer/hikey960/nvme.img
fastboot flash fw_lpm3 ${FIRMWARE_DIR}/installer/hikey960/lpm3.img
fastboot flash trustfirmware ${FIRMWARE_DIR}/installer/hikey960/bl31.bin
}
flash_dts() {
DTB_FILE=kernel/target/hikey960/device-tree.dtb
DT_IMAGE="${BUILD_DIR}/dt.img"
${MKDTIMG} -c -d $DTB_FILE -o $DT_IMAGE
fastboot flash dts $DT_IMAGE
}
flash_kernel() {
"${MKBOOTIMG}" \
--kernel $KERNEL \
--kernel_offset $KERNEL_OFFSET \
--base $MEMBASE \
--ramdisk_offset $RAMDISK_OFFSET \
--ramdisk "${RAMDISK}" \
--tags_offset $DT_OFFSET \
--cmdline "${CMDLINE}" \
-o $OUT_IMAGE
if [[ $FLAG_NOFLASH ]]; then
fastboot boot $OUT_IMAGE
else
fastboot flash boot $OUT_IMAGE
# Can't guarantee that the target has written image to flash before the
# fastboot command completes, so short delay here before reboot.
sleep 1
fastboot reboot
fi
}
while getopts "b:d:fmnp:ruh" FLAG; do
case $FLAG in
b) BUILD_DIR="${OPTARG}";;
d) RAMDISK="${OPTARG}";;
f) FLAG_FIRMWARE=true;;
m) CMDLINE+=" netsvc.netboot=true";;
n) FLAG_NOFLASH=true;;
p) RECOVERY_PORT="${OPTARG}";;
r) FLAG_RECOVER=true;
FLAG_FIRMWARE=true;;
u) FLAG_UEFI=true;;
*) help;;
esac
done
shift $((OPTIND-1))
BUILD_DIR="${BUILD_DIR:-build-hikey960}"
RAMDISK="${RAMDISK:-${BUILD_DIR}/bootdata.bin}"
OUT_IMAGE="${BUILD_DIR}/boot.img"
if [[ $FLAG_RECOVER ]]; then
if [[ $FLAG_UEFI ]]; then
recover_uefi
else
recover_device
fi
fi
if [[ $FLAG_FIRMWARE ]]; then
if [[ $FLAG_UEFI ]]; then
flash_firmware_uefi
else
flash_firmware
fi
exit 0
fi
if [[ $FLAG_UEFI ]]; then
KERNEL="${BUILD_DIR}/zircon.bin-dtb"
flash_kernel
else
KERNEL="${BUILD_DIR}/zzircon.bin"
flash_dts
flash_kernel
fi