diff options
Diffstat (limited to 'classes')
-rw-r--r-- | classes/image_type_tezi.bbclass | 218 | ||||
-rw-r--r-- | classes/toradex-devicetree.bbclass | 17 | ||||
-rw-r--r-- | classes/toradex-fitimage.bbclass | 149 | ||||
-rw-r--r-- | classes/toradex-kernel-config.bbclass | 23 | ||||
-rw-r--r-- | classes/toradex-kernel-deploy-config.bbclass | 8 | ||||
-rw-r--r-- | classes/toradex-kernel-localversion.bbclass | 13 | ||||
-rw-r--r-- | classes/toradex-sanity.bbclass | 65 | ||||
-rw-r--r-- | classes/toradex-u-boot-localversion.bbclass | 2 |
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 |