Compare commits

..

No commits in common. "3fdb245765bfc4a9c2599c2d7bd7ebe62b3d9a69" and "d657673d1f18aec5a4c3bb68f088c583f38c14cb" have entirely different histories.

31 changed files with 26 additions and 1455 deletions

View File

@ -8,9 +8,6 @@ MACHINEOVERRIDES =. "mx95:${DIGI_FAMILY}:${DIGI_SOM}:"
# Include the machine configuration for Digi's ConnectCore 9 module
include conf/machine/include/ccimx9.inc
# Machine features
MACHINE_FEATURES += "mca"
# Console
SERIAL_CONSOLES = "115200;ttyLP0"
@ -68,7 +65,6 @@ KERNEL_DEVICETREE ?= " \
digi/ccimx95-dvk_mikroe-gyro-click.dtbo \
digi/ccimx95-dvk_pcam5c.dtbo \
digi/ccimx95_bt.dtbo \
digi/ccimx95_npu.dtbo \
digi/ccimx95_wifi.dtbo \
"
FIT_CONF_DEFAULT_DTB = "ccimx95-dvk.dtb"

View File

@ -153,15 +153,11 @@ ST_USERFS = "0"
# Boot artifacts to be copied from the deploy dir to the installer ZIP
BOOTABLE_ARTIFACTS = " \
${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', \
oe.utils.ifelse(d.getVar('TRUSTFENCE_ENCRYPT') == '0', 'tf-a-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand${SIGN_SUFFIX}.stm32 ', \
'tf-a-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand${ENCRYPT_SUFFIX}${SIGN_SUFFIX}.stm32 '), \
'tf-a-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand.stm32 ')} \
${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', 'tf-a-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand${SIGN_SUFFIX}.stm32', \
'tf-a-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand.stm32')} \
metadata-ccmp13-dvk.bin \
${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', \
oe.utils.ifelse(d.getVar('TRUSTFENCE_ENCRYPT') == '0', 'fip-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand${SIGN_SUFFIX}.bin ', \
'fip-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand${ENCRYPT_SUFFIX}${SIGN_SUFFIX}.bin '), \
'fip-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand.bin ')} \
${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', 'fip-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand${SIGN_SUFFIX}.bin', \
'fip-ccmp13-dvk-256MB-${BOOTSCHEME_DEFAULT}-nand.bin')} \
"
# Default overlayfs_etc mount point and type

View File

@ -358,19 +358,6 @@ OPTEE_PKGS ??= "optee-client optee-os"
PREFERRED_VERSION_opencv:mx8-nxp-bsp ??= "4.10.0.imx"
PREFERRED_VERSION_opencv:mx9-nxp-bsp ??= "4.10.0.imx"
# ML on ccimx95 (backport from NXP's lf-6.12.49-2.2.0)
PREFERRED_VERSION_flatbuffers-native:mx95-nxp-bsp ??= "24.3.25"
PREFERRED_VERSION_flatbuffers:mx95-nxp-bsp ??= "24.3.25"
PREFERRED_VERSION_neutron:mx95-nxp-bsp ??= "2.2.1"
PREFERRED_VERSION_nnstreamer-edge:mx95-nxp-bsp ??= "0.2.6"
PREFERRED_VERSION_nnstreamer:mx95-nxp-bsp ??= "2.4.2"
PREFERRED_VERSION_onnxruntime:mx95-nxp-bsp ??= "1.22.0"
PREFERRED_VERSION_python3-flatbuffers:mx95-nxp-bsp ??= "24.3.25"
PREFERRED_VERSION_tensorflow-lite-host-tools-native:mx95-nxp-bsp ??= "2.19.0"
PREFERRED_VERSION_tensorflow-lite-host-tools:mx95-nxp-bsp ??= "2.19.0"
PREFERRED_VERSION_tensorflow-lite-neutron-delegate:mx95-nxp-bsp ??= "2.19.0"
PREFERRED_VERSION_tensorflow-lite:mx95-nxp-bsp ??= "2.19.0"
EXTRA_IMAGEDEPENDS += "u-boot"
# Do not update fstab file when using wic images

View File

@ -1,4 +1,4 @@
# Copyright (C) 2016-2026, Digi International Inc.
# Copyright (C) 2016-2024, Digi International Inc.
SUMMARY = "MCA firmware management tool"
SECTION = "console/tools"
@ -32,4 +32,4 @@ do_install:append() {
INSANE_SKIP:${PN} = "already-stripped"
COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x|ccmp1|ccimx95)"
COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x|ccmp1)"

View File

@ -168,33 +168,10 @@ if [ "${PLATFORM}" = "ccmp15" ] || [ "${PLATFORM}" = "ccmp25" ]; then
fi
fi
# Generate random keys if they don't exist
if [ "${PLATFORM}" = "ccmp13" ]; then
if [ -n "${CONFIG_FSBL_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_FIP_ENCRYPT_KEYNAME}" ]; then
if [ ! -f "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}" ]; then
echo "Generating random encryption key for FSBL"
if ! STM32MP_KeyGen_CLI -rand 16 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}"; then
echo "[ERROR] Failed to generate 16-byte FSBL encryption key"
exit 1
fi
chmod 444 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}"
fi
if [ ! -f "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}" ]; then
echo "Generating encryption key for FIP"
if ! hexdump -e '/1 "%02x"' "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}" > "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}"; then
echo "[ERROR] Failed to generate 32-byte FIP encryption key"
exit 1
fi
if ! hexdump -e '/1 "%02x"' "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}" >> "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}"; then
echo "[ERROR] Failed to generate 32-byte FIP encryption key"
exit 1
fi
printf "\n" >> "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}"
chmod 444 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}"
fi
fi
elif [ "${PLATFORM}" = "ccmp25" ]; then
if [ -n "${CONFIG_FSBL_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_FIP_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_RPROC_ENCRYPT_KEYNAME}" ]; then
if [ -n "${CONFIG_FSBL_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_FIP_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_RPROC_ENCRYPT_KEYNAME}" ]; then
# Generate random keys if they don't exist
if [ "${PLATFORM}" = "ccmp25" ]; then
if [ ! -f "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}" ]; then
echo "Generating random encryption key for FSBL"
if ! STM32MP_KeyGen_CLI -rand 16 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}"; then
@ -219,8 +196,8 @@ elif [ "${PLATFORM}" = "ccmp25" ]; then
fi
chmod 444 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_RPROC_ENCRYPT_KEYNAME}"
fi
else
echo "[ERROR] Could not generate encryption keys. Platform not supported."
exit 1
fi
else
echo "[ERROR] Could not generate encryption keys. Platform not supported."
exit 1
fi

View File

