No camera image from /dev/video0 on Jetson Xavier NX with Arducam IMX477 stereo

I’ve got an Arducam B0397 IMX477 stereo array on a Jetson Xavier NX Developer Kit, and I can’t get any image out of /dev/video0. I’ve tried gstreamer, opencv, ffplay, and vlc - nothing shows a frame.

Gstreamer does detect video0, but the sensor modes/resolutions it reports are completely different from the Arducam quick start tutorial. And sometimes it just dies with:

nvbuf_utils: dmabuf_fd -1 mapped entry NOT found
nvbuf_utils: Can not get HW buffer from FD… Exiting…

Has anyone hit this before?

Can you share your Jetpack/L4T version and the output of uname -a? Also, how did you configure the board - did you use jetson-io.py? And what does v4l2-ctl --list-devices show when /dev/video0 is present?

Kernel version is 5.10.104-tegra-35.1.0-20220810203728, on a NVIDIA Jetson Xavier NX Developer Kit.

From an earlier thread: /dev/video0 only appears when I select ‘imx477 dual’ in jetson-io.py. In that earlier setup, gstreamer gave:

nvbuf_utils: dmabuf_fd -1 mapped entry NOT found
threadExecute:694 NvBufSurfaceFromFd failed

Your kernel 5.10.104-tegra-35.1.0 is Jetpack 5.x. On that version the Arducam install script fails with “Cannot find the corresponding deb package, please send the following information to Arducam support” - basically there is no matching deb for your release, so the driver never gets set up correctly.

I’d suggest downgrading to Jetpack 4.6.2 (R32.7.2) and running the imx477_stereo install script there.

I downgraded to Jetpack 4.6.2 (R32.7.2) and the imx477_stereo install script finally ran successfully.

But after reboot there’s still no image. I ran:
dmesg | grep -E “imx477|imx219|arducam”

And got:

[ 4.463544] imx219 9-0010: tegracam sensor driver:imx219_v2.0.6
[ 4.487155] imx219 9-0010: imx219_board_setup: error during i2c read probe (-121)
[ 4.487263] imx219 9-0010: board setup failed
[ 4.487339] imx219: probe of 9-0010 failed with error -121
[ 4.487729] imx219 10-0010: tegracam sensor driver:imx219_v2.0.6
[ 4.511016] imx219 10-0010: imx219_board_setup: error during i2c read probe (-121)
[ 4.511115] imx219 10-0010: board setup failed
[ 4.511203] imx219: probe of 10-0010 failed with error -121

So something is still wrong.

That output is the key clue. It’s probing imx219, not imx477 - the wrong sensor driver is being loaded. Both I2C addresses (9-0010 and 10-0010) fail board setup with read probe error -121, which means the IMX477 is not being detected/configured at all.

Arducam’s troubleshooting page explains this check: if your dmesg output matches their expected figure, the IMX-477 driver is installed; if it shows imx219 or “arducam” instead, the wrong driver is installed.

The Jetpack version you were on before (5.x) was also flagged as not compatible with this camera driver.

I decided to downgrade further to Jetpack 4.6.1 (L4T 32.7.3).

Now the environment looks like this:

  • DTS: tegra194-p3668-all-p3509-0000.dts
  • Sensor driver: imx477_v2.0.6
  • /dev/video0 is present

v4l2-ctl --list-devices now gives:

vi-output, imx477 10-001a (platform:15c10000.vi:2):
/dev/video0

So at least the imx477 driver is showing up now.

Progress. Can you check dmesg again for the imx477 lines on 4.6.1 and then run:

gst-launch-1.0 nvarguscamerasrc ! videoconvert ! autovideosink

Paste the full output - especially the “Available Sensor modes” section and anything after it.

dmesg shows this on 4.6.1:

