blob: e79ca828907cf7d5240ffdf4f95bbd1b96bde815 [file] [log] [blame]
#!/usr/bin/env bash
# Helper script to make a SD-card image for the official OP-TEE Raspberry Pi 3
# build.
set -e
WORKDIR=""
display_usage() {
echo "Usage: $0 [options]"
echo "Options:"
echo " -w|--workdir <dir> : The OP-TEE RPI3 working directory"
echo " -h|--help : Display this help message"
}
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-w | --workdir)
WORKDIR="$2"
shift 2
;;
-h | --help)
display_usage
exit 0
;;
*)
echo "Invalid option: $1"
display_usage
exit 1
;;
esac
done
# No point to continue if files/folders we depend on are not existing.
check_exist() {
local dir="$1"
if [ ! -e "${dir}" ]; then
echo "Folder ${dir} does not exist. Exiting..."
exit 1
fi
}
check_exist ${WORKDIR}
IMAGE_FILE=${WORKDIR}/out/rpi3-sdcard.img
rm -f ${IMAGE_FILE}
################################################################################
# Configuration
################################################################################
OFFSET_KIB=1024
BOOT_PARTITION_SIZE_MB=64
# ROOT FS size is read out from the rootfs file created by Buildroot, therefore
# we don't need to configure that here.
################################################################################
# Image and partition generation
################################################################################
# In bytes, always 512, when creating msdos/MBR images.
SECTOR_SIZE=512
# 1. Compute the sector size for the offset to the first partition.
OFFSET_SECTOR_SIZE=$((OFFSET_KIB * 1024 / SECTOR_SIZE))
echo "OFFSET_SECTOR_SIZE: $((OFFSET_KIB * 1024)) bytes ($((OFFSET_KIB / 1024))MB in ${OFFSET_SECTOR_SIZE} sectors)"
# 2. Calculate the boot partition sizes.
BOOT_PARTITION_SIZE_KIB=$((BOOT_PARTITION_SIZE_MB * 1024))
BOOT_PARTITION_SIZE_BYTES=$((BOOT_PARTITION_SIZE_KIB * 1024))
BOOT_PARTITION_SECTOR_SIZE=$((BOOT_PARTITION_SIZE_BYTES / SECTOR_SIZE))
echo "BOOT PARTITION SIZE: ${BOOT_PARTITION_SIZE_BYTES} bytes ($(($BOOT_PARTITION_SIZE_BYTES / 1024 / 1024))MB in ${BOOT_PARTITION_SECTOR_SIZE} sectors)"
# 3. Find out the size of the rootfs produced by Buildroot and calculate the
# rootfs partition sizes.
ROOTFS_IMG=${WORKDIR}/out-br/images/rootfs.ext2
check_exist ${ROOTFS_IMG}
ROOTFS_SIZE_BYTES=$(stat -c %s ${ROOTFS_IMG})
ROOTFS_SECTOR_SIZE=$((ROOTFS_SIZE_BYTES / SECTOR_SIZE))
echo "ROOTFS PARTITION SIZE: ${ROOTFS_SIZE_BYTES} bytes ($((ROOTFS_SIZE_BYTES / 1024 / 1024))MB in ${ROOTFS_SECTOR_SIZE} sectors)"
# 4. Compute the images size, based on the rootfs size, the
# desired boot image size and the offset to the first partition.
IMG_SECTOR_SIZE=$((OFFSET_SECTOR_SIZE + BOOT_PARTITION_SECTOR_SIZE + ROOTFS_SECTOR_SIZE))
IMG_SIZE_KIB=$((IMG_SECTOR_SIZE * SECTOR_SIZE / 1024))
echo "TOTAL IMAGE SIZE: ${IMG_SIZE_KIB} bytes ($((IMG_SIZE_KIB / 1024))MB in ${IMG_SECTOR_SIZE} sectors)"
# Create empty disk image
truncate -s ${IMG_SIZE_KIB}KiB ${IMAGE_FILE}
parted -s ${IMAGE_FILE} unit kiB mklabel msdos
parted -a optimal ${IMAGE_FILE} unit kiB mkpart primary fat16 ${OFFSET_KIB} ${BOOT_PARTITION_SIZE_KIB}
parted -a optimal ${IMAGE_FILE} set 1 boot on
parted -a optimal ${IMAGE_FILE} unit kiB mkpart primary ext4 $((OFFSET_KIB + BOOT_PARTITION_SIZE_KIB)) 100%
# Show some useful information about the image we just created.
echo ""
fdisk -l ${IMAGE_FILE}
################################################################################
# Copy the ext2 partition from Buildroot to the second partition.
################################################################################
dd if=${ROOTFS_IMG} of=${IMAGE_FILE} bs=${SECTOR_SIZE} seek=$((OFFSET_SECTOR_SIZE + BOOT_PARTITION_SECTOR_SIZE)) conv=notrunc,fsync
################################################################################
# Create the boot image and copy it to the boot partition
################################################################################
GENIMAGE=${WORKDIR}/out-br/host/bin/genimage
check_exist ${GENIMAGE}
# Used for a temporary genimage config file.
RPI3_GENIMAGE_CFG=$(mktemp)
# Used for temporarily storing files when creating the boot vfat image.
RPI3_GENIMAGE_TMPPATH=$(mktemp -d)
echo "RPI3_GENIMAGE_CFG: ${RPI3_GENIMAGE_CFG}"
echo "RPI3_GENIMAGE_TMPPATH: ${RPI3_GENIMAGE_TMPPATH}"
trap "rm -rf ${RPI3_GENIMAGE_CFG} ${RPI3_GENIMAGE_TMPPATH}" EXIT
BOOT_PARTITION_FILES=${WORKDIR}/out/boot
check_exist ${BOOT_PARTITION_FILES}
# Create the config file for genimage on the fly.
cat <<EOF >${RPI3_GENIMAGE_CFG}
image boot.vfat {
vfat {
}
size = ${BOOT_PARTITION_SIZE_MB}M
mountpoint = "/"
}
EOF
# Create the boot.vfat image.
${GENIMAGE} --rootpath ${BOOT_PARTITION_FILES} --config ${RPI3_GENIMAGE_CFG} --tmppath=${RPI3_GENIMAGE_TMPPATH} --outputpath=${WORKDIR}/out
# Copy the contents of boot.vfat to the boot partition in the image we prepared.
dd if=${WORKDIR}/out/boot.vfat of=${IMAGE_FILE} bs=${SECTOR_SIZE} seek=${OFFSET_SECTOR_SIZE} conv=notrunc,fsync