IMX519 CSI Camera: QMMF works but qtiqmmfsrc GStreamer plugin

***

### Environment

| **Device** | Particle Tachyon |

| **OS** | Ubuntu 20.04.6 LTS (Desktop build) |

| **OS Version** | 1.0.180 |

| **Kernel** | 5.4.219 |

| **Camera Module** | Sony IMX519 Autofocus Module (officially listed as supported) |

| **CSI Connector** | CSI2 (DSI/CSI combo connector) |

| **Connection** | SSH over Wi-Fi |

---

### Summary

The IMX519 camera module is physically connected to the CSI2 connector

and is correctly detected at the kernel level (sensor probe succeeds).

The underlying QMMF (Qualcomm Multimedia Framework) camera API also

works correctly as verified by qmmf_recorder_gtest. However, the

GStreamer `qtiqmmfsrc` plugin either fails to open the camera

(camera=1) or opens it but delivers zero frames to any sink (camera=0),

making it impossible to capture images or video from the CSI camera.

---

### Steps to Reproduce

**1. Hardware Setup**

- Sony IMX519 connected to CSI2 (DSI/CSI combo) connector via 22-pin

0.5mm FPC cable

- Battery connected

- GPIO 68 set to HIGH to enable CSI mode on the combo connector

**2. Enable CSI2 mode**

```bash

gpio.sh set 68 out 1

3. Set environment variable (as per official docs)

export XDG_RUNTIME_DIR=/run/user/root

4. Restart QMMF server

systemctl restart qmmf-server.service

5. Attempt camera capture with camera=1 (CSI2 per docs)

gst-launch-1.0 -e qtiqmmfsrc camera=1 \

! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \

! jpegenc \

! multifilesink location=/tmp/snapshot.jpg

6. Attempt camera capture with camera=0 (CSI1 per docs)

gst-launch-1.0 -e qtiqmmfsrc camera=0 \

! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 \

! jpegenc \

! multifilesink location=/tmp/snapshot.jpg


Observed Results

camera=1 immediately fails:

Setting pipeline to PAUSED ...

ERROR: Pipeline doesn't want to pause.

ERROR: from element /GstPipeline:pipeline0/GstQmmfSrc:qmmfsrc0:

   Failed to Open Camera!

camera=0 enters PLAYING state but produces no frames:

Setting pipeline to PAUSED ...

Pipeline is live and does not need PREROLL ...

Setting pipeline to PLAYING ...

New clock: GstSystemClock

[pipeline runs for 10+ seconds, then exits with 0-byte output file]


Kernel Logs (dmesg)

IMX519 is correctly detected on the second probe attempt:

[91.432548] CAM_ERR: CAM-SENSOR: cam_cci_i2c_read: rc = -22

[91.432551] CAM_WARN: CAM-SENSOR: cam_sensor_match_id:

         read id: 0x0 expected id 0x519

[91.701134] CAM_INFO: CAM-SENSOR: cam_sensor_driver_cmd: 970

         Probe success, slot:1, slave_addr:0x34, sensor_id:0x519

When camera=0 pipeline is running, dmesg confirms the sensor IS opened and started by QMMF:

CAM_INFO: CAM-SENSOR: cam_sensor_driver_cmd:

      CAM_ACQUIRE_DEV Success, sensor_id:0x519, sensor_slave_addr:0x34

CAM_INFO: CAM-SENSOR: cam_sensor_util_request_gpio_table: No GPIO data

CAM_INFO: CAM-SENSOR: cam_sensor_driver_cmd:

      CAM_START_DEV Success, sensor_id:0x519, sensor_slave_addr:0x34

However, the kernel also reports a GPIO warning:

CAM_INFO: CAM-SENSOR: cam_sensor_util_request_gpio_table: 1199 No GPIO data

CAM_INFO: CAM-SENSOR: msm_cam_sensor_handle_reg_gpio: 1931

      Input Parameters are not proper

Key Finding: QMMF API Works, qtiqmmfsrc Plugin Does Not

Running the Qualcomm QMMF recorder gtest directly confirms the underlying QMMF layer works correctly:

qmmf_recorder_gtest --gtest_filter=VideoGtest.StartStopCamera

# Result: 50/50 iterations PASSED

qmmf_recorder_gtest --gtest_filter=VideoGtest.SessionWithSingleStream

# Result: Successfully initializes 1920x1080 NV12 30fps stream

This proves the issue is isolated to the qtiqmmfsrc GStreamer plugin, not the QMMF framework itself.


Attempted Workarounds (All Failed)

Workaround Result
Start headless Weston compositor (wayland socket) and set WAYLAND_DISPLAY=wayland-0 Still no frames
Try all camera IDs (0, 1, 2, 3) Only camera=0 reaches PLAYING; all others fail immediately
Kill all processes holding /dev/video0, /dev/video1 No change
Full reboot + clean state test Reproducible on every boot
Python GStreamer appsink (gi.repository) Pipeline plays but appsink receives 0 buffers

Device Tree Observations

Active camera sensor slots in device tree:

  • CCI0 / cam-sensor1: status = enabled (sensor ID 0x3109 — not present)

  • CCI1 / cam-sensor3: status = enabled (sensor ID 0x519 — IMX519 ✓)

The IMX519 on CCI1 (CSI2) is probe-detected as slot:1.


Expected Result

The GStreamer pipeline with camera=1 (or whichever camera index corresponds to the CSI2/DSI connector) should deliver NV12 frames and allow image/video capture as documented.


Additional Notes

  • This issue appears related to the known caveat documented at
    https://developer.particle.io/tachyon/software/ubuntu_20_04/ubuntu-20.04-camera
    which states: "Known Issue: This is currently not working on the desktop build due to errors opening the waylandsink."
    However, even using fakesink or filesink (no Wayland involved), frames are not delivered, suggesting the issue is deeper than Wayland.

  • The QMMF server logs confirm CAM_START_DEV Success for the IMX519, but the GStreamer plugin does not forward any buffers downstream.

  • Suspected root cause: Missing GPIO power/reset configuration for IMX519 in device tree (No GPIO data warning), preventing the sensor from actually streaming pixel data despite the QMMF session opening successfully.


Request

  1. Confirm whether IMX519 on CSI2 connector is officially supported on Ubuntu 20.04 Desktop build v1.0.180

  2. Provide correct device tree configuration or updated OS image with proper GPIO/regulator settings for IMX519

  3. Fix or provide a workaround for the qtiqmmfsrc frame delivery issuePlease provide your Ubuntu version (eg. 24.04) and your OS Version if you have any software related issues.

***