EDM-IMX95 VLS3 Camera Usage Guide
π Introductionβ
This article guides you how to set up Media Controller Framework for using VLS cameras on EDM-IMX95 EVM board.
For detailed camera setup instructions, please refer to the π EDM-IMX95 TEVS Camera Usage Guide. If anything in this article is unclear, that guide covers most of the configuration in depth.
This article uses the IMX95-EVM baseboard as an example, based on the π Yocto 5.0 (Scarthgap) 2025Q2 Release. The corresponding Linux kernel version is 6.6.52_2.2.0.
πΈ Supported Camera Modulesβ
Camera Series | Products |
---|---|
VLS3 | VLS3-AR0144 VLS3-AR0145 VLS3-AR0234 VLS3-AR0521 VLS3-AR0522 VLS3-AR0821 VLS3-AR0822 VLS3-AR1335 |
π§ Hardware Setup Instructionsβ
1. Prepare Accessories and Hardware Setupβ
The TechNexion IMX95-EVM kit supports FPD-Link III SerDes.
Each CSI interface can connect up to 4 camera channels, allowing a total of 8 cameras to stream simultaneously.
If you're using the CSI2 connector, make sure to set SW2 to "ON" to enable it.
Required Accessory: VizionLink-COAX1 Cableβ
Supports cable lengths up to 15 meters for stable camera streaming.