[0.438912] DTS File Name: /var/jenkins_home/workspace/l_l4t-32.7.3-imx477-stereo-rpi_2/kernel/kernel-4.9/arch/arm64/boot/dts/…/…/…/…/…/…/hardware/nvidia/platform/t19x/jakku/kernel-dts/tegra194-p3668-all-p3509-0000.dts
[2.073025] imx477 9-001a: tegracam sensor driver:imx477_v2.0.6
[2.373534] imx477 9-001a: imx477_board_setup: error during i2c read probe (-121)
[2.373766] imx477 9-001a: board setup failed
[2.373971] imx477: probe of 9-001a failed with error -121
[2.374395] imx477 10-001a: tegracam sensor driver:imx477_v2.0.6
[4.119087] tegra194-vi5 15c10000.vi: subdev imx477 10-001a bound
[5140.195738] WARNING: CPU: 0 PID: 10462 at /var/jenkins_home/workspace/l_l4t-32.7.3-imx477-stereo-rpi_2/kernel/kernel-4.9/drivers/media/v4l2-core/videobuf2-core.c:1675 __vb2_queue_cancel+0x11c/0x188

Okay so 10-001a bound successfully, but 9-001a still fails the I2C read probe with -121. That’s one of the two cameras on the array not coming up. Let’s still see the gstreamer log - the nvarguscamerasrc output will tell us what modes the bound camera is exposing.

Here’s the gstreamer run:

gst-launch-1.0 nvarguscamerasrc ! videoconvert ! autovideosink

Setting pipeline to PAUSED …
Pipeline is live and does not need PREROLL …
Setting pipeline to PLAYING …
New clock: GstSystemClock
GST_ARGUS: Creating output stream
CONSUMER: Waiting until producer is connected…
GST_ARGUS: Available Sensor modes :
GST_ARGUS: 4056 x 3040 FR = 10.000000 fps Duration = 100000000 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;
GST_ARGUS: 2028 x 1520 FR = 40.000000 fps Duration = 25000000 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;
GST_ARGUS: 2028 x 1080 FR = 50.000000 fps Duration = 20000000 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;
GST_ARGUS: Running with following settings: Camera index = 0, Camera mode = 2, Output Stream W = 2028 H = 1080, seconds to Run = 0, Frame Rate = 50.000000
GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
nvbuf_utils: dmabuf_fd -1 mapped entry NOT found
nvbuf_utils: Can not get HW buffer from FD… Exiting…
CONSUMER: Done Success
Got EOS from element “pipeline0”.
Execution ended after 0:00:04.004534720
Setting pipeline to PAUSED …
Setting pipeline to READY …
GST_ARGUS: Cleaning up
GST_ARGUS: Done Success
Setting pipeline to NULL …
Freeing pipeline …

Two problems visible there.

  1. Your reported modes are:
  • 4056 x 3040 @ 10 fps
  • 2028 x 1520 @ 40 fps
  • 2028 x 1080 @ 50 fps

The Arducam quick start tutorial expects:

  • 4032 x 3040 @ 12.999999 fps
  • 1920 x 1080 @ 59.999999 fps
  • 2592 x 1944 @ 29.999999 fps
  • 2560 x 1440 @ 40.000000 fps

So the sensor modes don’t match what the IMX477 driver should be exposing. Combined with 9-001a failing -121 and the nvbuf_utils dmabuf_fd -1 error, the camera isn’t being set up correctly.

To summarize everything I’ve tried so far:

  • gstreamer, opencv, ffplay, vlc - none show an image
  • jetson-io.py - /dev/video0 only appears when ‘imx477 dual’ is selected
  • i2cset to try different modes on the Arducam hat
  • On Jetpack 4.6.2, imx477_stereo installed, but dmesg showed imx219 (9-0010 / 10-0010) board setup failed with -121
  • On Jetpack 4.6.1, imx477 binds on 10-001a, but 9-001a still fails -121 and gstreamer still dies with the nvbuf_utils errors

Is this a driver problem or a Jetpack problem?

I think the root cause is a known Jetpack 4.6.2 bug: cboot in R32.7.2 fails to read extlinux.conf. That’s why after installing imx477_stereo on 4.6.2, dmesg still showed imx219 being probed - the correct DTB wasn’t actually being applied.

See this NVIDIA forum thread for the details and the cboot fix:

The options are:

  1. Compile and replace cboot as described in that thread.
  2. Rewrite the system using SDKmanager.
  3. The simplest workaround: switch to a different Jetpack version.

On 4.6.1 the driver situation improved (imx477 on 10-001a, /dev/video0 present), but you still have 9-001a failing the I2C read probe with -121 and the sensor modes/nvbuf_utils failure. So the current conclusion is that the 4.6.2 cboot bug is the underlying cause, and the cleanest path is to change the Jetpack version, or apply the cboot fix and reflash.