Published on

Getting the Intel IPU6 Camera Working on Ubuntu

Authors

The Problem

I run a Dell Precision 5490 with an Intel Core Ultra 7 165H (Meteor Lake) as my daily driver on Ubuntu. Everything works great — except the webcam.

On Windows: plug and play. On Linux: nothing. No camera found. Not in Chrome, not in Zoom, not anywhere.

The reason? Intel ditched the standard USB Video Class (UVC) approach that basicall all webcams has used for the last 15+ years. They introduced the IPU6 (Image Processing Unit 6), which uses the same interface type used in smartphones.

The idea was reasonable: thinner laptops, lower power consumption, and better image processing through a dedicated ISP. The problem is that this architecture is fundamentally different from USB webcams, and Linux support has been painfully slow to materialize.

Instead of a simple "camera sends frames to the OS" model, you now have a complex pipeline involving the IPU6 hardware, a separate IVSC (Intel Visual Sensing Controller) for privacy features, proprietary firmware blobs, a userspace HAL library, and a v4l2loopback hack to make it look like a normal camera to applications.

On Windows, Intel provides a complete driver package. On Linux, you are on your own.

Identifying Your Hardware

First try figure out what you are actually dealing with. Open the terminal and run:

ls /sys/bus/i2c/devices
lspci -k -d 8086:a75d
sudo dmesg | grep -i ipu

In my case, the output revealed:

  • i2c-OVTI01A0:00 — the ov01a10 camera sensor (common in Dell business laptops)
  • i2c-VEN_0488:00 — the IVSC (Intel Visual Sensing Controller)
  • IPU6 hardware version 6, CSE authenticated and loaded

This tells you the kernel side is actually seeing the hardware. The problem lies in the userspace pipeline.

Step 1: Install the Kernel Modules

On Ubuntu 24.04, the IPU6 kernel modules are available as pre-built packages. Do not use the intel-ipu6-dkms package — it has known build issues on 24.04.

sudo apt-get install --no-install-recommends --yes \
  linux-generic-hwe-24.04 \
  linux-modules-ipu6-generic-hwe-24.04 \
  linux-modules-usbio-generic-hwe-24.04

Reboot after installing:

sudo reboot

Step 2: Install the Dell OEM Meta Package (Dell laptops only)

If you are running a Dell laptop, Canonical provides OEM-specific packages that configure the full camera stack. For my Dell Precision 5490, this was:

sudo apt install oem-somerville-oricorio-meta

This pulls in hardware support tailored to your specific Dell model, including the correct HAL library configuration.

After installing, check Software & Updates → Additional Drivers. You should see an option for "Using Dynamic loading plugin for IPU6 camera (ipu6epmtl)". Make sure this is selected and that the intel-ipu6-dkms option is not.

Reboot again.

Step 3: Install the Missing HAL Plugin

This is where I got stuck for a while. Even with the OEM meta package installed, the camera still was not found. Checking the system logs revealed the actual problem:

sudo dmesg | grep -i camhal

The error was:

CamHAL[ERR] load_camera_hal_library, failed to open library:
/usr/lib/libcamhal/plugins/ipu6epmtl.so: cannot open shared object file:
No such file or directory

The base libcamhal0 package was installed, but the actual Meteor Lake plugin was missing. The fix:

sudo apt install libcamhal-ipu6epmtl

Verify the plugin is now in place:

ls -la /usr/lib/libcamhal/plugins/

You should see ipu6epmtl.so.

Step 4: Fix the Resolution

Now the kernel stack is fully loaded and the HAL library is in place. When testing the the camera pipeline, it still fails:

sudo -E gst-launch-1.0 icamerasrc ! autovideosink

The error message says something about stream configuration not being supported for V4L2_PIX_FMT_NV12 (1920x1080). The ov01a10 sensor is only 1280x720. It cannot do 1080p.

Specify the correct resolution explicitly:

