Skip to main content

IMX8MM Camera Usage Guide

πŸš€ Introduction​

This guide shows you how to get started using TechNexion camera modules on TechNexion IMX8MM development kits. You must have the background knowledge to modify the kernel configuration, rebuild, and replace the kernel and the device tree source (DTS). This article is based on Yocto 6.0 (Wrynose) 2026Q3 Release with Linux kernel version 6.18.20-2.0.0.


πŸ“Έ Supported Camera Modules​

Camera SeriesProducts
TEVS
TEVS-AR0144
TEVS-AR0145
TEVS-AR0234
TEVS-AR0235
TEVS-AR0246
TEVS-AR0521
TEVS-AR0522
TEVS-AR0544
TEVS-AR0821
TEVS-AR0822
TEVS-AR0830
TEVS-AR1335
TEVS-AR2020
Camera Sensor Comparison
Example

This article uses the TEVS-AR0521 as an example.


🧩 Supported Boards​

SoMBoard
EDM-G-IMX8M-MINIWB-EDM-G-IMX8M-MINI
PICO-IMX8M-MINIPICO-PI-IMX8M-MINI
PICO-WIZARD-IMX8M-MINI

πŸ”§ Hardware Setup Instructions​

1. Power Supply Preparation​

  • Use a DC 5V or 12V power cable to supply power to the board.
  • If you are using FPD-Link III SerDes, use a 12V power adapter (minimum 3A) connected through the barrel jack.

2. Debug Console Connection​

  • Prepare a USB-to-UART cable when connecting to a PC.
  • Connect it to the CONSOLE1 connector.

3. Display Output Connection​

  • Prepare a panel for output display.
  • Connect it to the LVDS1 connector on the board.
About display

The provided DTBs include configuration for 10.1-inch and 15.6-inch LVDS display panels, as well as 5-inch MIPI panel.

This output is useful for verifying the camera stream on screen.

4. Camera Interface (CSI) Overview​

  • The board has one MIPI CSI-2 interface, CSI1.
  • It uses a 70-pin board-to-board connector manufactured by Hirose.
About camera

Although the board has two CSI interfaces, only CSI1 is enabled. The IMX8M-MINI only supports one MIPI CSI-2 interface.


πŸ’» Prepare Yocto demo image for testing TechNexion camera​

Use a Yocto demo image that includes the required device tree blobs and camera drivers.

πŸ”½ Downloading the Demo Image​

The prebuilt demo image is available on TechNexion's download server.

πŸ’Ύ Flashing the Image​

Flash the image to e.MMC or an SD card using one of these methods:

Method 1. Using the UUU Tool​

πŸ”— How to Flash with UUU

Boot Mode

Set the board to Serial Download Mode before flashing.

Method 2. Using the U-Boot UMS Command​

πŸ”— Using UMS in U-Boot

U-Boot Requirement

The board must boot a U-Boot version that supports the ums command.

Method 3. For Windows Users​

πŸ”— Using Balena Etcher


πŸ› οΈ Build Yocto​

TechNexion supports building a Yocto-based Linux image with the following kernel and branch.

πŸ“¦ Supported Linux Kernel​

Linux Kernel VersionYocto Branch
6.18.20tn-imx_6.18.20_2.0.0-stable

πŸ“ Source and Build Instructions​

Fetch Yocto Source


πŸ“Έ Camera Testing Instructions​

🌳 Specify Camera DTBO in U-Boot​

  1. Connect the debug console cable to the carrier board.
  2. Power on the board and interrupt boot when Hit any key to stop autoboot: appears.
  3. Set the camera overlay:
u-boot=> setenv dtoverlay tevs
  1. Continue booting.
u-boot=> saveenv
u-boot=> boot
tip

Append the display-panel overlay when you need on-screen camera output.

u-boot=> setenv dtoverlay=tevs sn65dsi84-vl10112880

πŸŽ›οΈ Setup the media controller before camera streaming​

Starting from kernel 6.12, the CSI driver supports media-ctl for configuring the pipeline on the i.MX8M Mini platform.

Inspect the media topology:

$ media-ctl -p

Example output:

Media controller API version 6.18.20

Media device information
------------------------
driver imx7-csi
model imx-media
serial
bus info platform:32e20000.csi
hw revision 0x0
driver version 6.18.20

Device topology
- entity 1: csi (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev0
pad0: SINK
[stream:0 fmt:UYVY8_2X8/640x480 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:lim-range]
<- "csis-32e30000.mipi-csi":1 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:UYVY8_2X8/640x480 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:lim-range]
-> "csi capture":0 [ENABLED,IMMUTABLE]

- entity 4: csi capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video2
pad0: SINK
<- "csi":1 [ENABLED,IMMUTABLE]

