Dual IMX477 Cameras with Jetson Orin Nano J401 Board?

TLDR: I cam0 doesn’t seem to work with an imx477 on the J401, any help before I just return them all for a refund would be appreciated.

I have a Jetson Orin Nano 4GB, Seeed J401 carrier board, and two Raspberry Pi HQ cameras. Both the cameras have been modified to remove R8 and they both work when connected to CAM1, but not CAM0.

Image installed is the Jetpack 6.2 release from the J401 installation guide.
Install info:

dev@jetson:~$ uname -r
5.15.148-tegra
dev@jetson:~$ cat /etc/nv_tegra_release
# R36 (release), REVISION: 4.3, GCID: 38968081, BOARD: generic, EABI: aarch64, DATE: Wed Jan  8 01:49:37 UTC 2025
# KERNEL_VARIANT: oot
TARGET_USERSPACE_LIB_DIR=nvidia
TARGET_USERSPACE_LIB_DIR_PATH=usr/lib/aarch64-linux-gnu/nvidia
# Seeed Image Name mfi_recomputer-orin-nano-4g-j401-6.2-36.4.3-2025-04-07.tar.gz
# branch R36.4.3
# commit ID 9ce36c44b035ab3e3207e336ff632f460a48efb5

I have used the jetson-io tool to configure the CSI ports, and the following is the listing from dmesg which looks like it’s loading both cameras fine when they are both connected.

[    8.512467] imx477 9-001a: parsing for mode0 props
[    8.512477] imx477 9-001a: pixel_clock.val = 300000000
[    8.512480] imx477 9-001a: serdes_link_freq err: -61
[    8.512481] imx477 9-001a: serdes_pixel_clock.val = 0
[    8.512483] imx477 9-001a: serdes_pixel_clock.val = 0 phy_mode = 0   num_lanes = 2   depth = 10  mipi_clock = 750000000
[    8.512499] imx477 9-001a: parsing for mode1 props
[    8.512503] imx477 9-001a: pixel_clock.val = 300000000
[    8.512504] imx477 9-001a: serdes_link_freq err: -61
[    8.512505] imx477 9-001a: serdes_pixel_clock.val = 0
[    8.512506] imx477 9-001a: serdes_pixel_clock.val = 0 phy_mode = 0   num_lanes = 2   depth = 10  mipi_clock = 750000000
[    8.512531] imx477 9-001a: tegracam sensor driver:imx477_v2.0.6
[    8.813672] tegra-camrtc-capture-vi tegra-capture-vi: subdev imx477 9-001a bound
[    8.847186] imx477 10-001a: parsing for mode0 props
[    8.847198] imx477 10-001a: pixel_clock.val = 300000000
[    8.847200] imx477 10-001a: serdes_link_freq err: -61
[    8.847201] imx477 10-001a: serdes_pixel_clock.val = 0
[    8.847203] imx477 10-001a: serdes_pixel_clock.val = 0 phy_mode = 0   num_lanes = 2   depth = 10  mipi_clock = 750000000
[    8.847218] imx477 10-001a: parsing for mode1 props
[    8.847222] imx477 10-001a: pixel_clock.val = 300000000
[    8.847224] imx477 10-001a: serdes_link_freq err: -61
[    8.847225] imx477 10-001a: serdes_pixel_clock.val = 0
[    8.847227] imx477 10-001a: serdes_pixel_clock.val = 0 phy_mode = 0   num_lanes = 2   depth = 10  mipi_clock = 750000000
[    8.847249] imx477 10-001a: tegracam sensor driver:imx477_v2.0.6
[    9.148385] tegra-camrtc-capture-vi tegra-capture-vi: subdev imx477 10-001a bound

I have used these command to test the cameras,

gst-launch-1.0 nvarguscamerasrc sensor-id=0 sensor-mode=0 ! 'video/x-raw(memory:NVMM),width=1920, height=1080, framerate=20/1, format=NV12' ! nvvidconv ! xvimagesink
gst-launch-1.0 nvarguscamerasrc sensor-id=1 sensor-mode=0 ! 'video/x-raw(memory:NVMM),width=1920, height=1080, framerate=20/1, format=NV12' ! nvvidconv ! xvimagesink

Console output of CAM0 test

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
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: 3840 x 2160 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1920 x 1080 FR = 59.999999 fps Duration = 16666667 ; 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  = 0
   Output Stream W = 3840 H = 2160
   seconds to Run    = 0
   Frame Rate = 29.999999
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
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadExecute:734 NvBufSurfaceFromFd Failed.
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadFunction:245 (propagating)
ERROR: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: Output window was closed
Additional debug info:
../sys/xvimage/xvimagesink.c(568): gst_xv_image_sink_handle_xevents (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0
Execution ended after 0:00:03.269928012
Setting pipeline to NULL ...
GST_ARGUS: Cleaning up
GST_ARGUS: Done Success
Freeing pipeline ...

Console output of CAM1 test

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
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: 3840 x 2160 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1920 x 1080 FR = 59.999999 fps Duration = 16666667 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: Running with following settings:
   Camera index = 1
   Camera mode  = 0
   Output Stream W = 3840 H = 2160
   seconds to Run    = 0
   Frame Rate = 29.999999
GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
Redistribute latency...
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: Pipeline construction is invalid, please add queues.
Additional debug info:
../libs/gst/base/gstbasesink.c(1249): gst_base_sink_query_latency (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
Not enough buffering available for  the processing deadline of 0:00:00.015000000, add enough queues to buffer  0:00:00.015000000 additional data. Shortening processing latency to 0:00:00.000000000.
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: Pipeline construction is invalid, please add queues.
Additional debug info:
../libs/gst/base/gstbasesink.c(1249): gst_base_sink_query_latency (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
Not enough buffering available for  the processing deadline of 0:00:00.015000000, add enough queues to buffer  0:00:00.015000000 additional data. Shortening processing latency to 0:00:00.000000000.
ERROR: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: Output window was closed
Additional debug info:
../sys/xvimage/xvimagesink.c(568): gst_xv_image_sink_handle_xevents (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0
Execution ended after 0:00:03.863196540
Setting pipeline to NULL ...
GST_ARGUS: Cleaning up
CONSUMER: Done Success
GST_ARGUS: Done Success
Freeing pipeline ...

I also tried using jetson-io to set it to only use cam0 and got the same error:

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
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: 3840 x 2160 FR = 29.999999 fps Duration = 33333334 ; Analog Gain range min 1.000000, max 22.250000; Exposure Range min 13000, max 683709000;

GST_ARGUS: 1920 x 1080 FR = 59.999999 fps Duration = 16666667 ; 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  = 0
   Output Stream W = 3840 H = 2160
   seconds to Run    = 0
   Frame Rate = 29.999999
GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
ERROR: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: Output window was closed
Additional debug info:
../sys/xvimage/xvimagesink.c(568): gst_xv_image_sink_handle_xevents (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0
Execution ended after 0:00:03.061623832
Setting pipeline to NULL ...
nvbuf_utils: dmabuf_fd -1 mapped entry NOT found
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadExecute:734 NvBufSurfaceFromFd Failed.
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadFunction:245 (propagating)
GST_ARGUS: Cleaning up
GST_ARGUS: Done Success
Freeing pipeline ...

I had dmesg --follow in a serparate window and no errors were thrown either.

If anyone can help with this I’d greatly appreciate it, I’m ready to can the whole project at this point as it’s been nothing but problems and the switch to jetson has only made things worse.

If this isn’t the right place to ask could someone point me in the right direction please? The nvidia forums point here when others ask similar questions.