armbian-build/config/sources/families/genio.conf
Ricardo Pardini 91b2454496 genio: export (from the image) bins needed for flashing
- so regular armbian/build users can get them in `output/images`
2026-01-08 12:30:24 +01:00

284 lines
14 KiB
Plaintext

declare -g LINUXFAMILY=genio
declare -g OVERLAY_DIR="/boot/dtb/mediatek/overlay"
declare -g ARCH=arm64
declare -g GOVERNOR=performance
declare -g INSTALL_ARMBIAN_FIRMWARE=yes
# U-Boot bootscript configuration
declare -g BOOTCONFIG="${BOOTCONFIG:-"none"}" # Skip U-Boot compilation, unless specified by the board
declare -g BOOTSCRIPT="boot-genio.cmd:boot.cmd" # Use custom boot script for Genio (compatible with U-Boot without itest/setexpr/bootz)
declare -g BOOTENV_FILE="genio.txt" # Boot environment template for armbianEnv.txt
# U-Boot (Vendor, 2022.10 + heavily patched)
declare -g BOOTSOURCE="https://gitlab.com/mediatek/aiot/bsp/u-boot.git"
declare -g BOOTBRANCH="commit:40c563b0d2ba7e150085e195f23f4ed4adc81646"
declare -g BOOTPATCHDIR="u-boot-genio" # U-Boot patches from Collabora
declare -g BOOTDIR="u-boot-${BOARD}-${BRANCH}" # do not share u-boot directory
declare -g UBOOT_TARGET_MAP="all;;fip.img lk.bin" # fip.img is produced by postprocess _after_ TF-A builds; see hooks; lk.bin is from mtkbin for convenience
# Don't build ATF as regularly (before u-boot), it will be done in uboot postprocess; see hooks below
declare -g ATFSOURCE="none"
# Board-overridable params for OPTEE/ATF build; here default to 1200-compatible stuff and BOOT_SOC (that is already hashed in uboot version)
declare -g MEDIATEK_GENIO_SOC_PLATFORM="${MEDIATEK_GENIO_SOC_PLATFORM:-"${BOOT_SOC:-"mt8195"}"}"
declare -g MEDIATEK_GENIO_TFA_PLAT="${MEDIATEK_GENIO_TFA_PLAT:-"${MEDIATEK_GENIO_SOC_PLATFORM}"}"
declare -g MEDIATEK_GENIO_OPTEE_PLAT="${MEDIATEK_GENIO_OPTEE_PLAT:-"mediatek-${MEDIATEK_GENIO_SOC_PLATFORM}"}"
declare -g MEDIATEK_GENIO_OPTEE_DRAM_SIZE=${MEDIATEK_GENIO_OPTEE_DRAM_SIZE:-"0x200000000"} # default for genio-1200
declare -g MEDIATEK_GENIO_TFA_SOC_SRAM_ADDR="0x201000" # default for genio-1200
declare -g MEDIATEK_GENIO_TFA_STORAGE="ufs" # or "emmc"
declare -g MEDIATEK_GENIO_LK_BIN="${MEDIATEK_GENIO_LK_BIN:-"${BOARD}/lk/lk.bin"}" # default lk.bin name from mtkbin
# Kernel configuration
case $BRANCH in
collabora)
declare -g LINUXCONFIG="linux-genio-$BRANCH"
declare -g KERNEL_MAJOR_MINOR="6.19"
declare -g KERNELSOURCE='https://gitlab.collabora.com/mediatek/aiot/linux.git'
declare -g KERNELBRANCH='commit:1d2ead55826e7b4a01ba2fe14763857afbada42b' # 6.19-rc4 from 'branch:mediatek-next'
declare -g EXTRAWIFI="no"
;;
vendor)
declare -g LINUXCONFIG="linux-genio-vendor"
declare -g KERNEL_MAJOR_MINOR="5.15"
declare -g KERNELPATCHDIR='genio-1200-vendor'
declare -g KERNELSOURCE='https://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-mtk/+git/jammy'
declare -g KERNELBRANCH='branch:master-next'
declare -g EXTRAWIFI="no"
declare -g INSTALL_HEADERS="no" #Leads to build error bc custom ubuntu folder for oem drivers
family_tweaks() {
echo "blacklist snd-mixer-oss" > "${SDCARD}/etc/modprobe.d/blacklist-genio.conf"
echo "blacklist snd-pcm-oss" >> "${SDCARD}/etc/modprobe.d/blacklist-genio.conf"
}
;;
esac
# Version string control
declare -g KERNEL_SKIP_MAKEFILE_VERSION="yes"
declare -g LOCALVERSION="-${BRANCH}-${LINUXFAMILY}"
# U-Boot build for genio
# Based on Collabora's work at https://gitlab.collabora.com/mediatek/aiot/boot at 2a1ab81bb4094ef6b205ec835893af113ecad108
# - uses 2 prebuilts: libbase-prebuilt and libdram-prebuilt straight from git
# - builds u-boot _first_ (ATFSOURCE=none in global scope)
# - in u-boot postprocess:
# - in a subshell (since it's in u-boot build context):
# - builts optee from source
# - builts ATF twice (bl2.bin/fip.bin), pointing it to libdram, libbase, optee, and u-boot
# - mashes ATF outputs into fip.img, which is the actual output of the "u-boot" build
# This runs after regular fetch_sources_tools (500_) so boards have a chance to influence it.
function fetch_sources_tools__700_genio_fetch_mediatek_prebuilts() {
# Fetch optee sources
# <project name="bsp/optee-os.git" path="optee-os" revision="ab5d0acf9447cb6b8ffc49917867c61265589ac1"/>
display_alert "Fetching optee-os" "for ${BOARD} ATF compile" "info"
fetch_from_repo "https://gitlab.com/mediatek/aiot/bsp/optee-os.git" "mediatek-optee/optee-os" "commit:ab5d0acf9447cb6b8ffc49917867c61265589ac1"
# Fetch armbian/mtkbin for libdram, libbase, and lk.bin
# Important: use a specific commit here (NOT branch), so when changes are made to this hook, the u-boot version hash changes too
fetch_from_repo "${MTKBIN_GIT_URL:-"${GITHUB_SOURCE}/armbian/mtkbin"}" "mtkbin" "commit:${MTKBIN_GIT_SHA1:-"ac66548f1c619813aa561d56d998206d3caaffba"}"
}
function post_uboot_custom_postprocess__genio_optee_atf_fip_build() {
display_alert "Genio u-boot postprocess" "Building OPTEE, 2xATF, and producing FIP" "info"
# <functions declared since hook, so hashing takes cares of changes>
function mediatek_genio_build_optee() {
display_alert "Building OPTEE" "for ${BOARD} ATF compile" "info"
declare optee_dir="${SRC}/cache/sources/mediatek-optee/optee-os"
(
cd "${optee_dir}" || exit 1
git clean -xfd # always pristine clean build
export CROSS_COMPILE="aarch64-linux-gnu-" # in a subshell, so, it's fine
run_host_command_logged ARCH=arm make "-j$(nproc --all)" \
"PLATFORM=${MEDIATEK_GENIO_OPTEE_PLAT}" \
"SOC_PLATFORM=${MEDIATEK_GENIO_SOC_PLATFORM}" \
ta-targets=ta_arm64 \
CFG_ARM64_core=y \
"CFG_DRAM_SIZE=${MEDIATEK_GENIO_OPTEE_DRAM_SIZE}" \
all
)
display_alert "OPTEE build complete" "for ${BOARD} ATF compile, locating built files" "info"
mediatek_genio_built_bl32_full_path="$(find "${optee_dir}" -type f -name tee.bin)" # outer scope/output var
run_host_command_logged ls -la "${mediatek_genio_built_bl32_full_path}"
}
function mediatek_genio_build_atf() {
display_alert "Building ATF" "for ${BOARD} ATF compile" "info"
# ATF will be called from uboot postprocess, not from it's normal location (which is before u-boot)
declare -g ATFSOURCE="https://gitlab.com/mediatek/aiot/bsp/trusted-firmware-a.git"
declare -g ATFBRANCH="commit:decacb88cfe882cb09ddd613ecaf1323d3fe6c22"
declare -g ATFSOURCEDIR="${ATFDIR}/$(branch2dir "${ATFBRANCH}")" # we're doing stuff out of the normal order, sorry.
declare -g ATFPATCHDIR="atf-genio"
declare -g ATF_SKIP_LDFLAGS_WL="yes" # this TF-A build passes TF_LDFLAGS directly to the linker, not to gcc
declare libbase_prebuilt_bin="${SRC}/cache/sources/mtkbin/${BOARD}/libbase/libbase.a"
declare libdram_prebuilt_bin="${SRC}/cache/sources/mtkbin/${BOARD}/libdram/libdram.a"
if [[ ! -f "${libdram_prebuilt_bin}" ]]; then
display_alert "ERROR: missing libdram prebuilt" "for ${BOARD} ATF compile: expected at ${libdram_prebuilt_bin}" "error"
return 1
fi
if [[ ! -f "${libbase_prebuilt_bin}" ]]; then
display_alert "ERROR: missing libbase prebuilt" "for ${BOARD} ATF compile: expected at ${libbase_prebuilt_bin}" "error"
return 1
fi
declare -a common_tfa_args=(
"E=0"
"PLAT=${MEDIATEK_GENIO_TFA_PLAT}"
"SPD=opteed"
"NEED_BL32=yes"
"BL32=${mediatek_genio_built_bl32_full_path}"
"NEED_BL33=yes"
"BL33=${mediatek_genio_built_bl33_full_path}"
"LIBBASE=${libbase_prebuilt_bin}"
"LIBDRAM=${libdram_prebuilt_bin}"
"PLAT_HW_CRYPTO=1"
)
if [[ "${MEDIATEK_GENIO_TFA_STORAGE}" == "ufs" ]]; then
# unrelated to ufs extension, as this is always needed per-board even for SD builds
# (genio always loads uboot from emmc/UFS and not SD)
display_alert "Adding UFS support to ATF build" "for ${BOARD} ATF compile: STORAGE_UFS=1" "info"
common_tfa_args+=("STORAGE_UFS=1")
fi
common_tfa_args+=(
STORAGE_APPEND_FIP=1
"STORAGE_FIP_OFFSET=0x100000"
"STORAGE_BOOT_LENGTH=0x300000"
"CFLAGS='-fdiagnostics-color=always ${mediatek_vendor_cflags_modern_gcc[*]}'"
"KCFLAGS='-fdiagnostics-color=always ${mediatek_vendor_cflags_modern_gcc[*]}'"
)
# Do it twice instead of trying to make idiotic _TARGET_MAP work; single target for bl2+fip doesn't work either
declare atftempdir="undetermined_atftempdir" # scope for compile_atf
# bl2.bin build
declare -g ATF_TARGET_MAP="${common_tfa_args[*]} bl2;;build/${MEDIATEK_GENIO_TFA_PLAT}/release/bl2.bin"
display_alert "ATF_TARGET_MAP: for ${BOARD} ATF compile" "${ATF_TARGET_MAP}" "info"
CLEAN_LEVEL="make-atf" compile_atf # core function; force make distclean for first build
run_host_command_logged cp -v "${atftempdir}/bl2.bin" "${uboot_build_dir}/bl2.bin" # collect from atftempdir to u-boot dir
# fip.bin build
declare -g ATF_TARGET_MAP="${common_tfa_args[*]} fip;;build/${MEDIATEK_GENIO_TFA_PLAT}/release/fip.bin"
display_alert "ATF_TARGET_MAP: for ${BOARD} ATF compile" "${ATF_TARGET_MAP}" "info"
compile_atf # core function
run_host_command_logged cp -v "${atftempdir}/fip.bin" "${uboot_build_dir}/fip.bin" # collect from atftempdir to u-boot dir
}
function mediatek_genio_produce_fip() {
display_alert "Producing final FIP image" "for ${BOARD}" "info"
display_alert "Producing final FIP image" "for ${BOARD} uboot_build_dir:${uboot_build_dir}" "info"
declare bl2_bin="${uboot_build_dir}/bl2.bin"
declare bl2_img="${uboot_build_dir}/bl2.img"
declare fip_bin="${uboot_build_dir}/fip.bin"
declare fip_img="${uboot_build_dir}/fip.img"
declare -a mkimage_args=(
-T mtk_image
-a "${MEDIATEK_GENIO_TFA_SOC_SRAM_ADDR}"
-e "${MEDIATEK_GENIO_TFA_SOC_SRAM_ADDR}"
-n "media=${MEDIATEK_GENIO_TFA_STORAGE};arm64=1"
-d "${bl2_bin}" "${bl2_img}"
)
run_host_command_logged "${uboot_build_dir}/tools/mkimage" "${mkimage_args[*]@Q}"
truncate --size=1M "${bl2_img}"
cat "${bl2_img}" "${fip_bin}" > "${fip_img}"
# lk.bin (Little Kernel) is included in u-boot for convenience; it is not used in regular booting,
# but will be needed by users flashing the board. To support EXT=mtkflash too, as it extracts both
# fip.img and lk.bin from the image's uboot directory.
declare lk_bin="${SRC}/cache/sources/mtkbin/${MEDIATEK_GENIO_LK_BIN}"
if [[ ! -f "${lk_bin}" ]]; then
display_alert "ERROR: missing lk.bin" "for ${BOARD} Little Kernel" "error"
return 1
fi
run_host_command_logged cp -v "${lk_bin}" "${uboot_build_dir}/lk.bin"
# Lets also output stuff needed for flashing to ${SRC}/output/ for easier access for developers
run_host_command_logged cp -v "${fip_img}" "${SRC}/output/${BOARD}-${HOSTRELEASE}-fip.img"
run_host_command_logged cp -v "${lk_bin}" "${SRC}/output/${BOARD}-lk.bin"
return 0
}
# </functions declared since hook, so hashing takes cares of changes>
# control variable scope across function calls
declare uboot_build_dir="undetermined_uboot_build_dir"
declare mediatek_genio_built_bl32_full_path="undetermined_bl32"
declare mediatek_genio_built_bl33_full_path="undetermined_bl33"
# Find the u-boot.bin produced by the u-boot build; it's needed for the ATF build
display_alert "Locating built U-Boot binary" "for ${BOARD} ATF compile" "info"
uboot_build_dir="$(pwd)"
mediatek_genio_built_bl33_full_path="${uboot_build_dir}/u-boot.bin"
run_host_command_logged ls -la "${mediatek_genio_built_bl33_full_path}"
# Done in a subshell, as we're in u-boot build context/cwd here and would like to remain so after those builds
(
mediatek_genio_build_optee # sets mediatek_genio_built_bl32_full_path
mediatek_genio_build_atf # uses mediatek_genio_built_bl32_full_path and mediatek_genio_built_bl33_full_path
mediatek_genio_produce_fip # uses ATF outputs in atftempdir set by compile_atf() and puts fip.img in uboot_build_dir
)
}
function post_config_uboot_target__downgrade_gcc_errors_to_warnings() {
declare -i gcc_major_version=0
gcc_major_version=$(gcc -dumpversion | cut -d. -f1)
display_alert "$BOARD" "GCC major version: ${gcc_major_version}" "debug"
if [[ ${gcc_major_version} -ge 13 ]]; then
display_alert "$BOARD" "Adding extra CFLAGS to fix vendor U-Boot building with GCC 13+" "info"
# Curb the compiler's warnings so it builds on trixie+ (original source is for bookworm)
declare -g -a mediatek_vendor_cflags_modern_gcc=(# Used for both ATF and u-boot builds, via global var
"-Wno-error=enum-int-mismatch"
"-Wno-error=int-conversion"
"-Wno-error=implicit-function-declaration"
"-Wno-error=incompatible-pointer-types"
)
uboot_cflags_array+=("${mediatek_vendor_cflags_modern_gcc[@]}")
fi
return 0
}
# This exports fip.img and lk.bin _from the image_ to DESTIMG, for easier flashing by users.
# Those will end up being compressed (.xz/etc) by the compression code.
# Note: this is exported _from the image_, not from the u-boot build output; image builds might use
# a cached u-boot artifacts, so might not run the u-boot build at all; while we want to export those
# files together with the image.
function pre_umount_final_image__700_genio_export_flash_bins() {
: "${version:?"ERROR: version variable not defined"}"
run_host_command_logged ls -la "${MOUNT}"/usr/lib/linux-u-boot-*-"${BOARD}"/fip.img
run_host_command_logged ls -la "${MOUNT}"/usr/lib/linux-u-boot-*-"${BOARD}"/lk.bin
run_host_command_logged cp -v "${MOUNT}"/usr/lib/linux-u-boot-*-"${BOARD}"/fip.img "${DESTIMG}/${version}.fip.img"
run_host_command_logged cp -v "${MOUNT}"/usr/lib/linux-u-boot-*-"${BOARD}"/lk.bin "${DESTIMG}/${version}.lk.bin"
# shellcheck disable=SC2034 # used by the mtkflash extension
declare -g MEDIATEK_GENIO_EXPORTED_FIP_IMG="${version}.fip.img" MEDIATEK_GENIO_EXPORTED_LK_BIN="${version}.lk.bin"
}
function add_host_dependencies__genio_python3_deps_for_optee_build() {
display_alert "Preparing Genio OPTEE host-side dependencies" "for ATF/OPTEE build" "info"
declare -g EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} python3-cryptography python3-pyelftools"
}
function write_uboot_platform() {
: # noop; this means `armbian-install` can't be used to flash u-boot; users must use mtkflash or similar
}