- entity 10: csis-32e30000.mipi-csi (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: SINK,MUST_CONNECT
[stream:0 fmt:UYVY8_1X16/640x480 field:none colorspace:smpte170m xfer:709 ycbcr:601 quantization:lim-range]
<- "tevs 1-0048":0 [ENABLED]
pad1: SOURCE,MUST_CONNECT
[stream:0 fmt:UYVY8_1X16/640x480 field:none colorspace:smpte170m xfer:709 ycbcr:601 quantization:lim-range]
-> "csi":0 [ENABLED,IMMUTABLE]

- entity 15: tevs 1-0048 (1 pad, 1 link, 0 routes)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev2
pad0: SOURCE
[stream:0 fmt:UYVY8_1X16/1280x800@1/60 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/1280x800
crop:(0,0)/1280x800]
-> "csis-32e30000.mipi-csi":0 [ENABLED]

The graph view can make the topology easier to understand.

note

Generate the graph with:

$ media-ctl --print-dot > graph.dot
$ dot -Tpng graph.dot > graph.png
# Install Graphviz if needed:
# sudo apt-get install -y graphviz

Set the resolution and format of every media entity to match the camera output. Check supported formats, resolutions, and frame intervals:

# formats
$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-mbus-codes
ioctl: VIDIOC_SUBDEV_ENUM_MBUS_CODE (pad=0,stream=0)
0x200f: MEDIA_BUS_FMT_UYVY8_1X16
0x300a: MEDIA_BUS_FMT_SGRBG10_1X10
0x3011: MEDIA_BUS_FMT_SGRBG12_1X12

# resolutions
$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-framesize code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_SIZE (pad=0,stream=0)
Size Range: 640x480 - 640x480
Size Range: 1280x720 - 1280x720
Size Range: 1280x960 - 1280x960
Size Range: 1920x1080 - 1920x1080
Size Range: 2560x1440 - 2560x1440
Size Range: 2592x1944 - 2592x1944

# frame interval of resolution
$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-frameintervals width=640,height=480,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.008s (120.000 fps)

$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-frameintervals width=1280,height=720,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.017s (60.000 fps)

$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-frameintervals width=1280,height=960,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.017s (60.000 fps)

$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-frameintervals width=1920,height=1080,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.017s (60.000 fps)

$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-frameintervals width=2560,height=1440,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.031s (32.000 fps)

$ v4l2-ctl -d /dev/v4l-subdev2 --list-subdev-frameintervals width=2592,height=1944,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.042s (24.000 fps)

Set the resolution to 1280Γ—720, for example:

$ media-ctl -V "'csi':0 [fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601]"
$ media-ctl -V "'tevs 1-0048':0 [fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601]"

πŸŽ₯ Start Camera Video Stream via GStreamer​

🎬 Launch GStreamer Pipeline​

Replace <res_w> and <res_h> with the selected resolution:

$ gst-launch-1.0 v4l2src device=/dev/video2 ! \
"video/x-raw, format=UYVY, width=<res_w>, height=<res_h>" ! \
waylandsink sync=false

βœ… Check Media Controller​

Run media-ctl -p again after setting the resolution and link:

Media controller API version 6.18.20

Media device information
------------------------
driver imx7-csi
model imx-media
serial
bus info platform:32e20000.csi
hw revision 0x0
driver version 6.18.20

Device topology
- entity 1: csi (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev0
pad0: SINK
[stream:0 fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:lim-range]
<- "csis-32e30000.mipi-csi":1 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:lim-range]
-> "csi capture":0 [ENABLED,IMMUTABLE]

- entity 4: csi capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video2
pad0: SINK
<- "csi":1 [ENABLED,IMMUTABLE]

- entity 10: csis-32e30000.mipi-csi (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: SINK,MUST_CONNECT
[stream:0 fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
<- "tevs 1-0048":0 [ENABLED]
pad1: SOURCE,MUST_CONNECT
[stream:0 fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
-> "csi":0 [ENABLED,IMMUTABLE]

- entity 15: tevs 1-0048 (1 pad, 1 link, 0 routes)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev2
pad0: SOURCE
[stream:0 fmt:UYVY8_1X16/1280x720@1/60 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/1280x800
crop:(0,0)/1280x720]
-> "csis-32e30000.mipi-csi":0 [ENABLED]

🚨 Troubleshooting​

Check DTB Overlay in U-Boot​

  u-boot=> printenv dtoverlay
dtoverlay=tevs vxt-vl050-070-8048nt
tip

The vxt-vl050-070-8048nt overlay is for the 5-inch LCD display panel.

Verify Camera Initialization​

  $ dmesg -t | grep tevs
/soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48: Fixed dependency cycle(s) with /soc@0/bus@32c00000/mipi-csi@32e30000
/soc@0/bus@32c00000/mipi-csi@32e30000: Fixed dependency cycle(s) with /soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48
/soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48: Fixed dependency cycle(s) with /soc@0/bus@32c00000/mipi-csi@32e30000
/soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48: Fixed dependency cycle(s) with /soc@0/bus@32c00000/mipi-csi@32e30000
/soc@0/bus@32c00000/mipi-csi@32e30000: Fixed dependency cycle(s) with /soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48
/soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48: Fixed dependency cycle(s) with /soc@0/bus@32c00000/mipi-csi@32e30000
/soc@0/bus@32c00000/mipi-csi@32e30000: Fixed dependency cycle(s) with /soc@0/bus@30800000/i2c@30a30000/tevs_mipi@48
tevs 1-0048: tevs_probe() device node: tevs_mipi@48
tevs 1-0048: Version:26.3.0.1
tevs 1-0048: Product:TEVS-AR0144, HeaderVer:3, MIPI_Rate:800
tevs 1-0048: Chip ID: 0x0356
tevs 1-0048: probe success

Confirm Board and Camera DTB​

  $ dmesg -t | grep -i model
Machine model: TechNexion EDM-G-IMX8MM and WB baseboard
exc3000 2-002a: Retry 1 get EETI EXC3000 model: -6
exc3000 2-002a: Retry 2 get EETI EXC3000 model: -6
exc3000 2-002a: Retry 3 get EETI EXC3000 model: -6

Check Available Video Devices​

$ v4l2-ctl --list-device

Example output:

imx-capture (platform:32e20000.csi):
/dev/video2
/dev/media0

vsi_v4l2dec (platform:vsi_v4l2dec):
/dev/video1

vsi_v4l2enc (platform:vsi_v4l2enc):
/dev/video0

Typically, /dev/video2 is the primary camera capture device when using CSI1.