The Impact Acquire runtime libraries (*.so) from the installation script for the target machine (*.sh) are sufficient for including the Impact Acquire framework into the embedded Linux distribution. The following chapter will demonstrate how to achieve this via the Yocto Project.
Yocto Project
The Yocto Project is an open-source framework that helps users to create a custom Linux distribution. To use Balluff imaging devices on the embedded system, Bitbake recipes are needed to package and install the Impact Acquire libraries which are already compiled by Balluff for the target system architecture into the embedded Linux image. In this example, we will guide you through:
- Package and install the Impact Acquire libraries for each device (i.e. BVS CA-BN, USB3 Vision™ devices, GigE Vision™ devices, Balluff USB2.0 cameras and Virtual Device support);
- Cross-compile, package and install the Impact Acquire sample programs;
- Configure and build the final image.
Install Impact Acquire Libraries
The Yocto Project uses a layer module (i.e. meta-layers
) to logically modulate and separate metadata in a build. Therefore, it's a good practice to create a meta-layer for the Impact Acquire framework packages and programs on top of the Linux distribution or on top of a BSP (Board Support Package) provided by the hardware manufacturer. Once the Yocto build environment and the base Linux distribution have been set, create a meta-layer in the source directory:
$ bitbake-layers create-layer meta-impact-acquire
Once the Impact Acquire meta-layer has been created, open the conf/bblayers.conf
file in the build directory and add the following line:
BBLAYERS += "${BSPDIR}/sources/meta-impact-acquire"
Now it's time to install the Impact Acquire common runtime libraries and device-specific runtime libraries.
Install Common Impact Acquire Libraries
There are some libraries that are needed by every Impact Acquire capture stack:
- libmvDeviceManager.so
- libmvImageProcessing.so
- libmvPropHandling.so
- libexpat.so
- libfreeimage.so
Therefore, if multiple device drivers are going to be installed on the target machine, it might be better to install these common libraries by a separate Bitbake recipe.
Since these runtime libraries are shipped in the Impact Acquire installation archive, the latest *.sh script for the target machine can be downloaded from the Balluff website (https://www.balluff.com/en-de/products/MP18308637). In this demonstration, the ImpactAcquire-arm64-linux-3.6.0.sh
for an arm64 platform will be used.
- Note
- Please download the *.sh file that is suitable for the imaging device and the target system architecture.
Now extract the Impact Acquire libraries from the installer and save them as a tgz archive. The installer may be used to do this by specifying the -x
or --extract
option.
./ImpactAcquire-arm64-linux-3.6.0.sh -x
Once the libraries have been extracted, navigate to the source directory, copy the new *.tgz file to the recipe directory and create a Bitbake recipe for installing the common runtime libraries:
$ cd meta-impact-acquire && mkdir -p recipes-impact-acquire/impact-acquire/files
$ cp -r /tmp/ImpactAcquire-arm64-3.6.0.tgz recipes-impact-acquire/impact-acquire/files/
$ touch recipes-impact-acquire/impact-acquire/impact-acquire-base_3.6.0.bb
The demo Bitbake recipe impact-acquire-base_3.6.0
looks like this:
SUMMARY = "Installs Impact Acquire base libraries"
DESCRIPTION = "This recipe installs Impact Acquire framework base libraries for all Balluff imaging and image capture devices."
HOMEPAGE = "https://www.balluff.com"
LICENSE_FLAGS = "EULA"
LICENSE_FLAGS_ACCEPTED = "EULA"
LICENSE = "EULA"
LIC_FILES_CHKSUM = "file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/doc/EULA.txt;md5=ef1e6eb67fc90b2450f752745bce0099"
PACKAGE_ARCH = "${MACHINE_ARCH}"
S = "${WORKDIR}"
SRC_URI = "file://ImpactAcquire-arm64-3.6.0.tgz"
TARGET = "arm64"
MVIA_SUBDIR = "opt/ImpactAcquire"
MVIA_LIB_SUBDIR = "lib/${TARGET}"
TOOLKITS_LIB_SUBDIR = "Toolkits"
MV_DATA_DIR = "opt/ImpactAcquire/data"
do_install() {
# install Impact Acquire runtime binaries
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${TOOLKITS_LIB_SUBDIR}/expat/bin/${TARGET}/lib
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${TOOLKITS_LIB_SUBDIR}/FreeImage-3.19.9/Dist/${TARGET}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvDeviceManager.so.${PV} ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvImageProcessing.so.${PV} ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvPropHandling.so.${PV} ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/${TOOLKITS_LIB_SUBDIR}/expat/bin/${TARGET}/lib/*.so.* ${D}${base_prefix}/${MVIA_SUBDIR}/${TOOLKITS_LIB_SUBDIR}/expat/bin/${TARGET}/lib
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/${TOOLKITS_LIB_SUBDIR}/FreeImage-3.19.9/Dist/${TARGET}/*.so ${D}${base_prefix}/${MVIA_SUBDIR}/${TOOLKITS_LIB_SUBDIR}/FreeImage-3.19.9/Dist/${TARGET}
# set environment variables for Impact Acquire
install -m 0755 -d ${D}${sysconfdir}/profile.d
echo 'export MVIMPACT_ACQUIRE_DIR=/opt/ImpactAcquire' >> ${D}${sysconfdir}/profile.d/acquire.sh
echo 'export MVIMPACT_ACQUIRE_DATA_DIR=/opt/ImpactAcquire/data' >> ${D}${sysconfdir}/profile.d/acquire.sh
# set library search paths for the dynamic linker
install -m 0755 -d ${D}${sysconfdir}/ld.so.conf.d
echo '/opt/ImpactAcquire/lib' >> ${D}${sysconfdir}/ld.so.conf.d/acquire.conf
echo '/opt/ImpactAcquire/Toolkits' >> ${D}${sysconfdir}/ld.so.conf.d/acquire.conf
# set up logfiles
install -m 0755 -d ${D}${base_prefix}/${MV_DATA_DIR}/logs
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/LogFileViewer/mvDebugFlags.mvd ${D}${base_prefix}/${MV_DATA_DIR}/logs/
}
INHIBIT_PACKAGE_STRIP = "1"
INSANE_SKIP:${PN} += "dev-so \
already-stripped \
ldflags"
PACKAGES = "${PN}-dbg ${PN} ${PN}-doc"
FILES:${PN} += "${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/lib*.so* \
${base_prefix}/${MVIA_SUBDIR}/${TOOLKITS_LIB_SUBDIR}/expat/bin/${TARGET}/lib/libexpat.so* \
${base_prefix}/${MVIA_SUBDIR}/${TOOLKITS_LIB_SUBDIR}/FreeImage-3.19.9/Dist/${TARGET}/lib*.so \
${sysconfdir}/profile.d/*.sh \
${sysconfdir}/ld.so.conf.d/*.conf"
FILES:${PN}-doc += "${base_prefix}/${MV_DATA_DIR}/logs"
- Note
- As a unique signature of a task's inputs, checksum indicates when the input data change. Therefore, it might be necessary to update the checksum of the license file if it has been changed. Run
md5sum [file_name]
to check the current MD5 checksum of the file and update it in the recipe.
After the recipe has been created, run bitbake
to build it:
$ bitbake impact-acquire-base
Install GenICam™ GenTL Specific Impact Acquire Libraries
Apart from the common Impact Acquire runtime libraries, the GenICam™ GenTL specific libraries need to be installed from the Impact Acquire installation archive in order to use USB3 Vision™ devices, GigE Vision™ devices or BVS CA-BN devices. Therefore, download the ImpactAcquire-ARM64_gnu-3.6.0.tgz
from the Balluff website (https://www.balluff.com/en-de/products/MP18308637). Assume the target platform is arm64
. Skip this step if the same *.tgz has been downloaded during the previous step Install Common Impact Acquire Libraries.
$ cp -r ~/Downloads/ImpactAcquire-ARM64_gnu-3.6.0.tgz recipes-impact-acquire/impact-acquire/files/
Create a Bitbake recipe for installing GenICam™ GenTL specific Impact Acquire libraries:
$ touch recipes-impact-acquire/impact-acquire/impact-acquire-gentl_3.6.0.bb
The demo Bitbake recipe impact-acquire-gentl_3.6.0
looks like this:
SUMMARY = "Installs GenICam GenTL specific Impact Acquire libraries"
DESCRIPTION = "This recipe installs Impact Acquire GenTL framework libraries for USB3 Vision, GigE Vision and BVS CA-BN (mvBlueNAOS) devices on ARM64 platforms."
HOMEPAGE = "https://www.balluff.com"
LICENSE_FLAGS = "EULA"
LICENSE_FLAGS_ACCEPTED = "EULA"
LICENSE = "EULA"
LIC_FILES_CHKSUM = "file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/doc/EULA.txt;md5=ef1e6eb67fc90b2450f752745bce0099"
PACKAGE_ARCH = "${MACHINE_ARCH}"
S = "${WORKDIR}"
SRC_URI = "file://ImpactAcquire-arm64-3.6.0.tgz"
TARGET = "arm64"
MVIA_SUBDIR = "opt/ImpactAcquire"
MVIA_LIB_SUBDIR = "lib/${TARGET}"
GENICAM_LIB_SUBDIR = "runtime"
MV_DATA_DIR = "opt/ImpactAcquire/data"
RDEPENDS:${PN} += "impact-acquire-base"
RDEPENDS:${PN} += "libusb1"
RDEPENDS:${PN} += "libudev"
do_install() {
# install Impact Acquire runtime binaries and dependencies for USB3 Vision, GigE Vision and BVS CA-BN devices.
install -m 0755 -d ${D}${base_prefix}
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}/bin/Linux64_ARM
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvGenTLConsumer.so* ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvGenTLProducer.so* ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvGenTLProducer.PCIe.so* ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libBVS_CA-BN.H.*.so ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libBVS_CA-BN.S.*.so ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/runtime/bin/Linux64_ARM/*.so ${D}${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}/bin/Linux64_ARM
# create softlink for libmvGenTLProducer
cd ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
ln -sf libmvGenTLProducer.so mvGenTLProducer.cti
ln -sf libmvGenTLProducer.PCIe.so mvGenTLProducer.PCIe.cti
# set environment variables for Impact Acquire GenICAM devices
install -m 0755 -d ${D}${sysconfdir}/profile.d
echo 'export GENICAM_ROOT=/opt/ImpactAcquire/runtime' >> ${D}${sysconfdir}/profile.d/genicam.sh
echo 'export GENICAM_ROOT_V3_5=/opt/ImpactAcquire/runtime' >> ${D}${sysconfdir}/profile.d/genicam.sh
echo 'export GENICAM_GENTL64_PATH=/opt/ImpactAcquire/lib' >> ${D}${sysconfdir}/profile.d/genicam.sh
echo 'export GENICAM_CACHE_V3_5=/opt/ImpactAcquire/runtime/cache/v3_5' >> ${D}${sysconfdir}/profile.d/genicam.sh
echo 'export GENICAM_LOG_CONFIG_V3_5=/opt/ImpactAcquire/runtime/log/config-unix/DefaultLogging.properties' >> ${D}${sysconfdir}/profile.d/genicam.sh
# set library search path for the dynamic linker
install -m 0755 -d ${D}${sysconfdir}/ld.so.conf.d
echo '/opt/ImpactAcquire/runtime/bin/Linux64_ARM' >> ${D}${sysconfdir}/ld.so.conf.d/genicam.conf
# define udev rules for USB3 Vision devices
install -m 0755 -d ${D}${sysconfdir}/udev/rules.d
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/52-mvbf3.rules ${D}${sysconfdir}/udev/rules.d/
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/52-U3V.rules ${D}${sysconfdir}/udev/rules.d/
# define udev rules for pcie cameras
install -m 0755 -d ${D}/usr/local/bin/
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/51-udev-pcie.rules ${D}${sysconfdir}/udev/rules.d/
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/make_device.sh ${D}/usr/local/bin/
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/device_namer.sh ${D}/usr/local/bin/
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/change_permissions.sh ${D}/usr/local/bin/
# install GenICam Cache and Logs
cp -r ${S}/ImpactAcquire-ARM64-${PV}/runtime/cache ${D}${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}
cp -r ${S}/ImpactAcquire-ARM64-${PV}/runtime/log ${D}${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}
# set up GenICam cache and xml file location
install -m 0755 -d ${D}${base_prefix}/${MV_DATA_DIR}/genicam
# increase usb core memory for USB3 Vision devices
echo 'sh -c "echo 128 > /sys/module/usbcore/parameters/usbfs_memory_mb"' > ${D}${sysconfdir}/profile.d/usbfs_memory.sh
# increase GigE buffer size for GigE Vision devices
install -m 0755 -d ${D}${sysconfdir}/sysctl.d
echo 'net.core.wmem_max=16777216' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.core.rmem_max=16777216' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.core.wmem_default=16777216' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.core.rmem_default=16777216' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.core.netdev_max_backlog=10000' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.ipv4.udp_mem=10240 87380 16777216' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.ipv4.conf.all.rp_filter=2' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
echo 'net.ipv4.conf.default.rp_filter=2' >> ${D}${sysconfdir}/sysctl.d/62-buffers-performance.conf
}
INHIBIT_PACKAGE_STRIP = "1"
INSANE_SKIP:${PN} += "dev-so \
already-stripped \
ldflags"
PACKAGES = "${PN}-dbg ${PN} ${PN}-doc"
FILES:${PN} += "${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/lib*.so* \
${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/*.cti \
${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/libBVS_CA-BN.H.*.so \
${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/libBVS_CA-BN.S.*.so \
${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}/bin/Linux64_ARM/lib*.so \
${sysconfdir}/profile.d/*.sh \
${sysconfdir}/ld.so.conf.d/*.conf \
${sysconfdir}/udev/rules.d/*.rules \
${sysconfdir}/sysctl.d/*.conf"
FILES:${PN}-doc += "/usr/local/bin/*.sh \
${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}/cache \
${base_prefix}/${MVIA_SUBDIR}/${GENICAM_LIB_SUBDIR}/log \
${base_prefix}/${MV_DATA_DIR}/genicam"
- Note
- As a unique signature of a task's inputs, checksum indicates when the input data change. Therefore, it might be necessary to update the checksum of the license file if it has been changed. Run
md5sum [file_name]
to check the current MD5 checksum of the file and update it in the recipe.
- When installing the Impact Acquire libraries for USB3 Vision™ devices, please make sure that libudev and libusb are present in the system BSP.
After the recipe has been created, run bitbake
to build it:
$ bitbake impact-acquire-gentl
Install the Impact Acquire PCIe Kernel Module
The Impact Acquire PCIe kernel module is needed in order to use BVS CA-BN devices. Before compiling the out-of-tree kernel module, run the configuration of the virtual kernel from the build directory to create a workspace directory containing the kernel source:
$ bitbake -c menuconfig virtual/kernel
- Note
- Since the Impact Acquire PCIe kernel module uses the userspace I/O driver, please make sure that it is marked as built-in or as module in the kernel configuration.
The source code of Impact Acquire PCIe kernel module is provided by the Impact Acquire installation archive ImpactAcquire-ARM64_gnu-3.6.0.tgz
(version >= 2.44.0) which can be downloaded from the Balluff website (https://www.balluff.com/en-de/products/MP18308637). Assume the target platform is arm64
. Skip this step if the same *.tgz has been downloaded during the previous step Install Common Impact Acquire Libraries.
$ cp -r ~/Downloads/ImpactAcquire-ARM64_gnu-3.6.0.tgz recipes-impact-acquire/impact-acquire/files/
Now navigate to the source directory and create a Bitbake recipe for installing the Impact Acquire kernel module:
$ touch recipes-impact-acquire/impact-acquire/mvpci-mod_3.6.0.bb
The demo Bitbake recipe mvpci-mod_3.6.0
looks like this:
SUMMARY = "Builds the BVS CA-BN (mvBlueNAOS) external Linux kernel module"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/kernelmodules/linux/PCIe/README.txt;md5=ef7c92a2141d1b613ae0072bf978cd85 \
file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/kernelmodules/linux/PCIe/LICENSES/GPL-2.0-or-later.txt;md5=3d26203303a722dedc6bf909d95ba815"
inherit module
SRC_URI = "file://ImpactAcquire-ARM64_gnu-3.6.0.tgz"
S = "${WORKDIR}/ImpactAcquire-ARM64-3.6.0/kernelmodules/linux/PCIe"
# The inherit of module.bbclass will automatically name module packages with
# "kernel-module-" prefix as required by the oe-core build environment.
RPROVIDES:${PN} += "kernel-module-mvpci"
- Note
- As a unique signature of a task's inputs, checksum indicates when the input data change. Therefore, it might be necessary to update the checksum of the license file if it has been changed. Run
md5sum [file_name]
to check the current MD5 checksum of the file and update it in the recipe.
After the recipe has been created, run bitbake
to build it:
Install USB2.0 specific Impact Acquire Libraries
Apart from the common Impact Acquire runtime libraries, the USB2.0 specific libraries need to be installed from the Impact Acquire installation archive in order to use BVS CA-MLC/-IGC devices. Therefore, download the ImpactAcquire-ARM64_gnu-3.6.0.tgz
from the Balluff website (https://www.balluff.com/en-de/products/MP18308637). Assume the target platform is arm64
. Skip this step if the same *.tgz has been downloaded during the previous step Install Common Impact Acquire Libraries.
$ cp -r ~/Downloads/ImpactAcquire-ARM64_gnu-3.6.0.tgz recipes-impact-acquire/impact-acquire/files/
Create a Bitbake recipe for installing USB2.0 specific Impact Acquire libraries:
$ touch recipes-impact-acquire/impact-acquire/impact-acquire-usb2_3.6.0.bb
The demo Bitbake recipe impact-acquire-usb2_3.6.0
looks like this:
SUMMARY = "Installs USB2.0 specific Impact Acquire libraries"
DESCRIPTION = "This recipe installs Impact Acquire USB2.0 framework libraries for Balluff BVS CA-MLC/-IGC cameras."
HOMEPAGE = "https://www.balluff.com"
LICENSE_FLAGS = "EULA"
LICENSE_FLAGS_ACCEPTED = "EULA"
LICENSE = "EULA"
LIC_FILES_CHKSUM = "file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/doc/EULA.txt;md5=ef1e6eb67fc90b2450f752745bce0099"
PACKAGE_ARCH = "${MACHINE_ARCH}"
S = "${WORKDIR}"
SRC_URI = "file://ImpactAcquire-arm64-3.6.0.tgz"
TARGET = "arm64"
MVIA_SUBDIR = "opt/ImpactAcquire"
MVIA_LIB_SUBDIR = "lib/${TARGET}"
RDEPENDS:${PN} += "impact-acquire-base"
RDEPENDS:${PN} += "libusb1"
do_install() {
# install Impact Acquire runtime binaries and dependencies for BVS CA-MLC/-IGC devices
install -m 0755 -d ${D}${base_prefix}
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvBlueFOX.so* ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
# define udev rules for BVS CA-MLC/-IGC devices
install -m 0755 -d ${D}${sysconfdir}/udev/rules.d
install -m 0755 ${S}/ImpactAcquire-ARM64-${PV}/Scripts/51-mvbf.rules ${D}${sysconfdir}/udev/rules.d/
}
INHIBIT_PACKAGE_STRIP = "1"
INSANE_SKIP:${PN} += "dev-so \
already-stripped \
ldflags"
PACKAGES = "${PN}-dbg ${PN}"
FILES:${PN} += "${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/lib*.so* \
${sysconfdir}/udev/rules.d/*.rules"
- Note
- As a unique signature of a task's inputs, checksum indicates when the input data change. Therefore, it might be necessary to update the checksum of the license file if it has been changed. Run
md5sum [file_name]
to check the current MD5 checksum of the file and update it in the recipe.
- When installing the Impact Acquire libraries for USB2.0 specific devices, please make sure that libudev and libusb are present in the system BSP.
After the recipe has been created, run bitbake
to build it:
$ bitbake impact-acquire-usb2
Install Virtual Device Specific Impact Acquire Libraries
Apart from the common Impact Acquire runtime libraries, the virtual device specific libraries need to be installed from either the Impact Acquire installation archive in order to use the virtual device. In this example, the ImpactAcquire-ARM64_gnu-3.6.0.tgz
will be downloaded and used. Assume the target platform is arm64
. Skip this step if the same *.tgz has been downloaded during the previous step Install Common Impact Acquire Libraries or Install GenICam™ GenTL Specific Impact Acquire Libraries.
$ cp -r ~/Downloads/ImpactAcquire-ARM64_gnu-3.6.0.tgz recipes-impact-acquire/impact-acquire/files/
Create a Bitbake recipe for installing Balluff virtual device specific Impact Acquire libraries:
$ touch recipes-impact-acquire/impact-acquire/impact-acquire-virtualdevice_3.6.0.bb
The demo Bitbake recipe impact-acquire-virtualdevice_3.6.0
looks like this:
SUMMARY = "Installs virtual device specific Impact Acquire libraries"
DESCRIPTION = "This recipe installs Impact Acquire driver libraries for virtual devices."
HOMEPAGE = "https://www.balluff.com"
LICENSE_FLAGS = "EULA"
LICENSE_FLAGS_ACCEPTED = "EULA"
LICENSE = "EULA"
LIC_FILES_CHKSUM = "file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/doc/EULA.txt;md5=ef1e6eb67fc90b2450f752745bce0099"
PACKAGE_ARCH = "${MACHINE_ARCH}"
S = "${WORKDIR}"
SRC_URI = "file://ImpactAcquire-ARM64_gnu-3.6.0.tgz"
TARGET = "arm64"
MVIA_SUBDIR = "opt/ImpactAcquire"
MVIA_LIB_SUBDIR = "lib/${TARGET}"
RDEPENDS:${PN} += "impact-acquire-base"
do_install() {
# install Impact Acquire runtime binaries and dependencies for virtual devices.
install -m 0755 -d ${D}${base_prefix}
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
oe_soinstall ${S}/ImpactAcquire-ARM64-${PV}/lib/${TARGET}/libmvVirtualDevice.so.${PV} ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}
}
INHIBIT_PACKAGE_STRIP = "1"
INSANE_SKIP:${PN} += "dev-so \
already-stripped \
ldflags"
PACKAGES = "${PN}"
FILES:${PN} += "${base_prefix}/${MVIA_SUBDIR}/${MVIA_LIB_SUBDIR}/lib*.so*"
- Note
- As a unique signature of a task's inputs, checksum indicates when the input data change. Therefore, it might be necessary to update the checksum of the license file if it has been changed. Run
md5sum [file_name]
to check the current MD5 checksum of the file and update it in the recipe.
After the recipe has been created, run bitbake
to build it:
$ bitbake impact-acquire-virtualdevice
Cross-Compile Impact Acquire Sample Programs
After the required Impact Acquire framework packages have been successfully built, user application programs using the Impact Acquire API can be built by Bitbake. Since the Impact Acquire installation archive already provides sample program source code with CMake files and Bitbake supports CMake, it can be used to cross-compile these programs.
First, create a Bitbake recipe for cross-compiling the sample programs:
$ touch recipes-impact-acquire/impact-acquire/impact-acquire-examples_3.6.0.bb
All source code is shipped with ImpactAcquire-ARM64_gnu-3.6.0.tgz
and is located under its apps
directory.
Here is how the demo recipe impact-acquire-examples_3.6.0.bb
looks like:
SUMMARY = "Builds and installs Impact Acquire sample programs"
DESCRIPTION = "This recipe builds and installs Impact Acquire sample programs."
HOMEPAGE = "https://www.balluff.com"
LICENSE_FLAGS = "EULA"
LICENSE_FLAGS_ACCEPTED = "EULA"
LICENSE = "EULA"
LIC_FILES_CHKSUM = "file://${WORKDIR}/ImpactAcquire-ARM64-3.6.0/doc/EULA.txt;md5=ef1e6eb67fc90b2450f752745bce0099"
SRC_URI = "file://ImpactAcquire-ARM64_gnu-3.6.0.tgz"
PACKAGE_ARCH = "${MACHINE_ARCH}"
S = "${WORKDIR}/ImpactAcquire-ARM64-${PV}/apps"
MVIA_SUBDIR = "opt/ImpactAcquire"
MVIA_APP_SUBDIR = "apps"
RDEPENDS:${PN} += "impact-acquire-base"
export MVIMPACT_ACQUIRE_DIR="${WORKDIR}/ImpactAcquire-ARM64-${PV}/"
export LDFLAGS="${TARGET_LDFLAGS} \
-Wl,-rpath-link,${MVIMPACT_ACQUIRE_DIR}lib/arm64 \
-Wl,-rpath-link,${MVIMPACT_ACQUIRE_DIR}Toolkits/expat/bin/arm64/lib"
do_softlink() {
cd ${MVIMPACT_ACQUIRE_DIR}Toolkits/expat/bin/arm64/lib
ln -sf libexpat.so.1.* libexpat.so.1
ln -sf libexpat.so.1 libexpat.so
}
addtask softlink after do_fetch before do_configure
inherit pkgconfig cmake
do_install() {
install -m 0755 -d ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_APP_SUBDIR}
install -m 0755 ${WORKDIR}/build/bin/* ${D}${base_prefix}/${MVIA_SUBDIR}/${MVIA_APP_SUBDIR}
}
FILES:${PN} += "${base_prefix}/${MVIA_SUBDIR}/${MVIA_APP_SUBDIR}/*"
- Note
- As a unique signature of a task's inputs, checksum indicates when the input data change. Therefore, it might be necessary to update the checksum of the license file if it has been changed. Run
md5sum [file_name]
to check the current MD5 checksum of the file and update it in the recipe.
After the recipe has been created, run bitbake
to build it:
$ bitbake impact-acquire-examples
- Note
- In order for the Impact Acquire CMake to be correctly configured, it might be necessary to set the
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
variable to BOTH
in the cmake.bbclass
file.
Configure and Build the Image
To include the Impact Acquire framework to the custom Linux image, append the required package in the conf/layer.conf
file. For instance, to install all the packages mentioned above:
$ echo "IMAGE_INSTALL:append = \"impact-acquire-base\"" >> meta-impact-acquire/conf/layer.conf
$ echo "IMAGE_INSTALL:append = \"impact-acquire-gentl\"" >> meta-impact-acquire/conf/layer.conf
$ echo "IMAGE_INSTALL:append = \"impact-acquire-usb2\"" >> meta-impact-acquire/conf/layer.conf
$ echo "IMAGE_INSTALL:append = \"impact-acquire-virtualdevice\"" >> meta-impact-acquire/conf/layer.conf
$ echo "IMAGE_INSTALL:append = \"impact-acquire-examples\"" >> meta-impact-acquire/conf/layer.conf
$ echo "MACHINE_EXTRA_RRECOMMENDS += \"kernel-module-mvpci\"" >> meta-impact-acquire/conf/layer.conf
After that, bitbake
the image to build it for the target system.