#!/bin/bash # vim:sw=8:noet FSBL_UID=496846A9-9E0A-4ABA-9736-A41A9FC6B5D8 ENV_UID=5F720A03-FF87-4B93-A46F-F5788594EA3B OPENSBI_UID=0FCB0F7C-4A6C-4C81-8C69-4F0A67F0D5E7 UBOOT_UID=3E5B8F92-0BFF-4E20-8E88-7EEC40A7CC42 MEDIATABLE=gpt ROOTPART_NUM=1 START_SECTOR=4 # MiB CONSOLE=1 soc_write_bootloader() { unmount_partition if [ -n "$ROOTFS" ]; then print_message "Creating partitions for FSBL, ENV, OpenSBI and U-Boot..." sgdisk -a 1 \ --new=0:256:+256K --change-name=0:fsbl \ --typecode=0:"$FSBL_UID" \ --new=0:768:+64K --change-name=0:env \ --typecode=0:"$ENV_UID" \ --new=0:2048:+1M --change-name=0:opensbi \ --typecode=0:"$OPENSBI_UID" \ --new=0:4096:+2M --change-name=0:uboot \ --typecode=0:"$UBOOT_UID" \ "$MEDIA" || fatal_error "failed to create bootloader partitions" sgdisk --sort "$MEDIA" || fatal_error "failed to sort partitions by sector" print_done sync_partitions fi local FSBLPART ENVPART UBOOTPART OPENSBIPART PART_NUMS=$(ls "$MEDIA"* | sed "s:$MEDIA::" | sed 's/^p//') for PART_NUM in $PART_NUMS; do local CODE CODE=$(sgdisk -i "$PART_NUM" "$MEDIA" | grep 'Partition GUID code:' | cut -d ' ' -f 4) case "$CODE" in "$FSBL_UID") FSBLPART="${MEDIA}${partsuffix-}${PART_NUM}";; "$ENV_UID") ENVPART="${MEDIA}${partsuffix-}${PART_NUM}";; "$OPENSBI_UID") OPENSBIPART="${MEDIA}${partsuffix-}${PART_NUM}";; "$UBOOT_UID") UBOOTPART="${MEDIA}${partsuffix-}${PART_NUM}";; esac done # ensure we have all necessary partitions [ -n "$FSBLPART" ] && [ -n "$ENVPART" ] && [ -n "$OPENSBIPART" ] && [ -n "$UBOOTPART" ] || fatal_error "bootloader partitions not found: expected FSBL, ENV, OpenSBI, U-Boot" # find actual rootfs after bootloader zone local RAW_START=$((START_SECTOR * 2048)) local PART_NUMS PART_NUM PS PART_NUMS=$(ls "$MEDIA"* | sed "s:$MEDIA::" | sed 's/^p//') for PART_NUM in $PART_NUMS; do PS=$(sgdisk -i "$PART_NUM" "$MEDIA" 2>/dev/null | grep 'First sector:' | tr -s ' ' | cut -d ' ' -f 3) if [ -n "$PS" ] && [ "$PS" -ge "$RAW_START" ]; then ROOTPART_NUM=$PART_NUM break fi done ROOTPART="${MEDIA}${partsuffix-}${ROOTPART_NUM}" mount_partition TARGET=spacemit-k1x set_path_to_uboot print_message "Searching for U-Boot files for ${TARGET-}..." [ -d "$UBOOT" ] || fatal_error "U-Boot files for ${TARGET-} were not found" print_done print_message "Searching for OpenSBI files for ${TARGET-}..." OPENSBI="${TMPROOT-}/usr/share/opensbi-spacemit/k1x" [ -d "$OPENSBI" ] || fatal_error "OpenSBI files for ${TARGET-} were not found" print_done write_partition_blob "bootinfo" "$UBOOT/bootinfo_sd.bin" "$MEDIA" "1M" write_partition_blob "FSBL" "$UBOOT/FSBL.bin" "$FSBLPART" write_partition_blob "U-Boot environment" "$UBOOT/u-boot-env-default.bin" "$ENVPART" write_partition_blob "U-Boot" "$UBOOT/u-boot.itb" "$UBOOTPART" write_partition_blob "OpenSBI" "$OPENSBI/generic/firmware/fw_dynamic.itb" "$OPENSBIPART" }