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.

@Seeed_Seraphina, sorry for the tag but you’re the most frequent Seeed person on here so hopefully you can help getting assistance from someone who knows your Jetson products please?

@Seeed_Kevin, I’ve seen you post about Jetson boards, can you help? I sense Seeed don’t care about this board any more, or maybe just not about their customers who are struggling?

Hi there,

So these are not plug and play when doing the Higher end cameras and advanced features and NOT all of the Nvidia tech applies to these reference design clones.
I would email, elane at seeed , she is in most of the Live Stream videos for AI, jetson products and Was at the Nvidia GTC 2025 , she is super smart and probably knows how to get it going.

check seeed (Linkdin) site or her blog for her contact info.

HTH
GL :slight_smile: PJ :v:

1 Like

Thanks for the pointer, I’ll try and get in touch with them. I’ve done a fair bit of esoteric camera work and, more importantly, followed their own guide for enabling dual cameras.

I shouldn’t need luck to have something work that the manufacturer claim works, especially when they provided steps that are either out of date, or simply untested.

1 Like

I found Elaine’s blog, it has no contact details on it and I can’t message her on LinkedIn as I don’t have LinkedIn Premium.

This is proving infuriating, we were going to develop a product around these boards but there’s no chance of that happening now.

Hi there,

WOW, I feel your pain… I know it can be frustrating. especially when a OEM product isn’t measuring up. You have tagged Kevin so please try and be patient they will respond but it does take some time and they more times than not come already with a solution. I hear you have a lot riding on this, so it is worth all your patients and Effort.

to mUy technical mind, it should be a patch or a config issue. They work , the cameras as CAM1. The tools you use are they for this unit specifically ? or are they the “Nvidia” tools?
this may be part of the issue? Not all of Nvidia’s tools will be compatible, these have there own DTS, so I imagine this could be the root cause. But I could be wrong too. I don’t have one but I see most folks are pretty satisfied with the basics on here.

I’m looking into as much of it as I can… sometimes two heads are better than one. Hopefully the active of this thread will get us some attention."

Meanwhile a deep dive with AI , shows this info…
what do you think?

AL’s take on it…Worth a look :crossed_fingers:

Summary of the Problem

  • Hardware: Jetson Orin Nano 4GB with Seeed J401 carrier board
  • Cameras: 2x Raspberry Pi HQ (IMX477) with R8 resistor removed
  • Software: Jetpack 6.2 (L4T R36.4.3), Seeed custom image (mfi_recomputer-orin-nano-4g-j401)
  • Behavior:
    • Both cameras work on CAM1, not on CAM0
    • nvarguscamerasrc fails on CAM0 with NvBufSurfaceFromFd Failed and no video
    • Camera shows up in I2C and sensor is detected by kernel
    • Error occurs in GStreamer threadExecute() when buffer allocation fails

What’s Working

  • Both cameras initialize properly — no I2C errors.
  • CAM1 works well — sensor is streaming video.
  • CAM0 is detected, but streaming fails at buffer mapping.
  • User tried remapping Jetson-IO to CAM0-only with no change.

What’s Likely Wrong

This does not appear to be:

  • A software-only problem — because CAM1 works fine, and both cameras work on CAM1, meaning sensors are good.
  • A firmware mismatch — image is built for J401, JetPack version matches kernel.

Instead, this smells like a hardware issue or missing device-tree overlay setup for CAM0. (this was muy initial thought also). the dts is not a standard match to Nvidia’s perhaps.

further inquiry :crossed_fingers:

Root Cause Candidates

1. CAM0 MIPI or PCIe Lane Conflict

  • Jetson Orin Nano shares lanes for multiple peripherals.
  • The J401 carrier board maps CAM0 and CAM1 differently than NVIDIA’s devkit.
  • A missing or misapplied device tree overlay may fail to bring up CAM0’s CSI lanes.

2. J401 Device Tree Issue

  • Seeed’s BSP might have only enabled CAM1 (CSI1) in default overlay.
  • CAM0 may need an additional overlay applied (especially if using dual cam support).