@ -442,7 +442,7 @@ index 1c949774f..b56d3b77c 100644
if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) {
- spin_lock(&port->lock);
+ uart_port_lock(port);
size = stm32_usart_receive_chars(port, false);
size = stm32_usart_receive_chars(port, (sr & USART_SR_RTOF));
uart_unlock_and_check_sysrq(port);
if (size)
@@ -1319,7 +1309,7 @@ static void stm32_usart_unthrottle(struct uart_port *port)

View File

@ -35,15 +35,10 @@ SRC_URI:append:ccmp25 = " \
RT_CONFIG_FRAGS:use-nxp-bsp = " ${WORKDIR}/fragment-nxp-rt.config"
RT_CONFIG_FRAGS:stm32mpcommon = " \
${S}/arch/arm64/configs/fragment-07-rt.config \
${S}/arch/arm64/configs/fragment-07-rt-sysvinit.config \
${WORKDIR}/fragment-08-deactivate-rng.config \
${WORKDIR}/fragment-10-network-improvment.config \
"
RT_CONFIG_FRAGS:stm32mpcommon:append = " \
${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', \
'${S}/arch/arm64/configs/fragment-07-rt-sysvinit.config', \
'', d)} \
"
KERNEL_CONFIG_FRAGMENTS:append = " \
${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${RT_CONFIG_FRAGS}', '', d)} \
"

View File

@ -21,7 +21,7 @@ TRUSTFENCE_KEYS_PATH ?= "${TOPDIR}/trustfence"
# NXP keys
TRUSTFENCE_DEK_ENCRYPT_KEYNAME ?= "dek.bin"
# STM keys
TRUSTFENCE_FIP_ENCRYPT_KEYNAME ?= "${TF_FIP_ENCRYPT_KEYNAME}"
TRUSTFENCE_FIP_ENCRYPT_KEYNAME ?= "encryption_key_fip.bin"
TRUSTFENCE_FSBL_ENCRYPT_KEYNAME ?= "encryption_key_fsbl.bin"
TRUSTFENCE_RPROC_ENCRYPT_KEYNAME ?= "encryption_key_rproc.bin"
@ -59,9 +59,7 @@ TRUSTFENCE_READ_ONLY_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-onl
# Platform specific defaults
TF_ENCRYPT = "1"
TF_ENCRYPT:ccimx9 = "0"
TF_ENCRYPT:ccmp15 = "0"
TF_FIP_ENCRYPT_KEYNAME = "encryption_key_fip.bin"
TF_FIP_ENCRYPT_KEYNAME:ccmp13 = "encryption_key_fip.txt"
TF_ENCRYPT:ccmp1 = "0"
TF_FILE_BASED_ENCRYPT = "0"
TF_FILE_BASED_ENCRYPT:ccimx9 = "1"
TF_FILE_BASED_ENCRYPT:ccmp1 = "1"
@ -93,9 +91,7 @@ gen_pki_tree() {
if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then
export CONFIG_FIP_ENCRYPT_KEYNAME="${TRUSTFENCE_FIP_ENCRYPT_KEYNAME}"
export CONFIG_FSBL_ENCRYPT_KEYNAME="${TRUSTFENCE_FSBL_ENCRYPT_KEYNAME}"
if [ "${DIGI_SOM}" = "ccmp25" ]; then
export CONFIG_RPROC_ENCRYPT_KEYNAME="${TRUSTFENCE_RPROC_ENCRYPT_KEYNAME}"
fi
export CONFIG_RPROC_ENCRYPT_KEYNAME="${TRUSTFENCE_RPROC_ENCRYPT_KEYNAME}"
fi
trustfence-gen-pki.sh -p ${DIGI_SOM}
fi
@ -176,11 +172,6 @@ python () {
DEK_PATH = os.path.dirname(d.getVar("TRUSTFENCE_DEK_PATH"))
if (d.getVar("TRUSTFENCE_KEYS_PATH") != DEK_PATH):
bb.fatal('[trustfence] TRUSTFENCE_DEK_PATH is deprecated; Set new variable TRUSTFENCE_KEYS_PATH to the directory containing both your sign and encryption keys.')
if d.getVar("TRUSTFENCE_DEK_PATH"):
if (d.getVar("TRUSTFENCE_DEK_PATH") != "0"):
bb.warnonce('[trustfence] TRUSTFENCE_DEK_PATH is deprecated; Set new variable TRUSTFENCE_KEYS_PATH to the directory containing both your sign and encryption keys.')
else:
bb.fatal('[trustfence] TRUSTFENCE_DEK_PATH is deprecated; To disable encryption set new variable TRUSTFENCE_ENCRYPT.')
# Secure console configuration
if (d.getVar("TRUSTFENCE_CONSOLE_DISABLE") == "1"):

View File

@ -1,113 +0,0 @@
# This recipe is for the i.MX fork of libcamera. For ease of
# maintenance, the top section is a verbatim copy of an OE-core
# recipe. The second section customizes the recipe for i.MX.
########### meta-openembedded copy ##################
# Upstream hash: f4b9dfa0c903bc94c344c657917a3fbb229c322f
SUMMARY = "Linux libcamera framework"
SECTION = "libs"
LICENSE = "GPL-2.0-or-later & LGPL-2.1-or-later"
LIC_FILES_CHKSUM = "\
file://LICENSES/GPL-2.0-or-later.txt;md5=fed54355545ffd980b814dab4a3b312c \
file://LICENSES/LGPL-2.1-or-later.txt;md5=2a4f4fd2128ea2f65047ee63fbca9f68 \
"
SRC_URI = " \
git://git.libcamera.org/libcamera/libcamera.git;protocol=https;branch=master;tag=v${PV} \
"
SRCREV = "e8d8e6c88bc7cf2a33a9ffbbe250838626c57de0"
PE = "1"
S = "${WORKDIR}/git"
DEPENDS = "python3-pyyaml-native python3-jinja2-native python3-ply-native python3-jinja2-native udev gnutls chrpath-native libevent libyaml"
DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES', 'qt', 'qtbase qtbase-native', '', d)}"
PACKAGES =+ "${PN}-gst ${PN}-pycamera"
PACKAGECONFIG ??= ""
PACKAGECONFIG[dng] = ",,tiff"
PACKAGECONFIG[gst] = "-Dgstreamer=enabled,-Dgstreamer=disabled,gstreamer1.0 gstreamer1.0-plugins-base"
PACKAGECONFIG[pycamera] = "-Dpycamera=enabled,-Dpycamera=disabled,python3 python3-pybind11"
PACKAGECONFIG[raspberrypi] = ",,libpisp"
# Raspberry Pi requires the meta-raspberrypi layer
# These values are coming from the project's meson.build file,
# which lists the supported values by arch.
ARM_PIPELINES = "${@bb.utils.contains('PACKAGECONFIG', 'raspberrypi', 'rpi/pisp,rpi/vc4,', '', d)}"
ARM_PIPELINES .= "imx8-isi,mali-c55,simple,uvcvideo"
LIBCAMERA_PIPELINES ??= "auto"
LIBCAMERA_PIPELINES:arm ??= "${ARM_PIPELINES}"
LIBCAMERA_PIPELINES:aarch64 ??= "${ARM_PIPELINES}"
EXTRA_OEMESON = " \
-Dpipelines=${LIBCAMERA_PIPELINES} \
-Dv4l2=true \
-Dcam=enabled \
-Dlc-compliance=disabled \
-Dtest=false \
-Ddocumentation=disabled \
"
RDEPENDS:${PN} = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland qt', 'qtwayland', '', d)}"
inherit meson pkgconfig python3native
do_configure:prepend() {
sed -i -e 's|py_compile=True,||' ${S}/utils/codegen/ipc/mojo/public/tools/mojom/mojom/generate/template_expander.py
}
do_install:append() {
chrpath -d ${D}${libdir}/libcamera.so
chrpath -d ${D}${libexecdir}/libcamera/v4l2-compat.so
}
do_package:append() {
bb.build.exec_func("do_package_recalculate_ipa_signatures", d)
}
do_package_recalculate_ipa_signatures() {
local modules
for module in $(find ${PKGD}/usr/lib/libcamera -name "*.so.sign"); do
module="${module%.sign}"
if [ -f "${module}" ] ; then
modules="${modules} ${module}"
fi
done
${S}/src/ipa/ipa-sign-install.sh ${B}/src/ipa-priv-key.pem "${modules}"
}
FILES:${PN} += " ${libexecdir}/libcamera/v4l2-compat.so"
FILES:${PN}-gst = "${libdir}/gstreamer-1.0"
FILES:${PN}-pycamera = "${PYTHON_SITEPACKAGES_DIR}/libcamera"
# libcamera-v4l2 explicitly sets _FILE_OFFSET_BITS=32 to get access to
# both 32 and 64 bit file APIs.
GLIBC_64BIT_TIME_FLAGS = ""
########### End of meta-openembedded copy ###########
########### i.MX overrides ################
SRC_URI:remove = "git://git.libcamera.org/libcamera/libcamera.git;protocol=https;branch=master;tag=v${PV}"
SRC_URI:prepend = "${LIBCAMERA_SRC};branch=${SRCBRANCH} "
LIBCAMERA_SRC ?= "git://github.com/nxp-imx/libcamera.git;protocol=https"
SRCBRANCH = "lf-6.12.49_2.2.0"
SRCREV = "e8d8e6c88bc7cf2a33a9ffbbe250838626c57de0"
PACKAGECONFIG = "gst pycamera dng"
ARM_PIPELINES .= ",nxp/neo"
# Qt installs native tools to /usr/libexec, but this is not in PATH
PATH:prepend = "${@bb.utils.contains('DISTRO_FEATURES', 'qt', '${STAGING_LIBEXECDIR_NATIVE}:', '', d)}"
COMPATIBLE_MACHINE = "(mx95-nxp-bsp|mx8mm-nxp-bsp|mx8ulp-nxp-bsp|mx8mq-nxp-bsp)"
########### End of i.MX overrides #########

View File

@ -38,7 +38,6 @@ MACHINE_GSTREAMER_1_0_EXTRA_INSTALL ?= " \
gstreamer1.0-libav \
"
MACHINE_GSTREAMER_1_0_EXTRA_INSTALL:ccimx6ul ?= ""
MACHINE_GSTREAMER_1_0_EXTRA_INSTALL:append:ccimx95 = " libcamera-gst"
RDEPENDS:${PN} = " \
${MACHINE_GSTREAMER_1_0_PKGS} \

View File

@ -1,39 +0,0 @@
From 6cb4d671a88e054744ce3029df9e733dc724ee76 Mon Sep 17 00:00:00 2001
From: Derek Bailey <dbaileychess@gmail.com>
Date: Mon, 19 Aug 2024 16:08:46 -0700
Subject: [PATCH] Fixes LICENSE file in python
Fixes: #8376
Upstream-Status: Backport [https://github.com/google/flatbuffers/commit/6cb4d671a88e054744ce3029df9e733dc724ee76]
---
python/setup.cfg | 2 +-
python/setup.py | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/python/setup.cfg b/python/setup.cfg
index e3647037..0c43b1cf 100644
--- a/python/setup.cfg
+++ b/python/setup.cfg
@@ -3,4 +3,4 @@ universal=1
[metadata]
license_files =
- ../license
\ No newline at end of file
+ ../LICENSE
\ No newline at end of file
diff --git a/python/setup.py b/python/setup.py
index 065b2754..21ddecb9 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -18,7 +18,6 @@ setup(
name='flatbuffers',
version='24.3.25',
license='Apache 2.0',
- license_files='../LICENSE',
author='Derek Bailey',
author_email='derekbailey@google.com',
url='https://google.github.io/flatbuffers/',
--
2.34.1

View File

@ -1,7 +0,0 @@
Name: flatbuffers
Description: memory efficient serialization library
Version: @version@
Requires:
Libs: -L@libdir@ -lflatbuffers
Cflags: -I@includedir@

View File

@ -1,10 +0,0 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI:append = " file://flatbuffers.pc.in"
do_install:append() {
install -D -m 0644 ${WORKDIR}/flatbuffers.pc.in ${D}${libdir}/pkgconfig/flatbuffers.pc
sed -i 's:@version@:${PV}:g
s:@libdir@:${libdir}:g
s:@includedir@:${includedir}:g' ${D}${libdir}/pkgconfig/flatbuffers.pc
}

View File

@ -1,34 +0,0 @@
SUMMARY = "Memory Efficient Serialization Library"
HOMEPAGE = "https://github.com/google/flatbuffers"
SECTION = "console/tools"
LICENSE = "Apache-2.0"
PACKAGE_BEFORE_PN = "${PN}-compiler"
DEPENDS = "flatbuffers-native"
RDEPENDS:${PN}-compiler = "${PN}"
RDEPENDS:${PN}-${PYTHON_PN} = "${PN}"
RDEPENDS:${PN}-dev += "${PN}-compiler"
LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
SRCREV = "e6463926479bd6b330cbcf673f7e917803fd5831"
SRC_URI = "git://github.com/google/flatbuffers.git;branch=master;protocol=https"
CVE_CHECK_IGNORE += "CVE-2020-35864"
EXTRA_OECMAKE += "\
-DFLATBUFFERS_BUILD_TESTS=OFF \
-DFLATBUFFERS_BUILD_SHAREDLIB=ON \
"
EXTRA_OECMAKE:append:class-target = " -DFLATBUFFERS_FLATC_EXECUTABLE=${STAGING_BINDIR_NATIVE}/flatc"
inherit cmake python3native
S = "${WORKDIR}/git"
FILES:${PN}-compiler = "${bindir}"
BBCLASSEXTEND = "native nativesdk"

View File

@ -1,16 +0,0 @@
SUMMARY = "Memory Efficient Serialization Library - Python3 Modules"
HOMEPAGE = "https://github.com/google/flatbuffers"
SECTION = "console/tools"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://../LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
SRCREV = "e6463926479bd6b330cbcf673f7e917803fd5831"
SRC_URI = "git://github.com/google/flatbuffers.git;branch=master;protocol=https \
file://0001-Fixes-LICENSE-file-in-python.patch"
S = "${WORKDIR}/git/python"
RDEPENDS:${PN} = "flatbuffers"
PATCHTOOL = "git"
inherit setuptools3

View File

@ -1,6 +1,12 @@
# Copyright (C) 2023-2025, Digi International Inc.
# Copyright (C) 2023,2024, Digi International Inc.
# For the ccimx93 install only tensorflow-lite engine, as it is
# the only one supported in the NPU. This reduces significantly
# the rootfs image size.
ML_PKGS:ccimx93 = "tensorflow-lite"
# ARM ethos-u package
ETHOS_U_PKGS:append:mx93-nxp-bsp = " \
eiq-examples \
tensorflow-lite-ethosu-delegate \
"

View File

@ -1,8 +0,0 @@
require recipes-libraries/neutron/neutron_1.0.0.bb
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=bc649096ad3928ec06a8713b8d787eac"
SRC_URI = "${NEUTRON_SRC};branch=${SRCBRANCH}"
NEUTRON_SRC ?= "git://github.com/nxp-imx/neutron.git;protocol=https"
SRCBRANCH = "lf-6.12.49_2.2.0"
SRCREV = "a7d5f17a9210c45aef2bbc9dc09d637f41fd3a7c"

View File

@ -1,203 +0,0 @@
# Copyright 2020-2025 NXP
DESCRIPTION = "cross-platform, high performance scoring engine for ML models"
SECTION = "devel"
LICENSE = "MIT & Apache-2.0"
LIC_FILES_CHKSUM_runtime = "file://LICENSE;md5=0f7e3b1308cb5c00b372a6e78835732d"
LIC_FILES_CHKSUM_model = "file://${S}/example-models/squeezenet/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57"
LIC_FILES_CHKSUM = "${LIC_FILES_CHKSUM_runtime} ${LIC_FILES_CHKSUM_model}"
DEPENDS = "libpng zlib"
inherit setuptools3
SRC_URI = "${ONNXRUNTIME_SRC};branch=${SRCBRANCH}"
ONNXRUNTIME_SRC ?= "gitsm://github.com/nxp-imx/onnxruntime-imx.git;protocol=https"
SRCBRANCH = "lf-6.12.49_2.2.0"
SRCREV = "2ef0bb77e4b886c1d075b2bbc4ce0dc5b60c268b"
S = "${WORKDIR}/git"
inherit cmake python3native
OECMAKE_SOURCEPATH = "${S}/cmake"
OECMAKE_GENERATOR = "Unix Makefiles"
# Notes:
# Abseil:
# - FETCHCONTENT_FULLY_DISCONNECTED=OFF and do_configure:prepend() added to allow
# abseil build process (the issue was related to CMake not fetching sources)
EXTRA_OECMAKE += "\
-DFETCHCONTENT_FULLY_DISCONNECTED=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-Donnxruntime_BUILD_UNIT_TESTS=ON \
-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
"
PYTHON_DEPENDS = "\
${PYTHON_PN} \
${PYTHON_PN}-pip-native \
${PYTHON_PN}-numpy \
${PYTHON_PN}-numpy-native \
${PYTHON_PN}-packaging-native\
${PYTHON_PN}-pybind11\
${PYTHON_PN}-pybind11-native\
"
PYTHON_RDEPENDS = "\
${PYTHON_PN} \
${PYTHON_PN}-numpy \
${PYTHON_PN}-protobuf \
${PYTHON_PN}-coloredlogs \
${PYTHON_PN}-flatbuffers \
${PYTHON_PN}-sympy \
"
PACKAGECONFIG ?= "crosscompiling sharedlib python kleidiai ${PACKAGECONFIG_NPU}"
PACKAGECONFIG_NPU = ""
PACKAGECONFIG_NPU:mx95-nxp-bsp = "neutron"
PACKAGECONFIG_NPU:mx943-nxp-bsp = "neutron"
PACKAGECONFIG_NPU:mx8-nxp-bsp:imxgpu = "vsinpu"
PACKAGECONFIG_NPU:mx8mm-nxp-bsp = ""
PACKAGECONFIG[nsync] = "-Donnxruntime_USE_NSYNC=ON, -Donnxruntime_USE_NSYNC=OFF"
PACKAGECONFIG[prebuilt] = "-Donnxruntime_USE_PREBUILT_PB=ON, -Donnxruntime_USE_PREBUILT_PB=OFF"
PACKAGECONFIG[openmp] = "-Donnxruntime_USE_OPENMP=ON, -Donnxruntime_USE_OPENMP=OFF"
PACKAGECONFIG[trt] = "-Donnxruntime_USE_TRT=ON, -Donnxruntime_USE_TRT=OFF"
PACKAGECONFIG[nuphar] = "-Donnxruntime_USE_NUPHAR=ON, -Donnxruntime_USE_NUPHAR=OFF"
PACKAGECONFIG[brainslice] = "-Donnxruntime_USE_BRAINSLICE=ON, -Donnxruntime_USE_BRAINSLICE=OFF"
PACKAGECONFIG[python] = "-Donnxruntime_ENABLE_PYTHON=ON, -Donnxruntime_ENABLE_PYTHON=OFF, ${PYTHON_DEPENDS}, ${PYTHON_RDEPENDS}"
PACKAGECONFIG[sharedlib] = "-Donnxruntime_BUILD_SHARED_LIB=ON, -Donnxruntime_BUILD_SHARED_LIB=OFF"
PACKAGECONFIG[eigenblas] = "-Donnxruntime_USE_EIGEN_FOR_BLAS=ON, -Donnxruntime_USE_EIGEN_FOR_BLAS=OFF"
PACKAGECONFIG[openblas] = "-Donnxruntime_USE_OPENBLAS=ON, -Donnxruntime_USE_OPENBLAS=OFF"
PACKAGECONFIG[dnnl] = "-Donnxruntime_USE_DNNL=ON, -Donnxruntime_USE_DNNL=OFF"
PACKAGECONFIG[mklml] = "-Donnxruntime_USE_MKLML=ON, -Donnxruntime_USE_MKLML=OFF"
PACKAGECONFIG[gemmlowp] = "-Donnxruntime_USE_GEMMLOWP=ON, -Donnxruntime_USE_GEMMLOWP=OFF"
PACKAGECONFIG[ngraph] = "-Donnxruntime_USE_NGRAPH=ON, -Donnxruntime_USE_NGRAPH=OFF"
PACKAGECONFIG[openvino] = "-Donnxruntime_USE_OPENVINO=ON, -Donnxruntime_USE_OPENVINO=OFF"
PACKAGECONFIG[interop] = "-Donnxruntime_ENABLE_LANGUAGE_INTEROP_OPS=ON, -Donnxruntime_ENABLE_LANGUAGE_INTEROP_OPS=OFF"
PACKAGECONFIG[dml] = "-Donnxruntime_USE_DML=ON, -Donnxruntime_USE_DML=OFF"
PACKAGECONFIG[telemetry] = "-Donnxruntime_USE_TELEMETRY=ON, -Donnxruntime_USE_TELEMETRY=OFF"
PACKAGECONFIG[armnn-relu] = "-Donnxruntime_ARMNN_RELU_USE_CPU=ON, -Donnxruntime_ARMNN_RELU_USE_CPU=OFF"
PACKAGECONFIG[armnn-bn] = "-Donnxruntime_ARMNN_BN_USE_CPU=ON, -Donnxruntime_ARMNN_BN_USE_CPU=OFF"
PACKAGECONFIG[opschema] = "-Donnxruntime_PYBIND_EXPORT_OPSCHEMA=ON, -Donnxruntime_PYBIND_EXPORT_OPSCHEMA=OFF"
PACKAGECONFIG[nnapi] = "-Donnxruntime_USE_NNAPI_BUILTIN=ON, -Donnxruntime_USE_NNAPI_BUILTIN=OFF"
PACKAGECONFIG[tvm] = "-Donnxruntime_USE_TVM=ON, -Donnxruntime_USE_TVM=OFF"
PACKAGECONFIG[llvm] = "-Donnxruntime_USE_LLVM=ON, -Donnxruntime_USE_LLVM=OFF"
PACKAGECONFIG[microsoft] = "-Donnxruntime_ENABLE_MICROSOFT_INTERNAL=ON, -Donnxruntime_ENABLE_MICROSOFT_INTERNAL=OFF"
PACKAGECONFIG[eigenthreadpool] = "-Donnxruntime_USE_EIGEN_THREADPOOL=ON, -Donnxruntime_USE_EIGEN_THREADPOOL=OFF"
PACKAGECONFIG[tensorrt] = "-Donnxruntime_USE_TENSORRT=ON, -Donnxruntime_USE_TENSORRT=OFF"
PACKAGECONFIG[crosscompiling] = "-Donnxruntime_CROSS_COMPILING=ON, -Donnxruntime_CROSS_COMPILING=OFF "
PACKAGECONFIG[server] = "-Donnxruntime_BUILD_SERVER=ON, -Donnxruntime_BUILD_SERVER=OFF"
PACKAGECONFIG[x86] = "-Donnxruntime_BUILD:x86=ON, -Donnxruntime_BUILD:x86=OFF"
PACKAGECONFIG[fullprotobuf] = "-Donnxruntime_USE_FULL_PROTOBUF=ON, -Donnxruntime_USE_FULL_PROTOBUF=OFF"
PACKAGECONFIG[ops] = "-Donnxruntime_DISABLE_CONTRIB_OPS=ON, -Donnxruntime_DISABLE_CONTRIB_OPS=OFF"
PACKAGECONFIG[staticruntime] = "-Donnxruntime_MSVC_STATIC_RUNTIME=ON, -Donnxruntime_MSVC_STATIC_RUNTIME=OFF"
PACKAGECONFIG[runtests] = "-Donnxruntime_RUN_ONNX_TESTS=ON, -Donnxruntime_RUN_ONNX_TESTS=OFF"
PACKAGECONFIG[reports] = "-Donnxruntime_GENERATE_TEST_REPORTS=ON, -Donnxruntime_GENERATE_TEST_REPORTS=OFF"
PACKAGECONFIG[devmode] = "-Donnxruntime_DEV_MODE=ON, -Donnxruntime_DEV_MODE=OFF"
PACKAGECONFIG[cuda] = "-Donnxruntime_USE_CUDA=ON, -Donnxruntime_USE_CUDA=OFF"
PACKAGECONFIG[automl] = "-Donnxruntime_USE_AUTOML=ON, -Donnxruntime_USE_AUTOML=OFF"
PACKAGECONFIG[jemalloc] = "-Donnxruntime_USE_JEMALLOC=ON, -Donnxruntime_USE_JEMALLOC=OFF"
PACKAGECONFIG[mimalloc] = "-Donnxruntime_USE_MIMALLOC=ON, -Donnxruntime_USE_MIMALLOC=OFF"
PACKAGECONFIG[csharp] = "-Donnxruntime_BUILD_CSHARP=ON, -Donnxruntime_BUILD_CSHARP=OFF"
PACKAGECONFIG[java] = "-Donnxruntime_BUILD_JAVA=ON, -Donnxruntime_BUILD_JAVA=OFF"
PACKAGECONFIG[kleidiai] = "-Donnxruntime_USE_KLEIDIAI=ON, -Donnxruntime_USE_KLEIDIAI=OFF"
PACKAGECONFIG[neutron] = "-Donnxruntime_USE_NEUTRON=ON, -Donnxruntime_USE_NEUTRON=OFF, neutron nlohmann-json"
PACKAGECONFIG[vsinpu] = "-Donnxruntime_USE_VSINPU=ON, -Donnxruntime_USE_VSINPU=OFF, tim-vx"
do_configure[network] = "1"
do_configure:prepend() {
export HTTP_PROXY=${http_proxy}
export HTTPS_PROXY=${https_proxy}
export http_proxy=${http_proxy}
export https_proxy=${https_proxy}
}
do_compile[network] = "1"
do_compile:prepend() {
if ${@bb.utils.contains('PACKAGECONFIG', 'python', 'true', 'false', d)}; then
# required to pull pybind11
export HTTP_PROXY=${http_proxy}
export HTTPS_PROXY=${https_proxy}
export http_proxy=${http_proxy}
export https_proxy=${https_proxy}
fi
}
SETUPTOOLS_SETUP_PATH = "${B}"
do_compile:append() {
if ${@bb.utils.contains('PACKAGECONFIG', 'python', 'true', 'false', d)}; then
# Copy 'setup.py' to build dir
cp ${S}/setup.py ${B}
cp -r ${S}/onnxruntime/python ${B}/onnxruntime/
# Copy path file with path 'docs/python/README.rst' to build dir
mkdir -p ${B}/docs/python && cp ${S}/docs/python/README.rst ${B}/docs/python
setuptools3_do_compile
git config --global --add safe.directory ${WORKDIR}/build/pybind11/src/pybind11
fi
}
do_install:append() {
CP_ARGS="-Prf --preserve=mode,timestamps --no-preserve=ownership"
# Ensure target dir exists
install -d ${D}${bindir}/${BP}
# Copy squeezenet updated model from onnxruntime-imx repo
if [ -d ${S}/example-models/ ]; then
cp $CP_ARGS ${S}/example-models/squeezenet ${D}${bindir}/${BP}/
fi
# Copy label_image_onnx.py tool from onnxruntime-imx repo
cp ${S}/onnxruntime/core/providers/neutron/tools/label_image_onnx.py ${D}${bindir}/${BP}/
# If cmake installs 'onnx_test_runner' at bindir level, move to package
if [ -f ${D}${bindir}/onnx_test_runner ]; then
mv ${D}${bindir}/onnx_test_runner ${D}${bindir}/${BP}/
fi
# Install onnxruntime_perf_test in main package
install -m 0755 ${B}/onnxruntime_perf_test ${D}${bindir}/${BP}
# Install test binaries and data in test package
install -d ${D}${bindir}/${BP}/tests
install -m 0744 ${B}/libcustom_op_library.so ${D}${bindir}/${BP}/tests
install -m 0744 ${B}/onnxruntime_global_thread_pools_test ${D}${bindir}/${BP}/tests
install -m 0744 ${B}/onnxruntime_mlas_test ${D}${bindir}/${BP}/tests
install -m 0744 ${B}/onnxruntime_shared_lib_test ${D}${bindir}/${BP}/tests
install -m 0744 ${B}/onnxruntime_test_all ${D}${bindir}/${BP}/tests
cp $CP_ARGS ${B}/testdata ${D}${bindir}/${BP}/tests
if ${@bb.utils.contains('PACKAGECONFIG', 'python', 'true', 'false', d)}; then
setuptools3_do_install
find ${D}/${PYTHON_SITEPACKAGES_DIR} -type d -name "__pycache__" -exec rm -Rf {} +
git config --global --unset-all safe.directory ${TMPDIR}/.*/${PN}/.*/build/pybind11/src/pybind11
fi
rm ${D}/${PYTHON_SITEPACKAGES_DIR}/${PN}/capi/libonnxruntime.so*
}
# Make the package arch SOC-specific since the recipe now builds with SOC-specific configuration:
PACKAGE_ARCH = "${MACHINE_SOCARCH}"
# Adjust the Python runtime dependency inherited from setuptools3-base.bbclass
# since Python support for this recipe is conditional
RDEPENDS:${PN}:remove:class-target = " \
${@bb.utils.contains('PACKAGECONFIG', 'python', '', '${PYTHON_PN}-core', d)}"
# libonnxruntime_providers_shared.so is being packaged into -dev which is intended
INSANE_SKIP:${PN}-dev += "dev-elf"
# A separate tests package for the test binaries not appearing in the main package
PACKAGE_BEFORE_PN = "${PN}-tests"
FILES:${PN}-tests = "${bindir}/${BP}/tests/*"
# libcustom_op_library.so is in bindir, which is intended;
# onnxruntime_shared_lib_test requires the shlib to be in the same directory as testdata to run properly
INSANE_SKIP:${PN}-tests += "libdir"
INSANE_SKIP:${PN}-dbg += "libdir"

View File

@ -1,5 +0,0 @@
# Copyright 2020-2025 NXP
TENSORFLOW_LITE_SRC ?= "git://github.com/nxp-imx/tensorflow-imx.git;protocol=https"
SRCBRANCH_tf = "lf-6.12.49_2.2.0"
SRCREV_tf = "c6f244fe303bd5170fdd6b8d570fc0e3282fd38b"

View File

@ -1,29 +0,0 @@
# Copyright 2022-2025 NXP
DESCRIPTION = "Host tools required for build of TensorFlow Lite C++ Library unit tests and Evaluation Tools"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=4158a261ca7f2525513e31ba9c50ae98"
require tensorflow-lite-${PV}.inc
SRC_URI = "${TENSORFLOW_LITE_SRC};branch=${SRCBRANCH_tf};name=tf"
inherit cmake
S = "${WORKDIR}/git"
OECMAKE_SOURCEPATH = "${S}/tensorflow/lite/tools/cmake/native_tools"
BBCLASSEXTEND = "native nativesdk"
EXTRA_OECMAKE = " \
-DFETCHCONTENT_FULLY_DISCONNECTED=OFF \
-DCMAKE_SYSROOT=${PKG_CONFIG_SYSROOT_DIR} \
"
CXXFLAGS += "-fPIC"
do_configure[network] = "1"
do_configure:prepend() {
export HTTP_PROXY=${http_proxy}
export HTTPS_PROXY=${https_proxy}
export http_proxy=${http_proxy}
export https_proxy=${https_proxy}
}

View File

@ -1,65 +0,0 @@
# Copyright 2023-2025 NXP
DESCRIPTION = "TensorFlow Lite Neutron Delegate"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=86d3f3a95c324c9479bd8986968f4327"
DEPENDS = "tensorflow-lite neutron tensorflow-lite-host-tools-native"
require tensorflow-lite-${PV}.inc
NEUTRON_DELEGATE_SRC ?= "git://github.com/nxp-imx/tflite-neutron-delegate.git;protocol=https"
SRCBRANCH_neutron = "lf-6.12.49_2.2.0"
SRCREV_neutron = "f24d08e5e1d461e669ece3c476c6dd340ce355cb"
SRCREV_FORMAT = "neutron_tf"
SRC_URI = "${NEUTRON_DELEGATE_SRC};branch=${SRCBRANCH_neutron};name=neutron \
${TENSORFLOW_LITE_SRC};branch=${SRCBRANCH_tf};name=tf;destsuffix=tfgit \
"
S = "${WORKDIR}/git"
inherit python3native cmake
EXTRA_OECMAKE = "-DCMAKE_SYSROOT=${PKG_CONFIG_SYSROOT_DIR}"
EXTRA_OECMAKE += " \
-DFETCHCONTENT_FULLY_DISCONNECTED=OFF \
-DTFLITE_HOST_TOOLS_DIR=${STAGING_BINDIR_NATIVE} \
-DFETCHCONTENT_SOURCE_DIR_TENSORFLOW=${WORKDIR}/tfgit \
-DTFLITE_LIB_LOC=${STAGING_DIR_HOST}${libdir}/libtensorflow-lite.so \
${S} \
"
CXXFLAGS += "-fPIC"
do_configure[network] = "1"
do_configure:prepend() {
export HTTP_PROXY=${http_proxy}
export HTTPS_PROXY=${https_proxy}
export http_proxy=${http_proxy}
export https_proxy=${https_proxy}
# There is no Fortran compiler in the toolchain, but bitbake sets this variable anyway
# with unavailable binary.
export FC=""
}
do_install() {
# install libraries
install -d ${D}${libdir}
for lib in ${B}/lib*.so*
do
cp --no-preserve=ownership -d $lib ${D}${libdir}
done
}
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
# Output library is unversioned
SOLIBS = ".so"
FILES_SOLIBSDEV = ""
# Work around do_package_qa error
INSANE_SKIP:${PN} += "buildpaths rpaths"
COMPATIBLE_MACHINE = "(mx943-nxp-bsp|mx95-nxp-bsp)"

View File

@ -1,150 +0,0 @@
# Copyright 2020-2025 NXP
DESCRIPTION = "TensorFlow Lite C++ Library"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=4158a261ca7f2525513e31ba9c50ae98"
DEPENDS = "flatbuffers python3-numpy-native python3-pip-native python3-pybind11-native python3-wheel-native unzip-native \
python3 jpeg zlib ${BPN}-host-tools-native"
require tensorflow-lite-${PV}.inc
SRC_URI = "${TENSORFLOW_LITE_SRC};branch=${SRCBRANCH_tf};name=tf"
SRC_URI += "https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224_quant.tgz;name=model-mobv1"
SRC_URI[model-mobv1.sha256sum] = "d32432d28673a936b2d6281ab0600c71cf7226dfe4cdcef3012555f691744166"
S = "${WORKDIR}/git"
inherit python3native cmake
PACKAGECONFIG ??= "python-example ${PACKAGECONFIG_GPU_DELEGATE}"
PACKAGECONFIG_GPU_DELEGATE = ""
PACKAGECONFIG_GPU_DELEGATE:mx95-nxp-bsp = "gpu-delegate"
PACKAGECONFIG[gpu-delegate] = "-DTFLITE_ENABLE_GPU=on,-DTFLITE_ENABLE_GPU=off"
PACKAGECONFIG[python-example] = ",,,python3-pillow"
EXTRA_OECMAKE = " \
-DCMAKE_SYSROOT=${PKG_CONFIG_SYSROOT_DIR} \
-DFETCHCONTENT_FULLY_DISCONNECTED=OFF \
-DTFLITE_EVAL_TOOLS=on \
-DTFLITE_HOST_TOOLS_DIR=${STAGING_BINDIR_NATIVE} \
-DTFLITE_BUILD_SHARED_LIB=on \
-DTFLITE_ENABLE_NNAPI=off \
-DTFLITE_ENABLE_NNAPI_VERBOSE_VALIDATION=on \
-DTFLITE_ENABLE_RUY=on \
-DTFLITE_ENABLE_XNNPACK=on \
-DTFLITE_PYTHON_WRAPPER_BUILD_CMAKE2=on \
-DTFLITE_ENABLE_EXTERNAL_DELEGATE=on \
${S}/tensorflow/lite/ \
"
EXTRA_OECMAKE_BUILD = "benchmark_model label_image"
CXXFLAGS += "-fPIC"
do_configure[network] = "1"
do_configure:prepend() {
export HTTP_PROXY=${http_proxy}
export HTTPS_PROXY=${https_proxy}
export http_proxy=${http_proxy}
export https_proxy=${https_proxy}
# There is no Fortran compiler in the toolchain, but bitbake sets this variable anyway
# with unavailable binary.
export FC=""
}
do_compile:append () {
# build pip package
cd ${B}
CI_BUILD_PYTHON=${PYTHON} BUILD_NUM_JOBS=8 ${S}/tensorflow/lite/tools/pip_package/build_pip_package_with_cmake2.sh ${TARGET_ARCH}
}
do_install() {
# install libraries
install -d ${D}${libdir}
for lib in ${B}/lib*.so*
do
cp --no-preserve=ownership -d $lib ${D}${libdir}
done
# install header files
install -d ${D}${includedir}/tensorflow/lite
cd ${S}/tensorflow/lite
cp --parents \
$(find . -name "*.h*") \
${D}${includedir}/tensorflow/lite
install -d ${D}${includedir}/tensorflow/compiler/mlir/lite
cd ${S}/tensorflow/compiler/mlir/lite
cp --parents \
$(find . -name "*.h*") \
${D}${includedir}/tensorflow/compiler/mlir/lite
# install version.h from core
install -d ${D}${includedir}/tensorflow/core/public
cp ${S}/tensorflow/core/public/version.h ${D}${includedir}/tensorflow/core/public
# install ctstring_internal.h from core
install -d ${D}${includedir}/tensorflow/core/platform
cp ${S}/tensorflow/core/platform/ctstring_internal.h ${D}${includedir}/tensorflow/core/platform
# install ctstring_internal.h from tsl
install -d ${D}${includedir}/tsl/platform
cp ${S}/third_party/xla/third_party/tsl/tsl/platform/ctstring_internal.h ${D}${includedir}/tsl/platform
# install examples
install -d ${D}${bindir}/${PN}-${PV}/examples
install -m 0555 ${B}/examples/label_image/label_image ${D}${bindir}/${PN}-${PV}/examples
install -m 0555 ${B}/tools/benchmark/benchmark_model ${D}${bindir}/${PN}-${PV}/examples
install -m 0555 ${B}/tools/evaluation/coco_object_detection_run_eval ${D}${bindir}/${PN}-${PV}/examples
install -m 0555 ${B}/tools/evaluation/imagenet_image_classification_run_eval ${D}${bindir}/${PN}-${PV}/examples
install -m 0555 ${B}/tools/evaluation/inference_diff_run_eval ${D}${bindir}/${PN}-${PV}/examples
# install label_image data
cp ${S}/tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp ${D}${bindir}/${PN}-${PV}/examples
cp ${S}/tensorflow/lite/java/ovic/src/testdata/labels.txt ${D}${bindir}/${PN}-${PV}/examples
# Install python example
if ${@bb.utils.contains('PACKAGECONFIG', 'python-example', 'true', 'false', d)}; then
cp ${S}/tensorflow/lite/examples/python/label_image.py ${D}${bindir}/${PN}-${PV}/examples
fi
# Install mobilenet tflite file
cp ${WORKDIR}/mobilenet_*.tflite ${D}${bindir}/${PN}-${PV}/examples
# Install pip package
install -d ${D}/${PYTHON_SITEPACKAGES_DIR}
${STAGING_BINDIR_NATIVE}/pip3 install --disable-pip-version-check -vvv --platform linux_${TARGET_ARCH} \
-t ${D}/${PYTHON_SITEPACKAGES_DIR} --no-cache-dir --no-deps \
${B}/tflite_pip/dist/tflite_runtime-*.whl
}
PACKAGE_ARCH = "${MACHINE_SOCARCH}"
RDEPENDS:${PN} = " \
python3 \
python3-numpy \
${RDEPENDS_OPENCL} \
"
RDEPENDS_OPENCL = "opencl-icd-loader-dev"
RDEPENDS_OPENCL:mx8mm-nxp-bsp = ""
INSANE_SKIP:${PN} += "dev-deps"
# TensorFlow and TensorFlow Lite both exports few files, suppress the error
# SSTATE_ALLOW_OVERLAP_FILES = "${D}${includedir}"
SSTATE_ALLOW_OVERLAP_FILES = "/"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INSANE_SKIP:${PN} += " \
already-stripped \
staticdev \
buildpaths \
"
FILES:${PN} += "${libdir}/python*"

View File

@ -1,26 +0,0 @@
SUMMARY = "NNStreamer-Edge library"
DESCRIPTION = "Remote source nodes for NNStreamer pipelines without GStreamer dependencies"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=095e13fef457e259d3bc155d0ed859f1"
DEPENDS = "\
gtest \
"
NNS_EDGE_SRC ?= "git://github.com/nnstreamer/nnstreamer-edge.git;protocol=https"
SRCBRANCH = "prod/tizen-9.0"
SRCREV = "e73acb740dce3ecbf8a650f45fab790afb400a95"
SRC_URI = "${NNS_EDGE_SRC};branch=${SRCBRANCH}"
S = "${WORKDIR}/git"
inherit cmake pkgconfig
EXTRA_OECMAKE = " \
-DENABLE_TEST=ON \
"
# The build produces a mix of versioned and unversioned libs, so custom packaging is required
FILES_SOLIBSDEV:remove = "${libdir}/lib*${SOLIBSDEV}"
FILES:${PN} += "${libdir}/libnnstreamer-edge-custom-test${SOLIBSDEV}"
FILES:${PN}-dev += "${libdir}/libnnstreamer-edge${SOLIBSDEV}"

View File

@ -1,63 +0,0 @@
From fd05c3f40c9ae1bdf2e05fc3581a00ec967fb9e3 Mon Sep 17 00:00:00 2001
From: Nicolas Goueslain <nicolas.goueslain@nxp.com>
Date: Wed, 23 Jul 2025 12:28:07 +0000
Subject: [PATCH] AIR-11938: tensor-filter-use-memcpy-ethosu-delegate
Upstream-Status: Inappropriate [i.MX specific]
Signed-off-by: Nicolas Goueslain <nicolas.goueslain@nxp.com>
---
.../tensor_filter/tensor_filter_tensorflow_lite.cc | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc b/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
index 95ab68c6..86879932 100644
--- a/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
+++ b/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
@@ -244,6 +244,7 @@ class TFLiteInterpreter
char *model_path;
bool is_cached_after_first_invoke; /**< To cache again after first invoke */
bool is_xnnpack_delegated; /**< To check if XNNPACK delegate is used */
+ bool is_ethosu_delegated;
char *ext_delegate_path; /**< path to external delegate lib */
GHashTable *ext_delegate_kv_table; /**< external delegate key values options */
QNNBackendType qnn_backend_type; /**< QNN Delegate backend type */
@@ -332,6 +333,7 @@ TFLiteInterpreter::TFLiteInterpreter ()
is_cached_after_first_invoke = false;
is_xnnpack_delegated = false;
+ is_ethosu_delegated = false;
}
/**
@@ -366,7 +368,7 @@ TFLiteInterpreter::invoke (const GstTensorMemory *input, GstTensorMemory *output
* Therefore tensor data is to be manually copied from/to input/output
* GStreamer buffers memory whose address changes at every round.
*/
- if (is_xnnpack_delegated) {
+ if (is_xnnpack_delegated || is_ethosu_delegated) {
for (unsigned int i = 0; i < inputTensorMeta.num_tensors; ++i) {
tensor_ptr = inputTensorPtr[i];
g_assert (tensor_ptr->bytes == input[i].size);
@@ -395,7 +397,7 @@ TFLiteInterpreter::invoke (const GstTensorMemory *input, GstTensorMemory *output
* After the very first invoke, the output buffer address may change.
* To handle the case, memcpy the output buffer directly.
*/
- if (is_xnnpack_delegated || !is_cached_after_first_invoke) {
+ if (is_xnnpack_delegated || is_ethosu_delegated || !is_cached_after_first_invoke) {
for (unsigned int i = 0; i < outputTensorMeta.num_tensors; ++i) {
tensor_ptr = outputTensorPtr[i];
g_assert (tensor_ptr->bytes == output[i].size);
@@ -555,6 +557,9 @@ TFLiteInterpreter::loadModel (int num_threads, tflite_delegate_e delegate_e)
options = TfLiteExternalDelegateOptionsDefault (ext_delegate_path);
+ if (strcmp(ext_delegate_path, "libethosu_delegate.so") == 0){
+ is_ethosu_delegated = true;
+ }
/* Add optional key values to delegate configuration */
if (ext_delegate_kv_table) {
GHashTable *table = ext_delegate_kv_table;
--
2.34.1

View File

@ -1,33 +0,0 @@
From 68ed0ca853338c9436d5047777f3f395c0f2c5b2 Mon Sep 17 00:00:00 2001
From: Nolann Chobert <nolann.chobert@nxp.com>
Date: Mon, 28 Jul 2025 16:00:19 +0000
Subject: [PATCH] Fix libnnstreamer_customfilter_passthrough.so path
Custom filter path is set to Yocto build path which will trigger an error on target.
The appropriate path is /usr/lib/nnstreamer/customfilters/libnnstreamer_customfilter_passthrough.so.
Upstream-Status: Inappropriate [i.MX specific]
Signed-off-by: Nolann Chobert <nolann.chobert@nxp.com>
---
tests/nnstreamer_filter_extensions_common/meson.build | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tests/nnstreamer_filter_extensions_common/meson.build b/tests/nnstreamer_filter_extensions_common/meson.build
index ecd1878b..eba2cc83 100644
--- a/tests/nnstreamer_filter_extensions_common/meson.build
+++ b/tests/nnstreamer_filter_extensions_common/meson.build
@@ -9,7 +9,9 @@ tizen_apptest_deps = [
# Format for adding subplugin into extensions -
# [name, extension abbreviation, dependencies, model file name/folder path/file path, test name]
extensions = []
-custom_filter_path = join_paths(meson.build_root(), 'tests', 'nnstreamer_example',
+nnst_prefix = get_option('prefix')
+nnst_libdir = join_paths(nnst_prefix, get_option('libdir'))
+custom_filter_path = join_paths(nnst_libdir, 'nnstreamer', 'customfilters',
'libnnstreamer_customfilter_passthrough.' + so_ext)
extensions += [['custom', 'custom', nnstreamer_unittest_deps, custom_filter_path, 'custom']]
extensions += [['custom', 'custom', nnstreamer_unittest_deps, custom_filter_path, 'custom-set']]
--
2.34.1

View File

@ -1,125 +0,0 @@
From e7585fe374349fb6e022c7515271a2ca475015b2 Mon Sep 17 00:00:00 2001
From: Nolann Chobert <nolann.chobert@nxp.com>
Date: Thu, 16 Oct 2025 17:39:33 +0200
Subject: [PATCH] [Filter/TFLite] Fix to provide default delegates
Some external delegates might need to access default delegates such as
XNNPACK to accelerate unsupported operations.
Upstream-Status: Pending
Signed-off-by: Nolann Chobert <nolann.chobert@nxp.com>
---
.../tensor_filter_tensorflow_lite.cc | 41 ++++++++++++-------
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc b/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
index 95ab68c6..d293e78c 100644
--- a/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
+++ b/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
@@ -98,13 +98,6 @@
#define TFLITE_SUBPLUGIN_NAME "tensorflow-lite"
#endif
-/**
- * @brief prevent usage by TFLite of default delegates that may not be supported
- */
-#if TFLITE_VERSION_MAJOR >= 2 && TFLITE_VERSION_MINOR >= 4
-#define TFLITE_RESOLVER_WITHOUT_DEFAULT_DELEGATES
-#endif
-
/**
* @brief Macro for debug mode.
*/
@@ -157,6 +150,7 @@ typedef struct {
GHashTable *ext_delegate_kv_table; /**< external delegate key values options */
QNNBackendType qnn_backend_type; /**< QNN Delegate backend type */
QNNPerformanceMode qnn_performance_mode; /**< QNN Delegate performance mode */
+ bool use_default_delegates; /**< whether to use default delegates in resolver */
} tflite_option_s;
/**
@@ -197,6 +191,10 @@ class TFLiteInterpreter
void setModelPath (const char *model_path);
void setExtDelegate (const char *lib_path, GHashTable *key_val);
void getExtDelegate (const char **lib_path, GHashTable **key_val);
+ void setUseDefaultDelegates (gboolean use_default)
+ {
+ use_default_delegates = use_default;
+ }
/** @brief get current model path */
const char *getModelPath ()
{
@@ -248,6 +246,7 @@ class TFLiteInterpreter
GHashTable *ext_delegate_kv_table; /**< external delegate key values options */
QNNBackendType qnn_backend_type; /**< QNN Delegate backend type */
QNNPerformanceMode qnn_performance_mode; /**< QNN Delegate performance mode */
+ bool use_default_delegates; /**< whether to use default delegates in resolver */
std::unique_ptr<tflite::Interpreter> interpreter;
std::unique_ptr<tflite::FlatBufferModel> model;
@@ -324,6 +323,7 @@ TFLiteInterpreter::TFLiteInterpreter ()
ext_delegate_kv_table = nullptr;
qnn_backend_type = QNN_BACKEND_UNDEFINED;
qnn_performance_mode = QNN_PERFMODE_Default;
+ use_default_delegates = FALSE;
g_mutex_init (&mutex);
@@ -460,12 +460,14 @@ TFLiteInterpreter::loadModel (int num_threads, tflite_delegate_e delegate_e)
interpreter = nullptr;
-#ifdef TFLITE_RESOLVER_WITHOUT_DEFAULT_DELEGATES
- tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
-#else
- tflite::ops::builtin::BuiltinOpResolver resolver;
-#endif
- tflite::InterpreterBuilder (*model, resolver) (&interpreter);
+ if (use_default_delegates) {
+ tflite::ops::builtin::BuiltinOpResolver resolver;
+ tflite::InterpreterBuilder (*model, resolver) (&interpreter);
+ } else {
+ tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
+ tflite::InterpreterBuilder (*model, resolver) (&interpreter);
+ }
+
if (!interpreter) {
ml_loge ("Failed to construct interpreter\n");
return -2;
@@ -1075,6 +1077,7 @@ TFLiteCore::init (tflite_option_s *option)
{
interpreter->setModelPath (option->model_file);
interpreter->setExtDelegate (option->ext_delegate_path, option->ext_delegate_kv_table);
+ interpreter->setUseDefaultDelegates (option->use_default_delegates);
interpreter->qnn_backend_type = option->qnn_backend_type;
interpreter->qnn_performance_mode = option->qnn_performance_mode;
num_threads = option->num_threads;
@@ -1395,6 +1398,13 @@ tflite_parseCustomOption (const GstTensorFilterProperties *prop, tflite_option_s
if (g_ascii_strcasecmp (pair[0], "NumThreads") == 0) {
option->num_threads = (int) g_ascii_strtoll (pair[1], NULL, 10);
+ } else if (g_ascii_strcasecmp (pair[0], "UseDefaultDelegates") == 0) {
+ if (g_ascii_strcasecmp (pair[1], "true") == 0 || g_ascii_strcasecmp (pair[1], "1") == 0)
+ option->use_default_delegates = TRUE;
+ else if (g_ascii_strcasecmp (pair[1], "false") == 0 || g_ascii_strcasecmp (pair[1], "0") == 0)
+ option->use_default_delegates = FALSE;
+ else
+ ml_logw ("Invalid value for UseDefaultDelegates (%s). Use 'true' or 'false'.", pair[1]);
} else if (g_ascii_strcasecmp (pair[0], "Delegate") == 0) {
if (g_ascii_strcasecmp (pair[1], "NNAPI") == 0)
option->delegate = TFLITE_DELEGATE_NNAPI;
@@ -1777,8 +1787,9 @@ _nns_filter_register_tflite (void)
{
nnstreamer_filter_probe (&NNS_support_tensorflow_lite);
nnstreamer_filter_set_custom_property_desc (NNS_support_tensorflow_lite.v0.name,
- "NumThreads", "Number of threads. Set 0 for default behaviors.", "Delegate",
- "TF-Lite delegation options: {'NNAPI', 'GPU', 'XNNPACK', 'External', 'QNN'}."
+ "NumThreads", "Number of threads. Set 0 for default behaviors.",
+ "UseDefaultDelegates", "Whether to use default delegates in resolver. Set 'true' or 'false'. Default is 'false'.",
+ "Delegate", "TF-Lite delegation options: {'NNAPI', 'GPU', 'XNNPACK', 'External', 'QNN'}."
" Do not specify to disable delegation.",
"ExtDelegateLib", "Path to external delegate shared library", "ExtDelegateKeyVal",
"key/values pairs optional parameters for delegate."
--
2.34.1

View File

@ -1,179 +0,0 @@
From 686e0ece0aef4f1d4bb24c893106f8d595016a30 Mon Sep 17 00:00:00 2001
From: Alexandru Firuti <alexandru.firuti@nxp.com>
Date: Tue, 18 Nov 2025 13:54:15 +0000
Subject: [PATCH] tensor_converter: add frame padding removal for GRAY8
- gst_tensor_converter_parse_video: add a new function for checking i.MX-specific
padding (gst_tensor_converter_video_stride_imx); if detected, set self->remove_imx_padding flag
- gst_tensor_converter_chain: for video media type, remove the paddding when either of
self->remove_padding and self->remove_imx_padding flags are set; in case there is no metadata
attached to padding, ignore the i.MX padding removal as the buffer is not coming from i.MX plugins;
add also logic to skip frame padding if it exists
Upstream-Status: Inappropriate [i.MX specific]
Signed-off-by: Alexandru Firuti <alexandru.firuti@nxp.com>
---
gst/nnstreamer/elements/gsttensor_converter.c | 50 ++++++++++++++++++-
gst/nnstreamer/elements/gsttensor_converter.h | 1 +
2 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/gst/nnstreamer/elements/gsttensor_converter.c b/gst/nnstreamer/elements/gsttensor_converter.c
index 78f62247..b7a28a36 100644
--- a/gst/nnstreamer/elements/gsttensor_converter.c
+++ b/gst/nnstreamer/elements/gsttensor_converter.c
@@ -359,6 +359,7 @@ gst_tensor_converter_init (GstTensorConverter * self)
self->in_media_type = _NNS_MEDIA_INVALID;
self->frame_size = 0;
self->remove_padding = FALSE;
+ self->remove_imx_padding = FALSE;
self->externalConverter = NULL;
self->priv_data = NULL;
self->mode = _CONVERTER_MODE_NONE;
@@ -1032,7 +1033,7 @@ gst_tensor_converter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
GstTensorsConfig new_config;
GstTensorInfo *_info;
GstBuffer *inbuf;
- gsize buf_size, frame_size;
+ gsize buf_size, frame_size, frame_padding;
guint frames_in, frames_out;
UNUSED (pad);
@@ -1073,7 +1074,7 @@ gst_tensor_converter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
/** supposed 1 frame in buffer */
g_assert ((buf_size / self->frame_size) == 1);
- if (self->remove_padding) {
+ if (self->remove_padding || self->remove_imx_padding) {
GstMapInfo src_info, dest_info;
guint d0, d1;
unsigned int src_idx = 0, dest_idx = 0;
@@ -1104,6 +1105,13 @@ gst_tensor_converter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
GstVideoMeta *video_meta = gst_buffer_get_video_meta (buf);
if (video_meta) {
offset = video_meta->stride[0];
+ } else if (self->remove_imx_padding && !self->remove_padding) {
+ /**
+ * If GstVideoMeta is missing, the buffer comes from a generic GStreamer plugin.
+ * Only the default 4-bytes alignment correction should be done, the i.MX specific
+ * one should be skipped.
+ */
+ break;
} else {
g_assert (offset % 4); /** Internal logic error! */
if (offset % 4) {
@@ -1111,12 +1119,22 @@ gst_tensor_converter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
}
}
+ /* Calculate frame padding (padding at the end of entire frame) */
+ frame_padding = 0;
+ if (buf_size > frame_size) {
+ frame_padding = buf_size - frame_size;
+ }
+
for (d0 = 0; d0 < frames_in; d0++) {
for (d1 = 0; d1 < height; d1++) {
memcpy (dest_info.data + dest_idx, src_info.data + src_idx, size);
dest_idx += size;
src_idx += offset;
}
+ /* Skip frame padding if it exists (after all rows of current frame) */
+ if (frame_padding > 0 && d0 < (frames_in - 1)) {
+ src_idx += frame_padding;
+ }
}
gst_buffer_unmap (buf, &src_info);
@@ -1438,6 +1456,26 @@ gst_tensor_converter_video_stride (GstVideoFormat format, gint width)
return FALSE;
}
+/**
+ * @brief Determine if we need i.MX-specific zero-padding
+ * @return TRUE if we need to add (or remove) stride per row from the stream data.
+ */
+static gboolean
+gst_tensor_converter_video_stride_imx (GstVideoFormat format, gint width, gint height, gsize frame_size)
+{
+ switch (format) {
+ case GST_VIDEO_FORMAT_GRAY8:
+ if ((width % 16) || (height % 16) || (frame_size % 4096)) {
+ return TRUE;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
/**
* @brief Set the tensors config structure from video info (internal static function)
* @param self this pointer to GstTensorConverter
@@ -1459,6 +1497,7 @@ gst_tensor_converter_parse_video (GstTensorConverter * self,
GstVideoFormat format;
gint width, height, views;
guint i;
+ gsize size = 0; // Frame size
g_return_val_if_fail (config != NULL, FALSE);
@@ -1494,6 +1533,7 @@ gst_tensor_converter_parse_video (GstTensorConverter * self,
config->info.info[0].dimension[0] = 1;
config->info.info[0].dimension[1] = width;
config->info.info[0].dimension[2] = height;
+ size = 1 * width * height; // 1 byte per pixel
break;
case GST_VIDEO_FORMAT_GRAY16_BE:
case GST_VIDEO_FORMAT_GRAY16_LE:
@@ -1501,6 +1541,7 @@ gst_tensor_converter_parse_video (GstTensorConverter * self,
config->info.info[0].dimension[0] = 1;
config->info.info[0].dimension[1] = width;
config->info.info[0].dimension[2] = height;
+ size = 2 * 1 * width * height; // 2 bytes per pixel
break;
case GST_VIDEO_FORMAT_RGB:
case GST_VIDEO_FORMAT_BGR:
@@ -1508,6 +1549,7 @@ gst_tensor_converter_parse_video (GstTensorConverter * self,
config->info.info[0].dimension[0] = 3;
config->info.info[0].dimension[1] = width;
config->info.info[0].dimension[2] = height;
+ size = 1 * 3 * width * height; // 1 byte per channel, 3 channels
break;
case GST_VIDEO_FORMAT_RGBx:
case GST_VIDEO_FORMAT_BGRx:
@@ -1521,6 +1563,7 @@ gst_tensor_converter_parse_video (GstTensorConverter * self,
config->info.info[0].dimension[0] = 4;
config->info.info[0].dimension[1] = width;
config->info.info[0].dimension[2] = height;
+ size = 1 * 4 * width * height; // 1 byte per channel, 4 channels
break;
#if GST_CHECK_VERSION(1, 20, 0)
case GST_VIDEO_FORMAT_RGBP:
@@ -1571,6 +1614,9 @@ gst_tensor_converter_parse_video (GstTensorConverter * self,
"Please use 4 x n as image width for inputs; the width of your input is %d.\n",
width);
}
+ if (gst_tensor_converter_video_stride_imx (format, width, height, size)) {
+ self->remove_imx_padding = TRUE;
+ }
self->frame_size = GST_VIDEO_INFO_SIZE (&vinfo);
return (config->info.info[0].type != _NNS_END);
diff --git a/gst/nnstreamer/elements/gsttensor_converter.h b/gst/nnstreamer/elements/gsttensor_converter.h
index b1328bb6..75589540 100644
--- a/gst/nnstreamer/elements/gsttensor_converter.h
+++ b/gst/nnstreamer/elements/gsttensor_converter.h
@@ -92,6 +92,7 @@ struct _GstTensorConverter
gsize frame_size; /**< size of one frame */
gboolean remove_padding; /**< If true, zero-padding must be removed */
+ gboolean remove_imx_padding; /**< If true, i.MX-specific zero-padding must be removed */
gboolean tensors_configured; /**< True if already successfully configured tensors metadata */
GstTensorsConfig tensors_config; /**< output tensors info */
--
2.34.1

View File

@ -1,45 +0,0 @@
From ccf4eea69e320d23013e5ec526d8b4f52a89192c Mon Sep 17 00:00:00 2001
From: Elliot Chen <elliot.chen@nxp.com>
Date: Wed, 23 Jul 2025 12:55:32 +0000
Subject: [PATCH] tensor_converter: calculate the offset by video meta when
removing padding
Changes for imxvideoconvert_g2d RGB888 support introduced 4-bytes alignment [MMFMWK-9523].
Padding is used for dimensions that are not multiple of 4.
NNStreamer tensor_converter padding removal is done using a padding size calculated on the 4-bytes alignment of width value in bytes.
The attached patch fixes the mismatch by adjusting the offset used for padding removal in NNStreamer to the actual stride value coming in video meta from the GStreamer plugins.
Upstream-Status: Inappropriate [i.MX specific]
Signed-off-by: Elliot Chen <elliot.chen@nxp.com>
Signed-off-by: Nicolas Goueslain <nicolas.goueslain@nxp.com>
---
gst/nnstreamer/elements/gsttensor_converter.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/gst/nnstreamer/elements/gsttensor_converter.c b/gst/nnstreamer/elements/gsttensor_converter.c
index c03fe87e..78f62247 100644
--- a/gst/nnstreamer/elements/gsttensor_converter.c
+++ b/gst/nnstreamer/elements/gsttensor_converter.c
@@ -1100,9 +1100,15 @@ gst_tensor_converter_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
*/
size = offset = type * color * width;
- g_assert (offset % 4); /** Internal logic error! */
- if (offset % 4) {
- offset += 4 - (offset % 4);
+ /* Calculate the offset by video meta if is exist */
+ GstVideoMeta *video_meta = gst_buffer_get_video_meta (buf);
+ if (video_meta) {
+ offset = video_meta->stride[0];
+ } else {
+ g_assert (offset % 4); /** Internal logic error! */
+ if (offset % 4) {
+ offset += 4 - (offset % 4);
+ }
}
for (d0 = 0; d0 < frames_in; d0++) {
--
2.34.1

View File

@ -1,224 +0,0 @@
SUMMARY = "NNStreamer, Stream Pipeline Paradigm for Neural Network Applications"
DESCRIPTION = "NNStreamer is a GStreamer plugin allowing to construct neural network applications with stream pipeline paradigm."
SECTION = "AI"
LICENSE = "LGPL-2.0-or-later"
LIC_FILES_CHKSUM = "\
file://LICENSE;md5=c25e5c1949624d71896127788f1ba590 \
file://debian/copyright;md5=0462ef8fa89a1f53f2e65e74940519ef \
"
DEPENDS = "\
bison-native \
flex-native \
orc-native \
glib-2.0 \
gstreamer1.0 \
gstreamer1.0-plugins-base \
gtest \
libpng \
"
SRCREV = "9cf11e0768892636622480fe1b5fc042b5a224ad"
SRC_URI = "git://github.com/nnstreamer/nnstreamer.git;branch=prod/tizen-9.0;protocol=https \
file://0001-AIR-11938-tensor-filter-use-memcpy-ethosu-delegate.patch \
file://0001-rgb888_support_nnstreamer.patch \
file://0001-Fix-libnnstreamer_customfilter_passthrough.so-path.patch \
file://0001-gray8_padding_removal.patch \
file://0001-Fix-to-provide-default-delegates.patch \
"
# Use git instead of quilt as patch tool to support patches with binary content
PATCHTOOL = "git"
S = "${WORKDIR}/git"
inherit meson pkgconfig
PACKAGECONFIG ??= "protobuf python3 query ${PACKAGECONFIG_SOC}"
PACKAGECONFIG_SOC ??= ""
PACKAGECONFIG_SOC:mx8-nxp-bsp:imxgpu ??= "tensorflow-lite"
PACKAGECONFIG_SOC:mx8mp-nxp-bsp ??= "tensorflow-lite tvm"
PACKAGECONFIG_SOC:mx9-nxp-bsp ??= "tensorflow-lite"
PACKAGECONFIG[flatbuf] = "\
-Dflatbuf-support=enabled, \
-Dflatbuf-support=disabled, \
flatbuffers-native flatbuffers, \
,,\
"
PACKAGECONFIG[grpc] = "\
-Dgrpc-support=enabled, \
-Dgrpc-support=disabled, \
grpc-native grpc, \
,,\
"
PACKAGECONFIG[protobuf] = "\
-Dprotobuf-support=enabled, \
-Dprotobuf-support=disabled, \
protobuf-native protobuf, \
,,\
"
PACKAGECONFIG[python3] = "\
-Dpython3-support=enabled, \
-Dpython3-support=disabled, \
python3 python3-numpy-native, \
,,\
"
PACKAGECONFIG[query] = "\
-Dnnstreamer-edge-support=enabled, \
-Dnnstreamer-edge-support=disabled, \
nnstreamer-edge, \
,,\
"
PACKAGECONFIG[tensorflow-lite] = "\
-Dtflite2-support=enabled, \
-Dtflite2-support=disabled, \
tensorflow-lite flatbuffers, \
,,\
"
PACKAGECONFIG[tvm] = "\
-Dtvm-support=enabled, \
-Dtvm-support=disabled, \
tvm, \
,,\
"
EXTRA_OEMESON += "\
-Denable-float16=true \
-Denable-test=true \
-Dinstall-test=true \
"
# FIXME: Remove this when the source warnings are fixed
CFLAGS += "-Wno-error"
do_install:append() {
rm -f ${D}/${bindir}/unittest-nnstreamer/tests/test_models/models/tvm_add_one.so_
}
PACKAGES =+ "\
${PN}-unittest \
${@bb.utils.contains('PACKAGECONFIG', 'flatbuf','${PN}-flatbuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'flatbuf grpc','${PN}-grpc-flatbuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'grpc','${PN}-grpc', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'protobuf','${PN}-protobuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'protobuf grpc','${PN}-grpc-protobuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'python3','${PN}-python3', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'query','${PN}-query', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'tensorflow-lite','${PN}-tensorflow-lite', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'tvm','${PN}-tvm', '', d)} \
"
RDEPENDS:${PN} = "\
gstreamer1.0-plugins-base \
"
RDEPENDS:${PN}-unittest = "gstreamer1.0-plugins-good nnstreamer ssat \
${@bb.utils.contains('PACKAGECONFIG', 'flatbuf','${PN}-flatbuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'flatbuf grpc','${PN}-grpc-flatbuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'grpc','${PN}-grpc', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'protobuf','${PN}-protobuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'protobuf grpc','${PN}-grpc-protobuf', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'python3','${PN}-python3', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'query','${PN}-query', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'tensorflow-lite','${PN}-tensorflow-lite', '', d)} \
${@bb.utils.contains('PACKAGECONFIG', 'tvm','${PN}-tvm', '', d)} \
"
# The libraries are unversioned
SOLIBS = ".so"
FILES_SOLIBSDEV = ""
FILES:${PN} += "\
${libdir}/gstreamer-1.0/lib*${SOLIBS} \
"
FILES:${PN}-flatbuf = "\
${libdir}/nnstreamer/converters/libnnstreamer_converter_flatbuf.so \
${libdir}/nnstreamer/converters/libnnstreamer_converter_flexbuf.so \
${libdir}/nnstreamer/decoders/libnnstreamer_decoder_flatbuf.so \
${libdir}/nnstreamer/decoders/libnnstreamer_decoder_flexbuf.so \
"
FILES:${PN}-grpc = "\
${libdir}/gstreamer-1.0/libnnstreamer-grpc.so \
"
FILES:${PN}-grpc-flatbuf = "\
${libdir}/libnnstreamer_grpc_flatbuf.so \
"
FILES:${PN}-grpc-protobuf = "\
${libdir}/libnnstreamer_grpc_protobuf.so \
"
FILES:${PN}-protobuf = "\
${libdir}/nnstreamer/converters/libnnstreamer_converter_protobuf.so \
${libdir}/nnstreamer/decoders/libnnstreamer_decoder_protobuf.so \
${libdir}/libnnstreamer_protobuf.so \
"
FILES:${PN}-python3 = "\
${libdir}/nnstreamer/converters/libnnstreamer_converter_python3.so \
${libdir}/nnstreamer/decoders/libnnstreamer_decoder_python3.so \
${libdir}/nnstreamer/filters/libnnstreamer_filter_python3.so \
${libdir}/nnstreamer_python3.so \
${PYTHON_SITEPACKAGES_DIR}/nnstreamer_python.so \
"
FILES:${PN}-query = "\
${libdir}/gstreamer-1.0/libgstedge.so \
"
FILES:${PN}-tensorflow-lite = "\
${libdir}/nnstreamer/filters/libnnstreamer_filter_tensorflow2-lite.so \
"
FILES:${PN}-tvm = "\
${libdir}/nnstreamer/filters/libnnstreamer_filter_tvm.so \
"
FILES:${PN}-unittest = "\
${bindir}/unittest-nnstreamer/* \
${libdir}/libnnstreamer_unittest_util.so \
${libdir}/libcppfilter_test.so \
${libdir}/nnstreamer/customfilters/* \
${libdir}/nnstreamer/unittest/* \
"
# Libraries are unversioned, and the main package requires the symlink
# /usr/lib/libnnstreamer.so -> /usr/lib64/gstreamer-1.0/libnnstreamer.so,
# so disable QA dev-so
INSANE_SKIP:${PN} = "dev-so"
# The python3 package requires the symlink /usr/lib/python3.13/site-packages/nnstreamer_python.so,
# so disable QA dev-so
INSANE_SKIP:${PN}-python3 = "dev-so"
# The unittest package /usr/bin/unittest-nnstreamer/tests/libnnstreamer-edge-custom-test.so is correct,
# so silence the QA error
INSANE_SKIP:${PN}-unittest = "libdir"
# The dbg package requires /usr/bin/unittest-nnstreamer/tests/.debug/libnnstreamer-edge-custom-test.so,
# so silence the QA error
INSANE_SKIP:${PN}-dbg = "libdir"
do_install:append() {
# Fixes: 076a78ea [TVM/test] Add models for more architectures
bash -c "shopt -s extglob;
rm -f ${D}/${bindir}/unittest-nnstreamer/tests/test_models/models/tvm_add_one_!(${HOST_ARCH}).so_;
shopt -u extglob;"
# Check if python3 is enabled then install python module
if ${@bb.utils.contains('PACKAGECONFIG', 'python3', 'true', 'false', d)}; then
install -d ${D}${PYTHON_SITEPACKAGES_DIR}/
ln -sf ${libdir}/nnstreamer_python3.so ${D}${PYTHON_SITEPACKAGES_DIR}/nnstreamer_python.so
fi
}
PACKAGE_ARCH = "${MACHINE_SOCARCH}"

View File

@ -3,7 +3,7 @@
#
# sysinfo
#
# Copyright (C) 2016-2026 by Digi International Inc.
# Copyright (C) 2016-2024 by Digi International Inc.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
@ -317,8 +317,6 @@ if grep -qs '\<digi,ccimx6ul\>' /proc/device-tree/compatible; then
MCA_NODE="/sys/bus/i2c/devices/0-007e"
elif grep -qs '\<digi,ccimx8\(x\|m\)\>' /proc/device-tree/compatible; then
MCA_NODE="/sys/bus/i2c/devices/0-0063"
elif grep -qs '\<digi,ccimx95\>' /proc/device-tree/compatible; then
MCA_NODE="/sys/bus/i2c/devices/7-0020"
fi
if [ -d "$MCA_NODE" ]; then
MCA_HW_VERSION=$(cat ${MCA_NODE}/hw_version 2>/dev/null | tr -d '\0') || MCA_HW_VERSION="??"