From 57c77b3739322fb91959976ac49061433626a4dd Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Thu, 11 Oct 2018 14:54:40 +0200 Subject: image_type_tezi: implement teziimg for distro boot Implement a separate teziimg class which support distro boot. This image format uses a layout which allows distro boot on block devices as well as raw NAND devices. It also support multi flash type images by creating two image.json files for each flash type. It requires machine specific meta data e.g.: TORADEX_PRODUCT_IDS = "0032 0033 0039 0041" TORADEX_PRODUCT_IDS[0032] = "imx7s-colibri-eval-v3.dtb,rawnand" TORADEX_PRODUCT_IDS[0033] = "imx7d-colibri-eval-v3.dtb,rawnand" TORADEX_PRODUCT_IDS[0039] = "imx7d-colibri-emmc-eval-v3.dtb,emmc" TORADEX_PRODUCT_IDS[0041] = "imx7d-colibri-eval-v3.dtb,rawnand" TORADEX_FLASH_TYPE = "rawnand emmc" UBOOT_BINARY_TEZI_EMMC = "u-boot.imx-sd" UBOOT_BINARY_TEZI_RAWNAND = "u-boot.imx-nd" UBOOT_ENV_TEZI_EMMC = "uEnv-sd.txt" UBOOT_ENV_TEZI_RAWNAND = "uEnv-nd.txt" Signed-off-by: Stefan Agner --- classes/image_type_tezi.bbclass | 136 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) (limited to 'classes/image_type_tezi.bbclass') diff --git a/classes/image_type_tezi.bbclass b/classes/image_type_tezi.bbclass index 26a8ff2..48c55fb 100644 --- a/classes/image_type_tezi.bbclass +++ b/classes/image_type_tezi.bbclass @@ -1,6 +1,17 @@ inherit image_types +# This class implements Toradex Easy Installer image type +# It allows to use OpenEmbedded to build images which can be consumed +# by the Toradex Easy Installer. +# Since it also generates the image.json description file it is rather +# interwind with the boot flow which is U-Boot target specific. +# +# Currently there are two image types implemented: +# teziimg: Default Toradex boot flow +# teziimg-distro: Distro boot boot flow + do_image_teziimg[depends] += "tezi-metadata:do_deploy virtual/bootloader:do_deploy" +do_image_teziimg_distro[depends] += "tezi-metadata:do_deploy virtual/bootloader:do_deploy" TEZI_ROOT_FSTYPE ??= "ext4" TEZI_ROOT_LABEL ??= "RFS" @@ -204,7 +215,17 @@ def rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file): 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() + dtmapping = d.getVarFlags('TORADEX_PRODUCT_IDS') + data["supported_product_ids"] = [] + + # If no varflags are set, we assume all product ids supported with single image/U-Boot + if dtmapping is not None: + for f, v in dtmapping.items(): + dtbflashtypearr = v.split(',') + if len(dtbflashtypearr) < 2 or dtbflashtypearr[1] == flash_type: + data["supported_product_ids"].append(f) + else: + data["supported_product_ids"].extend(product_ids.split()) if flash_type == "rawnand": data["mtddevs"] = flash_data @@ -281,3 +302,116 @@ IMAGE_CMD_teziimg () { } IMAGE_TYPEDEP_teziimg += "${TEZI_ROOT_SUFFIX}" + +def rootfs_tezi_distro_rawnand(d): + from collections import OrderedDict + imagename = d.getVar('IMAGE_NAME', True) + imagename_suffix = d.getVar('IMAGE_NAME_SUFFIX', True) + imagetype_suffix = d.getVar('TEZI_ROOT_SUFFIX', True) + + return [ + OrderedDict({ + "name": "u-boot1", + "content": { + "rawfile": { + "filename": d.getVar('UBOOT_BINARY_TEZI_RAWNAND', True), + "size": 1 + } + }, + }), + OrderedDict({ + "name": "u-boot2", + "content": { + "rawfile": { + "filename": d.getVar('UBOOT_BINARY_TEZI_RAWNAND', True), + "size": 1 + } + } + }), + OrderedDict({ + "name": "ubi", + "ubivolumes": [ + { + "name": "boot", + "size_kib": 16384, + "content": { + "filesystem_type": "ubifs", + "filename": imagename + ".bootfs.tar.xz", + "uncompressed_size": bootfs_get_size(d) / 1024 + } + }, + { + "name": "rootfs", + "content": { + "filesystem_type": "ubifs", + "filename": imagename + imagename_suffix + "." + imagetype_suffix, + "uncompressed_size": rootfs_get_size(d) / 1024 + } + } + ] + })] + +python rootfs_tezi_run_distro_json() { + flash_types = d.getVar('TORADEX_FLASH_TYPE', True) + if flash_types is None: + bb.fatal("Toradex flash type not specified") + + flash_types_list = flash_types.split() + for flash_type in flash_types_list: + if flash_type == "rawnand": + flash_data = rootfs_tezi_distro_rawnand(d) + uenv_file = d.getVar('UBOOT_ENV_TEZI_RAWNAND', True) + uboot_file = d.getVar('UBOOT_BINARY_TEZI_RAWNAND', True) + elif flash_type == "emmc": + flash_data = rootfs_tezi_emmc(d) + uenv_file = d.getVar('UBOOT_ENV_TEZI_EMMC', True) + uboot_file = d.getVar('UBOOT_BINARY_TEZI_EMMC', True) + # TODO: Multi image/raw NAND with SPL currently not supported + if d.getVar('SPL_BINARY', True): + uboot_file += " " + d.getVar('SPL_BINARY', True) + else: + bb.fatal("Toradex flash type unknown") + + if len(flash_types_list) > 1: + json_file = "image-{0}.json".format(flash_type) + else: + json_file = "image.json" + + rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file) + d.appendVar("TEZI_IMAGE_JSON_FILES", json_file + " ") + d.appendVar("TEZI_IMAGE_UBOOT_FILES", uenv_file + " " + uboot_file + " ") +} + +do_image_teziimg_distro[prefuncs] += "rootfs_tezi_run_distro_json" + +IMAGE_CMD_teziimg-distro () { + bbnote "Create Toradex Easy Installer 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/') + for TEZI_IMAGE_JSON in ${TEZI_IMAGE_JSON_FILES}; do + sed -i "s/%release_date%/$ISODATE/" ${DEPLOY_DIR_IMAGE}/${TEZI_IMAGE_JSON} + done + + cd ${DEPLOY_DIR_IMAGE} + + # Create bootfs... + ${IMAGE_CMD_TAR} \ + -chf ${IMGDEPLOYDIR}/${IMAGE_NAME}.bootfs.tar -C ${DEPLOY_DIR_IMAGE} \ + ${KERNEL_IMAGETYPE} ${KERNEL_DEVICETREE} boot.scr + 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 \ + ${TEZI_IMAGE_JSON_FILES} toradexlinux.png marketing.tar prepare.sh wrapup.sh \ + ${TEZI_IMAGE_UBOOT_FILES} ${IMGDEPLOYDIR}/${IMAGE_NAME}.bootfs.tar.xz \ + ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${TEZI_ROOT_SUFFIX} +} + +IMAGE_TYPEDEP_teziimg-distro += "${TEZI_ROOT_SUFFIX}" -- cgit v1.2.3