Jetson Orin Nano won't load Arducam cameras on CAM0

There has been a lot of talk about fixing CAM0 on the Jetson Orin Nano’s, for example here and here, but I can’t figure out where things stand currently.

In my case, either the Arducam AR0234 will work, or the Arducam OV9281 on a stereo sync board (1 CSI MIPI connection) on CAM1.

Neither camera will work in CAM0, together or separate after running the Arducam camera updates and installing their arducam-nvidia-l4t-kernel-t234-nano-5.10.120-tegra-35.4.1-20230809074912_arm64.deb file in their install process listed here.

Both cameras are detected with ls /dev/video* as video0 and video1 when plugged in together. When I run arducam’s provided script with arducam_displayer.py -d x, I just have to select the proper x for the camera in CAM1, and it wil display fine.

I try CAM0 with the script, and nothing.

I know these are not nVidia issues out of the gate, but we really need help with our prototypes here before moving to board designs based on the Jetson Orin Nano.

I just want to be able to plug the stereo board AND the AR0234 into the 2 MIPI ports and they all work at the same (so we can external sync). What am I missing?

hello rich25,

is it 4-lane configuration?
do you have Raspberry Pi Camera v2, IMX219 or IMX477 as alternative camera hardwares for testing?

I’m not sure what the configuration is or how to check.

I do have both a Raspberry Pi Camera v2 which I verified worked on the Jetson Orin Nano before I ran the Arducam install using v4l2-ctl and gstreamer-launch-1.0, as well as an IMX219.

I should mention when I try to run the same v4l2-ctl script on the Raspberry Pi Camera v2 now, it also does NOT work on CAM0.

How would I check the lane configs in this scenario to confirm what you need?

hello rich25,

there’s options to enable 4-lane config of IMX477 by running Jetson-IO to set the CSI settings. and, it should be 2-lane config if you’re running with IMX219.

just double check… is it an Orin NX develope kit? or… it’s Orin SOM on Xavier NX carrier board?

This is a standard Jetson Orin Nano devkit.

I’ve tested all of the options in the Jetson-IO , and they work with their respective cameras. That is, the 2-lane IMX219 works with an IMX219 setting.

However, those will make the system unable to pick up the Arducam cameras at /dev/video*.

Likewise, when I run the ./install_full.sh -m arducam script from Arducam which creates it’s own kernel, I can no longer use the IMX219’s.

hello rich25,

that’s expected since it’s changing the CSI configure for loading its sensor driver.
we’ve now narrow down the issue to Arducam’s camera only, please contact with vendor to double check the sensor drivers.

I do have a message in with them currently. They are currently at a loss as well.

Is there something you can suggest that is related to other Jetson Orin Nano CAM0 issues? Swizzling? IO_CTL? Something else?

hello rich25,

you should have device tree for running Arducam’s camera, right?
please disassembler the dtb file into text file for quick checking.
for example, $ dtc -I dtb -O dts -o temp.txt tegra234-Arducam-xxx.dtb

Here is a link to the text file. What am I looking for in particular?

temp.txt (439.7 KB)

hello rich25,

