***
### 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 usingfakesinkorfilesink(no Wayland involved), frames are not delivered, suggesting the issue is deeper than Wayland. -
The QMMF server logs confirm
CAM_START_DEV Successfor 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 datawarning), preventing the sensor from actually streaming pixel data despite the QMMF session opening successfully.
Request
-
Confirm whether IMX519 on CSI2 connector is officially supported on Ubuntu 20.04 Desktop build v1.0.180
-
Provide correct device tree configuration or updated OS image with proper GPIO/regulator settings for IMX519
-
Fix or provide a workaround for the
qtiqmmfsrcframe delivery issuePlease provide your Ubuntu version (eg. 24.04) and your OS Version if you have any software related issues.
***