forked from armbian/build
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
extensions:
uefi-edk2-rk3588
: deploy edk2 (not u-boot) for rk3588 b…
…oards - this extension is _100% optional_ and shouldn't adversely affect any builds if not enabled - requires `UEFI_EDK2_BOARD_ID` to be set in board file, so we know which UEFI/edk2 build to use - it finds the latest edk2 version from GitHub automatically (currently `v0.9.1`) - it downloads (and caches) the correct edk2 build image automatically - if forces certain aspects of the image: - must use GPT partitioning - must NOT use a separate /boot partition - it _disables_ the building and deploying of u-boot _completely_ (thus blobs etc are from edk2) - it creates a GPT `"uboot"` partition pointing to edk2's FIT, required by SPL - this extension: - automatically enables 'grub-with-dtb' - automatically enable 'initramfs-usb-gadget-ums', to compensate for lack of ums/rockusb since we dont have u-boot anymore
- Loading branch information
1 parent
055d871
commit 820472d
Showing
1 changed file
with
76 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
# | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# Copyright (c) 2023 Ricardo Pardini <[email protected]> | ||
# This file is a part of the Armbian Build Framework https://github.com/armbian/build/ | ||
|
||
enable_extension "grub-with-dtb" | ||
enable_extension "initramfs-usb-gadget-ums" | ||
|
||
function extension_prepare_config__config_uefi_edk2_rk3588() { | ||
display_alert "Configuring UEFI EDK2 for RK3588" "${BOARD} - edk2 '${UEFI_EDK2_BOARD_ID}'" "info" | ||
|
||
declare -g GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_DEFAULT:-"acpi=off"}" # default to acpi=off | ||
declare -g UEFI_GRUB_TIMEOUT=${UEFI_GRUB_TIMEOUT:-3} # Default 3-seconds timeout for GRUB menu. | ||
declare -g UEFI_GRUB_TERMINAL="gfxterm serial console" # gfxterm is a long shot. | ||
|
||
# Check that UEFI_EDK2_BOARD_ID is set, or bomb | ||
if [[ -z "${UEFI_EDK2_BOARD_ID}" ]]; then | ||
exit_with_error "UEFI_EDK2_BOARD_ID is not set. Please set it to the correct value for your board." | ||
fi | ||
|
||
# Check that the image is a GPT image. | ||
if [[ "${IMAGE_PARTITION_TABLE}" != "gpt" ]]; then | ||
display_alert "Changing partition table to GPT" "original image partition table was ${IMAGE_PARTITION_TABLE}" "warn" | ||
declare -g IMAGE_PARTITION_TABLE="gpt" | ||
fi | ||
|
||
# If BOOTFS_TYPE is set, warn and unset it. | ||
if [[ -n "${BOOTFS_TYPE}" ]]; then | ||
display_alert "Unsetting BOOTFS_TYPE" "UEFI EDK2 requires BOOTFS_TYPE to be unset, but is set to '${BOOTFS_TYPE}'" "warn" | ||
unset BOOTFS_TYPE | ||
fi | ||
|
||
# Add a suffix to the image version, so people know what is is in it. | ||
EXTRA_IMAGE_SUFFIXES+=("-edk2") | ||
|
||
return 0 | ||
} | ||
|
||
# This writes the edk2 img to the image, hopefully without destroying the GPT. See https://github.com/edk2-porting/edk2-rk3588#updating-the-firmware | ||
function post_umount_final_image__write_edk2_to_image() { | ||
display_alert "Finding edk2 latest version" "from GitHub" "info" | ||
|
||
# Find the latest version of edk2-porting from GitHub, using JSON API, curl and jq. | ||
declare api_url="https://api.github.com/repos/edk2-porting/edk2-rk3588/releases/latest" | ||
declare latest_version | ||
latest_version=$(curl -s "${api_url}" | jq -r '.tag_name') | ||
display_alert "Latest version of edk2-porting is" "${latest_version}" "info" | ||
|
||
# Prepare the cache dir | ||
declare edk2_cache_dir="${SRC}/cache/edk2-rk3588" | ||
mkdir -p "${edk2_cache_dir}" | ||
|
||
declare edk2_img_filename="${UEFI_EDK2_BOARD_ID}_UEFI_Release_${latest_version}.img" | ||
declare -g -r edk2_img_path="${edk2_cache_dir}/${edk2_img_filename}" # global readonly | ||
display_alert "UEFI EDK2 image path" "${edk2_img_path}" "info" | ||
|
||
declare download_url="https://github.com/edk2-porting/edk2-rk3588/releases/download/${latest_version}/${edk2_img_filename}" | ||
|
||
# Download the image (with wget) if it doesn't exist; download to a temporary file first, then move to the final path. | ||
if [[ ! -f "${edk2_img_path}" ]]; then | ||
display_alert "Downloading UEFI EDK2 image" "${download_url}" "info" | ||
declare tmp_edk2_img_path="${edk2_img_path}.tmp" | ||
run_host_command_logged wget -O "${tmp_edk2_img_path}" "${download_url}" | ||
run_host_command_logged mv -v "${tmp_edk2_img_path}" "${edk2_img_path}" | ||
else | ||
display_alert "UEFI EDK2 image already downloaded, using it" "${edk2_img_path}" "info" | ||
fi | ||
|
||
display_alert " Writing UEFI EDK2 image" "${edk2_img_path} to ${LOOP}" "info" | ||
# Write the whole uefi image, but skip the GPT... | ||
dd if="${edk2_img_path}" of="${LOOP}" bs=512 conv=notrunc skip=64 seek=64 | ||
|
||
# ... Use parted to create "uboot" GPT partition pointing to the FIT image, so SPL finds it | ||
display_alert "Creating uboot partition" "on ${LOOP}" "info" | ||
/sbin/parted -s "${LOOP}" unit s mkpart uboot 2048 18431 | ||
} |