it looks it’s dual camera running with 2-lane configuration, which are using CSI-A and CSI-C.

	cam_i2cmux {
		i2c@0 {
			arducam_a@0c {
				compatible = "arducam,arducam-csi2";
				mode0 {
					tegra_sinterface = "serial_a";

				ports {
						endpoint {
							port-index = <0x00>;
							bus-width = <0x02>;

here’s erroneous,
the tegra_sinterface of arducam_c should be CSI-C.
for instance,

		i2c@1 {
			arducam_c@0c {
				compatible = "arducam,arducam-csi2";
				mode0 {
					tegra_sinterface = "serial_a";   <== this should be "serial_c"

						endpoint {
							port-index = <0x02>;
							bus-width = <0x02>;

Made the change, confirmed the change on a reboot, and still not working on CAM0 with either camera. Works fine on CAM1.

What else could I look for in this case?

hello rich25,

may I know what’s failure messages reported?
besides, could you please have cross validation to confirm it’s not camera hardware issue?

Hardware tests good on both the cameras (they work in CAM1) and the dev kit side (the IMX219 works fine in CAM0 when kernel set up for it).

No failure message that I know. Is there one outside the main script I should use?

I tried sudo dmesg | grep arducam and got this:

[    0.000000] Linux version 5.10.120-tegra (arducam_006@arducam-server-006) (aarch64-linux-gcc.br_real (Buildroot 2020.08) 9.3.0, GNU ld (GNU Binutils) 2.33.1) #1 SMP PREEMPT Wed Aug 9 15:29:32 CST 2023
[    0.002623] DTS File Name: /home/arducam_006/jenkins/workspace/n_nano_kernel_l4t-35.4.1-arducam/kernel/kernel-5.10/arch/arm64/boot/dts/../../../../../../hardware/nvidia/platform/t23x/p3768/kernel-dts/tegra234-p3767-0003-p3768-0000-a0.dts
[   13.164737] arducam_csi2: no symbol version for module_layout
[   13.274186] arducam-csi2 9-000c: firmware version: 0x10004
[   13.274573] arducam-csi2 9-000c: Sensor ID: 0x9281
[   13.388553] tegra-camrtc-capture-vi tegra-capture-vi: subdev arducam-csi2 9-000c bound
[   13.389882] arducam-csi2 9-000c: sensor arducam-csi2 9-000c registered
[   13.415631] arducam-csi2 10-000c: firmware version: 0x10003
[   13.415931] arducam-csi2 10-000c: Sensor ID: 0x0A56
[   13.492924] tegra-camrtc-capture-vi tegra-capture-vi: subdev arducam-csi2 10-000c bound
[   13.494788] arducam-csi2 10-000c: sensor arducam-csi2 10-000c registered

Both cameras are being recognized on their respective MIPI connections it looks like.

I also have a full log from the Arducam debugging script here:

hello rich25,

CSI/VI port bindings should be correct since sensor drivers has register to linux kernel.
it’s streaming on failures reported here.

[   79.385536] (NULL device *): vi_capture_control_message: NULL VI channel received
[   79.393250] t194-nvcsi 13e40000.host1x:nvcsi@15a00000: csi5_stream_open: VI channel not found for stream- 0 vc- 0

it might be incorrect sensor configurations.
please double check lane_polarity settings, it’s CSI0 D1 and CSI1 D0 P/N will always been swizzled for P/N on Orin Nano.
please use device tree property, lane_polarity to configure a polarity swap on any lane.

besides,
please also give it a try with below commands to boost all the VI/CSI/ISP clocks.
for example,

sudo su
echo 1 > /sys/kernel/debug/bpmp/debug/clk/vi/mrq_rate_locked
echo 1 > /sys/kernel/debug/bpmp/debug/clk/isp/mrq_rate_locked
echo 1 > /sys/kernel/debug/bpmp/debug/clk/nvcsi/mrq_rate_locked
echo 1 > /sys/kernel/debug/bpmp/debug/clk/emc/mrq_rate_locked
cat /sys/kernel/debug/bpmp/debug/clk/vi/max_rate |tee /sys/kernel/debug/bpmp/debug/clk/vi/rate
cat /sys/kernel/debug/bpmp/debug/clk/isp/max_rate | tee /sys/kernel/debug/bpmp/debug/clk/isp/rate
cat /sys/kernel/debug/bpmp/debug/clk/nvcsi/max_rate | tee /sys/kernel/debug/bpmp/debug/clk/nvcsi/rate
cat /sys/kernel/debug/bpmp/debug/clk/emc/max_rate | tee /sys/kernel/debug/bpmp/debug/clk/emc/rate

I ran the commands you sent, rebooted, and it did not work. The values on the cat were:

550400000
729600000
214300000
213300000

I’m trying to understand the lane_polarity fix. I have a i2c@0 and i2c@1 in the am_i2cmux. The lane_polarity in i2c@0 is lane_polarity = [36 00] and i2c@1 is lane_polarity = [30 00] I changed both to lane_polarity = [30 00] or lane_polarity = [36 00], and even reversed them, and it did mess up the CAM1, but didn’t help with CAM0. Is there another value or method I should be using or trying?

This is the code for the IOC control.

I also just tested the stereo cam on CAM1, and only 1 of the stereo cameras is now working, even after going back to my original .dtb backup file. The AR0234 works fine. Might be related to the clock changes.

hello rich25,

note, those commands to boost all the clocks will reset once you reboot the system.
please check Jetson Orin NX Series and Orin Nano Series Design Guide for [Figure 10-1. CSI 2-Lane Connection Options] for more details of lane polarity.

you may see-also reference driver for lane_polarity property description.
for instance,
$public_sources/kernel_src/hardware/nvidia/platform/t23x/p3768/kernel-dts/cvb/tegra234-camera-rbpcv2-imx219.dtsi

                                * lane_polarity
                                * Based on the camera connector pin.
                                * CSIx_D0 | CSIx_D1 | CSI(X+1)_D0 | CSI(X+1)CSIx_D1
                                *    LSB  |   BIT1  |     BIT2    |      MSB 
                                * if there is a polarity swap on any lane, the bit corrsponding
                                * to the lane should be set 
                                * e.g. polarity swap on CSIx_D0 only -> lane_polarity = "1"; 0001
                                * e.g. polarity swap on CSIx_D1 and CSI(X+1)_D0 -> lane_polarity = "6"; 0110

The note from Arducam is:

Currently, on the Jetson Orin Nano, when using the camera, it requires extreme value inversion, but nVidia has inverted the hardware. The inversion can only be done within the gstreamer framework, and there is currently no way to do it using v4l2. However, the arducam_displayer.py library is based on v4l2.

So, it seems that none of the nVidia camera partners can get two camera MIPI pipelines working on the Jetson Orin Nano using v4l2 currently. How would I approach this using gStreamer?

hello rich25,

here’s gst pipeline for your reference, you may modify sensor-id to select different camera nodes.
for instance, $ gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! 'video/x-raw(memory:NVMM),framerate=30/1,format=NV12' ! nvvidconv ! xvimagesink

please see-also developer guide, Accelerated GStreamer.

Running the command as is, with the current CAM1 that works on the Arducam v4l2, can’t find the camera:

gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! 'video/x-raw(memory:NVMM),framerate=30/1,format=NV12' ! nvvidconv ! xvimagesink
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, execute:751 No cameras available
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: Pipeline construction is invalid, please add queues.
Additional debug info:
gstbasesink.c(1209): 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.
Got EOS from element "pipeline0".
Execution ended after 0:00:00.008934501
Setting pipeline to NULL ...
Freeing pipeline ...

I am attempting to use an external trigger to sync over the two CSI ports the AR0234 and the Stereo OV9281 cameras on the Jetson Orin Nano for our new camera series. I’ve now tried 2 nVidia Camera partners and they both failed to get two cameras working using gStreamer or V4l2 on the Orin Nano. This should be possible from what you’re saying, it’s just different than the other Jetson series devices, which is why none of the partners can get this done.

How can we fix this and get it working?

I have the comparison of the .dtb files before and after the driver installs. How would you get Orin Nano’s working on both CAM0 and CAM1 with preferred partner cameras?