IMX95 Aquila ISP usage Hello, I bought an Aquila IMX95 Evaluation Kit 2 with two ov5640 sensors (https://www.toradex.com/cart). I have the drivers for the sensors. The board is flashed correctly, with the isp module active : root@imx95-1:~# lsmod | grep -i isp neoisp 69632 0 The cameras are showing in libcamera : root@imx95-1:~# libcamera -sh: libcamera: command not found root@imx95-1:~# cam -l [17:17:31.010001558] [2747] INFO Camera camera_manager.cpp:327 libcamera v0.4.0+dirty (2026-06-03T11:26:44UTC) [17:17:31.044088474] [2748] WARN CameraSensor camera_sensor_legacy.cpp:354 'ov5640 4-003c': Recommended V4L2 control 0x009a0922 not supported [17:17:31.044159391] [2748] WARN CameraSensor camera_sensor_legacy.cpp:426 'ov5640 4-003c': The sensor kernel driver needs to be fixed [17:17:31.044178224] [2748] WARN CameraSensor camera_sensor_legacy.cpp:428 'ov5640 4-003c': See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information [17:17:31.044882558] [2748] WARN CameraSensor camera_sensor_legacy.cpp:594 'ov5640 4-003c': Failed to retrieve the camera location [17:17:31.044918891] [2748] WARN CameraSensor camera_sensor_legacy.cpp:616 'ov5640 4-003c': Rotation control not available, default to 0 degrees [17:17:31.045722599] [2748] WARN CameraSensor camera_sensor_legacy.cpp:354 'ov5640 3-003c': Recommended V4L2 control 0x009a0922 not supported [17:17:31.045762974] [2748] WARN CameraSensor camera_sensor_legacy.cpp:426 'ov5640 3-003c': The sensor kernel driver needs to be fixed [17:17:31.045783849] [2748] WARN CameraSensor camera_sensor_legacy.cpp:428 'ov5640 3-003c': See Documentation/sensor_driver_requirements.rst in the libcamera sources for more information [17:17:31.046362016] [2748] WARN CameraSensor camera_sensor_legacy.cpp:594 'ov5640 3-003c': Failed to retrieve the camera location [17:17:31.046388308] [2748] WARN CameraSensor camera_sensor_legacy.cpp:616 'ov5640 3-003c': Rotation control not available, default to 0 degrees [17:17:31.048068724] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.048640224] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.048904099] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.049145974] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.049451724] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.049694683] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.049937141] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.050184266] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.050477516] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.050720433] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.050962433] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.051201724] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.051441724] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.051683308] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.051925308] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.052259141] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.052510099] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.061185308] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.061469974] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.061736058] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.061988683] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.062242933] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.062489474] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.062733266] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.062980349] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.063228266] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.063470391] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.063712849] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.063953933] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.064216891] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.064463349] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.064706683] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.064958766] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 [17:17:31.065200974] [2748] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format AR30 Available cameras: 1: 'ov5640' (/base/soc/bus@42000000/i2c@42540000/camera@3c) 2: 'ov5640' (/base/soc/bus@42000000/i2c@426e0000/camera@3c) Just to check if the mipis are fine, I started a gstreamer pipeline and managed to get a stable 30fps stream on both cameras. I also managed to take snapshots with v4l2-ctl. Now, I'd like to test the Aquila's ISP with my cameras to see what it can do. Following the https://www.nxp.com/docs/en/user-guide/UG10215.pdf I added the environment variable : root@imx95-1:~# export LIBCAMERA_PIPELINES_MATCH_LIST='nxp/neo' But, doing so, the camera is not detected anymore by libcamera and I don't know why : root@imx95-1:~# cam -l [17:36:38.947430563] [2788] INFO Camera camera_manager.cpp:327 libcamera v0.4.0+dirty (2026-06-03T11:26:44UTC) Available cameras: root@imx95-1:~# Thank you for your reply ! Cordially, Re: IMX95 Aquila ISP usage After looking at your logs, I believe the issue is not related to the MIPI interfaces or the OV5640 driver itself.
The fact that:
both OV5640 cameras are detected by libcamera
GStreamer can stream at 30 fps
v4l2-ctl can capture images
indicates that the sensor drivers, I2C communication, CSI-2 links and media topology are all working correctly.
The key point is that the NXP Neo ISP pipeline expects a RAW Bayer sensor input.
OV5640 is a SoC image sensor with its own internal image processing pipeline, and in the NXP BSP it is typically used in YUV output mode (for example YUV422) rather than as a RAW Bayer sensor. In such a configuration, the camera can be used through the standard V4L2/libcamera pipeline, but it does not match the requirements of the Neo ISP pipeline.
This would explain why:
`cam -l` shows both OV5640 cameras by default
after setting
export LIBCAMERA_PIPELINES_MATCH_LIST='nxp/neo'
no cameras are detected anymore
The cameras are still present in the system, but the NEO pipeline handler cannot find a compatible camera topology and therefore exposes zero cameras to libcamera.
To verify the actual sensor output format, could you please provide the outputs of:
```bash media-ctl -p v4l2-ctl --list-formats-ext We are particularly interested in whether the sensor exposes any RAW Bayer formats such as: SBGGR8 SBGGR10 SRGGB10 RG10 BA10 If only YUV formats (for example YUYV/UYVY) are available, then the camera is not operating in RAW mode and cannot be processed by the Neo ISP pipeline. Although the OV5640 hardware is capable of RAW Bayer output, RAW support is not commonly enabled in BSP camera drivers, and the NXP Neo ISP stack also relies on sensor-specific tuning data. Even if RAW output can be enabled, the absence of a dedicated OV5640 tuning profile may prevent proper ISP operation (AE/AWB/image quality tuning). If your goal is to evaluate the Neo ISP framework itself, it may be easier to use a sensor that is known to work with the NXP ISP stack. Common candidates include:
OS08A20 OX03C10 OX05B1S AR0521 AR1335 (may require additional tuning work)
Could you share the output of the commands above? That will allow us to confirm whether the current OV5640 configuration is exposing RAW Bayer formats to the system. Best regards, Re: IMX95 Aquila ISP usage Thanks for the reply. I did some additional checks: You were right and the OV5640 was initially running in UYVY mode, but I manually switched one sensor to RAW Bayer (SRGGB8). media-ctl -p now shows: root@imx95-1:~# media-ctl -p
Media controller API version 6.12.55
Media device information
------------------------
driver mxc-isi
model FSL Capture Media Device
serial
bus info platform:4ad50000.isi
hw revision 0x0
driver version 6.12.55
Device topology
- entity 1: crossbar (13 pads, 11 links, 8 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev0
routes:
2/0 -> 5/0 [ACTIVE]
3/0 -> 6/0 [ACTIVE]
2/0 -> 7/0 [ACTIVE]
3/0 -> 8/0 [ACTIVE]
2/0 -> 9/0 [ACTIVE]
3/0 -> 10/0 [ACTIVE]
2/0 -> 11/0 [ACTIVE]
3/0 -> 12/0 [ACTIVE]
pad0: SINK,MUST_CONNECT
pad1: SINK,MUST_CONNECT
pad2: SINK,MUST_CONNECT
[stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
<- "4ac10000.syscon:formatter@20":1 [ENABLED,IMMUTABLE]
pad3: SINK,MUST_CONNECT
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
<- "4ac10000.syscon:formatter@120":1 [ENABLED,IMMUTABLE]
pad4: SINK,MUST_CONNECT
<- "mxc_isi.output":0 [ENABLED,IMMUTABLE]
pad5: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
-> "mxc_isi.0":0 [ENABLED,IMMUTABLE]
pad6: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
-> "mxc_isi.1":0 [ENABLED,IMMUTABLE]
pad7: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
-> "mxc_isi.2":0 [ENABLED,IMMUTABLE]
pad8: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
-> "mxc_isi.3":0 [ENABLED,IMMUTABLE]
pad9: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
-> "mxc_isi.4":0 [ENABLED,IMMUTABLE]
pad10: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
-> "mxc_isi.5":0 [ENABLED,IMMUTABLE]
pad11: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080 field:none]
-> "mxc_isi.6":0 [ENABLED,IMMUTABLE]
pad12: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
-> "mxc_isi.7":0 [ENABLED,IMMUTABLE]
- entity 15: 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
compose.bounds:(0,0)/1920x1080
compose:(0,0)/1920x1080]
<- "crossbar":5 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:YUV8_1X24/1920x1080 field:none
crop.bounds:(0,0)/1920x1080
crop:(0,0)/1920x1080]
-> "mxc_isi.0.capture":0 [ENABLED,IMMUTABLE]
- entity 18: mxc_isi.0.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video2
pad0: SINK
<- "mxc_isi.0":1 [ENABLED,IMMUTABLE]
- entity 26: mxc_isi.1 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev2
pad0: SINK
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none
compose.bounds:(0,0)/1920x1080
compose:(0,0)/1920x1080]
<- "crossbar":6 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:YUV8_1X24/1920x1080 field:none
crop.bounds:(0,0)/1920x1080
crop:(0,0)/1920x1080]
-> "mxc_isi.1.capture":0 [ENABLED,IMMUTABLE]
- entity 29: mxc_isi.1.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video3
pad0: SINK
<- "mxc_isi.1":1 [ENABLED,IMMUTABLE]
- entity 37: mxc_isi.2 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev3
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":7 [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.2.capture":0 [ENABLED,IMMUTABLE]
- entity 40: mxc_isi.2.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video4
pad0: SINK
<- "mxc_isi.2":1 [ENABLED,IMMUTABLE]
- entity 48: mxc_isi.3 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev4
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":8 [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.3.capture":0 [ENABLED,IMMUTABLE]
- entity 51: mxc_isi.3.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video5
pad0: SINK
<- "mxc_isi.3":1 [ENABLED,IMMUTABLE]
- entity 59: mxc_isi.4 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev5
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":9 [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.4.capture":0 [ENABLED,IMMUTABLE]
- entity 62: mxc_isi.4.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video6
pad0: SINK
<- "mxc_isi.4":1 [ENABLED,IMMUTABLE]
- entity 70: mxc_isi.5 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev6
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":10 [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.5.capture":0 [ENABLED,IMMUTABLE]
- entity 73: mxc_isi.5.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video7
pad0: SINK
<- "mxc_isi.5":1 [ENABLED,IMMUTABLE]
- entity 81: mxc_isi.6 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev7
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":11 [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.6.capture":0 [ENABLED,IMMUTABLE]
- entity 84: mxc_isi.6.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video8
pad0: SINK
<- "mxc_isi.6":1 [ENABLED,IMMUTABLE]
- entity 92: mxc_isi.7 (2 pads, 2 links, 0 routes)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev8
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":12 [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.7.capture":0 [ENABLED,IMMUTABLE]
- entity 95: mxc_isi.7.capture (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video9
pad0: SINK
<- "mxc_isi.7":1 [ENABLED,IMMUTABLE]
- entity 103: mxc_isi.output (1 pad, 1 link)
type Node subtype V4L flags 0
pad0: SOURCE
-> "crossbar":4 [ENABLED,IMMUTABLE]
- entity 110: 4ac10000.syscon:formatter@120 (2 pads, 2 links, 1 route)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev9
routes:
0/0 -> 1/0 [ACTIVE]
pad0: SINK
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
<- "csidev-4ad40000.csi":1 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
-> "crossbar":3 [ENABLED,IMMUTABLE]
- entity 115: 4ac10000.syscon:formatter@20 (2 pads, 2 links, 1 route)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev10
routes:
0/0 -> 1/0 [ACTIVE]
pad0: SINK
[stream:0 fmt:SRGGB8_1X8/1920x1080]
<- "csidev-4ad30000.csi":1 [ENABLED,IMMUTABLE]
pad1: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080]
-> "crossbar":2 [ENABLED,IMMUTABLE]
- entity 120: csidev-4ad30000.csi (2 pads, 2 links, 1 route)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev11
routes:
0/0 -> 1/0 [ACTIVE]
pad0: SINK
[stream:0 fmt:SRGGB8_1X8/1920x1080 colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
<- "ov5640 4-003c":0 [ENABLED]
pad1: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080 colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range]
-> "4ac10000.syscon:formatter@20":0 [ENABLED,IMMUTABLE]
- entity 125: csidev-4ad40000.csi (2 pads, 2 links, 1 route)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev12
routes:
0/0 -> 1/0 [ACTIVE]
pad0: SINK
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
<- "ov5640 3-003c":0 [ENABLED]
pad1: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080 field:none]
-> "4ac10000.syscon:formatter@120":0 [ENABLED,IMMUTABLE]
- entity 130: ov5640 4-003c (1 pad, 1 link, 0 routes)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev13
pad0: SOURCE
[stream:0 fmt:SRGGB8_1X8/1920x1080@1/30 colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/2624x1964
crop:(336,434)/1952x1088]
-> "csidev-4ad30000.csi":0 [ENABLED]
- entity 134: ov5640 3-003c (1 pad, 1 link, 0 routes)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev14
pad0: SOURCE
[stream:0 fmt:UYVY8_1X16/1920x1080@1/30 field:none colorspace:srgb xfer:srgb ycbcr:601 quantization:full-range
crop.bounds:(0,0)/2624x1964
crop:(336,434)/1952x1088]
-> "csidev-4ad40000.csi":0 [ENABLED] (The second OV5640 remains in UYVY mode for comparison) So : OV5640 -> SRGGB8 CSI -> SRGGB8 Formatter -> SRGGB8 Crossbar -> SRGGB8 => RAW Bayer is successfully propagated through the sensor, CSI and formatter. The neoisp kernel module is loaded: root@imx95-1:~# modprobe neoisp
root@imx95-1:~# lsmod | grep -i isp
neoisp 69632 0 An ISP node is present in the running device tree: /sys/firmware/devicetree/base/soc/isp@4ae00000 => However, I only see a single media device (/dev/media0) exposing the CSI/Formatter/ISI pipeline. No neoisp entity appears in the media graph. I do not see any neoisp entity in the media graph, and I do not know whether this is expected. => cam -l (libcamera) still returns no available cameras. At this point the RAW Bayer path appears functional, but I cannot identify where the Neo ISP becomes part of the active pipeline. How can I verify that the stream is actually processed by the Neo ISP rather than simply following the CSI -> Formatter -> ISI path? Also, is https://www.nxp.com/docs/en/user-guide/UG10215.pdf still the recommended guide for this setup, or is there a more specific reference for OV5640 + Neo ISP on i.MX95? Cordially, Re: IMX95 Aquila ISP usage My current suspicion is that one of the following is happening:
OV5640 is running in YUV mode rather than RAW Bayer mode (most likely).
The camera DT overlay is not the ISP-enabled variant.
The Neo IPA/calibration components are missing from the root filesystem.
The media topology seen by the Neo pipeline does not match the expected i.MX95 ISP graph.
The media-ctl -p output will usually pinpoint which of these is the actual issue. Re: IMX95 Aquila ISP usage Hello ! Here is the output : root@imx95-1:~# v4l2-ctl --list-formats-ext -d /dev/video2
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture Multiplanar
[0]: 'YUYV' (YUYV 4:2:2, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[1]: 'YUVA' (32-bit YUVA 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[2]: 'NV12' (Y/UV 4:2:0, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 2x2 - 4096x8190 with step 2/2
[3]: 'NM12' (Y/UV 4:2:0 (N-C), csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 2x2 - 4096x8190 with step 2/2
[4]: 'NV16' (Y/UV 4:2:2, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 2x1 - 4096x8191 with step 2/1
[5]: 'NM16' (Y/UV 4:2:2 (N-C), csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 2x1 - 4096x8191 with step 2/1
[6]: 'YM24' (Planar YUV 4:4:4 (N-C), csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[7]: 'RGBP' (16-bit RGB 5-6-5, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[8]: 'RGB3' (24-bit RGB 8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[9]: 'BGR3' (24-bit BGR 8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[10]: 'XR24' (32-bit BGRX 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[11]: 'AR24' (32-bit BGRA 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[12]: 'RA24' (32-bit ABGR 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[13]: 'AB24' (32-bit RGBA 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[14]: 'RX24' (32-bit XBGR 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[15]: 'XB24' (32-bit RGBX 8-8-8-8, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[16]: 'AR30' (32-bit ARGB 2-10-10-10, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[17]: 'GREY' (8-bit Greyscale, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[18]: 'Y10 ' (10-bit Greyscale, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[19]: 'Y12 ' (12-bit Greyscale, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[20]: 'Y14 ' (14-bit Greyscale, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[21]: 'BA81' (8-bit Bayer BGBG/GRGR, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[22]: 'GBRG' (8-bit Bayer GBGB/RGRG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[23]: 'GRBG' (8-bit Bayer GRGR/BGBG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[24]: 'RGGB' (8-bit Bayer RGRG/GBGB, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[25]: 'BG10' (10-bit Bayer BGBG/GRGR, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[26]: 'GB10' (10-bit Bayer GBGB/RGRG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[27]: 'BA10' (10-bit Bayer GRGR/BGBG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[28]: 'RG10' (10-bit Bayer RGRG/GBGB, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[29]: 'BG12' (12-bit Bayer BGBG/GRGR, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[30]: 'GB12' (12-bit Bayer GBGB/RGRG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[31]: 'BA12' (12-bit Bayer GRGR/BGBG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[32]: 'RG12' (12-bit Bayer RGRG/GBGB, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[33]: 'BG14' (14-bit Bayer BGBG/GRGR, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[34]: 'GB14' (14-bit Bayer GBGB/RGRG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[35]: 'GR14' (14-bit Bayer GRGR/BGBG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[36]: 'RG14' (14-bit Bayer RGRG/GBGB, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[37]: 'BYR2' (16-bit Bayer BGBG/GRGR, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[38]: 'GB16' (16-bit Bayer GBGB/RGRG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[39]: 'GR16' (16-bit Bayer GRGR/BGBG, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[40]: 'RG16' (16-bit Bayer RGRG/GBGB, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1
[41]: 'MJPG' (Motion-JPEG, compressed, csc-colorspace, csc-ycbcr, csc-quantization, csc-xfer-func)
Size: Stepwise 1x1 - 4096x8191 with step 1/1 If I read it correctly, camera does take raw bayer, and I configured it to aswell (hopefully I did it correctly). I'll try to flash again with another image to see if the issue is somewhere around there. Cordially, Re: IMX95 Aquila ISP usage Thank you for the update. The v4l2-ctl output confirms that the ISI capture node supports RAW Bayer formats, and the media-ctl -p output from your previous message already shows that the RAW Bayer path is correctly propagated through the pipeline:
OV5640 (SRGGB8) -> CSI (SRGGB8) -> Formatter (SRGGB8) -> Crossbar (SRGGB8)
So the sensor-side configuration looks correct.
The core issue now is that the neoisp module is loaded but does not appear in the media graph, and no /dev/media1 is created. This typically indicates that the neoisp driver loaded successfully as a kernel module but failed during device probe, which would prevent it from registering a media device.
Could you please provide the following diagnostic information:
# Check neoisp probe status
dmesg | grep -i neoisp
dmesg | grep -i "isp@4ae"
dmesg | grep -i "probe failed"
dmesg | grep -i "4ae00000"
# Confirm all available media devices
ls -la /dev/media*
# Check neoisp status in sysfs
ls /sys/bus/platform/drivers/nxp-neoisp/
cat /sys/firmware/devicetree/base/soc/isp@4ae00000/status
In parallel, we would also like to ask: do you have access to any of the following sensors that are officially supported by the NXP Neo ISP stack with complete tuning profiles?
OS08A20
OX03C10
OX05B1S
Testing with one of these sensors would allow us to quickly verify whether the Neo ISP driver itself is functioning correctly in your environment, and help isolate whether the issue is driver/environment-related or specific to the OV5640 configuration.
Note that while OV5640 is capable of RAW Bayer output, it does not have an official NXP Neo ISP tuning profile, which means even if the pipeline is connected correctly, AE/AWB and image quality tuning will not be available. Re: IMX95 Aquila ISP usage Some update: We checked this internally and would like to share the following observations regarding OV5640 and the i.MX95 Neo ISP pipeline. Although the OV5640 is capable of outputting RAW Bayer data, we generally do not recommend the OV5640 + Neo ISP combination for new designs for the following reasons:
OV5640 is already an end-of-life (EOL) sensor. Although RAW output is supported, the sensor itself provides only limited tunable controls compared to more recent RAW sensors. NXP's i.MX95 reference camera solution is based on RAW sensors such as OS08A20, which are already supported and validated within the Neo ISP software framework.
Therefore, our recommendation would be one of the following:
Use OV5640 together with its existing image processing path (without relying on Neo ISP AE/AWB tuning functionality). Use an NXP-supported RAW sensor such as OS08A20 if full Neo ISP functionality is required. If OV5640 must be used with the Neo ISP pipeline, additional software enablement work will be required.
For the OV5640 + Neo ISP approach, a libcamera CameraHelper needs to be implemented. The following file can be used as a starting reference: camera_helper_ov5640.cpp https://github.com/nxp-imx/libcamera/blob/lf-6.6.52_2.2.0/src/ipa/nxp/cam_helper/camera_helper_ov5640.cpp
Please note that this CameraHelper implementation is only the first step. Its primary purpose is to allow libcamera to recognize and identify the OV5640 sensor. Additional sensor-specific adaptation is still required. For example, if Neo ISP Auto Exposure (AE) is expected to work, APIs such as the sensor gain conversion functions need to be implemented. A simple example can be found in the IMX219 CameraHelper implementation: https://github.com/nxp-imx/libcamera/blob/lf-6.18.20_2.0.0/src/ipa/nxp/cam_helper/camera_helper_imx219.cpp In particular, the customer would need to determine and implement the mapping between:
Sensor gain code Real analog gain multiplier (gain value)
so that the Neo ISP AE algorithm can correctly control the sensor exposure and gain. For CameraHelper development details, please refer to the Camera Porting Guide: Section 5.3 – "Implementing a libcamera CameraHelper for a new sensor" One special consideration for OV5640 is that it already contains its own AE functionality. Therefore, if the intention is to continue using the sensor's internal AE instead of the Neo ISP AE algorithm, implementations such as gainCodeToGain() and gainToGainCode() may not be strictly required. In this case, a basic CameraHelper used only for sensor detection may be sufficient to bring up the pipeline. However, image quality tuning would still need to be evaluated and adjusted. Since OV5640 was not originally characterized and tuned as a Neo ISP reference sensor, additional ISP tuning work may be required to achieve optimal image quality.
Overall, while OV5640 RAW output can be connected to the i.MX95 Neo ISP pipeline, some sensor-specific libcamera and ISP integration work is expected. For new developments, we would recommend using a Neo ISP validated RAW sensor such as OS08A20 whenever possible.
Re: IMX95 Aquila ISP usage Following up on our previous discussion, we have investigated the root cause of the Neo ISP pipeline not recognizing the OV5640 sensor.
The issue is that the NXP Neo IPA (Image Processing Algorithm) framework uses a CameraHelper factory to look up sensor-specific gain/exposure algorithms by matching the kernel V4L2 subdev model string. Since no CameraHelper was registered for "ov5640" , the factory returned nullptr and the ISP pipeline could not be configured for this sensor.
To address this, we have implemented a CameraHelper for the OV5640 sensor based on the in-tree NXP kernel driver ( drivers/media/i2c/ov5640.c 😞
Gain register mapping:
Register: OV5640_REG_AEC_PK_REAL_GAIN ( 0x350a ), 10-bit value
Format: Q6.4 fixed point, unity gain = 16
gainCode(g) = round(g * 16)
gain(code) = code / 16.0
Two files have been modified:
camera_helper_ov5640.cpp – new CameraHelper implementation for OV5640, registered as "ov5640" to match the kernel subdev model string
meson.build – added camera_helper_ov5640.cpp to the build source list
Please rebuild libcamera with these two files and retry with LIBCAMERA_PIPELINES_MATCH_LIST='nxp/neo' . The Neo ISP pipeline should now be able to find and configure the OV5640 sensor.
Note that while this enables the gain/exposure control path, a full ISP tuning profile (AE/AWB parameters) for OV5640 is not yet available. Image quality tuning may still require further work.
Please let us know the results after rebuilding.
記事全体を表示