summaryrefslogtreecommitdiff
path: root/classes
diff options
context:
space:
mode:
Diffstat (limited to 'classes')
-rw-r--r--classes/image_type_tezi.bbclass218
-rw-r--r--classes/toradex-devicetree.bbclass17
-rw-r--r--classes/toradex-fitimage.bbclass149
-rw-r--r--classes/toradex-kernel-config.bbclass23
-rw-r--r--classes/toradex-kernel-deploy-config.bbclass8
-rw-r--r--classes/toradex-kernel-localversion.bbclass13
-rw-r--r--classes/toradex-sanity.bbclass65
-rw-r--r--classes/toradex-u-boot-localversion.bbclass2
8 files changed, 280 insertions, 215 deletions
diff --git a/classes/image_type_tezi.bbclass b/classes/image_type_tezi.bbclass
index c10a325..672a9bc 100644
--- a/classes/image_type_tezi.bbclass
+++ b/classes/image_type_tezi.bbclass
@@ -5,12 +5,12 @@
# Since it also generates the image.json description file it is rather
# interwind with the boot flow which is U-Boot target specific.
-WKS_FILE_DEPENDS_append = " tezi-metadata virtual/dtb"
+KERNEL_DEVICETREE_BASENAME = "${@make_dtb_boot_files(d)}"
+WKS_FILE_DEPENDS:append = " tezi-metadata virtual/dtb"
DEPENDS += "${WKS_FILE_DEPENDS}"
-IMAGE_BOOT_FILES_REMOVE = "${@make_dtb_boot_files(d) if d.getVar('KERNEL_IMAGETYPE') == 'fitImage' else ''}"
-IMAGE_BOOT_FILES_REMOVE_apalis-tk1 = "${@ d.getVar('KERNEL_DEVICETREE') if d.getVar('KERNEL_IMAGETYPE') == 'fitImage' else ''}"
-IMAGE_BOOT_FILES_append = " overlays.txt ${@'' if d.getVar('KERNEL_IMAGETYPE') == 'fitImage' else 'overlays/*;overlays/'}"
-IMAGE_BOOT_FILES_remove = "${IMAGE_BOOT_FILES_REMOVE}"
+IMAGE_BOOT_FILES_REMOVE = "${@'${KERNEL_DEVICETREE_BASENAME}' if d.getVar('KERNEL_IMAGETYPE') == 'fitImage' else ''}"
+IMAGE_BOOT_FILES:append = " overlays.txt ${@'' if d.getVar('KERNEL_IMAGETYPE') == 'fitImage' else 'overlays/*;overlays/'}"
+IMAGE_BOOT_FILES:remove = "${IMAGE_BOOT_FILES_REMOVE}"
RM_WORK_EXCLUDE += "${PN}"
@@ -19,18 +19,27 @@ TDX_RELEASE ??= "0.0.0"
TDX_MATRIX_BUILD_TIME ??= "${DATETIME}"
TDX_MATRIX_BUILD_TIME[vardepsexclude] = "DATETIME"
+EMMCDEV = "mmcblk0"
+EMMCDEV:verdin-imx8mp = "emmc"
+EMMCDEVBOOT0 = "mmcblk0boot0"
+EMMCDEVBOOT0:verdin-imx8mp = "emmc-boot0"
TEZI_VERSION ?= "${DISTRO_VERSION}"
TEZI_DATE ?= "${TDX_MATRIX_BUILD_TIME}"
TEZI_IMAGE_NAME ?= "${IMAGE_NAME}"
TEZI_ROOT_FSTYPE ??= "ext4"
+TEZI_ROOT_FSOPTS ?= "-E nodiscard"
TEZI_ROOT_LABEL ??= "RFS"
TEZI_ROOT_NAME ??= "rootfs"
TEZI_ROOT_SUFFIX ??= "tar.xz"
+TEZI_ROOT_PART_TYPE ??= "83"
+TEZI_ROOT_PART_SIZE ??= "512"
+TEZI_ROOT_FILELIST ??= ""
TEZI_USE_BOOTFILES ??= "true"
+TEZI_AUTO_INSTALL ??= "false"
TEZI_BOOT_SUFFIX ??= "${@'bootfs.tar.xz' if oe.types.boolean('${TEZI_USE_BOOTFILES}') else ''}"
TEZI_CONFIG_FORMAT ??= "2"
# Require newer Tezi for mx8 Socs with the u-boot environment bugfix
-TEZI_CONFIG_FORMAT_mx8 ??= "4"
+TEZI_CONFIG_FORMAT:mx8-generic-bsp ??= "4"
TORADEX_FLASH_TYPE ??= "emmc"
UBOOT_BINARY_TEZI_EMMC ?= "${UBOOT_BINARY}"
UBOOT_BINARY_TEZI_RAWNAND ?= "${UBOOT_BINARY}"
@@ -40,18 +49,20 @@ UBOOT_ENV_TEZI_RAWNAND ?= "${UBOOT_ENV_TEZI}"
# use DISTRO_FLAVOUR to append to the image name displayed in TEZI
DISTRO_FLAVOUR ??= ""
-SUMMARY_append = "${DISTRO_FLAVOUR}"
+SUMMARY:append = "${DISTRO_FLAVOUR}"
-TEZI_EULA_URL ?= "https://www.nxp.com/docs/en/disclaimer/LA_OPT_NXP_SW.html"
-export TEZI_EULA_URL
+TEZI_EULA_FILE ?= "LA_OPT_NXP_SW.html"
+TEZI_EULA_FILE:ti-soc ?= "TI-TFL.txt"
+TEZI_EULA_URL ?= "https://www.nxp.com/docs/en/disclaimer/${TEZI_EULA_FILE}"
+TEZI_EULA_URL:ti-soc ?= ""
# Append tar command to store uncompressed image size to ${T}.
# If a custom rootfs type is used make sure this file is created
# before compression.
-IMAGE_CMD_tar_append = "; du -ks ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar | cut -f 1 > ${T}/image-size${IMAGE_NAME_SUFFIX}"
-CONVERSION_CMD_tar_append = "; du -ks ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}.tar | cut -f 1 > ${T}/image-size.${type}"
-CONVERSION_CMD_tar = "touch ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}; ${IMAGE_CMD_TAR} --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}.tar -C ${TAR_IMAGE_ROOTFS} . || [ $? -eq 1 ]"
-CONVERSIONTYPES_append = " tar"
+IMAGE_CMD:tar:append = "; du -ks ${IMGDEPLOYDIR}/${IMAGE_NAME}.tar | cut -f 1 > ${T}/image-size${IMAGE_NAME_SUFFIX}"
+CONVERSION_CMD:tar:append = "; du -ks ${IMGDEPLOYDIR}/${IMAGE_NAME}.${type}.tar | cut -f 1 > ${T}/image-size.${type}"
+CONVERSION_CMD:tar = "touch ${IMGDEPLOYDIR}/${IMAGE_NAME}.${type}; ${IMAGE_CMD_TAR} --numeric-owner -cf ${IMGDEPLOYDIR}/${IMAGE_NAME}.${type}.tar -C ${TAR_IMAGE_ROOTFS} . || [ $? -eq 1 ]"
+CONVERSIONTYPES:append = " tar"
def get_uncompressed_size(d, type):
path = os.path.join(d.getVar('T'), "image-size.%s" % type)
@@ -69,6 +80,59 @@ def get_bootfs_part_size(d):
part_size = 3 * 2 ** (1 + int(log(get_uncompressed_size(d, 'bootfs'), 2)))
return max(16, part_size)
+def get_filelist_var(d, varname):
+ filelist = d.getVar(varname)
+ if not filelist:
+ return None
+ import re
+ return re.split(r"\s+", filelist.strip())
+
+def get_tezi_filelist_artifacts(d):
+ filelist = get_filelist_var(d, 'TEZI_ROOT_FILELIST')
+ if not filelist:
+ return None
+ artifacts = []
+ for entry in filelist:
+ artifacts.append(entry.split(":")[0])
+ return artifacts
+
+# Determine the storage space required for the given "filelist".
+def get_filelist_extra_size(d, filelist):
+ import shlex
+ import subprocess
+
+ extra_size = 0
+ for entry in filelist:
+ unpack = False
+ flds = entry.split(":")
+ fpath = os.path.join(d.getVar('IMGDEPLOYDIR'), flds[0])
+ # Any non-empty string is considered as true except the strings "0" and
+ # "false"; this is to be compatible with the QVariant used by Tezi.
+ if len(flds) >= 3 and (flds[2] and flds[2].lower() not in ["0", "false"]):
+ unpack = True
+ if unpack and fpath.endswith(".zip"):
+ # Deal with .zip files only:
+ cmd = ("unzip -p %s | wc -c" % shlex.quote(fpath))
+ bb.debug(1, "Running command [%s]" % cmd)
+ outp = subprocess.check_output(cmd, shell=True)
+ size = int(outp)
+ bb.debug(1, "Unpacked size of '%s': %d (bytes)" % (fpath, size))
+ elif unpack:
+ # Deal with .tar.(gz|xz|bz2|lzo|zstd):
+ cmd = ("tar -xf %s -O | wc -c" % shlex.quote(fpath))
+ bb.debug(1, "Running command [%s]" % cmd)
+ outp = subprocess.check_output(cmd, shell=True)
+ size = int(outp)
+ bb.debug(1, "Unpacked size of '%s': %d (bytes)" % (fpath, size))
+ else:
+ stat = os.stat(fpath)
+ size = stat.st_size
+ bb.debug(1, "Size of '%s': %d (bytes)" % (fpath, size))
+ extra_size += size
+
+ # Returned size is in MB.
+ return float(extra_size) / 1024 / 1024
+
# Whitespace separated list of files declared by 'deploy_var' variable
# from 'source_dir' (DEPLOY_DIR_IMAGE by default) to place in 'deploy_dir'.
# Entries will be installed under a same name as the source file. To change
@@ -128,23 +192,39 @@ def tezi_deploy_files(d, deploy_var, deploy_dir, source_dir=None):
def rootfs_tezi_emmc(d, use_bootfiles):
from collections import OrderedDict
+ emmcdev = d.getVar('EMMCDEV')
+ emmcdevboot0 = d.getVar('EMMCDEVBOOT0')
+ imagename = d.getVar('IMAGE_LINK_NAME')
offset_bootrom = d.getVar('OFFSET_BOOTROM_PAYLOAD')
+ offset_fw = d.getVar('OFFSET_FW_PAYLOAD')
offset_spl = d.getVar('OFFSET_SPL_PAYLOAD')
- imagename = d.getVar('IMAGE_LINK_NAME')
bootpart_rawfiles = []
filesystem_partitions = []
+ offset_payload = offset_bootrom
+ if offset_fw:
+ # FIRMWARE_BINARY contain product_id <-> filename mapping
+ fwmapping = d.getVarFlags('FIRMWARE_BINARY')
+ for f, v in fwmapping.items():
+ bootpart_rawfiles.append(
+ {
+ "filename": v,
+ "dd_options": "seek=" + offset_payload,
+ "product_ids": f
+ })
+ offset_payload = offset_fw
if offset_spl:
bootpart_rawfiles.append(
{
"filename": d.getVar('SPL_BINARY'),
- "dd_options": "seek=" + offset_bootrom
+ "dd_options": "seek=" + offset_payload
})
+ offset_payload = offset_spl
bootpart_rawfiles.append(
{
"filename": d.getVar('UBOOT_BINARY_TEZI_EMMC'),
- "dd_options": "seek=" + (offset_spl if offset_spl else offset_bootrom)
+ "dd_options": "seek=" + offset_payload
})
if use_bootfiles:
@@ -161,26 +241,48 @@ def rootfs_tezi_emmc(d, use_bootfiles):
}
})
- filesystem_partitions.append(
- {
- "partition_size_nominal": 512,
- "want_maximised": True,
- "content": {
- "label": d.getVar('TEZI_ROOT_LABEL'),
- "filesystem_type": d.getVar('TEZI_ROOT_FSTYPE'),
- "mkfs_options": "-E nodiscard",
- "filename": imagename + "." + d.getVar('TEZI_ROOT_SUFFIX'),
- "uncompressed_size": get_uncompressed_size(d, d.getVar('TEZI_ROOT_NAME'))
- }
- })
+ if d.getVar('TEZI_ROOT_FSTYPE') == "raw":
+ rootfs = {
+ "partition_size_nominal": d.getVar('TEZI_ROOT_PART_SIZE'),
+ "partition_type": d.getVar('TEZI_ROOT_PART_TYPE'),
+ "want_maximised": True,
+ "content": {
+ "filesystem_type": "raw",
+ "rawfiles": [
+ {
+ "filename": imagename + "." + d.getVar('TEZI_ROOT_SUFFIX')
+ }
+ ],
+ "uncompressed_size": get_uncompressed_size(d, d.getVar('TEZI_ROOT_NAME'))
+ }
+ }
+ else:
+ rootfs = {
+ "partition_size_nominal": d.getVar('TEZI_ROOT_PART_SIZE'),
+ "want_maximised": True,
+ "content": {
+ "label": d.getVar('TEZI_ROOT_LABEL'),
+ "filesystem_type": d.getVar('TEZI_ROOT_FSTYPE'),
+ "mkfs_options": d.getVar('TEZI_ROOT_FSOPTS'),
+ "filename": imagename + "." + d.getVar('TEZI_ROOT_SUFFIX'),
+ "uncompressed_size": get_uncompressed_size(d, d.getVar('TEZI_ROOT_NAME'))
+ }
+ }
+
+ rootfs_filelist = get_filelist_var(d, 'TEZI_ROOT_FILELIST')
+ if rootfs_filelist:
+ rootfs["content"]["filelist"] = rootfs_filelist
+ rootfs["content"]["uncompressed_size"] += get_filelist_extra_size(d, rootfs_filelist)
+
+ filesystem_partitions.append(rootfs)
return [
OrderedDict({
- "name": "mmcblk0",
+ "name": emmcdev,
"partitions": filesystem_partitions
}),
OrderedDict({
- "name": "mmcblk0boot0",
+ "name": emmcdevboot0,
"erase": True,
"content": {
"filesystem_type": "raw",
@@ -228,9 +330,14 @@ def rootfs_tezi_rawnand(d):
}
}
+ rootfs_filelist = get_filelist_var(d, 'TEZI_ROOT_FILELIST')
+ if rootfs_filelist:
+ rootfs["content"]["filelist"] = rootfs_filelist
+ rootfs["content"]["uncompressed_size"] += get_filelist_extra_size(d, rootfs_filelist)
+
kernel = {
"name": "kernel",
- "size_kib": 8192,
+ "size_kib": 12288,
"type": "static",
"content": {
"rawfile": {
@@ -274,7 +381,7 @@ def rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file):
from datetime import datetime
deploydir = d.getVar('DEPLOY_DIR_IMAGE')
- data = OrderedDict({ "config_format": d.getVar('TEZI_CONFIG_FORMAT'), "autoinstall": False })
+ data = OrderedDict({ "config_format": d.getVar('TEZI_CONFIG_FORMAT'), "autoinstall": oe.types.boolean(d.getVar('TEZI_AUTO_INSTALL')) })
# Use image recipes SUMMARY/DESCRIPTION...
data["name"] = d.getVar('SUMMARY')
@@ -291,8 +398,7 @@ def rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file):
if os.path.exists(os.path.join(deploydir, "toradexlinux.png")):
data["icon"] = "toradexlinux.png"
if d.getVar('TEZI_SHOW_EULA_LICENSE') == "1":
- url = d.getVar('TEZI_EULA_URL')
- data["license"] = os.path.basename(url)
+ data["license"] = d.getVar('TEZI_EULA_FILE')
product_ids = d.getVar('TORADEX_PRODUCT_IDS')
if product_ids is None:
@@ -319,6 +425,18 @@ def rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file):
json.dump(data, outfile, indent=4)
bb.note("Toradex Easy Installer metadata file {0} written.".format(json_file))
+def fw_binaries(d):
+ fwmapping = d.getVarFlags('FIRMWARE_BINARY')
+
+ if fwmapping is not None:
+ fw_bins = []
+ for key, val in fwmapping.items():
+ if val not in fw_bins:
+ fw_bins.append(val)
+ return " " + " ".join(fw_bins)
+ else:
+ return ""
+
python rootfs_tezi_run_json() {
artifacts = "%s/%s.%s" % (d.getVar('IMGDEPLOYDIR'), d.getVar('IMAGE_LINK_NAME'), d.getVar('TEZI_ROOT_SUFFIX'))
flash_type = d.getVar('TORADEX_FLASH_TYPE')
@@ -330,19 +448,24 @@ python rootfs_tezi_run_json() {
flash_data = rootfs_tezi_rawnand(d)
uenv_file = d.getVar('UBOOT_ENV_TEZI_RAWNAND')
uboot_file = d.getVar('UBOOT_BINARY_TEZI_RAWNAND')
- artifacts += " " + d.getVar('KERNEL_IMAGETYPE') + " " + d.getVar('KERNEL_DEVICETREE')
+ artifacts += " " + d.getVar('KERNEL_IMAGETYPE') + " " + d.getVar('KERNEL_DEVICETREE_BASENAME')
elif flash_type == "emmc":
use_bootfiles = oe.types.boolean(d.getVar('TEZI_USE_BOOTFILES'))
flash_data = rootfs_tezi_emmc(d, use_bootfiles)
uenv_file = d.getVar('UBOOT_ENV_TEZI_EMMC')
uboot_file = d.getVar('UBOOT_BINARY_TEZI_EMMC')
# TODO: Multi image/raw NAND with SPL currently not supported
+ uboot_file += fw_binaries(d);
uboot_file += " " + d.getVar('SPL_BINARY') if d.getVar('OFFSET_SPL_PAYLOAD') else ""
artifacts += " " + "%s/%s.%s" % (d.getVar('IMGDEPLOYDIR'), d.getVar('IMAGE_LINK_NAME'), d.getVar('TEZI_BOOT_SUFFIX')) if use_bootfiles else ""
else:
bb.fatal("Toradex flash type unknown")
artifacts += " " + uenv_file + " " + uboot_file
+ artifacts_fl = get_tezi_filelist_artifacts(d)
+ if artifacts_fl:
+ for artifact in artifacts_fl:
+ artifacts += " %s/%s" % (d.getVar('IMGDEPLOYDIR'), artifact)
d.setVar("TEZI_ARTIFACTS", artifacts)
rootfs_tezi_json(d, flash_type, flash_data, "image-%s.json" % d.getVar('IMAGE_BASENAME'), uenv_file)
@@ -355,36 +478,43 @@ tezi_deploy_bootfs_files[dirs] =+ "${WORKDIR}/bootfs"
tezi_deploy_bootfs_files[cleandirs] += "${WORKDIR}/bootfs"
tezi_deploy_bootfs_files[vardeps] += "IMAGE_BOOT_FILES"
-TAR_IMAGE_ROOTFS_task-image-bootfs = "${WORKDIR}/bootfs"
-IMAGE_CMD_bootfs () {
+TAR_IMAGE_ROOTFS:task-image-bootfs = "${WORKDIR}/bootfs"
+IMAGE_CMD:bootfs () {
:
}
TEZI_IMAGE_BOOTFS_PREFUNCS ??= "tezi_deploy_bootfs_files"
do_image_bootfs[prefuncs] += "${TEZI_IMAGE_BOOTFS_PREFUNCS}"
TEZI_IMAGE_TEZIIMG_PREFUNCS ??= "rootfs_tezi_run_json"
-IMAGE_TYPEDEP_teziimg += "${TEZI_BOOT_SUFFIX} ${TEZI_ROOT_SUFFIX}"
-IMAGE_CMD_teziimg () {
+IMAGE_TYPEDEP:teziimg += "${TEZI_BOOT_SUFFIX} ${TEZI_ROOT_SUFFIX}"
+IMAGE_CMD:teziimg () {
bbnote "Create Toradex Easy Installer tarball"
# Copy image json file to ${WORKDIR}/image-json
cp ${IMGDEPLOYDIR}/image*.json ${WORKDIR}/image-json/image.json
- # Keep License up to date
- curl -k -O ${TEZI_EULA_URL}
- EULA_FILE=$(echo "${TEZI_EULA_URL##*/}")
+ if [ -n "$TEZI_EULA_URL" ]; then
+ curl -k --retry 5 -O ${TEZI_EULA_URL} || true
+ fi
+
+ local outfile stdoutfile
+ outfile=${TEZI_IMAGE_NAME}-Tezi_${TEZI_VERSION}.tar
+ stdoutfile=${TEZI_IMAGE_NAME}-Tezi.tar
# The first transform strips all folders from the files to tar, the
# second transform "moves" them in a subfolder ${TEZI_IMAGE_NAME}-Tezi_${TEZI_VERSION}.
${IMAGE_CMD_TAR} \
--transform='s/.*\///' \
--transform 's,^,${TEZI_IMAGE_NAME}-Tezi_${TEZI_VERSION}/,' \
- -chf ${IMGDEPLOYDIR}/${TEZI_IMAGE_NAME}-Tezi_${TEZI_VERSION}.tar \
- toradexlinux.png marketing.tar prepare.sh wrapup.sh ${EULA_FILE} \
+ -chf "${IMGDEPLOYDIR}/${outfile}" \
+ toradexlinux.png marketing.tar prepare.sh wrapup.sh ${TEZI_EULA_FILE} \
${WORKDIR}/image-json/image.json ${TEZI_ARTIFACTS}
+
+ ln -sf "${outfile}" "${IMGDEPLOYDIR}/${stdoutfile}"
}
do_image_teziimg[dirs] += "${WORKDIR}/image-json ${DEPLOY_DIR_IMAGE}"
do_image_teziimg[cleandirs] += "${WORKDIR}/image-json"
do_image_teziimg[prefuncs] += "${TEZI_IMAGE_TEZIIMG_PREFUNCS}"
do_image_teziimg[recrdeptask] += "do_deploy"
do_image_teziimg[vardepsexclude] = "TEZI_VERSION TEZI_DATE"
+do_image_teziimg[network] = "1"
diff --git a/classes/toradex-devicetree.bbclass b/classes/toradex-devicetree.bbclass
index 4deb850..a511c64 100644
--- a/classes/toradex-devicetree.bbclass
+++ b/classes/toradex-devicetree.bbclass
@@ -13,8 +13,8 @@
#
# The devicetree overlays to be deployed
# to ${DEPLOY_DIR_IMAGE}/overlays, if not
-# set, all common and machine related
-# overlays would be deployed.
+# set, all machine related overlays would
+# be deployed.
#
# TEZI_EXTERNAL_KERNEL_DEVICETREE_BOOT = "a-overlay.dtbo"
#
@@ -38,18 +38,19 @@ inherit devicetree
S = "${WORKDIR}/git/overlays"
DT_FILES_PATH = "${WORKDIR}/machine-overlays"
+DT_INCLUDE:append = " ${S}"
+KERNEL_DTB_PREFIX ??= ""
+KERNEL_INCLUDE:append = " ${STAGING_KERNEL_DIR}/arch/${ARCH}/boot/dts/${KERNEL_DTB_PREFIX}"
# The machine specific recipes start with MACHINE_PREFIX}[_-]
MACHINE_PREFIX = "${MACHINE}"
-MACHINE_PREFIX_colibri-imx7-emmc = "colibri-imx7"
-MACHINE_PREFIX_apalis-imx8x-v11a = "apalis-imx8x"
-MACHINE_PREFIX_colibri-imx8x-v10b = "colibri-imx8x"
+MACHINE_PREFIX:colibri-imx6ull-emmc = "colibri-imx6ull"
+MACHINE_PREFIX:colibri-imx7-emmc = "colibri-imx7"
do_collect_overlays () {
if [ -z "${TEZI_EXTERNAL_KERNEL_DEVICETREE}" ] ; then
machine_dts=`cd ${S} && ls ${MACHINE_PREFIX}[_-]*.dts 2>/dev/null || true`
- common_dts=`cd ${S} && ls *.dts 2>/dev/null | grep -v -e 'imx[6-8]' -e 'tk1' | xargs || true`
- all_dts="$machine_dts $common_dts"
+ all_dts="$machine_dts"
else
for dtbo in ${TEZI_EXTERNAL_KERNEL_DEVICETREE}; do
dtbo_ext=${dtbo##*.}
@@ -67,7 +68,7 @@ do_collect_overlays[cleandirs] = "${DT_FILES_PATH}"
addtask collect_overlays after do_patch before do_configure
-do_deploy_append () {
+do_deploy:append () {
install -d ${DEPLOYDIR}/overlays
if [ -d ${DEPLOYDIR}/devicetree ]; then
cp ${DEPLOYDIR}/devicetree/* ${DEPLOYDIR}/overlays
diff --git a/classes/toradex-fitimage.bbclass b/classes/toradex-fitimage.bbclass
deleted file mode 100644
index 7d74d63..0000000
--- a/classes/toradex-fitimage.bbclass
+++ /dev/null
@@ -1,149 +0,0 @@
-# Toradex kernel-fitimage.bbclass extension
-#
-# This bbclass extends OE's kernel-fitimage.bbclass by overridding
-# some functions according to Toradex specific requirements.
-#
-# Copyright 2021 (C) Toradex AG
-
-inherit kernel-fitimage
-
-#
-# Override fitimage_assemble in kernel-fitimage.bbclass
-#
-# To support devicetree overlays, we need handle both
-# ${KERNEL_DEVICETREE} and ${EXTERNAL_KERNEL_DEVICETREE} at
-# meanwhile.
-#
-# Assemble fitImage
-#
-# $1 ... .its filename
-# $2 ... fitImage name
-# $3 ... include ramdisk
-fitimage_assemble() {
- kernelcount=1
- dtbcount=""
- DTBS=""
- ramdiskcount=${3}
- setupcount=""
- rm -f ${1} arch/${ARCH}/boot/${2}
-
- fitimage_emit_fit_header ${1}
-
- #
- # Step 1: Prepare a kernel image section.
- #
- fitimage_emit_section_maint ${1} imagestart
-
- uboot_prep_kimage
- fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}"
-
- #
- # Step 2: Prepare a DTB image section
- #
-
- if [ -n "${KERNEL_DEVICETREE}" ]; then
- dtbcount=1
- for DTB in ${KERNEL_DEVICETREE}; do
- if echo ${DTB} | grep -q '/dts/'; then
- bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
- DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
- fi
- DTB_PATH="arch/${ARCH}/boot/dts/${DTB}"
- if [ ! -e "${DTB_PATH}" ]; then
- DTB_PATH="arch/${ARCH}/boot/${DTB}"
- fi
-
- DTB=$(echo "$(basename ${DTB})" | tr '/' '_')
- DTBS="${DTBS} ${DTB}"
- fitimage_emit_section_dtb ${1} ${DTB} ${DTB_PATH}
- done
- fi
-
- if [ -n "${EXTERNAL_KERNEL_DEVICETREE}" ]; then
- dtbcount=1
- for DTB in $(find "${EXTERNAL_KERNEL_DEVICETREE}" \( -name '*.dtb' -o -name '*.dtbo' \) -printf '%P\n' | sort); do
- DTB=$(echo "${DTB}" | tr '/' '_')
- DTBS="${DTBS} ${DTB}"
- fitimage_emit_section_dtb ${1} ${DTB} "${EXTERNAL_KERNEL_DEVICETREE}/${DTB}"
- done
- fi
-
- #
- # Step 3: Prepare a setup section. (For x86)
- #
- if [ -e arch/${ARCH}/boot/setup.bin ]; then
- setupcount=1
- fitimage_emit_section_setup ${1} "${setupcount}" arch/${ARCH}/boot/setup.bin
- fi
-
- #
- # Step 4: Prepare a ramdisk section.
- #
- if [ "x${ramdiskcount}" = "x1" ] ; then
- # Find and use the first initramfs image archive type we find
- for img in cpio.lz4 cpio.lzo cpio.lzma cpio.xz cpio.gz ext2.gz cpio; do
- initramfs_path="${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.${img}"
- echo "Using $initramfs_path"
- if [ -e "${initramfs_path}" ]; then
- fitimage_emit_section_ramdisk ${1} "${ramdiskcount}" "${initramfs_path}"
- break
- fi
- done
- fi
-
- fitimage_emit_section_maint ${1} sectend
-
- # Force the first Kernel and DTB in the default config
- kernelcount=1
- if [ -n "${dtbcount}" ]; then
- dtbcount=1
- fi
-
- #
- # Step 5: Prepare a configurations section
- #
- fitimage_emit_section_maint ${1} confstart
-
- if [ -n "${DTBS}" ]; then
- i=1
- for DTB in ${DTBS}; do
- dtb_ext=${DTB##*.}
- if [ "${dtb_ext}" = "dtbo" ]; then
- fitimage_emit_section_config ${1} "" "${DTB}" "" "" "`expr ${i} = ${dtbcount}`"
- else
- fitimage_emit_section_config ${1} "${kernelcount}" "${DTB}" "${ramdiskcount}" "${setupcount}" "`expr ${i} = ${dtbcount}`"
- fi
- i=`expr ${i} + 1`
- done
- fi
-
- fitimage_emit_section_maint ${1} sectend
-
- fitimage_emit_section_maint ${1} fitend
-
- #
- # Step 6: Assemble the image
- #
- uboot-mkimage \
- ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
- -f ${1} \
- arch/${ARCH}/boot/${2}
-
- #
- # Step 7: Sign the image and add public key to U-Boot dtb
- #
- if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
- add_key_to_u_boot=""
- if [ -n "${UBOOT_DTB_BINARY}" ]; then
- # The u-boot.dtb is a symlink to UBOOT_DTB_IMAGE, so we need copy
- # both of them, and don't dereference the symlink.
- cp -P ${STAGING_DATADIR}/u-boot*.dtb ${B}
- add_key_to_u_boot="-K ${B}/${UBOOT_DTB_BINARY}"
- fi
- uboot-mkimage \
- ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
- -F -k "${UBOOT_SIGN_KEYDIR}" \
- $add_key_to_u_boot \
- -r arch/${ARCH}/boot/${2}
- fi
-}
diff --git a/classes/toradex-kernel-config.bbclass b/classes/toradex-kernel-config.bbclass
index 8c3ad71..4b7aa13 100644
--- a/classes/toradex-kernel-config.bbclass
+++ b/classes/toradex-kernel-config.bbclass
@@ -1,17 +1,26 @@
-# Assign a config variable in ${B}/.config.
-# Should be called in do_configure_append only.
-#
+# Assign/change a config variable
# $1 - config variable to be set
# $2 - value [n/y/value]
+# $3 - config file
#
-kernel_configure_variable() {
+kconfig_configure_variable() {
# Remove the original config, to avoid reassigning it.
- sed -i -e "/CONFIG_$1[ =]/d" ${B}/.config
+ sed -i -e "/CONFIG_$1[ =]/d" $3
# Assign the config value
if [ "$2" = "n" ]; then
- echo "# CONFIG_$1 is not set" >> ${B}/.config
+ echo "# CONFIG_$1 is not set" >> $3
else
- echo "CONFIG_$1=$2" >> ${B}/.config
+ echo "CONFIG_$1=$2" >> $3
fi
}
+
+# Assign a config variable in ${B}/.config.
+# Should be called in do_configure:append only.
+#
+# $1 - config variable to be set
+# $2 - value [n/y/value]
+#
+kernel_configure_variable() {
+ kconfig_configure_variable $1 $2 ${B}/.config
+}
diff --git a/classes/toradex-kernel-deploy-config.bbclass b/classes/toradex-kernel-deploy-config.bbclass
new file mode 100644
index 0000000..644c731
--- /dev/null
+++ b/classes/toradex-kernel-deploy-config.bbclass
@@ -0,0 +1,8 @@
+# This deploys the actual used kernel .config file as kernel-config
+
+KERNEL_CONFIG_NAME ?= "${KERNEL_PACKAGE_NAME}-config-${KERNEL_ARTIFACT_NAME}"
+KERNEL_CONFIG_LINK_NAME ?= "${KERNEL_PACKAGE_NAME}-config"
+do_deploy:append() {
+ cp -a ${B}/.config ${DEPLOYDIR}/${KERNEL_CONFIG_NAME}
+ ln -sf ${KERNEL_CONFIG_NAME} ${DEPLOYDIR}/${KERNEL_CONFIG_LINK_NAME}
+}
diff --git a/classes/toradex-kernel-localversion.bbclass b/classes/toradex-kernel-localversion.bbclass
index 319ba96..d17dcd5 100644
--- a/classes/toradex-kernel-localversion.bbclass
+++ b/classes/toradex-kernel-localversion.bbclass
@@ -4,8 +4,8 @@
#
# The following options are supported:
#
-# SCMVERSION Puts the Git hash in kernel local version
-# LOCALVERSION Value used in LOCALVERSION
+# SCMVERSION Puts the Git hash in kernel local version
+# KERNEL_LOCALVERSION Value used in LOCALVERSION by the oe kernel classes
#
# Copyright 2014, 2015 (C) O.S. Systems Software LTDA.
# Copyright 2019 (C) Toradex AG
@@ -14,11 +14,12 @@ inherit toradex-kernel-config
TDX_VERSION ??= "0"
SCMVERSION ??= "y"
-LOCALVERSION ?= "-${TDX_VERSION}"
-
-kernel_do_configure_append() {
- kernel_configure_variable LOCALVERSION "\"${LOCALVERSION}\""
+KERNEL_LOCALVERSION ?= "-${TDX_VERSION}"
+# mute the meta-freescale/classes/fsl-kernel-localversion setting, otherwise
+# with latest master we get -${TDX_VERSION} twice in the resulting version.
+LINUX_VERSION_EXTENSION = ""
+kernel_do_configure:append() {
if [ "${SCMVERSION}" = "y" ]; then
# Add GIT revision to the local version
# SRCREV_machine is used in kernel recipes using kernel-yocto.bbclass,
diff --git a/classes/toradex-sanity.bbclass b/classes/toradex-sanity.bbclass
new file mode 100644
index 0000000..bfb95f3
--- /dev/null
+++ b/classes/toradex-sanity.bbclass
@@ -0,0 +1,65 @@
+# Sanity check the Toradex setup for common misconfigurations
+
+TORADEX_SANITY_ABIFILE ?= "${DEPLOY_DIR}/abi_version"
+
+#
+# Check the 'ABI' of DEPLOY_DIR
+#
+def toradex_check_abichanges(status, d):
+ current_abi = d.getVar('OELAYOUT_ABI')
+ abifile = d.getVar('TORADEX_SANITY_ABIFILE')
+ if os.path.exists(abifile):
+ with open(abifile, "r") as f:
+ abi = f.read().strip()
+ if not abi.isdigit():
+ with open(abifile, "w") as f:
+ f.write(current_abi)
+ elif (abi != current_abi):
+ # Code to convert from one ABI to another could go here if possible.
+ status.addresult("Error, DEPLOY_DIR has changed its layout version number (%s to %s) and you need to either rebuild, revert or adjust it at your own risk.\n" % (abi, current_abi))
+ else:
+ bb.utils.mkdirhier(os.path.dirname(abifile))
+ with open(abifile, "w") as f:
+ f.write(current_abi)
+
+def toradex_raise_sanity_error(msg, d):
+ if d.getVar("SANITY_USE_EVENTS") == "1":
+ bb.event.fire(bb.event.SanityCheckFailed(msg), d)
+ return
+
+ bb.fatal("Toradex' config sanity checker detected a potential misconfiguration.\n"
+ "Please fix the cause of this error then you can continue to build.\n"
+ "Following is the list of potential problems / advisories:\n"
+ "\n%s" % msg)
+
+def toradex_check_sanity(sanity_data):
+ class SanityStatus(object):
+ def __init__(self):
+ self.messages = ""
+ self.reparse = False
+
+ def addresult(self, message):
+ if message:
+ self.messages = self.messages + message
+
+ status = SanityStatus()
+
+ toradex_check_abichanges(status, sanity_data)
+
+ if status.messages != "":
+ toradex_raise_sanity_error(sanity_data.expand(status.messages), sanity_data)
+
+addhandler toradex_check_sanity_eventhandler
+toradex_check_sanity_eventhandler[eventmask] = "bb.event.SanityCheck"
+
+python toradex_check_sanity_eventhandler() {
+ if bb.event.getName(e) == "SanityCheck":
+ sanity_data = bb.data.createCopy(e.data)
+ if e.generateevents:
+ sanity_data.setVar("SANITY_USE_EVENTS", "1")
+ reparse = toradex_check_sanity(sanity_data)
+ e.data.setVar("BB_INVALIDCONF", reparse)
+ bb.event.fire(bb.event.SanityCheckPassed(), e.data)
+
+ return
+}
diff --git a/classes/toradex-u-boot-localversion.bbclass b/classes/toradex-u-boot-localversion.bbclass
index 3ad86db..844cb0e 100644
--- a/classes/toradex-u-boot-localversion.bbclass
+++ b/classes/toradex-u-boot-localversion.bbclass
@@ -17,7 +17,7 @@ LOCALVERSION ??= "-${TDX_VERSION}"
UBOOT_LOCALVERSION = "${LOCALVERSION}"
-do_compile_prepend() {
+do_compile:prepend() {
if [ "${SCMVERSION}" = "y" ]; then
head=`cd ${S} ; git rev-parse --verify --short=12 HEAD 2> /dev/null`
printf "%s+git.%s" "${UBOOT_LOCALVERSION}" $head > ${S}/.scmversion