meta-digi-dey: add dynamic layer for ST X-LINUX-ISP integration

Introduce a dynamic layer to integrate X-LINUX-ISP v6.1.0 ST layer into DEY,
providing ISP image quality software, tools, and example applications for
STM32MP25x series.

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

Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
This commit is contained in:
Arturo Buzarra 2026-01-12 09:26:21 +01:00
parent 291bddcf4c
commit de852f317d
14 changed files with 321 additions and 4 deletions

View File

@ -57,6 +57,16 @@ BBMASK += " \
meta-st-x-linux-ai/recipes-st/images/st-image-ai.bb \
"
# Tweak x-linux-isp dependencies to use ST's ISP packages
LAYERDEPENDS_x-linux-isp:remove = "st-openstlinux"
BBMASK += " \
meta-st-x-linux-isp/recipes-st/images/st-image-isp.bb \
meta-st-x-linux-isp/recipes-st/images/st-image-isp-lava.bb \
meta-st-x-linux-isp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend \
meta-st-x-linux-isp/recipes-devtools/x-linux-isp/x-linux-isp-tool.bb \
meta-st-x-linux-isp/recipes-iqtune/stm32-isp-iqtune-application-python_6.1.0.bb \
"
# Digi's General and Open Source license agreements
DIGI_EULA_FILE = "${LAYERDIR}/DIGI_EULA"
DIGI_OPEN_EULA_FILE = "${LAYERDIR}/DIGI_OPEN_EULA"

View File

@ -22,6 +22,10 @@ BBFILES_DYNAMIC += " \
x-linux-ai:${LAYERDIR}/dynamic-layers/x-linux-ai/*/*/*.bbappend \
x-linux-ai:${LAYERDIR}/dynamic-layers/x-linux-ai/*/*/*/*.bb \
x-linux-ai:${LAYERDIR}/dynamic-layers/x-linux-ai/*/*/*/*.bbappend \
x-linux-isp:${LAYERDIR}/dynamic-layers/x-linux-isp/*/*.bb \
x-linux-isp:${LAYERDIR}/dynamic-layers/x-linux-isp/*/*.bbappend \
x-linux-isp:${LAYERDIR}/dynamic-layers/x-linux-isp/*/*/*.bb \
x-linux-isp:${LAYERDIR}/dynamic-layers/x-linux-isp/*/*/*.bbappend \
qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bb \
qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/*/*/*.bbappend \
qt5-layer:${LAYERDIR}/dynamic-layers/qt5-layer/${DEY_SOC_VENDOR}/*/*/*.bb \

View File

