263 lines
10 KiB
Plaintext
263 lines
10 KiB
Plaintext
#
|
|
# 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/
|
|
#
|
|
|
|
declare -g LINUXFAMILY="meson-s4t7"
|
|
declare -g ARCH="arm64"
|
|
declare -g ATF_COMPILE="no"
|
|
|
|
declare -g BLUETOOTH_HCIATTACH_PARAMS="-s 115200 /dev/ttyS1 bcm43xx 2000000" # For the bluetooth-hciattach extension
|
|
enable_extension "bluetooth-hciattach" # Enable the bluetooth-hciattach extension
|
|
|
|
# Determine kernel
|
|
case $BRANCH in
|
|
|
|
legacy)
|
|
declare -g KERNEL_MAJOR_MINOR="5.15" # Major and minor versions of this kernel. For mainline caching.
|
|
declare -g KERNELSOURCE="${GITHUB_SOURCE}/khadas/linux.git" # Khadas kernel
|
|
declare -g KERNELBRANCH="branch:khadas-vims-5.15.y" # Branch or tag to build from. It should match MAJOR_MINOR
|
|
declare -g KERNELPATCHDIR="archive/meson-s4t7-5.15"
|
|
declare -g COMMON_DRIVERS_SOURCE="${GITHUB_SOURCE}/khadas/common_drivers"
|
|
declare -g EXTRAWIFI=no
|
|
;;
|
|
|
|
esac
|
|
|
|
# Lets build uboot from source
|
|
BOOTSOURCE="${GITHUB_SOURCE}/CoreELEC/u-boot.git"
|
|
BOOTBRANCH="branch:khadas-vims-v2019.01"
|
|
BOOTPATCHDIR="u-boot-meson-s4t7"
|
|
BOOTENV_FILE='meson.txt'
|
|
BOOTSCRIPT="boot-meson-s4t7.cmd:boot.cmd"
|
|
FORCE_BOOTSCRIPT_UPDATE="yes"
|
|
FORCE_UBOOT_UPDATE="yes"
|
|
UBOOT_TARGET_MAP=";;fip/_tmp/u-boot.bin.sd.bin.signed:u-boot.bin.sd.bin.signed"
|
|
|
|
## funny enough, the uboot+fip blobs go in the same spot as normal meson64...
|
|
function write_uboot_platform() {
|
|
dd if="$1/u-boot.bin.sd.bin.signed" of="$2" conv=fsync,notrunc bs=442 count=1 #> /dev/null 2>&1
|
|
dd if="$1/u-boot.bin.sd.bin.signed" of="$2" conv=fsync,notrunc bs=512 skip=1 seek=1 #> /dev/null 2>&1
|
|
}
|
|
|
|
# We'll need xxd to build the fip blobs
|
|
function add_host_dependencies__khadas_fips_needs_xxd() {
|
|
display_alert "Adding xxd to host dependencies" "for khadas bootloader compile" "debug"
|
|
declare -g EXTRA_BUILD_DEPS="${EXTRA_BUILD_DEPS} xxd"
|
|
}
|
|
|
|
function fetch_sources_tools__meson_s4t7_download_uboot_toolchain() {
|
|
display_alert "$BOARD" "preparing linaro toolchain for bootloader fip" "info"
|
|
|
|
if [[ "${HOSTARCH}" != "amd64" ]] && [[ "${HOSTARCH}" != "arm64" ]]; then
|
|
exit_with_error "vim1s/vim4 uboot requires amd64 or arm64 system to build"
|
|
fi
|
|
|
|
declare tversion="7.3.1-2018.05"
|
|
declare tbasedir="${SRC}/cache/toolchain"
|
|
declare tos="x86_64"
|
|
[[ "${HOSTARCH}" == "arm64" ]] && tos="aarch64"
|
|
declare tdir="${tbasedir}/gcc-linaro-${tversion}-${tos}_aarch64-elf"
|
|
declare tfile="gcc-linaro-${tversion}-${tos}_aarch64-elf.tar.xz"
|
|
declare turl="https://dl.armbian.com/_toolchain/${tfile}"
|
|
|
|
mkdir -p "${tbasedir}"
|
|
|
|
if [[ ! -d "${tdir}" ]]; then
|
|
run_host_command_logged curl -fL#o "${tbasedir}/${tfile}" "${turl}"
|
|
run_host_command_logged tar -C "${tbasedir}" -xf "${tbasedir}/${tfile}"
|
|
run_host_command_logged rm -fv "${tbasedir}/${tfile}"
|
|
fi
|
|
|
|
# Symlinks are not enough: riscv-none-embed-ld: cannot find -lgcc, So we need to add the toolchain to the PATH
|
|
export PATH="${tdir}/bin:${PATH}"
|
|
|
|
display_alert "$BOARD" "preparing riscv toolchain for bootloader fip" "info"
|
|
|
|
declare tos="x64"
|
|
[[ "${HOSTARCH}" == "arm64" ]] && tos="arm64"
|
|
[[ "${HOSTARCH}" == "armhf" ]] && tos="arm"
|
|
declare tversion="8.3.0-1.2"
|
|
declare tbasedir="${SRC}/cache/toolchain"
|
|
declare tdir="${tbasedir}/xpack-riscv-none-embed-gcc-${tversion}"
|
|
declare tfile="xpack-riscv-none-embed-gcc-${tversion}-linux-${tos}.tar.gz"
|
|
declare turl="https://dl.armbian.com/_toolchain/${tfile}"
|
|
|
|
mkdir -p "${tbasedir}"
|
|
|
|
if [[ ! -d "${tdir}" ]]; then
|
|
run_host_command_logged curl -fL#o "${tbasedir}/${tfile}" "${turl}"
|
|
run_host_command_logged tar -C "${tbasedir}" -xzf "${tbasedir}/${tfile}"
|
|
run_host_command_logged rm -fv "${tbasedir}/${tfile}"
|
|
fi
|
|
|
|
# Symlinks are not enough: riscv-none-embed-ld: cannot find -lgcc, So we need to add the toolchain to the PATH
|
|
declare -g -r PRE_TOOLCHAIN_PATH="${PATH}"
|
|
export PATH="${tdir}/bin:${PATH}"
|
|
}
|
|
|
|
# Invoke fip build script after the u-boot target
|
|
function build_custom_uboot__meson_s4t7_build_custom_uboot() {
|
|
: "${KHADAS_BOARD_ID:?KHADAS_BOARD_ID not set}"
|
|
display_alert "$BOARD" "building fip" "info"
|
|
|
|
patch_uboot_target
|
|
|
|
if [[ $CREATE_PATCHES == yes ]]; then
|
|
return 0
|
|
fi
|
|
|
|
export CROSS_COMPILE="aarch64-elf-"
|
|
rm -rf "${PWD}"/fip/_tmp
|
|
# U-Boot Defconfig
|
|
run_host_command_logged make -j`nproc` $BOOTCONFIG
|
|
# U-Boot Binary
|
|
run_host_command_logged make -j`nproc`
|
|
# Firmware Image Package (fip)
|
|
run_host_command_logged bash fip/mk_script.sh "${KHADAS_BOARD_ID}" "${PWD}"
|
|
loop_over_uboot_targets_and_do deploy_built_uboot_bins_for_one_target_to_packaging_area
|
|
declare -g EXTENSION_BUILT_UBOOT=yes
|
|
}
|
|
|
|
function custom_kernel_config__add_khadas_common_drivers() {
|
|
display_alert "Enabling kernel config" "DEBUG_KERNEL=y, EXPERT=y, EMBEDDED=y to fix khadas_common_drivers compilation" "info"
|
|
opts_y+=("DEBUG_KERNEL") # Unfortunately, debug kernel has to be enabled to make khadas_common_drivers compile
|
|
opts_y+=("EMBEDDED")
|
|
opts_y+=("EXPERT")
|
|
|
|
# viraniac: The kernel config hooks are always called twice, once without being in kernel directory and once with current directory being the kernel work directory.
|
|
if [[ ! -f .config ]]; then
|
|
display_alert "$BOARD" "Fetching khadas common drivers git info" "info"
|
|
|
|
common_drivers_cache_ttl_seconds=3600
|
|
declare -A GIT_INFO_COMMON_DRIVERS=([GIT_SOURCE]="${COMMON_DRIVERS_SOURCE}" [GIT_REF]="${KERNELBRANCH}")
|
|
|
|
if [[ "${KERNEL_GIT_CACHE_TTL}" != "" ]]; then
|
|
common_drivers_cache_ttl_seconds="${KERNEL_GIT_CACHE_TTL}"
|
|
fi
|
|
|
|
memoize_cache_ttl=$common_drivers_cache_ttl_seconds run_memoized GIT_INFO_COMMON_DRIVERS "git2info" memoized_git_ref_to_info
|
|
|
|
# Hack to ensure that we will recreate kernel if common_drivers source changes
|
|
kernel_config_modifying_hashes+=("khadas_common_drivers=${GIT_INFO_COMMON_DRIVERS[SHA1]}")
|
|
fi
|
|
}
|
|
|
|
function kernel_copy_extra_sources__khadas_common_drivers() {
|
|
display_alert "$BOARD" "Copying khadas common drivers" "info"
|
|
|
|
common_drivers_git_bare_tree="${SRC}/cache/git-bare/khadas_common_drivers"
|
|
declare common_drivers_git_bare_tree_done_marker="${common_drivers_git_bare_tree}/.git/armbian-bare-tree-done"
|
|
|
|
if [[ ! -d "${common_drivers_git_bare_tree}" || ! -f "${common_drivers_git_bare_tree_done_marker}" ]]; then
|
|
if [[ -d "${common_drivers_git_bare_tree}" ]]; then
|
|
rm -rf "${common_drivers_git_bare_tree}"
|
|
fi
|
|
|
|
run_host_command_logged git clone --tags --no-checkout \
|
|
"${COMMON_DRIVERS_SOURCE}" "${common_drivers_git_bare_tree}"
|
|
|
|
touch "${common_drivers_git_bare_tree_done_marker}"
|
|
fi
|
|
|
|
git_ensure_safe_directory "${common_drivers_git_bare_tree}"
|
|
|
|
GIT_FIXED_WORKDIR="${LINUXSOURCEDIR}/common_drivers" \
|
|
GIT_BARE_REPO_FOR_WORKTREE="${common_drivers_git_bare_tree}" \
|
|
GIT_BARE_REPO_INITIAL_BRANCH="${KERNELBRANCH#*:}" \
|
|
fetch_from_repo "${COMMON_DRIVERS_SOURCE}" "common_drivers:${KERNEL_MAJOR_MINOR}" "${KERNELBRANCH}" "yes"
|
|
}
|
|
|
|
function pre_package_kernel_headers__copy_common_drivers_header_include_mk_file() {
|
|
display_alert "Copy common_drivers/header_include.mk file in kernel headers"
|
|
declare makefile_destination="${headers_target_dir}"/common_drivers
|
|
run_host_command_logged mkdir -p ${makefile_destination}
|
|
run_host_command_logged cp ${kernel_work_dir}/common_drivers/header_include.mk ${makefile_destination}/
|
|
run_host_command_logged cp -r ${kernel_work_dir}/common_drivers/include ${makefile_destination}/
|
|
}
|
|
|
|
function pre_package_kernel_image__copy_meson_s4t7_overlays() {
|
|
display_alert "Copy meson s4t7 overlays"
|
|
declare dtbo_destination="${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}"/amlogic
|
|
|
|
# the directory structure is changed between 5.4 and 5.15 kernel
|
|
# Lets make it consistent
|
|
run_host_command_logged mkdir -p ${dtbo_destination}
|
|
run_host_command_logged mv "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}"/*.dtb ${dtbo_destination}/
|
|
|
|
run_host_command_logged cp -r ${SRC}/patch/kernel/${KERNELPATCHDIR}/overlay ${dtbo_destination}/
|
|
|
|
display_alert "Enable Device Tree Overlays"
|
|
run_host_command_logged ln -sf amlogic/overlay "${tmp_kernel_install_dirs[INSTALL_DTBS_PATH]}"/overlay
|
|
}
|
|
|
|
function post_family_tweaks_bsp__disable_uinitrd_generation() {
|
|
if [[ -f "${destination}"/etc/initramfs/post-update.d/99-uboot ]]; then
|
|
run_host_command_logged rm "${destination}"/etc/initramfs/post-update.d/99-uboot
|
|
fi
|
|
}
|
|
|
|
function image_specific_armbian_env_ready__enable_earlycon() {
|
|
display_alert "Enabling earlycon"
|
|
run_host_command_logged echo "earlycon=on" >> ${SDCARD}/boot/armbianEnv.txt
|
|
}
|
|
|
|
function post_family_tweaks_bsp__add_fan_service() {
|
|
# bsp files matching fenix commit - eca6e06
|
|
if [[ ${BRANCH} = "legacy" ]]; then
|
|
run_host_command_logged cp -R "${SRC}"/packages/bsp/meson-s4t7/common/* "${destination}"/
|
|
run_host_command_logged cp -R "${SRC}"/packages/bsp/meson-s4t7/${BOARD}/* "${destination}"/
|
|
fi
|
|
}
|
|
|
|
function meson_s4t7_board_side_bsp_cli_postrm() { # not run here
|
|
if [[ remove == "$1" ]] || [[ abort-install == "$1" ]]; then
|
|
cp /usr/share/initramfs-tools/modules /etc/initramfs-tools/modules
|
|
fi
|
|
}
|
|
|
|
function post_family_tweaks_bsp__add_postrm_hook() {
|
|
display_alert "$BOARD" "Adding postrm hook to restore /etc/initramfs-tools/modules file" "info"
|
|
postrm_functions+=(meson_s4t7_board_side_bsp_cli_postrm)
|
|
}
|
|
|
|
function post_family_tweaks_bsp__meson_s4t7_set_initrd_symlink_location() {
|
|
# We already create /boot/Image symlink ourselves. Lets also create a symlink for initrd so that
|
|
# we can have a consistent way for booting.
|
|
run_host_command_logged cat <<- 'zzz-update-initramfs' > "${destination}"/etc/initramfs/post-update.d/zzz-update-initramfs
|
|
#!/bin/bash -e
|
|
|
|
# Play nice when run under debconf.
|
|
exec </dev/null >&2
|
|
|
|
abi=$1
|
|
initrd_file=$2
|
|
target=/boot/
|
|
|
|
function is_boot_dev_vfat() {
|
|
if ! mountpoint -q /boot; then
|
|
return 1
|
|
fi
|
|
local boot_partition bootfstype
|
|
boot_partition=$(findmnt --nofsroot -n -o SOURCE /boot)
|
|
bootfstype=$(blkid -s TYPE -o value $boot_partition)
|
|
if [[ "$bootfstype" == "vfat" ]]; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
if is_boot_dev_vfat; then
|
|
cp ${initrd_file} ${target}/Initrd
|
|
sync -f ${target}/Initrd || true
|
|
else
|
|
ln -sf ${initrd_file} ${target}/Initrd
|
|
fi
|
|
|
|
exit 0
|
|
zzz-update-initramfs
|
|
|
|
chmod a+x "${destination}"/etc/initramfs/post-update.d/zzz-update-initramfs
|
|
}
|