aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuli Piippo <samuli.piippo@qt.io>2019-01-31 10:17:14 +0200
committerSamuli Piippo <samuli.piippo@qt.io>2019-02-01 06:58:45 +0000
commit9ac2223f8e58ac46feff146586fa766978d3579e (patch)
tree86a0a639bff3d6387518e410a67ca496802bf2e8
parentdbd07446e02da51c9ea8fe6543ad156a9c656069 (diff)
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 <mikko.gronoff@qt.io>
-rw-r--r--meta-boot2qt-distro/conf/distro/include/toradex.inc4
-rw-r--r--meta-toradex-extras/classes/image_type_tezi_thud.bbclass250
2 files changed, 254 insertions, 0 deletions
diff --git a/meta-boot2qt-distro/conf/distro/include/toradex.inc b/meta-boot2qt-distro/conf/distro/include/toradex.inc
index 12a19990..95a52eee 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 00000000..22af0713
--- /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"