IMX93 Camera Usage Guide
π Introductionβ
This guide shows you how to get started using TechNexion camera modules on TechNexion IMX93 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β
- TEVS Series
- TEVM Series
| Camera Series | Products |
|---|---|
| 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 Series | Products |
|---|---|
| TEVM | TEVM-AR0144 TEVM-AR0145 TEVM-AR0234 TEVM-AR0235 TEVM-AR0246 TEVM-AR0521 TEVM-AR0522 TEVM-AR0544 TEVM-AR0821 TEVM-AR0822 TEVM-AR0830 TEVM-AR1335 TEVM-AR2020 |

This article uses the TEVS-AR0822 as an example.
π§© Supported Boardsβ
| SoM | Board |
|---|---|
| EDM-IMX93 | EDM-WB-IMX93 |
| AXON-IMX93 | AXON-WB-IMX93 |
| PICO-IMX93 | PICO-SK |
π§ 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 LCD1 connector or LVDS1 connector on the board.
The provided DTBs include configuration for 10.1-inch and 15.6-inch LVDS display panels, as well as 5-inch and 8-inch LCD panels.
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.
π» 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.
Download Linkβ
- EDM-IMX93
- AXON-IMX93
- PICO-IMX93
πΎ Flashing the Imageβ
Flash the image to e.MMC or an SD card using one of these methods:
Method 1. Using the UUU Toolβ
Set the board to Serial Download Mode before flashing.
Method 2. Using the U-Boot UMS Commandβ
π Using UMS in U-Boot
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 Version | Yocto Branch |
|---|---|
| 6.18.20 | tn-imx_6.18.20_2.0.0-stable |
π Source and Build Instructionsβ
- EDM-IMX93
- AXON-IMX93
- PICO-IMX93
πΈ Camera Testing Instructionsβ
π³ Specify Camera DTBO in U-Bootβ
- Connect the debug console cable to the carrier board.
- Power on the board and interrupt boot when
Hit any key to stop autoboot:appears. - Set the camera overlay:
- CSI1 connector
u-boot=> setenv dtoverlay tevs
- Continue booting.
u-boot=> saveenv
u-boot=> boot
Append the display-panel overlay when you need on-screen camera output.
u-boot=> setenv dtoverlay=tevs vxt-vl050-070-8048nt
ποΈ Setup the media controller before camera streamingβ
Inspect the media topology:
$ media-ctl -p
Example output:
Media controller API version 6.18.20
Media device information
------------------------
driver mxc-isi
model FSL Capture Media Device
serial
bus info platform:4ae40000.isi
hw revision 0x0
driver version 6.18.20
Device topology
- entity 1: crossbar (3 pads, 3 links, 1 route)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev0
routes:
0/0 -> 2/0 [ACTIVE]
pad0: SINK,MUST_CONNECT
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:lim-range]
<- "csidev-4ae00000.csi":1 [ENABLED,IMMUTABLE]
pad1: SINK,MUST_CONNECT
<- "mxc_isi.output":0 [ENABLED,IMMUTABLE]
pad2: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:lim-range]
-> "mxc_isi.0":0 [ENABLED,IMMUTABLE]
- entity 5: mxc_isi.0 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: SINK
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none colorspace:jpeg xfer:srgb ycbcr:601 quantization:full-range
compose.bounds:(0,0)/1920x1080
compose:(0,0)/1920x1080]
<- "crossbar":2 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:YUV8_1X24/1920x1080 field:none colorspace:jpeg xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/1920x1080
crop:(0,0)/1920x1080]
-> "mxc_isi.0.capture":0 [ENABLED,IMMUTABLE]
- entity 8: mxc_isi.0.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video0
pad0: SINK
<- "mxc_isi.0":1 [ENABLED,IMMUTABLE]
- entity 16: mxc_isi.output (1 pad, 1 link)
type Node subtype V4L flags 0
pad0: SOURCE
-> "crossbar":1 [ENABLED,IMMUTABLE]
- entity 23: csidev-4ae00000.csi (2 pads, 2 links, 1 route)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev2
routes:
0/0 -> 1/0 [ACTIVE]
pad0: SINK
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none colorspace:smpte170m xfer:709 ycbcr:601 quantization:lim-range]
<- "tevs 1-0048":0 [ENABLED]
pad1: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none colorspace:smpte170m xfer:709 ycbcr:601 quantization:lim-range]
-> "crossbar":0 [ENABLED,IMMUTABLE]
- entity 28: tevs 1-0048 (1 pad, 1 link, 0 routes)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev3
pad0: SOURCE
[stream:0 fmt:UYVY8_1X16/640x480@1/60 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/3840x2160
crop:(0,0)/640x480]
-> "csidev-4ae00000.csi":0 [ENABLED]
The graph view can make the topology easier to understand.
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-subdev3 --list-subdev-mbus-codes
ioctl: VIDIOC_SUBDEV_ENUM_MBUS_CODE (pad=0,stream=0)
0x200f: MEDIA_BUS_FMT_UYVY8_1X16
# resolutions
$ v4l2-ctl -d /dev/v4l-subdev3 --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: 1920x1080 - 1920x1080
Size Range: 2560x1440 - 2560x1440
Size Range: 3840x2160 - 3840x2160
# frame interval of resolution
$ v4l2-ctl -d /dev/v4l-subdev3 --list-subdev-frameintervals width=640,height=480,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.017s (60.000 fps)
Interval: 0.033s (30.000 fps)
Interval: 0.067s (15.000 fps)
Interval: 0.100s (10.000 fps)
$ v4l2-ctl -d /dev/v4l-subdev3 --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)
Interval: 0.033s (30.000 fps)
Interval: 0.067s (15.000 fps)
Interval: 0.100s (10.000 fps)
$ v4l2-ctl -d /dev/v4l-subdev3 --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)
Interval: 0.033s (30.000 fps)
Interval: 0.067s (15.000 fps)
Interval: 0.100s (10.000 fps)
$ v4l2-ctl -d /dev/v4l-subdev3 --list-subdev-frameintervals width=2560,height=1440,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.033s (30.000 fps)
Interval: 0.050s (20.000 fps)
Interval: 0.067s (15.000 fps)
Interval: 0.100s (10.000 fps)
$ v4l2-ctl -d /dev/v4l-subdev3 --list-subdev-frameintervals width=3840,height=2160,code=0x200f
ioctl: VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL (pad=0,stream=0)
Interval: 0.067s (15.000 fps)
Interval: 0.100s (10.000 fps)
Interval: 0.125s (8.000 fps)
Interval: 0.200s (5.000 fps)
Set the resolution to 1280Γ720, for example:
- Command Line
- Script
$ media-ctl -V "'crossbar':0 [fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601]"
$ media-ctl -V "'mxc_isi.0':0 [fmt:UYVY8_1X16/1280x720 field:none colorspace:srgb xfer:srgb ycbcr:601]"
$ media-ctl -V "'csidev-4ae00000.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@1/30 field:none colorspace:srgb xfer:srgb ycbcr:601]"
#!/bin/bash
# Define the format and resolution as a variable
mdev="/dev/media0"
mediactl="media-ctl -d $mdev"
cam="tevs 1-0048"
csi="csidev-4ae00000.csi"
isi="mxc_isi.0"
code="UYVY8_1X16"
width="1280"
height="720"
fps="1/30"
format="fmt:${code}/${width}x${height}@${fps} field:none"
# Function to run media-ctl commands with error handling
echo "Reset media controller..."
$mediactl -r
echo "Set media controller..."
$mediactl -l "\"$cam\":0 -> \"$csi\":0 [1]"
$mediactl -V "\"$cam\":0 [$format]"
$mediactl -V "\"$csi\":0/0 [$format]"
$mediactl -V "\"crossbar\":0 [$format]"
$mediactl -V "\"$isi\":0 [$format]"
This script includes enabling the link between the TEVS and CSI device.
π₯ 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/video0 ! \
"video/x-raw, format=YUY2, width=<res_w>, height=<res_h>" ! \
waylandsink sync=false
π¨ Troubleshootingβ
Check DTB Overlay in U-Bootβ
- CSI1 connector
u-boot=> printenv dtoverlay
dtoverlay=tevs vxt-vl050-070-8048nt
The vxt-vl050-070-8048nt overlay is for the 5-inch LCD display panel.
Verify Camera Initializationβ
$ dmesg -t | grep tevs
/soc@0/bus@44000000/i2c@44350000/tevs@48: Fixed dependency cycle(s) with /soc@0/bus@42800000/csi@4ae00000
/soc@0/bus@42800000/csi@4ae00000: Fixed dependency cycle(s) with /soc@0/bus@44000000/i2c@44350000/tevs@48
/soc@0/bus@44000000/i2c@44350000/tevs@48: Fixed dependency cycle(s) with /soc@0/bus@42800000/csi@4ae00000
/soc@0/bus@44000000/i2c@44350000/tevs@48: Fixed dependency cycle(s) with /soc@0/bus@42800000/csi@4ae00000
/soc@0/bus@42800000/csi@4ae00000: Fixed dependency cycle(s) with /soc@0/bus@44000000/i2c@44350000/tevs@48
/soc@0/bus@44000000/i2c@44350000/tevs@48: Fixed dependency cycle(s) with /soc@0/bus@42800000/csi@4ae00000
/soc@0/bus@42800000/csi@4ae00000: Fixed dependency cycle(s) with /soc@0/bus@44000000/i2c@44350000/tevs@48
/soc@0/bus@42800000/csi@4ae00000: Fixed dependency cycle(s) with /soc@0/bus@44000000/i2c@44350000/tevs@48
/soc@0/bus@44000000/i2c@44350000/tevs@48: Fixed dependency cycle(s) with /soc@0/bus@42800000/csi@4ae00000
tevs 1-0048: tevs_probe() device node: tevs@48
tevs 1-0048: Version:26.3.0.1
tevs 1-0048: Product:TEVS-AR0822, HeaderVer:3, MIPI_Rate:800
tevs 1-0048: Chip ID: 0x0F56
tevs 1-0048: probe success
Confirm Board and Camera DTBβ
- EDM-IMX93
- AXON-IMX93
- PICO-IMX93
$ dmesg -t | grep -i model
Machine model: TechNexion EDM-IMX93 and WB baseboard
$ dmesg -t | grep -i model
Machine model: TechNexion AXON-IMX93 and WB baseboard
$ dmesg -t | grep -i model
Machine model: TechNexion PICO-IMX93 and SK baseboard
Check Available Video Devicesβ
$ v4l2-ctl --list-devices
Example output:
mxc-isi-cap (platform:4ae40000.isi):
/dev/video0
/dev/video1
/dev/media0
