diff options
Diffstat (limited to 'classes/image_type_tezi.bbclass')
-rw-r--r-- | classes/image_type_tezi.bbclass | 258 |
1 files changed, 90 insertions, 168 deletions
diff --git a/classes/image_type_tezi.bbclass b/classes/image_type_tezi.bbclass index 60f91df..488562e 100644 --- a/classes/image_type_tezi.bbclass +++ b/classes/image_type_tezi.bbclass @@ -1,15 +1,9 @@ # 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[recrdeptask] += "do_deploy" -do_image_teziimg_distro[recrdeptask] += "do_deploy" WKS_FILE_DEPENDS_append = " tezi-metadata virtual/dtb " DEPENDS += "${WKS_FILE_DEPENDS}" @@ -21,8 +15,10 @@ TEZI_DATE ?= "${TDX_MATRIX_BUILD_TIME}" TEZI_IMAGE_NAME ?= "${IMAGE_NAME}" TEZI_ROOT_FSTYPE ??= "ext4" TEZI_ROOT_LABEL ??= "RFS" +TEZI_ROOT_NAME ??= "rootfs" TEZI_ROOT_SUFFIX ??= "tar.xz" -TEZI_BOOT_SUFFIX ??= "bootfs.tar.xz" +TEZI_USE_BOOTFILES ??= "true" +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" @@ -48,7 +44,11 @@ CONVERSION_CMD_tar = "touch ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${ CONVERSIONTYPES_append = " tar" def get_uncompressed_size(d, type): - with open(os.path.join(d.getVar('T'), "image-size.%s" % type), "r") as f: + path = os.path.join(d.getVar('T'), "image-size.%s" % type) + if not os.path.exists(path): + return 0 + + with open(path, "r") as f: size = f.read().strip() return float(size) / 1024 @@ -116,13 +116,14 @@ def tezi_deploy_files(d, deploy_var, deploy_dir, source_dir=None): except subprocess.CalledProcessError as e: bb.fatal("Command '%s' returned %d:\n%s" % (e.cmd, e.returncode, e.output)) -def rootfs_tezi_emmc(d, distro=False): +def rootfs_tezi_emmc(d, use_bootfiles): from collections import OrderedDict offset_bootrom = d.getVar('OFFSET_BOOTROM_PAYLOAD') offset_spl = d.getVar('OFFSET_SPL_PAYLOAD') imagename = d.getVar('IMAGE_LINK_NAME') bootpart_rawfiles = [] + filesystem_partitions = [] if offset_spl: bootpart_rawfiles.append( @@ -136,33 +137,37 @@ def rootfs_tezi_emmc(d, distro=False): "dd_options": "seek=" + (offset_spl if offset_spl else offset_bootrom) }) + if use_bootfiles: + filesystem_partitions.append( + { + "partition_size_nominal": get_bootfs_part_size(d), + "want_maximised": False, + "content": { + "label": "BOOT", + "filesystem_type": "FAT", + "mkfs_options": "", + "filename": imagename + "." + d.getVar('TEZI_BOOT_SUFFIX'), + "uncompressed_size": get_uncompressed_size(d, 'bootfs') + } + }) + + 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')) + } + }) + return [ OrderedDict({ "name": "mmcblk0", - "partitions": [ - { - "partition_size_nominal": get_bootfs_part_size(d), - "want_maximised": False, - "content": { - "label": "BOOT", - "filesystem_type": "FAT", - "mkfs_options": "", - "filename": imagename + "." + d.getVar('TEZI_BOOT_SUFFIX'), - "uncompressed_size": get_uncompressed_size(d, 'bootfs') - } - }, - { - "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, 'ota' if distro else "rootfs") - } - } - ] + "partitions": filesystem_partitions }), OrderedDict({ "name": "mmcblk0boot0", @@ -174,7 +179,7 @@ def rootfs_tezi_emmc(d, distro=False): })] -def rootfs_tezi_rawnand(d, distro=False): +def rootfs_tezi_rawnand(d): from collections import OrderedDict imagename = d.getVar('IMAGE_LINK_NAME') @@ -197,6 +202,7 @@ def rootfs_tezi_rawnand(d, distro=False): } } }) + env = OrderedDict({ "name": "u-boot-env", "erase": True, @@ -208,60 +214,46 @@ def rootfs_tezi_rawnand(d, distro=False): "content": { "filesystem_type": "ubifs", "filename": imagename + "." + d.getVar('TEZI_ROOT_SUFFIX'), - "uncompressed_size": get_uncompressed_size(d, 'ota' if distro else 'rootfs') + "uncompressed_size": get_uncompressed_size(d, d.getVar('TEZI_ROOT_NAME')) } } - if distro: - boot = { - "name": "boot", - "size_kib": 16384, - "content": { - "filesystem_type": "ubifs", - "filename": imagename + "." + d.getVar('TEZI_BOOT_SUFFIX'), - "uncompressed_size": get_uncompressed_size(d, 'bootfs') + kernel = { + "name": "kernel", + "size_kib": 8192, + "type": "static", + "content": { + "rawfile": { + "filename": d.getVar('KERNEL_IMAGETYPE'), + "size": 5 } } - ubivolumes = [boot, rootfs] - else: - kernel = { - "name": "kernel", - "size_kib": 8192, - "type": "static", - "content": { - "rawfile": { - "filename": d.getVar('KERNEL_IMAGETYPE'), - "size": 5 - } - } - } - - # 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 }) - - dtb = { - "name": "dtb", - "content": { - "rawfiles": dtfiles - }, - "size_kib": 128, - "type": "static" - } + } - m4firmware = { - "name": "m4firmware", - "size_kib": 896, - "type": "static" - } + # 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 }) + + dtb = { + "name": "dtb", + "content": { + "rawfiles": dtfiles + }, + "size_kib": 128, + "type": "static" + } - ubivolumes = [kernel, dtb, m4firmware, rootfs] + m4firmware = { + "name": "m4firmware", + "size_kib": 896, + "type": "static" + } ubi = OrderedDict({ "name": "ubi", - "ubivolumes": ubivolumes + "ubivolumes": [kernel, dtb, m4firmware, rootfs] }) return [uboot1, uboot2, env, ubi] @@ -315,9 +307,8 @@ def rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file): bb.note("Toradex Easy Installer metadata file {0} written.".format(json_file)) 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') - if flash_type is None: - bb.fatal("Toradex flash type not specified") if len(flash_type.split()) > 1: bb.fatal("This class only supports a single flash type.") @@ -326,18 +317,22 @@ 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') elif flash_type == "emmc": - flash_data = rootfs_tezi_emmc(d) + 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 - if d.getVar('OFFSET_SPL_PAYLOAD'): - uboot_file += " " + d.getVar('SPL_BINARY') + 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 + d.setVar("TEZI_ARTIFACTS", artifacts) + rootfs_tezi_json(d, flash_type, flash_data, "image-%s.json" % d.getVar('IMAGE_BASENAME'), uenv_file) - d.appendVar("TEZI_IMAGE_UBOOT_FILES", ' ' + uenv_file + ' ' + uboot_file) } python tezi_deploy_bootfs_files() { @@ -383,98 +378,25 @@ IMAGE_CMD_bootfs () { TEZI_IMAGE_BOOTFS_PREFUNCS ??= "tezi_deploy_bootfs_files tezi_deploy_dt_overlays" 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 () { bbnote "Create Toradex Easy Installer tarball" # Copy image json file to ${WORKDIR}/image-json cp ${IMGDEPLOYDIR}/image*.json ${WORKDIR}/image-json/image.json - 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 ${TEZI_IMAGE_NAME}_${TEZI_VERSION}. - ${IMAGE_CMD_TAR} \ - --transform='s/.*\///' \ - --transform 's,^,${TEZI_IMAGE_NAME}-Tezi_${TEZI_VERSION}/,' \ - -chf ${IMGDEPLOYDIR}/${TEZI_IMAGE_NAME}-Tezi_${TEZI_VERSION}.tar \ - ${WORKDIR}/image-json/image.json toradexlinux.png marketing.tar prepare.sh wrapup.sh \ - ${TEZI_IMAGE_UBOOT_FILES} ${KERNEL_IMAGETYPE} ${KERNEL_DEVICETREE} \ - ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${TEZI_ROOT_SUFFIX} - ;; - *) - # 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 \ - ${WORKDIR}/image-json/image.json toradexlinux.png marketing.tar prepare.sh wrapup.sh \ - ${TEZI_IMAGE_UBOOT_FILES} ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${TEZI_BOOT_SUFFIX} \ - ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${TEZI_ROOT_SUFFIX} - ;; - esac -} -IMAGE_TYPEDEP_teziimg[vardepsexclude] = "TEZI_VERSION TEZI_DATE" -IMAGE_TYPEDEP_teziimg += "${TEZI_BOOT_SUFFIX} ${TEZI_ROOT_SUFFIX}" -TEZI_IMAGE_TEZIIMG_PREFUNCS ??= "rootfs_tezi_run_json" - -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}" - -python rootfs_tezi_run_distro_json() { - flash_types = d.getVar('TORADEX_FLASH_TYPE') - 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_rawnand(d, True) - uenv_file = d.getVar('UBOOT_ENV_TEZI_RAWNAND') - uboot_file = d.getVar('UBOOT_BINARY_TEZI_RAWNAND') - elif flash_type == "emmc": - flash_data = rootfs_tezi_emmc(d, True) - 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 - if d.getVar('OFFSET_SPL_PAYLOAD'): - uboot_file += " " + d.getVar('SPL_BINARY') - else: - bb.fatal("Toradex flash type unknown") - - if len(flash_types_list) > 1: - json_file = "image-{0}-{1}.json".format(flash_type, d.getVar('IMAGE_BASENAME')) - else: - json_file = "image-{0}.json".format(d.getVar('IMAGE_BASENAME')) - - rootfs_tezi_json(d, flash_type, flash_data, json_file, uenv_file) - d.appendVar("TEZI_IMAGE_UBOOT_FILES", ' ' + uenv_file + ' ' + uboot_file) -} - -TEZI_IMAGE_TEZIIMG_DISTRO_PREFUNCS ??= "rootfs_tezi_run_distro_json" -do_image_teziimg_distro[dirs] += "${WORKDIR}/image-json ${DEPLOY_DIR_IMAGE}" -do_image_teziimg_distro[cleandirs] += "${WORKDIR}/image-json" -do_image_teziimg_distro[prefuncs] += "${TEZI_IMAGE_TEZIIMG_DISTRO_PREFUNCS}" - -IMAGE_CMD_teziimg-distro () { - bbnote "Create Toradex Easy Installer tarball" - - # Copy image json files to ${WORKDIR}/image-json - for image in ${IMGDEPLOYDIR}/image*.json; do - image_name=$(echo $(basename $image) | sed 's/-${IMAGE_BASENAME}//') - cp $image ${WORKDIR}/image-json/$image_name - done - + # 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 \ - ${TEZI_IMAGE_UBOOT_FILES} ${WORKDIR}/image-json/image*.json \ - ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${TEZI_BOOT_SUFFIX} \ - ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${TEZI_ROOT_SUFFIX} + ${WORKDIR}/image-json/image.json ${TEZI_ARTIFACTS} } -IMAGE_CMD_teziimg-distro[vardepsexclude] = "TEZI_VERSION TEZI_DATE" - -IMAGE_TYPEDEP_teziimg-distro += "${TEZI_BOOT_SUFFIX} ${TEZI_ROOT_SUFFIX}" +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" |