@ -0,0 +1,42 @@
From: Arturo Buzarra <arturo.buzarra@digi.com>
Date: Tue, 13 Jan 2026 15:43:26 +0100
Subject: [PATCH] image-classification: fix initialization issue with
x-linux-isp support
This commit fixes the following runtime error:
Traceback (most recent call last):
File "/usr/local/x-linux-ai/image-classification/stai_mpu_image_classification.py", line 60, in _on_realize
self.camera_dual_pipeline_creation()
File "/usr/local/x-linux-ai/image-classification/stai_mpu_image_classification.py", line 266, in camera_dual_pipeline_creation
src_pad.link(queue_sink_pad)
File "/usr/lib/python3.12/site-packages/gi/overrides/Gst.py", line 204, in link
raise LinkError(ret)
gi.overrides.Gst.LinkError: <enum GST_PAD_LINK_WAS_LINKED of type Gst.PadLinkReturn>
https://onedigi.atlassian.net/browse/DEL-9890
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
---
.../files/stai-mpu/stai_mpu_image_classification.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/stai-mpu/stai_mpu_image_classification.py b/stai-mpu/stai_mpu_image_classification.py
index 257e2b4..6c980e5 100644
--- a/stai-mpu/stai_mpu_image_classification.py
+++ b/stai-mpu/stai_mpu_image_classification.py
@@ -261,12 +261,12 @@ class GstWidget(Gtk.Box):
src_pad = self.libcamerasrc.get_static_pad("src")
src_pad.set_property("stream-role", 3)
# still-capture
src_request_pad0.set_property("stream-role", 1)
- src_pad.link(queue_sink_pad)
- src_request_pad0.link(queue0_sink_pad)
+ #src_pad.link(queue_sink_pad)
+ #src_request_pad0.link(queue0_sink_pad)
# getting pipeline bus
self.bus_pipeline = self.pipeline_preview.get_bus()
self.bus_pipeline.add_signal_watch()
self.bus_pipeline.connect('message::error', self.msg_error_cb)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024,2025, Digi International Inc.
# Copyright (C) 2024-2026, Digi International Inc.
FILESEXTRAPATHS:prepend := "${THISDIR}/../common:${THISDIR}/files:"
@ -7,6 +7,7 @@ SRC_URI += " \
file://patches/0001-image-classification-remove-weston-user-check-from-l.patch \
file://patches/0002-image-classification-reduce-font-size-for-big-screen.patch \
file://patches/0003-image-classification-set-camera-preview-to-640x480.patch \
${@bb.utils.contains("BBFILE_COLLECTIONS", "x-linux-isp", "file://patches/0004-image-classification-fix-initialization-issue-with-x.patch", "", d)} \
"
do_install:append () {

View File

@ -0,0 +1,42 @@
From: Arturo Buzarra <arturo.buzarra@digi.com>
Date: Tue, 13 Jan 2026 15:57:33 +0100
Subject: [PATCH] object-detection: fix initialization issue with x-linux-isp
support
This commit fixes the following runtime error:
Traceback (most recent call last):
File "/usr/local/x-linux-ai/object-detection/stai_mpu_object_detection.py", line 61, in _on_realize
self.camera_dual_pipeline_creation()
File "/usr/local/x-linux-ai/object-detection/stai_mpu_object_detection.py", line 267, in camera_dual_pipeline_creation
src_pad.link(queue_sink_pad)
File "/usr/lib/python3.12/site-packages/gi/overrides/Gst.py", line 204, in link
raise LinkError(ret)
gi.overrides.Gst.LinkError: <enum GST_PAD_LINK_WAS_LINKED of type Gst.PadLinkReturn>
https://onedigi.atlassian.net/browse/DEL-9890
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
---
.../files/stai-mpu/stai_mpu_object_detection.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/stai-mpu/stai_mpu_object_detection.py b/stai-mpu/stai_mpu_object_detection.py
index 6a40ad4..53a7576 100644
--- a/stai-mpu/stai_mpu_object_detection.py
+++ b/stai-mpu/stai_mpu_object_detection.py
@@ -262,12 +262,12 @@ class GstWidget(Gtk.Box):
src_pad = self.libcamerasrc.get_static_pad("src")
src_pad.set_property("stream-role", 3)
# still-capture
src_request_pad0.set_property("stream-role", 1)
- src_pad.link(queue_sink_pad)
- src_request_pad0.link(queue0_sink_pad)
+ #src_pad.link(queue_sink_pad)
+ #src_request_pad0.link(queue0_sink_pad)
# getting pipeline bus
self.bus_pipeline = self.pipeline_preview.get_bus()
self.bus_pipeline.add_signal_watch()
self.bus_pipeline.connect('message::error', self.msg_error_cb)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024,2025, Digi International Inc.
# Copyright (C) 2024-2026, Digi International Inc.
FILESEXTRAPATHS:prepend := "${THISDIR}/../common:${THISDIR}/files:"
@ -7,6 +7,7 @@ SRC_URI += " \
file://patches/0001-object-detection-remove-weston-user-check-from-launc.patch \
file://patches/0002-object-detection-reduce-font-size-for-big-screens.patch \
file://patches/0003-object-detection-set-camera-preview-to-640x480.patch \
${@bb.utils.contains("BBFILE_COLLECTIONS", "x-linux-isp", "file://patches/0004-object-detection-fix-initialization-issue-with-x-lin.patch", "", d)} \
"
do_install:append () {

View File

@ -0,0 +1,42 @@
From: Arturo Buzarra <arturo.buzarra@digi.com>
Date: Tue, 13 Jan 2026 15:31:33 +0100
Subject: [PATCH] pose-estimation: fix initialization issue with x-linux-isp
support
This commit fixes the following runtime error:
Traceback (most recent call last):
File "/usr/local/x-linux-ai/pose-estimation/stai_mpu_pose_estimation.py", line 60, in _on_realize
self.camera_dual_pipeline_creation()
File "/usr/local/x-linux-ai/pose-estimation/stai_mpu_pose_estimation.py", line 164, in camera_dual_pipeline_creation
src_pad.link(queue_sink_pad)
File "/usr/lib/python3.12/site-packages/gi/overrides/Gst.py", line 204, in link
raise LinkError(ret)
gi.overrides.Gst.LinkError: <enum GST_PAD_LINK_WAS_LINKED of type Gst.PadLinkReturn>
https://onedigi.atlassian.net/browse/DEL-9890
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
---
.../files/stai-mpu/stai_mpu_pose_estimation.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/stai-mpu/stai_mpu_pose_estimation.py b/stai-mpu/stai_mpu_pose_estimation.py
index 266bb49..a2be8f1 100644
--- a/stai-mpu/stai_mpu_pose_estimation.py
+++ b/stai-mpu/stai_mpu_pose_estimation.py
@@ -159,12 +159,12 @@ class GstWidget(Gtk.Box):
src_pad = self.libcamerasrc.get_static_pad("src")
src_pad.set_property("stream-role", 3)
# still-capture
src_request_pad0.set_property("stream-role", 1)
- src_pad.link(queue_sink_pad)
- src_request_pad0.link(queue0_sink_pad)
+ #src_pad.link(queue_sink_pad)
+ #src_request_pad0.link(queue0_sink_pad)
# getting pipeline bus
self.bus_pipeline = self.pipeline_preview.get_bus()
self.bus_pipeline.add_signal_watch()
self.bus_pipeline.connect('message::error', self.msg_error_cb)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024,2025, Digi International Inc.
# Copyright (C) 2024-2026, Digi International Inc.
FILESEXTRAPATHS:prepend := "${THISDIR}/../common:${THISDIR}/files:"
@ -7,6 +7,7 @@ SRC_URI += " \
file://patches/0001-pose-estimation-remove-weston-user-check-from-launch.patch \
file://patches/0002-pose-estimation-reduce-font-size-for-big-screens.patch \
file://patches/0003-pose-estimation-set-camera-preview-to-640x480.patch \
${@bb.utils.contains("BBFILE_COLLECTIONS", "x-linux-isp", "file://patches/0004-pose-estimation-fix-initialization-issue-with-x-linu.patch", "", d)} \
"
do_install:append () {

View File

@ -0,0 +1,42 @@
From: Arturo Buzarra <arturo.buzarra@digi.com>
Date: Tue, 13 Jan 2026 16:03:19 +0100
Subject: [PATCH] semantic-segmentation: fix initialization issue with
x-linux-isp support
This commit fixes the following runtime error:
Traceback (most recent call last):
File "/usr/local/x-linux-ai/semantic-segmentation/stai_mpu_semantic_segmentation.py", line 65, in _on_realize
self.camera_dual_pipeline_creation()
File "/usr/local/x-linux-ai/semantic-segmentation/stai_mpu_semantic_segmentation.py", line 169, in camera_dual_pipeline_creation
src_pad.link(queue_sink_pad)
File "/usr/lib/python3.12/site-packages/gi/overrides/Gst.py", line 204, in link
raise LinkError(ret)
gi.overrides.Gst.LinkError: <enum GST_PAD_LINK_WAS_LINKED of type Gst.PadLinkReturn>
https://onedigi.atlassian.net/browse/DEL-9890
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
---
.../files/stai-mpu/stai_mpu_semantic_segmentation.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/stai-mpu/stai_mpu_semantic_segmentation.py b/stai-mpu/stai_mpu_semantic_segmentation.py
index d0ee636..45351d6 100644
--- a/stai-mpu/stai_mpu_semantic_segmentation.py
+++ b/stai-mpu/stai_mpu_semantic_segmentation.py
@@ -164,12 +164,12 @@ class GstWidget(Gtk.Box):
src_pad = self.libcamerasrc.get_static_pad("src")
src_pad.set_property("stream-role", 3)
# still-capture
src_request_pad0.set_property("stream-role", 1)
- src_pad.link(queue_sink_pad)
- src_request_pad0.link(queue0_sink_pad)
+ #src_pad.link(queue_sink_pad)
+ #src_request_pad0.link(queue0_sink_pad)
# getting pipeline bus
self.bus_pipeline = self.pipeline_preview.get_bus()
self.bus_pipeline.add_signal_watch()
self.bus_pipeline.connect('message::error', self.msg_error_cb)

View File

@ -1,4 +1,4 @@
# Copyright (C) 2024,2025, Digi International Inc.
# Copyright (C) 2024-2026, Digi International Inc.
FILESEXTRAPATHS:prepend := "${THISDIR}/../common:${THISDIR}/files:"
@ -8,6 +8,7 @@ SRC_URI += " \
file://patches/0002-semantic-segmentation-reduce-font-size-for-big-scree.patch \
file://patches/0003-semantic-segmentation-adapt-sample-for-root-user.patch \
file://patches/0004-semantic-segmentation-set-camera-preview-to-640x480.patch \
${@bb.utils.contains("BBFILE_COLLECTIONS", "x-linux-isp", "file://patches/0005-semantic-segmentation-fix-initialization-issue-with-.patch", "", d)} \
"
do_install:append () {

View File

@ -0,0 +1,49 @@
From: Arturo Buzarra <arturo.buzarra@digi.com>
Date: Mon, 12 Jan 2026 21:44:34 +0100
Subject: [PATCH] stm32_isp_iqtune: add support to ConnectCore MP2
Signed-off-by: Arturo Buzarra <arturo.buzarra@digi.com>
---
.../stm32-isp-iqtune-application/stm32_isp_iqtune_app.py | 5 ++---
.../stm32-isp-iqtune-application/stm32_isp_iqtune_com.py | 2 +-
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/stm32-isp-iqtune-application/stm32_isp_iqtune_app.py b/stm32-isp-iqtune-application/stm32_isp_iqtune_app.py
index d9b6564..0a5501d 100644
--- a/stm32-isp-iqtune-application/stm32_isp_iqtune_app.py
+++ b/stm32-isp-iqtune-application/stm32_isp_iqtune_app.py
@@ -666,15 +666,14 @@ class Application:
version = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)
if version.returncode == 0:
self.ostl_version = version.stdout.strip()
else:
print("Fail to get OSTL version")
- print("The application cannot start")
- os._exit(1)
+ self.ostl_version = 6.1
#Get device(machine) (eg "STM32MP257F-EV1")
- command = r"cat /sys/firmware/devicetree/base/model | awk '{print $2}'"
+ command = r"cat /sys/firmware/devicetree/base/digi,machine,name"
device = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)
if device.returncode == 0:
self.device = device.stdout.strip()
else:
print("Fail to get device")
diff --git a/stm32-isp-iqtune-application/stm32_isp_iqtune_com.py b/stm32-isp-iqtune-application/stm32_isp_iqtune_com.py
index cfe132b..fe8ed17 100644
--- a/stm32-isp-iqtune-application/stm32_isp_iqtune_com.py
+++ b/stm32-isp-iqtune-application/stm32_isp_iqtune_com.py
@@ -666,11 +666,11 @@ class IQTuneCom():
# 03 - HasGamma. Not supported.
read_values = read_values + pack('<I', False)
# 04 - HasAntiFlicker. Not supported for the time being.
read_values = read_values + pack('<I', True)
# 05 - DeviceId (N6=0x00 - MP25/23=0x01 - MP21=0x2 ... 0xFFFFFF = unknown)
- if self._app.device.startswith("STM32MP25") or self._app.device.startswith("STM32MP23"):
+ if self._app.device.startswith("ccmp2"):
device = 0x01
elif self._app.device.startswith("STM32MP21"):
device = 0x02
else:
device = 0xFFFFFFFF

View File

@ -0,0 +1,14 @@
# Copyright (C) 2026, Digi International Inc.
#
# We need to get the rest of SRC_URI artifacts from meta-st-x-linux-isp, so
# "abuse" COREBASE to get the path to "meta-st-x-linux-isp"
#
FILESEXTRAPATHS:prepend := "${THISDIR}/files:${COREBASE}/../meta-st-x-linux-isp/recipes-iqtune/files:"
SRC_URI += " \
file://patches/0001-stm32_isp_iqtune-add-support-to-ConnectCore-MP2.patch \
"
DEPENDS:remove = "linux-stm32mp"
DEPENDS:append = " virtual/kernel "

View File

@ -0,0 +1,64 @@
# Copyright (C) 2024, STMicroelectronics - All Rights Reserved
SUMMARY = "STM32 ISP IQTune Linux application."
DESCRIPTION = "The STM32 IQTune tool is connected through USB to this \
application and allow customer properly configure the DCMIPP ISP \
with their own raw sensor tuning parameters."
LICENSE = "SLA0044"
LIC_FILES_CHKSUM = "file://stm32-isp-iqtune-application/LICENSE;md5=91fc08c2e8dfcd4229b69819ef52827c"
NO_GENERIC_LICENSE[SLA0044] = "stm32-isp-iqtune-application/LICENSE"
LICENSE:${PN} = "SLA0044"
inherit python3-dir
DEPENDS += " linux-stm32mp gstreamer1.0-plugins-bad"
SRC_URI = " file://stm32-isp-iqtune-application;subdir=sources "
SRC_URI += " file://resources;subdir=sources "
S = "${WORKDIR}/sources"
do_configure[noexec] = "1"
do_compile[noexec] = "1"
do_install() {
install -d ${D}${prefix}/local/demo/gtk-application
install -d ${D}${prefix}/local/x-linux-isp
install -d ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app
install -d ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app/resources
# install applications into the demo launcher
install -m 0755 ${S}/stm32-isp-iqtune-application/400-stm32-isp-iqtune-python.yaml ${D}${prefix}/local/demo/gtk-application
# install application and launcher scripts
install -m 0755 ${S}/stm32-isp-iqtune-application/stm32_isp_iqtune_app.py ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app
install -m 0755 ${S}/stm32-isp-iqtune-application/stm32_isp_iqtune_com.py ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app
install -m 0755 ${S}/stm32-isp-iqtune-application/launch_python*.sh ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app
# install the LICENSE file associated with the scripts
install -m 0444 ${S}/stm32-isp-iqtune-application/LICENSE ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app
# install all resource files
# .png files
install -m 0644 ${S}/resources/*.png ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app/resources
# configuration scripts
install -m 0644 ${S}/resources/Default.css ${D}${prefix}/local/x-linux-isp/stm32-isp-iqtune-app/resources
}
inherit module-base
FILES:${PN} += "${prefix}/local/"
RDEPENDS:${PN} += " \
gstreamer1.0-plugins-bad-waylandsink \
gstreamer1.0-plugins-bad-debugutilsbad \
gstreamer1.0-plugins-base-app \
gstreamer1.0-plugins-base-videoconvertscale \
gtk+3 \
libcamera-stm32mp-gst (>=${LIBCAMERA_VERSION_MIN}) \
usbotg-gadget-acm-config \
usbotg-gadget-acm-uvc-config \
${PYTHON_PN}-core \
${PYTHON_PN}-pyserial \
bash \
"

View File

@ -0,0 +1,4 @@
# Copyright (C) 2026, Digi International Inc.
# Manage to provide all framework tools base packages with overall one
RDEPENDS:packagegroup-x-linux-isp:remove = "x-linux-isp-tool"