summaryrefslogtreecommitdiff
path: root/classes/image_type_tezi.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'classes/image_type_tezi.bbclass')
-rw-r--r--classes/image_type_tezi.bbclass218
1 files changed, 174 insertions, 44 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"