Compare commits

...

10 Commits

Author SHA1 Message Date
Arturo Buzarra 74628a35ce meta-digi: revert revisions to AUTOREV
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
2026-05-27 22:03:34 +02:00
Arturo Buzarra 1acb052f68 meta-digi: update revisions for dey-5.0-r4.2
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
2026-05-27 22:03:33 +02:00
Arturo Buzarra d58d20358e meta-digi-dey: bump distro version to 5.0-r4.2
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
2026-05-27 21:36:19 +02:00
Arturo Buzarra 14cd1e7966 build.sh: use dey-image-containers image name
Update the build script to use `dey-image-containers` instead of the old
`dey-image-container-manager` name.

Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
2026-05-27 21:17:37 +02:00
Arturo Buzarra 89c42a5b0f installer: media: drop extra usb reset between partitions
Avoid EHCI timeout errors seen on some USB sticks by removing the redundant
`usb reset` between partitions.

Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
2026-05-27 21:13:33 +02:00
Gonzalo Ruiz ed9beccdcd sysinfo: add SMARC information
If device is a SMARC, use SMARC properties to log in sysinfo (serial
number, variant, hardware version). If not, use SOM properties.

Signed-off-by: Gonzalo Ruiz <Gonzalo.Ruiz@digi.com>
2026-05-27 18:32:17 +02:00
Gonzalo Ruiz 9be4f140d2 connectcore-demo-example: ccimx95: add mp4 video file
Replace current MOV video file not supported by Chromium with a MP4
video file with the same video content.

https://onedigi.atlassian.net/browse/DEL-10156

Signed-off-by: Gonzalo Ruiz <Gonzalo.Ruiz@digi.com>
2026-05-27 18:29:34 +02:00
Gonzalo Ruiz 0248d4a728 video-examples: update tarball to include mp4 file
Add an mp4 example video, with the same contents as the mov file:
1280x720, MPEG-4 format.

Also, for ccimx95, due to Chromium limitations, install the mp4 file
instead of the mov file.

https://onedigi.atlassian.net/browse/DEL-10156

Signed-off-by: Gonzalo Ruiz <Gonzalo.Ruiz@digi.com>
2026-05-27 18:29:34 +02:00
Francisco Gil 18a23d71d6 dey-image-containers: rename image references
While on it, fix a typo.

Signed-off-by: Francisco Gil <francisco.gilmartinez@digi.com>
Signed-off-by: Isaac Hermida <isaac.hermida@digi.com>
2026-05-27 17:36:07 +02:00
Isaac Hermida 7950ac2460 meta-digi-containers: modify how to generate the DCP
Modify and document the way to generate a DCP by package_id.
Update the source code of the container manager to align with.

Signed-off-by: Isaac Hermida <isaac.hermida@digi.com>
2026-05-27 17:01:02 +02:00
15 changed files with 90 additions and 86 deletions

View File

@ -19,7 +19,7 @@ Digi Embedded Yocto provides the following image recipes:
Expansion of custom Digi core-image-base including full Flutter
framework support.
* dey-image-container-manager: container management image
* dey-image-containers: container management image
Minimal image including the trimmed Podman and LXC runtimes used to
manage container artifacts on target.

View File

@ -19,7 +19,7 @@ Digi Embedded Yocto provides the following image recipes:
Expansion of custom Digi core-image-base including full Flutter
framework support.
* dey-image-container-manager: container management image
* dey-image-containers: container management image
Minimal image including the trimmed Podman and LXC runtimes used to
manage container artifacts on target.

View File

@ -179,7 +179,6 @@ fi
# - Erase the 'update' partition
# - Configure recovery to wipe 'update' partition
# - Run 'recovery' and let the system boot after
# NOTE: insert some 'usb reset' commands to avoid EHCI timeouts
setenv bootcmd "
env default -a;
setenv dualboot ${dualboot};
@ -228,9 +227,6 @@ setenv bootcmd "
exit;
fi;
fi;
if test "${INSTALL_MEDIA}" = "usb"; then
usb reset;
fi;
echo \"\";
echo \"\";
echo \">> Installing file ${INSTALL_ROOTFS_FILENAME} on rootfs_a\";