3. Hardware Fault

  • One of the CSI lanes or clocks for CAM0 could be damaged on the J401 board.
  • Since both cameras work on CAM1 — not a sensor problem.

4. NvBufSurfaceFromFd Failure = buffer/FD allocation fail

  • This usually means the buffer for the camera image could not be mapped to GPU/ISP.
  • Often tied to bad memory configuration, disabled CSI lane, or missing DT config.

Suggested Next Steps

1. Check CAM0 lane power

sudo dmesg | grep -i csi

Look for CSI errors or inactive state for csi0.

:white_check_mark: 2. Inspect connected devices

i2cdetect -y -r 9
i2cdetect -y -r 10

Make sure both cameras show up at 0x1a.

:white_check_mark: 3. Verify overlays loaded

sudo cat /boot/extlinux/extlinux.conf

Look for DTB (device tree) used. Make sure it points to the correct dual-imx477 config for J401.

sudo grep -r imx477 /boot/dtb/ | grep j401

recheck;

ls /boot/dtb/kernel_tegra*.dtb

:white_check_mark: 4. Force CAM0-only

Try testing CAM0 alone after unplugging CAM1 completely and rebooting.

Fix Path (if device tree issue)

You can try applying the correct overlay manually:

  1. Get Seeed BSP or overlays:
    GitHub - Seeed-Studio/seeed-linux-dtoverlays: Device Tree Overlays for Seeed boards
  2. Look for J401 + dual camera overlay:
    Likely file: seeed-j401-dual-imx477-overlay.dts
  3. Apply overlay using:

sudo /opt/nvidia/jetson-io/jetson-io.py
then try ,
Enable dual camera mode with CAM0 + CAM1.

Final Thoughts

  • The fact that CAM0 fails during NvBufSurfaceFromFd is a huge clue — it indicates CSI capture channel is not up, or device tree isn’t initializing CAM0 properly.
  • It’s not likely to be a RAM issue — 4GB is fine for 1080p streams.
  • Seeed’s carrier boards often need very specific overlays, so reapplying the correct one is the fastest way to isolate the fault.

Really hope that helps figure more out. I’m convinced it’s the overlay NOW! :+1: with that said I would think it CAN be Resolved.

HTH
GL :slight_smile: PJ :v:

if it still goes unanswered , by the weekend I’ll ping Kevin and see if they can get you some more SOLID help and Solution. easier said than done but Hang in there :+1:

2 Likes

Just spent the morning going through those suggestions, wrote out my results in here, and getting a HTTP403 error when I try to post my response…

Ok, lets try splitting this in to smaller messages.

This was installed using the images provided by Seeed, I spent a few days on this before I realised how fragmented the Jetson ecosystem is and that I needed the Seeed specific instructions for this board.

I agree it feels like it’s a device tree issue too. I saw on a thread on another forum something about the pins being different on the j401 cam0 port for some reason but can’t find it now annoyingly.

it looks like it’s loading the correct dtb file at least. from the conf file:

LABEL JetsonIO
        MENU LABEL Custom Header Config: <CSI Camera IMX477 Dual>
        LINUX /boot/Image
        FDT /boot/dtb/kernel_tegra234-j401-p3768-0000+p3767-0004-recomputer.dtb
        INITRD /boot/initrd
        APPEND ${cbootargs} root=PARTUUID=fd3507f9-7b1c-48fb-a981-9fbbe6d30d9a rw rootwait rootfstype=ext4 mminit_loglevel=4 console=ttyTCU0,115200 firmware_class.path=/etc/firmware fbcon=map:0 nospectre_bhb video=efifb:off console=tty0
        OVERLAYS /boot/tegra234-p3767-camera-p3768-imx477-dual.dtbo

Trying to rebuild the device trees from that repo throws the following error:
/lib/modules/5.15.148-tegra/build: No such file or directory. Stop.