sudo -E gst-launch-1.0 icamerasrc buffer-count=7 ! \
  "video/x-raw,format=NV12,width=1280,height=720,framerate=30/1" ! \
  videoconvert ! autovideosink

If that runs and you see your face — congratulations, the camera works.

Step 5: Make It Usable for Apps

The GStreamer pipeline test proves that the hardware works, meanwhile apps like Chrome, Slack and teams does not know how to communicate with icamerasrc directly. They expect a standard Video4Linux device. The only solution if found was to relay the GStreamer stream into a v4l2loopback virtual camera device.

Ubuntu ships with a v4l2-relayd service that should handle this automatically. I experienced that it crashes in a loop on both Ubuntu and Linux Mint. If yours works — great, skip ahead. If not, here is the manual approach.

Create a Custom systemd Service

sudo tee /etc/systemd/system/ipu6-camera.service << 'EOF'
[Unit]
Description=Intel IPU6 Camera Relay
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/gst-launch-1.0 icamerasrc buffer-count=7 ! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! videoconvert ! v4l2sink device=/dev/video0
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

Disable the broken default service:

sudo systemctl disable v4l2-relayd@default.service
sudo systemctl daemon-reload

Set Up Aliases

I did not want this ervice running constantly. It had my camera LED stay on whenever the stream is active. Having this light shining in my face all day was not ideal.

Instead i opted in to control it manually with these shell aliases.

echo '' >> ~/.zshrc
echo '# IPU6 Camera controls' >> ~/.zshrc
echo 'alias cam-on="sudo systemctl start ipu6-camera.service"' >> ~/.zshrc
echo 'alias cam-off="sudo systemctl stop ipu6-camera.service"' >> ~/.zshrc
source ~/.zshrc

If you are using bash instead of zsh, add these to ~/.bashrc instead.

Now before a video call, just type cam-on. When you are done, cam-off. Not elegant, but it works reliably.

The Full Picture

To understand why all of this is necessary, here is what happens when you type cam-on:

  1. The systemd service starts gst-launch-1.0
  2. GStreamer loads icamerasrc, which talks to the IPU6 HAL library (ipu6epmtl.so)
  3. The HAL library communicates with the IPU6 hardware through the kernel driver
  4. The IVSC (Intel Visual Sensing Controller) powers on the camera sensor
  5. Raw frames come in from the ov01a10 sensor at 1280x720 NV12
  6. GStreamer converts the frames and pipes them into /dev/video0 via v4l2sink
  7. Applications see /dev/video0 as a normal webcam

On Windows, all of this is handled by a single Intel driver. On Linux, you are assembling the pipeline yourself.

Troubleshooting

If the camera is still not found after following these steps, here are some diagnostic commands:

# Check if IPU6 modules are loaded
sudo dmesg | grep -i ipu

# Check for the camera sensor
sudo dmesg | grep -i ov01a

# List video devices
v4l2-ctl --list-devices

# If v4l2-ctl is not installed
sudo apt install v4l-utils

# Check the HAL library
dpkg -l | grep -i camhal

# Check if the plugin directory exists
ls -la /usr/lib/libcamhal/plugins/

Common issues:

  • No /dev/video0: The v4l2loopback module is not loaded. Check lsmod | grep v4l2loopback.
  • HAL plugin missing: Make sure you installed libcamhal-ipu6epmtl (for Meteor Lake) or the correct variant for your CPU generation.
  • Resolution mismatch: Your sensor might support different resolutions. Try 1280x800 if 1280x720 does not work.
  • v4l2-relayd crash loop: Check systemctl status v4l2-relayd@default.service. If it is failing, use the custom service approach above.

Will It Get Better?

Slowly, Fedora is probably the best bet, according to various sources, Hans de Goede at Red Hat has been doing most of the heavy lifting on IPU6 support. Ubuntu is still catching up though.

Realistically, its probably going to be some time before it becomes plug and play in Ubuntu.