View File

@ -22,7 +22,7 @@ CONTAINERS_BACKEND_TOOLS = "lxc"
the trimmed runtime packages to keep the image smaller.
The layer explicitly depends on `meta-virtualization`.
`dey-image-dcp` and`dey-image-containers` requires
`dey-image-dcp` and `dey-image-containers` require
`DISTRO_FEATURES:append = " virtualization"` in `local.conf`.
The `dey-image-dcp` workflow produces:
@ -78,13 +78,11 @@ The script generates exactly one runtime artifact per execution.
Notes:
- `--output-dir` is optional. If omitted, the script writes the DCP to the current directory.
- If the input manifest omits `package_id`, the generator derives the final
`package_id` from `name` and appends a unique suffix using the `created_at`
timestamp encoded in base36 milliseconds.
- If the input manifest provides `package_id`, that value is kept unchanged.
- The output file name is always derived from the generated package ID and
- The input manifest must provide `package_id`, which becomes the stable target
identifier.
- The output file name is always derived from the package ID and
manifest fields as:
- `<generated_package_id>-<runtime>-<device_types[0]>.tar.gz`
- `<package_id>-<runtime>-<device_types[0]>.tar.gz`
- For Podman payloads, the final internal payload name is always `payload/image.tar`
- For LXC payloads, the generator requires a Yocto-style `.tar.gz` bundle, validates its layout,
and stores it inside the DCP using the original file name and format without re-packaging it.
@ -104,14 +102,13 @@ python3 meta-digi-containers/scripts/generate-dcp.py \
This generates a bundle named like:
- `./flutter-demo-<base36_created_at_ms>-podman-ccmp25-dvk.tar.gz`
- `./flutter-demo-podman-ccmp25-dvk.tar.gz`
In those manifests:
- `name` is the stable logical container name stored on the target.
- `package_id` is the stable target identifier.
- `friendly_name` is the user-facing label shown by the manager output when available.
- the final `package_id` is generated automatically from `name` unless the
input manifest provides an explicit `package_id`
- the final DCP manifest does not include a second container identifier
- `registration_defaults` is limited to local manager policy such as `autostart`,
`monitor`, and `restart`; this release does not generate DRM-specific defaults
@ -182,19 +179,12 @@ Outputs are generated in:
Final outputs:
- `${DCP_NAME}-<base36_created_at_ms>-podman-<device_types[0]>.tar.gz`
- `${DCP_NAME}-<base36_created_at_ms>-lxc-<device_types[0]>.tar.gz`
- `${DCP_NAME}-podman-<device_types[0]>.tar.gz`
- `${DCP_NAME}-lxc-<device_types[0]>.tar.gz`
Notes:
- The generator script derives `package_id` from the input `name` only when the
manifest does not provide one explicitly. In that default case it appends a
base36-encoded millisecond timestamp suffix, stores the generated `package_id`
in the final `manifest.json`, and uses it in the DCP file name.
- In Yocto builds, `dey-image-dcp` keeps that unique-name behavior and
removes older DCP artifacts with the same `${DCP_NAME}` prefix before
generating the new one, so the deploy directory does not keep accumulating
previous builds of the same container/runtime.
- In Yocto builds, `dey-image-dcp` sets `package_id` to `${DCP_NAME}`.
Intermediate rootfs and OCI outputs are kept available for incremental rebuilds.
The LXC bundle and Podman archive are generated as temporary payloads while
@ -281,7 +271,6 @@ Supported placeholders in LXC config fragments:
The artifact manifest is generated automatically and includes:
- `package_id`
- `name` [stable logical container name]
- `friendly_name` [optional user-facing display name]
- `version`
- `runtime`

View File

