From 9ac2223f8e58ac46feff146586fa766978d3579e Mon Sep 17 00:00:00 2001 From: Samuli Piippo Date: Thu, 31 Jan 2019 10:17:14 +0200 Subject: toradex: override tezi bbclass Toradex layers are not fully thud compatible, the tezi bbclass expects to find dtbs files prefixed with the kernel image type, which is no longer used in thud. Change-Id: Ibfe43402b89a1f5d875262f6967cfda8b17e169a Reviewed-by: Mikko Gronoff --- .../conf/distro/include/toradex.inc | 4 + .../classes/image_type_tezi_thud.bbclass | 250 +++++++++++++++++++++ 2 files changed, 254 insertions(+) create mode 100644 meta-toradex-extras/classes/image_type_tezi_thud.bbclass diff --git a/meta-boot2qt-distro/conf/distro/include/toradex.inc b/meta-boot2qt-distro/conf/distro/include/toradex.inc index 12a1999..95a52ee 100644 --- a/meta-boot2qt-distro/conf/distro/include/toradex.inc +++ b/meta-boot2qt-distro/conf/distro/include/toradex.inc @@ -55,3 +55,7 @@ IMAGE_BOOT_FILES += " \ # use 1.14.0 that matches the imx version of gstreamer PREFERRED_VERSION_gstreamer1.0-plugins-ugly = "1.14.0" PREFERRED_VERSION_gstreamer1.0-libav = "1.14.0" + +# override tezi bbclass +IMAGE_CLASSES_remove = " image_type_tezi" +IMAGE_CLASSES_append = " image_type_tezi_thud" diff --git a/meta-toradex-extras/classes/image_type_tezi_thud.bbclass b/meta-toradex-extras/classes/image_type_tezi_thud.bbclass new file mode 100644 index 0000000..22af071 --- /dev/null +++ b/meta-toradex-extras/classes/image_type_tezi_thud.bbclass @@ -0,0 +1,250 @@ +inherit image_types + +do_image_teziimg[depends] += "tezi-metadata:do_deploy virtual/bootloader:do_deploy" + +TEZI_ROOT_FSTYPE ??= "ext4" +UBOOT_BINARY ??= "u-boot.${UBOOT_SUFFIX}" +UBOOT_BINARY_TEZI = "${UBOOT_BINARY}" +UBOOT_BINARY_TEZI_apalis-t30 = "apalis_t30.img" +UBOOT_BINARY_TEZI_apalis-tk1 = "apalis-tk1.img" +UBOOT_BINARY_TEZI_apalis-tk1-mainline = "apalis-tk1.img" +UBOOT_ENV_TEZI = "uEnv.txt" + +def rootfs_get_size(d): + import subprocess + + # Calculate size of rootfs in kilobytes... + output = subprocess.check_output(['du', '-ks', + d.getVar('IMAGE_ROOTFS', True)]) + return int(output.split()[0]) + +def rootfs_tezi_emmc(d): + import subprocess + from collections import OrderedDict + deploydir = d.getVar('DEPLOY_DIR_IMAGE', True) + kernel = d.getVar('KERNEL_IMAGETYPE', True) + offset_bootrom = d.getVar('OFFSET_BOOTROM_PAYLOAD', True) + offset_spl = d.getVar('OFFSET_SPL_PAYLOAD', True) + imagename = d.getVar('IMAGE_NAME', True) + imagename_suffix = d.getVar('IMAGE_NAME_SUFFIX', True) + + # Calculate size of bootfs... + bootfiles = [ os.path.join(deploydir, kernel) ] + has_devicetree = d.getVar('KERNEL_DEVICETREE', True) + if has_devicetree: + for dtb in d.getVar('KERNEL_DEVICETREE', True).split(): + bootfiles.append(os.path.join(deploydir, dtb)) + + args = ['du', '-kLc'] + args.extend(bootfiles) + output = subprocess.check_output(args) + bootfssize_kb = int(output.splitlines()[-1].split()[0]) + + bootpart_rawfiles = [] + + has_spl = d.getVar('SPL_BINARY', True) + if has_spl: + bootpart_rawfiles.append( + { + "filename": d.getVar('SPL_BINARY', True), + "dd_options": "seek=" + offset_bootrom + }) + bootpart_rawfiles.append( + { + "filename": d.getVar('UBOOT_BINARY_TEZI', True), + "dd_options": "seek=" + (offset_spl if has_spl else offset_bootrom) + }) + + return [ + OrderedDict({ + "name": "mmcblk0", + "partitions": [ + { + "partition_size_nominal": 16, + "want_maximised": False, + "content": { + "label": "BOOT", + "filesystem_type": "FAT", + "mkfs_options": "", + "filename": imagename + ".bootfs.tar.xz", + "uncompressed_size": bootfssize_kb / 1024 + } + }, + { + "partition_size_nominal": 512, + "want_maximised": True, + "content": { + "label": "RFS", + "filesystem_type": d.getVar('TEZI_ROOT_FSTYPE', True), + "mkfs_options": "-E nodiscard", + "filename": imagename + imagename_suffix + ".tar.xz", + "uncompressed_size": rootfs_get_size(d) / 1024 + } + } + ] + }), + OrderedDict({ + "name": "mmcblk0boot0", + "content": { + "filesystem_type": "raw", + "rawfiles": bootpart_rawfiles + } + })] + + +def rootfs_tezi_rawnand(d): + from collections import OrderedDict + imagename = d.getVar('IMAGE_NAME', True) + imagename_suffix = d.getVar('IMAGE_NAME_SUFFIX', True) + + # Use device tree mapping to create product id <-> device tree relationship + dtmapping = d.getVarFlags('TORADEX_PRODUCT_IDS') + dtfiles = [] + for f, v in dtmapping.items(): + dtfiles.append({ "filename": v, "product_ids": f }) + + return [ + OrderedDict({ + "name": "u-boot1", + "content": { + "rawfile": { + "filename": d.getVar('UBOOT_BINARY_TEZI', True), + "size": 1 + } + }, + }), + OrderedDict({ + "name": "u-boot2", + "content": { + "rawfile": { + "filename": d.getVar('UBOOT_BINARY_TEZI', True), + "size": 1 + } + } + }), + OrderedDict({ + "name": "ubi", + "ubivolumes": [ + { + "name": "kernel", + "size_kib": 8192, + "type": "static", + "content": { + "rawfile": { + "filename": d.getVar('KERNEL_IMAGETYPE', True), + "size": 5 + } + } + }, + { + "name": "dtb", + "content": { + "rawfiles": dtfiles + }, + "size_kib": 128, + "type": "static" + }, + { + "name": "m4firmware", + "size_kib": 896, + "type": "static" + }, + { + "name": "rootfs", + "content": { + "filesystem_type": "ubifs", + "filename": imagename + imagename_suffix + ".tar.xz", + "uncompressed_size": rootfs_get_size(d) / 1024 + } + } + ] + })] + +python rootfs_tezi_json() { + import json + from collections import OrderedDict + from datetime import datetime + + deploydir = d.getVar('DEPLOY_DIR_IMAGE', True) + # patched in IMAGE_CMD_teziimg() below + release_date = "%release_date%" + + data = OrderedDict({ "config_format": 2, "autoinstall": False }) + + # Use image recipes SUMMARY/DESCRIPTION/PV... + data["name"] = d.getVar('SUMMARY', True) + data["description"] = d.getVar('DESCRIPTION', True) + data["version"] = d.getVar('PV', True) + data["release_date"] = release_date + data["u_boot_env"] = d.getVar('UBOOT_ENV_TEZI', True) + if os.path.exists(os.path.join(deploydir, "prepare.sh")): + data["prepare_script"] = "prepare.sh" + if os.path.exists(os.path.join(deploydir, "wrapup.sh")): + data["wrapup_script"] = "wrapup.sh" + if os.path.exists(os.path.join(deploydir, "marketing.tar")): + data["marketing"] = "marketing.tar" + if os.path.exists(os.path.join(deploydir, "toradexlinux.png")): + data["icon"] = "toradexlinux.png" + + product_ids = d.getVar('TORADEX_PRODUCT_IDS', True) + if product_ids is None: + bb.fatal("Supported Toradex product ids missing, assign TORADEX_PRODUCT_IDS with a list of product ids.") + + data["supported_product_ids"] = d.getVar('TORADEX_PRODUCT_IDS', True).split() + + if bb.utils.contains("TORADEX_FLASH_TYPE", "rawnand", True, False, d): + data["mtddevs"] = rootfs_tezi_rawnand(d) + else: + data["blockdevs"] = rootfs_tezi_emmc(d) + + deploy_dir = d.getVar('DEPLOY_DIR_IMAGE', True) + with open(os.path.join(deploy_dir, 'image.json'), 'w') as outfile: + json.dump(data, outfile, indent=4) + bb.note("Toradex Easy Installer metadata file image.json written.") +} + +do_image_teziimg[prefuncs] += "rootfs_tezi_json" + +IMAGE_CMD_teziimg () { + bbnote "Create bootfs tarball" + + # Fixup release_date in image.json, convert ${DATE} to isoformat + # This works around the non fatal ERRORS: "the basehash value changed" when DATE is referenced + # in a python prefunction to do_image + ISODATE=`echo ${DATE} | sed 's/\(....\)\(..\)\(..\)/\1-\2-\3/'` + sed -i "s/%release_date%/$ISODATE/" ${DEPLOY_DIR_IMAGE}/image.json + + # Create list of device tree files + if test -n "${KERNEL_DEVICETREE}"; then + for DTS_FILE in ${KERNEL_DEVICETREE}; do + DTS_BASE_NAME=`basename ${DTS_FILE} .dtb` + if [ -e "${DEPLOY_DIR_IMAGE}/${DTS_BASE_NAME}.dtb" ]; then + KERNEL_DEVICETREE_FILES="${KERNEL_DEVICETREE_FILES} ${DTS_BASE_NAME}.dtb" + else + bbfatal "${DTS_FILE} does not exist." + fi + done + fi + + cd ${DEPLOY_DIR_IMAGE} + + case "${TORADEX_FLASH_TYPE}" in + rawnand) + # The first transform strips all folders from the files to tar, the + # second transform "moves" them in a subfolder ${IMAGE_NAME}_${PV}. + # The third transform removes zImage from the device tree. + ${IMAGE_CMD_TAR} --transform='s/.*\///' --transform 's,^,${IMAGE_NAME}-Tezi_${PV}/,' -chf ${IMGDEPLOYDIR}/${IMAGE_NAME}-Tezi_${PV}${TDX_VERDATE}.tar image.json toradexlinux.png marketing.tar prepare.sh wrapup.sh ${SPL_BINARY} ${UBOOT_BINARY_TEZI} ${UBOOT_ENV_TEZI} ${KERNEL_IMAGETYPE} ${KERNEL_DEVICETREE_FILES} ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar.xz + ;; + *) + # Create bootfs... + ${IMAGE_CMD_TAR} --transform="flags=r;s|${KERNEL_IMAGETYPE}-||" -chf ${IMGDEPLOYDIR}/${IMAGE_NAME}.bootfs.tar -C ${DEPLOY_DIR_IMAGE} ${KERNEL_IMAGETYPE} ${KERNEL_DEVICETREE_FILES} + xz -f -k -c ${XZ_COMPRESSION_LEVEL} ${XZ_THREADS} --check=${XZ_INTEGRITY_CHECK} ${IMGDEPLOYDIR}/${IMAGE_NAME}.bootfs.tar > ${IMGDEPLOYDIR}/${IMAGE_NAME}.bootfs.tar.xz + + # The first transform strips all folders from the files to tar, the + # second transform "moves" them in a subfolder ${IMAGE_NAME}-Tezi_${PV}. + ${IMAGE_CMD_TAR} --transform='s/.*\///' --transform 's,^,${IMAGE_NAME}-Tezi_${PV}/,' -chf ${IMGDEPLOYDIR}/${IMAGE_NAME}-Tezi_${PV}${TDX_VERDATE}.tar image.json toradexlinux.png marketing.tar prepare.sh wrapup.sh ${SPL_BINARY} ${UBOOT_BINARY_TEZI} ${UBOOT_ENV_TEZI} ${IMGDEPLOYDIR}/${IMAGE_NAME}.bootfs.tar.xz ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.tar.xz + ;; + esac +} + +IMAGE_TYPEDEP_teziimg += "tar.xz" -- cgit v1.2.3-54-g00ecf