π» Prepare Yocto demo image for testing VLS camerasβ
Prepare demo image contains the required device tree blobs and camera drivers to probe FPD-Link III SerDes.
π½ Downloading the Demo Imageβ
Prebuilt demo images are available for download on TechNexion's official server.
Download Link:β
Included DTB Filesβ
The demo image supports 8-camera configurations with different LVDS panel sizes:
-
For 10.1" LVDS panel:
imx95-edm-evm-fusion-lvds-vl10112880.dtb
-
For 15.6" LVDS panel:
imx95-edm-evm-fusion-lvds-vl156192108.dtb
The mainline driver cannot automatically detect or ignore unused channels. The DTB must describe exactly which ports are connected. You can edit the DTB via the source code here: π GitHub β TechNexion DTB Source
πΈ VLS Camera Testing Instructionsβ
Specify Camera DTB in U-Bootβ
-
Connect the debug console cable to carrier board.
-
Power on the board and interrupt the boot process. Keep pressing
Enter
when the following message appears:Hit any key to stop autoboot:
-
Specify the appropriate device tree for your camera using the
fdtfile
environment variable in U-Boot:
# with 10.1 inch LVDS panel
u-boot=> setenv fdtfile imx95-edm-evm-fusion-lvds-vl10112880.dtb
# with 15.6 inch LVDS panel
u-boot=> setenv fdtfile imx95-edm-evm-fusion-lvds-vl156192108.dtb
- Save the settings and boot the system.
u-boot=> saveenv
u-boot=> boot
Setup the media controller before camera streamingβ
To verify that the camera has been properly connected and linked, use the media-ctl
command:
$ media-ctl -p
Get the media controller information and transfer to image, here is 8 VLS3 cameras with FPD-Link III SerDes :
Modify the route through the βcrossbarβ and enable all the channel :
$ media-ctl -R "'crossbar' [2/0 -> 5/0 [1], 2/1 -> 6/0 [1], 2/2 -> 7/0 [1], 2/3 -> 8/0 [1], 3/4 -> 9/0 [1], 3/5 -> 10/0 [1], 3/6 -> 11/0 [1], 3/7 -> 12/0 [1]]"
Set the route
$ media-ctl -R "'crossbar' [2/0 -> 5/0 [1], 2/1 -> 6/0 [1], 2/2 -> 7/0 [1], 2/3 -> 8/0 [1], 3/4 -> 9/0 [1], 3/5 -> 10/0 [1], 3/6 -> 11/0 [1], 3/7 -> 12/0 [1]]"
$ media-ctl -R '"ds90ub960 1-0030" [0/0 -> 4/0 [1], 1/0 -> 4/1 [1], 2/0 -> 4/2 [1], 3/0 -> 4/3 [1]]'
$ media-ctl -R '"ds90ub960 2-0030" [0/0 -> 4/4 [1], 1/0 -> 4/5 [1], 2/0 -> 4/6 [1], 3/0 -> 4/7 [1]]'
$ media-ctl -R '"csidev-4ad30000.csi" [0/0 -> 1/0 [1], 0/1 -> 1/1 [1], 0/2 -> 1/$
$ media-ctl -R '"csidev-4ad40000.csi" [0/4 -> 1/4 [1], 0/5 -> 1/5 [1], 0/6 -> 1/6 [1], 0/7 -> 1/7 [1]]'
$ media-ctl -R '"4ac10000.syscon:formatter@20" [0/0 -> 1/0 [1], 0/1 -> 1/1 [1], 0/2 -> 1/2 [1], 0/3 -> 1/3 [1]]'
$ media-ctl -R '"4ac10000.syscon:formatter@120" [0/4 -> 1/4 [1], 0/5 -> 1/5 [1], 0/6 -> 1/6 [1], 0/7 -> 1/7 [1]]'
Set the link
$ media-ctl -l "'ds90ub960 1-0030':4 -> 'csidev-4ad30000.csi':0 [1]"
$ media-ctl -l "'ds90ub960 2-0030':4 -> 'csidev-4ad40000.csi':0 [1]"
Here is a script for setting resolution.
#!/bin/bash
# Define the format and resolution as a variable
MEDIA_FMT="UYVY8_1X16/1280x720"
# Function to run media-ctl commands with error handling
run_media_ctl() {
local cmd="$1"
echo "Running: $cmd"
if ! $cmd; then
echo "Error: Command failed: $cmd"
fi
}
# Configure crossbar devices
echo "Configuring crossbar devices..."
for i in {0..3}; do
run_media_ctl "media-ctl -V 'crossbar':2/$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
for i in {4..7}; do
run_media_ctl "media-ctl -V 'crossbar':3/$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
# Configure mxc_isi devices (endpoint 0)
echo "Configuring mxc_isi devices (endpoint 0)..."
for dev in {0..7}; do
run_media_ctl "media-ctl -V 'mxc_isi.$dev':0 [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
# Configure formatter@20 endpoints
echo "Configuring formatter@20 endpoints..."
for i in {0..3}; do
run_media_ctl "media-ctl -V '4ac10000.syscon:formatter@20':0/$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
# Configure formatter@120 endpoints
echo "Configuring formatter@120 endpoints..."
for i in {4..7}; do
run_media_ctl "media-ctl -V '4ac10000.syscon:formatter@120':0/$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
# Configure csidev-4ad30000.csi endpoints 0-3
echo "Configuring csidev-4ad30000.csi endpoints 0-3..."
for i in {0..3}; do
run_media_ctl "media-ctl -V 'csidev-4ad30000.csi':0/$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
# Configure csidev-4ad40000.csi endpoints 4-7
echo "Configuring csidev-4ad40000.csi endpoints 4-7..."
for i in {4..7}; do
run_media_ctl "media-ctl -V 'csidev-4ad40000.csi':0/$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
# Configure ds90ub960 buses (1 and 2) with endpoints 0-3
echo "Configuring ds90ub960 buses..."
for bus in 1 2; do
for i in {0..3}; do
run_media_ctl "media-ctl -V 'ds90ub960 $bus-0030':$i [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
done
# Configure ds90ub953 buses (1 and 2) with addresses 44-47 (endpoint 0)
echo "Configuring ds90ub953 buses..."
for bus in 1 2; do
for addr in 44 45 46 47; do
run_media_ctl "media-ctl -V 'ds90ub953 $bus-00$addr':0 [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
done
# Configure tevs buses (8-15) with endpoint 0
echo "Configuring tevs buses..."
for bus in {8..15}; do
run_media_ctl "media-ctl -V 'tevs $bus-0048':0 [fmt:$MEDIA_FMT field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]"
done
π₯ Start Camera Video Stream via GStreamerβ
Launch GStreamer Pipelineβ
Specify the capture device you just get and start gstreamer to get video stream on screen.
$ gst-launch-1.0 v4l2src device=/dev/videoX ! "video/x-raw, format=YUY2, width=1280, height=720" ! waylandsink sync=false