@ -1,5 +1,5 @@
{
"name": "flutter-demo",
"package_id": "flutter-demo",
"friendly_name": "Flutter Demo",
"version": "1.0",
"runtime": "lxc",

View File

@ -1,5 +1,5 @@
{
"name": "flutter-demo",
"package_id": "flutter-demo",
"friendly_name": "Flutter Demo",
"version": "1.0",
"runtime": "podman",

View File

@ -15,8 +15,8 @@ SRC_URI = " \
file://cc-containerd.service \
file://cc-containerd-shutdown.service \
"
SRC_URI[archive.md5sum] = "6d84c6f5ec9dc94d542c91001ff5fd36"
SRC_URI[archive.sha256sum] = "ce24c4fde041a69a7646eb9bad4891d2eb91291f3534e71444552d3830247aaa"
SRC_URI[archive.md5sum] = "2ae2c3c09e9bf223e7de4ec0994376f3"
SRC_URI[archive.sha256sum] = "627d90eb53a48bf978fb6993f661af3dba8e6bf091d295ff481457e4c0cb96a0"
S = "${WORKDIR}/${BP}"

View File

@ -15,9 +15,9 @@ do_clean_old_container_artifacts() {
fi
for runtime in lxc podman; do
old_artifact_glob="${DEPLOY_DIR_IMAGE}/${DCP_NAME}-*-${runtime}-${primary_device_type}.tar.gz"
bbnote "Removing old ${runtime} container artifacts matching ${old_artifact_glob}"
rm -f ${old_artifact_glob}
artifact_path="${DEPLOY_DIR_IMAGE}/${DCP_NAME}-${runtime}-${primary_device_type}.tar.gz"
bbnote "Removing old ${runtime} container artifact ${artifact_path}"
rm -f "${artifact_path}"
done
}
@ -69,7 +69,7 @@ do_image_container_artifacts() {
manifest_path="$2"
create_args="$3"
build_id="$4"
NAME="${DCP_NAME}" \
PACKAGE_ID="${DCP_NAME}" \
FRIENDLY_NAME="${CONTAINER_FRIENDLY_NAME}" \
VERSION="${CONTAINER_ARTIFACT_VERSION}" \
RUNTIME="${runtime}" \
@ -87,7 +87,7 @@ do_image_container_artifacts() {
LABELS_JSON="${CONTAINER_ARTIFACT_LABELS_JSON}" \
python3 -c 'import json, os, sys; \
parse_bool = lambda name: os.environ[name].strip().lower() == "true"; \
payload = {"name": os.environ["NAME"], "friendly_name": os.environ["FRIENDLY_NAME"], "version": os.environ["VERSION"], "runtime": os.environ["RUNTIME"], "registration_defaults": {"autostart": parse_bool("AUTOSTART"), "monitor": parse_bool("MONITOR"), "restart": {"enabled": parse_bool("RESTART_ENABLED"), "max_retries": int(os.environ["RESTART_MAX_RETRIES"]), "window": int(os.environ["RESTART_WINDOW"]), "retry_delay": int(os.environ["RESTART_RETRY_DELAY"]) } }, "device_types": json.loads(os.environ["DEVICE_TYPES_JSON"]), "firmware_versions": os.environ["FIRMWARE_VERSIONS"], "build_id": os.environ["BUILD_ID"], "description": os.environ["DESCRIPTION"], "labels": json.loads(os.environ["LABELS_JSON"])}; \
payload = {"package_id": os.environ["PACKAGE_ID"], "friendly_name": os.environ["FRIENDLY_NAME"], "version": os.environ["VERSION"], "runtime": os.environ["RUNTIME"], "registration_defaults": {"autostart": parse_bool("AUTOSTART"), "monitor": parse_bool("MONITOR"), "restart": {"enabled": parse_bool("RESTART_ENABLED"), "max_retries": int(os.environ["RESTART_MAX_RETRIES"]), "window": int(os.environ["RESTART_WINDOW"]), "retry_delay": int(os.environ["RESTART_RETRY_DELAY"]) } }, "device_types": json.loads(os.environ["DEVICE_TYPES_JSON"]), "firmware_versions": os.environ["FIRMWARE_VERSIONS"], "build_id": os.environ["BUILD_ID"], "description": os.environ["DESCRIPTION"], "labels": json.loads(os.environ["LABELS_JSON"])}; \
create_args = os.environ["CREATE_ARGS"].strip(); \
payload.update({"create_args": create_args} if create_args else {}); \
open(sys.argv[1], "w", encoding="utf-8").write(json.dumps(payload, indent=2) + "\n")' \

View File

@ -15,32 +15,15 @@ import sys
import tarfile
import tempfile
BASE36_ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz"
def fail(message: str) -> "NoReturn":
raise SystemExit(f"error: {message}")
def to_base36(value: int) -> str:
if value < 0:
fail("cannot convert negative values to base36")
if value == 0:
return "0"
result: list[str] = []
while value:
value, remainder = divmod(value, 36)
result.append(BASE36_ALPHABET[remainder])
return "".join(reversed(result))
def format_created_at(timestamp: datetime) -> str:
return timestamp.astimezone(timezone.utc).isoformat(timespec="milliseconds").replace("+00:00", "Z")
def build_generated_package_id(base_name: str, *, created_at_ms: int) -> str:
return f"{base_name}-{to_base36(created_at_ms)}"
def load_manifest(path: Path) -> dict:
try:
data = json.loads(path.read_text(encoding="utf-8"))
@ -100,11 +83,7 @@ def validate_labels(value: object) -> dict:
def validate_manifest(data: dict) -> dict:
package_id = data.get("package_id")
if package_id is not None:
if not isinstance(package_id, str) or not package_id.strip():
fail("invalid manifest: package_id must be a non-empty string")
package_id = package_id.strip()
package_id = validate_string(data, "package_id", path="manifest")
version = validate_string(data, "version", path="manifest")
runtime = validate_string(data, "runtime", path="manifest")
if runtime not in {"lxc", "podman"}:
@ -136,7 +115,6 @@ def validate_manifest(data: dict) -> dict:
description = data.get("description", "")
if description is not None and not isinstance(description, str):
fail("invalid manifest: description must be a string")
name = validate_string(data, "name", path="manifest")
friendly_name = data.get("friendly_name")
if friendly_name is not None:
if not isinstance(friendly_name, str) or not friendly_name.strip():
@ -145,7 +123,6 @@ def validate_manifest(data: dict) -> dict:
validated = {
"package_id": package_id,
"name": name,
"friendly_name": friendly_name,
"version": version,
"runtime": runtime,
@ -269,7 +246,6 @@ def build_final_manifest(
) -> dict:
output = {
"package_id": package_id,
"name": base["name"],
"friendly_name": base["friendly_name"],
"version": base["version"],
"runtime": base["runtime"],
@ -332,18 +308,10 @@ def main() -> int:
fail(f"cannot create output directory {output_dir}: {exc}")
created_at_dt = datetime.now(timezone.utc)
created_at_ms = int(created_at_dt.timestamp() * 1000)
created_at = format_created_at(created_at_dt)
generated_package_id = (
manifest["package_id"]
if manifest["package_id"]
else build_generated_package_id(
manifest["name"],
created_at_ms=created_at_ms,
)
)
package_id = manifest["package_id"]
output_name = build_output_name(
package_id=generated_package_id,
package_id=package_id,
runtime=manifest["runtime"],
device_type=manifest["device_types"][0],
)
@ -375,7 +343,7 @@ def main() -> int:
final_manifest = build_final_manifest(
manifest,
package_id=generated_package_id,
package_id=package_id,
artifact_type=artifact_type,
digest=digest,
size_bytes=size_bytes,
@ -389,7 +357,7 @@ def main() -> int:
lambda dst: write_default_readme(
dst,
manifest,
package_id=generated_package_id,
package_id=package_id,
created_at=created_at,
payload_name=payload_name,
),

View File

@ -4,7 +4,7 @@ require conf/distro/poky.conf
YOCTO_MAJOR = "5"
YOCTO_MINOR = "0"
DEY_RELEASE = "4"
DEY_BUILD = "1"
DEY_BUILD = "2"
# Firmware version of the system.
DEY_FIRMWARE_VERSION ?= "${YOCTO_MAJOR}.${YOCTO_MINOR}.${DEY_RELEASE}.${DEY_BUILD}"

View File

@ -14,6 +14,8 @@ SRC_URI += "\
file://connectcore-demo-server.service \
file://suspendtarget-connectcore-demo-server.service \
"
SRC_URI:append:ccimx95 = " file://0001-multimedia-replace-MOV-video-with-MP4.patch;patchdir=${WORKDIR}/git"
S = "${WORKDIR}/git/connectcore-demo-example"
do_configure[noexec] = "1"

View File

@ -0,0 +1,30 @@
From: Gonzalo Ruiz <Gonzalo.Ruiz@digi.com>
Date: Wed, 27 May 2026 16:33:46 +0200
Subject: [PATCH 1/1] multimedia: replace MOV video with MP4
This is required for Chromium demo.
Upstream-Status: Inappropriate [DEY specific]
Signed-off-by: Gonzalo Ruiz <Gonzalo.Ruiz@digi.com>
---
connectcore-demo-example/multimedia.html | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/connectcore-demo-example/multimedia.html b/connectcore-demo-example/multimedia.html
index 4073ff0..0327c1a 100644
--- a/connectcore-demo-example/multimedia.html
+++ b/connectcore-demo-example/multimedia.html
@@ -189,9 +189,9 @@ Digi Demo - Multimedia
<div class="row">
<div class="col-xl-2 multimedia-container">
<div class="d-flex justify-content-center align-items-center multimedia-box">
- <div class="multimedia-item" onclick="location.href='multimedia_viewer.html?exampleURL=videos/big_buck_bunny.mov'">
- <div class="multimedia-title">Big Buck Bunny (MOV)</div>
- <img src="./static/images/big_buck_bunny.jpg" alt="Big Buck Bunny (MOV)">
+ <div class="multimedia-item" onclick="location.href='multimedia_viewer.html?exampleURL=videos/big_buck_bunny.mp4'">
+ <div class="multimedia-title">Big Buck Bunny (MP4)</div>
+ <img src="./static/images/big_buck_bunny.jpg" alt="Big Buck Bunny (MP4)">
</div>
</div>
</div>

View File

@ -1,4 +1,4 @@
# Copyright (C) 2020-2022, Digi International Inc.
# Copyright (C) 2020-2026, Digi International Inc.
SUMMARY = "Short videos to demonstrate video playback on the WPE WebKit"
DESCRIPTION = "This package contains fragments of the short film 'Big Buck Bunny', which are used to demonstrate how WebKit makes use of hardware acceleration for video decoding"
@ -8,8 +8,8 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/CC-BY-3.0;md5=dfa02b5755629022e
SRC_URI = "${DIGI_PKG_SRC}/${BPN}-${PV}.tar.gz"
SRC_URI[md5sum] = "d22cc0fa20fde187455b27a799d2f9e6"
SRC_URI[sha256sum] = "97389f33d98c52d4311117366f0aa8dc78d00f51a787697af349de4668ccdbf6"
SRC_URI[md5sum] = "5b4cf8fe878adc6105df88866038e6db"
SRC_URI[sha256sum] = "18d64ec814d1a318641b1afc2ff51f93326390fc07dc2b79e53fb92477a0e8bd"
S = "${WORKDIR}/${PN}-${PV}"
@ -20,6 +20,10 @@ VIDEO_FORMATS = " \
mov \
webm \
"
VIDEO_FORMATS:ccimx95 = " \
mp4 \
webm \
"
# Name of the video sample
VIDEO_NAME = "big_buck_bunny"
@ -41,3 +45,5 @@ FILES:${PN} = "/${WEBSERVER_ROOT}/*"
# Don't generate dbg or dev packages
PACKAGES = "${PN}"
PACKAGE_ARCH = "${MACHINE_ARCH}"

View File

@ -567,8 +567,14 @@ if grep -qs 'DVK' /proc/device-tree/model; then
else
BOARD_TYPE="SBC"
fi
BOARD_VARIANT="$(cat /proc/device-tree/digi,hwid,variant | tr -d '\0')"
BOARD_SN="$(cat /proc/device-tree/digi,hwid,sn | tr -d '\0')"
SOM_SN="$(cat /proc/device-tree/digi,hwid,sn | tr -d '\0')"
SOM_VARIANT="$(cat /proc/device-tree/digi,hwid,variant | tr -d '\0')"
SOM_VERSION="$(($(cat /proc/device-tree/digi,hwid,hv | tr -d '\0' )))"
if [ -e /proc/device-tree/digi,smarcid,variant ]; then
SMARC_SN="$(cat /proc/device-tree/digi,smarcid,sn | tr -d '\0')"
SMARC_VARIANT="$(cat /proc/device-tree/digi,smarcid,variant | tr -d '\0')"
SMARC_VERSION="$(($(cat /proc/device-tree/digi,smarcid,hv | tr -d '\0' )))"
fi
BOARD_VERSION="$(cat /proc/device-tree/digi,carrierboard,version | tr -d '\0')"
[ -e "/proc/device-tree/digi,carrierboard,id" ] && BOARD_ID="$(cat /proc/device-tree/digi,carrierboard,id | tr -d '\0')"
[ -e "/proc/device-tree/cpus/rev" ] && SOC_REV="$(cat /proc/device-tree/cpus/rev | tr -d '\0')"
@ -627,7 +633,14 @@ print_qr || exit $?
echo ""
echo "|||:Component|:Version"
DUT_HEADER="SN-${BOARD_SN}, ${MACHINE} ${BOARD_VARIANT} ${BOARD_TYPE}v${BOARD_VERSION}"
if [ -n "${SMARC_VARIANT}" ]; then
DUT_HEADER="SN-${SMARC_SN}, ${MACHINE} ${SMARC_VARIANT} SMARCv${SMARC_VERSION}"
else
DUT_HEADER="SN-${SOM_SN}, ${MACHINE} ${SOM_VARIANT} SOMv${SOM_VERSION}"
fi
DUT_HEADER="${DUT_HEADER} ${BOARD_TYPE}v${BOARD_VERSION}"
if [ -n "${BOARD_ID}" ]; then
DUT_HEADER="${DUT_HEADER} board_ID=${BOARD_ID}"
fi

View File

@ -3,7 +3,7 @@
#
# build.sh
#
# Copyright (C) 2013-2025 by Digi International Inc.
# Copyright (C) 2013-2026 by Digi International Inc.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
@ -275,22 +275,22 @@ done<<-_EOF_
ccimx6ulrftest dey-image-mft-module-rf
ccmp15-dvk dey-image-qt,dey-image-webkit,dey-image-lvgl,dey-image-flutter
ccmp13-dvk core-image-base
ccmp25-dvk dey-image-qt,dey-image-webkit,dey-image-lvgl,dey-image-flutter,dey-image-container-manager
ccmp25-dvk dey-image-qt,dey-image-webkit,dey-image-lvgl,dey-image-flutter,dey-image-containers
ccimx91-dvk core-image-base
ccimx93-dvk dey-image-qt,dey-image-lvgl
ccimx95-dvk dey-image-qt,dey-image-chromium,dey-image-lvgl,dey-image-flutter,dey-image-container-manager
ccimx95-dvk dey-image-qt,dey-image-chromium,dey-image-lvgl,dey-image-flutter,dey-image-containers
_EOF_
# Set additional layers required for yocto images
declare -A EXTRA_YOCTO_LAYERS
EXTRA_YOCTO_LAYERS["dey-image-container-manager"]="\
EXTRA_YOCTO_LAYERS["dey-image-containers"]="\
meta-openembedded/meta-filesystems \
meta-virtualization \
meta-digi/meta-digi-containers"
# Set additional configurations required for yocto images
declare -A EXTRA_YOCTO_CONF
EXTRA_YOCTO_CONF["dey-image-container-manager"]="\
EXTRA_YOCTO_CONF["dey-image-containers"]="\
DISTRO_FEATURES:append = \" virtualization\" \
"