I assume I need the sources or similar, but, again, there is no documentation for this and isn’t mentioned in any issues on the github repo either. You’ve said yourself that these don’t work out of the box, if I can’t rely on the documentation, or support to assist, I need to know before we commit to a supplier.

I’ve been waiting since July 1st for a response for this and only got a response at all because I started pestering people, please ping Kevin now rather than waiting any longer.

There’s a bunch of other things I tried but kept getting the 403 when trying to post the notes related to them so I gave up.

Hi there,
Ok so I did ping him with the link, so shouldn’t be too much longer. I get that error (403) from a wacky cut and paste sometimes.

Documentation is Key, You will see there is a couple of us on here, that beat that to death on this tech :grin:

HTH
GL :slight_smile: PJ :v:

I added a message to @seeed_lorraine I think she is very good with theses :crossed_fingers:
Not that it is comfort but you are NOT alone in your quest and similar endeavors are being undertaken…

"Hi! I'm using the reComputer Jetson J1010 with JetPack 4.6.6 (L4T 32.7.6). I want to use the Raspberry Pi HQ Camera (IMX477) and I’ve already removed the R8 resistor as recommended.
However, jetson-io.py is not working on the J1010 carrier board, and I cannot configure the CSI camera from the graphical interface.
I found some .dtbo files in /boot, including:
/boot/tegra210-p3448-all-p3449-0000-camera-imx477-dual.dtbo
/boot/tegra210-p3448-all-p3449-0000-camera-imx477-imx219.dtbo
/boot/tegra210-p3448-common-imx477.dtbo
Can you please guide me on how to enable dual IMX477 cameras on J1010 via extlinux.conf or another method that works for JetPack 4.6.6?
Thank you in advance! "

:v: I’m fairly confident you will get it going…with the right help.

1 Like

I couldn’t find the thread you referenced, did they get the help they needed? Could be worth comparing notes

I raised an issue for this on the Seeed Jetson GitHub repo a few days ago, user ackPeng (not sure if they’re on here or what their handle is) has had a look and has said there are problems with it. They are going to debug further.

If there is anyone else who has seen this issue, and possibly has a fix already, it would be good to let ackPeng know so they aren’t duplicating work on this issue.

1 Like

Hi there,

Getting some traction now! :grin:
" Seeed_lorraine 3:40 AM

Hi, we’ve already assigned a colleague to follow up on this post urgently and will reply to him as soon as possible. Additionally, thank you so much for your helpful response! "
:+1:
also that was from a discord thread NOT on here, just showing that it is a “thing” :grinning: :ok_hand:

HTH
GL :slight_smile: PJ :v:

It’s a good product priced right , just needs some TLC from the software side… IMHO :crossed_fingers:

1 Like

Hopefully you’re right

1 Like

@kneave Hi, kneave. Due to file upload limitations, I’ve shared the new .dtbo file and demonstration video via a OneDrive link. Please copy the new .dtbo file to the /boot directory, then launch /opt/nvidia/jetson-io/jetson-io.py, select the “IMX477 Dual Seeed” configuration, save, and reboot the system.

After that, both CSI0 and CSI1 will be functional, and you can preview the video streams using nvgstcapture-1.0.
(https://

seeedstudio88-

my.sharepoint.c

om/:f:/g/personal/youjiang_yu_seeedstudio88_onmicrosoft

_com/Emiw_poMf9lGhkNYND01mgsBh91pS1jdor0wIHD-zgurBA?e=bUCnnh)

Since links are not allowed, I inserted a few line breaks in the valid link.

2 Likes

Hi there,

And welcome here…

Awesome, Let’s hope he is able to work with it, it takes a few posts to get the credz to post links and pics, after 2-3 reply’s you can.

Allow me to relink, both video’s appear to have it working , NICE JOB!

Files are here.

and here is the file Zipped for download.
tegra234-p3767-camera-p3768-imx477-dual-seeed.zip (2.2 KB)

Given enough light on a subject , the seeedineers always come through! :+1:

GL :slight_smile: PJ :v:

1 Like