|
| 1 | +#!/bin/bash |
| 2 | +# Builds a U-Boot only RaspberryPI image (with partitions) |
| 3 | + |
| 4 | +set -eo pipefail |
| 5 | +SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../" && pwd)" |
| 6 | +source "$SRC_DIR/lib/common.sh" |
| 7 | + |
| 8 | +# image builder options |
| 9 | +DIST_DIR="$SRC_DIR/dist" |
| 10 | +TMP_DOWNLOAD_DIR="$BUILD_DEST/tmp" |
| 11 | +UBOOT_IMAGE_DEST=${UBOOT_IMAGE_DEST:-"$BUILD_DEST/u-boot-image.bin"} |
| 12 | +MOUNT_TMP="${MOUNT_TMP:-/tmp/rpi.mount}" |
| 13 | +IMAGE_SIZE_MB=150 |
| 14 | + |
| 15 | +_lo_umount() { |
| 16 | + if [[ "$0" != "--force" && "$DEBUG" -gt 2 ]]; then return 0; fi |
| 17 | + log_info "Unmounting loopback device..." |
| 18 | + mountpoint -q "$MOUNT_TMP$RPI_FIRMWARE_DIR" && $SUDO umount "$MOUNT_TMP$RPI_FIRMWARE_DIR" || true |
| 19 | + mountpoint -q "$MOUNT_TMP" && $SUDO umount "$MOUNT_TMP" || true |
| 20 | + if [[ -n "$LO_DEV" ]]; then |
| 21 | + $SUDO losetup -d "$LO_DEV" |
| 22 | + else $SUDO losetup -D; fi |
| 23 | +} |
| 24 | +if [[ "$1" =~ ^(-u|--un?mount)$ ]]; then _lo_umount --force; exit 0; fi |
| 25 | + |
| 26 | +# reseve the image file |
| 27 | +dd if=/dev/zero of="$UBOOT_IMAGE_DEST" bs=1M count="$IMAGE_SIZE_MB" |
| 28 | + |
| 29 | +_PARTED_BOOT_START=1 |
| 30 | +_PARTED_BOOT_END=$(( "$IMAGE_BOOT_PART_MB" + "$_PARTED_BOOT_START" )) |
| 31 | + |
| 32 | +log_info "Creating partitions..." |
| 33 | +log_debug \ |
| 34 | + '1:' "${_PARTED_BOOT_START}MiB" "${_PARTED_BOOT_END}MiB" $'\n' \ |
| 35 | + '2:' "${_PARTED_BOOT_END}MiB" "100%" |
| 36 | + |
| 37 | +parted --script "$UBOOT_IMAGE_DEST" \ |
| 38 | + mklabel msdos \ |
| 39 | + mkpart primary "${_PARTED_BOOT_START}MiB" "${_PARTED_BOOT_END}MiB" \ |
| 40 | + type 1 0x0B set 1 boot on |
| 41 | + |
| 42 | +LO_DEV=$($SUDO losetup -f) |
| 43 | +$SUDO losetup -P "$LO_DEV" "$UBOOT_IMAGE_DEST" |
| 44 | +log_info "Loopback device $LO_DEV mapped to '$UBOOT_IMAGE_DEST'" |
| 45 | +trap _lo_umount EXIT |
| 46 | + |
| 47 | +if [[ ! -b "${LO_DEV}p1" ]]; then |
| 48 | + log_fatal "Image partition scanning failed!" |
| 49 | +fi |
| 50 | + |
| 51 | +log_info "Formatting boot partition..." |
| 52 | +$SUDO mkfs.vfat -n "$IMAGE_BOOT_PART_NAME" "${LO_DEV}p1" |
| 53 | + |
| 54 | +# use the /boot/firmware convention to split partitions |
| 55 | +$SUDO mkdir -p "$MOUNT_TMP" |
| 56 | +log_debug "mount ${LO_DEV}p1 $MOUNT_TMP" |
| 57 | +$SUDO mount "${LO_DEV}p1" "$MOUNT_TMP" |
| 58 | + |
| 59 | +mkdir -p "$TMP_DOWNLOAD_DIR" |
| 60 | +for file in "${RPI_FIRMWARE_FILES[@]}"; do |
| 61 | + # download the latest rpi firmware files (debian repo is outdated) |
| 62 | + wget "https://github.com/raspberrypi/firmware/raw/master/boot/$file" \ |
| 63 | + -O "$TMP_DOWNLOAD_DIR/$file" |
| 64 | + $SUDO cp -f "$TMP_DOWNLOAD_DIR/$file" "$MOUNT_TMP/$file" |
| 65 | +done |
| 66 | + |
| 67 | +$SUDO cp -f "$DIST_DIR/labsi-rpi4/u-boot.bin" "$MOUNT_TMP/u-boot.bin" |
| 68 | +$SUDO cp -f "$DIST_DIR/labsi-rpi4/"*".dtb" "$MOUNT_TMP/" |
| 69 | +$SUDO cp -f "$CUSTOM_CONFIG_DIR/files/boot/config.txt" "$MOUNT_TMP/config.txt" |
| 70 | + |
| 71 | +log_debug $'Firmware files list: \n' "$(ls -lh "$MOUNT_TMP")" |
| 72 | +$SUDO du -hs "$MOUNT_TMP" |
| 73 | + |
| 74 | +echo "Successfully generated U-Boot image!" |
| 75 | +ls -l "$UBOOT_IMAGE_DEST" |
| 76 | + |
0 commit comments