Imx477 uc-517 rev d3, imx477 uc-517 rev d3

  1. Where did you get the camera module(s)?
    Amazon/Arducam
  2. Model number of the product(s)?
    B0274 IMX477 UC-517 REV D3, B0273 for IMX477 UC-517 REV D3
  3. What hardware/platform were you working on?
    JETSON ORIN NX 16GB DEVELOPMENT KIT
  4. Instructions you have followed. (link/manual/etc.)
    LINK/MANUAL
  5. Problems you were having?
    Not working in 4 lane configuration on CAM1. Written the device tree overlay for this.
  6. The dmesg log from your hardware?
    Here camera is seen in CAM1 for 4 lane config.

[ 9.592046] imx477 9-001a: tegracam sensor driver:imx477_v2.0.6
[ 9.893999] imx477 9-001a: imx477_board_setup: error during i2c read probe (-121)
[ 9.894034] imx477 9-001a: board setup failed
[ 9.894105] imx477: probe of 9-001a failed with error -121
[ 9.895286] imx477 10-001a: tegracam sensor driver:imx477_v2.0.6
[ 10.196884] tegra-camrtc-capture-vi tegra-capture-vi: subdev imx477 10-001a bound

v4l2-compliance -d /dev/video0 -s
This test fails. dmesg output during this test is:
[ 76.801103] tegra_channel_queue_setup: sizes[0] = 8323072 chan->format.sizeimage = 16646144 …
[ 76.801164] tegra_channel_queue_setup: sizes[0] = 8323072 chan->format.sizeimage = 16646144 …
[ 76.801206] tegra_channel_queue_setup: sizes[0] = 8323072 chan->format.sizeimage = 16646144 …
[ 79.727504] tegra-camrtc-capture-vi tegra-capture-vi: uncorr_err: request timed out after 2500 ms
[ 79.727526] tegra-camrtc-capture-vi tegra-capture-vi: err_rec: attempting to reset the capture channel
[ 79.728635] tegra-camrtc-capture-vi tegra-capture-vi: err_rec: successfully reset the capture channel
[ 80.601000] tegra_channel_queue_setup: sizes[0] = 8294400 chan->format.sizeimage = 16588800 …
[ 83.590610] tegra-camrtc-capture-vi tegra-capture-vi: uncorr_err: request timed out after 2500 ms
[ 83.590640] tegra-camrtc-capture-vi tegra-capture-vi: err_rec: attempting to reset the capture channel
[ 83.591603] tegra-camrtc-capture-vi tegra-capture-vi: err_rec: successfully reset the capture channel

  1. Troubleshooting attempts you’ve made?
    Works in 2 lane configuration.

  2. What help do you need?
    Does this camera work in 4 lane configuration on CAM1?
    Is there a different camera model that you would recommend?
    Does only UC-698 support 4 lanes?

Hi there,
To clarify, the B0274 camera can work in the 4-lane configuration that is natively supported by the Jetson Orin series.

However, please note that the official carrier board for the Jetson Orin Dev Kit has one exclusive 4-lane CSI port.

Please make sure you connect the camera to the CSI port close to the Power port, and you will need to enable the native IMX477 4-lane driver in jetson-io.

You can follow the steps outlined here:
https://docs.arducam.com/Nvidia-Jetson-Camera/Application-note/Jetson-io/

Let me know if that works for you.

HI Dion,

Good to know that the B0274 is 4 lane capable. On my Orin NX 16GB development kit CAM0 is closer to the power. But CAM0 is only 2 lane capable as per NVIDIA.

I am using Jetpack 6.2 tegra_release 36.4.3. I have connected the B0274 to CAM1 which is the only port that is 4 lane capable on the development kit. The default nv_imx477.ko available in this JetPack is getting used.

I am using jetson-io but I don’t see the overlay names like “Camera Arducam Dual” in the display as see in the WiKi (Jetson-io - Arducam Wiki). Might be because it is for a Nano and older JetPack.

I have tried “Camera IMX477 Dual 4 lane / tegra234-p3767-camera-p3768-imx477-dual-4lane.dtbo” but this overlay does a 4 lane setup for CAM0 CSI A-B, and 2 lane setup for CAM1 - CSI C/D. But, on the Orin NX development kit CAM0 only CSI-B is used and therefore only 2 lane. So, with this overlay B0274 is sort of forced to 2 lane mode on CAM0 and and programmed to 2 lane mode on CAM1. So, I don’t think “Camera IMX477 Dual 4 lane” is not the correct overlay for B0274 on CAM1.

So, I wrote an overlay for 4 lane on CSI C-D. Here it is below. Can you please let me know if there is something wrong in the overlay below that jumps at you?

Thanks

// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

/dts-v1/;
/plugin/;

#define CAM0_PWDN TEGRA234_MAIN_GPIO(H, 6)
#define CAM1_PWDN TEGRA234_MAIN_GPIO(AC, 0)
#define CAM_I2C_MUX TEGRA234_AON_GPIO(CC, 3)

#include <dt-bindings/tegra234-p3767-0000-common.h>

/ {
overlay-name = “Camera IMX477 Dual 4 lane”;
jetson-header-name = “Jetson 24pin CSI Connector”;
compatible = JETSON_COMPATIBLE_P3768;

fragment@0 {
	target-path = "/";
	__overlay__ {
		tegra-capture-vi  {
			num-channels = <2>;
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				port@0 {
					reg = <0>;
					rbpcv3_imx477_vi_in0: endpoint {
						port-index = <1>;
						bus-width = <4>;
						remote-endpoint = <&rbpcv3_imx477_csi_out0>;
					};
				};
				port@1 {
					reg = <1>;
					rbpcv3_imx477_vi_in1: endpoint {
						port-index = <2>;
						bus-width = <4>;
						remote-endpoint = <&rbpcv3_imx477_csi_out1>;
					};
				};
			};
		};
		tegra-camera-platform {
			compatible = "nvidia, tegra-camera-platform";
			/**
			* Physical settings to calculate max ISO BW
			*
			* num_csi_lanes = <>;
			* Total number of CSI lanes when all cameras are active
			*
			* max_lane_speed = <>;
			* Max lane speed in Kbit/s
			*
			* min_bits_per_pixel = <>;
			* Min bits per pixel
			*
			* vi_peak_byte_per_pixel = <>;
			* Max byte per pixel for the VI ISO case
			*
			* vi_bw_margin_pct = <>;
			* Vi bandwidth margin in percentage
			*
			* max_pixel_rate = <>;
			* Max pixel rate in Kpixel/s for the ISP ISO case
			*
			* isp_peak_byte_per_pixel = <>;
			* Max byte per pixel for the ISP ISO case
			*
			* isp_bw_margin_pct = <>;
			* Isp bandwidth margin in percentage
			*/
			num_csi_lanes = <8>;
			max_lane_speed = <1500000>;
			min_bits_per_pixel = <10>;
			vi_peak_byte_per_pixel = <2>;
			vi_bw_margin_pct = <25>;
			max_pixel_rate = <7500000>;
			isp_peak_byte_per_pixel = <5>;
			isp_bw_margin_pct = <25>;
			/**
			 * The general guideline for naming badge_info contains 3 parts, and is as follows,
			 * The first part is the camera_board_id for the module; if the module is in a FFD
			 * platform, then use the platform name for this part.
			 * The second part contains the position of the module, ex. "rear" or "front".
			 * The third part contains the last 6 characters of a part number which is found
			 * in the module's specsheet from the vendor.
			 */
			modules {
				module0 {
					badge = "jakku_front_RBPCV3";
					position = "front";
					orientation = "1";
					drivernode0 {
						pcl_id = "v4l2_sensor";
						sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/cam_i2cmux/i2c@0/rbpcv3_imx477_a@1a";
					};
				};
				module1 {
					badge = "jakku_rear_RBPCV3";
					position = "front";
					orientation = "1";
					drivernode0 {
						pcl_id = "v4l2_sensor";
						sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/cam_i2cmux/i2c@1/rbpcv3_imx477_c@1a";
					};
				};
			};
		};
		bus@0 {
			host1x@13e00000 {
				nvcsi@15a00000 {
					num-channels = <2>;
					#address-cells = <1>;
					#size-cells = <0>;
					channel@0 {
						reg = <0>;
						ports {
							#address-cells = <1>;
							#size-cells = <0>;
							port@0 {
								reg = <0>;
								rbpcv3_imx477_csi_in0: endpoint@0 {
									port-index = <1>;
									bus-width = <4>;
									remote-endpoint = <&rbpcv3_imx477_out0>;
								};
							};
							port@1 {
								reg = <1>;
								rbpcv3_imx477_csi_out0: endpoint@1 {
									remote-endpoint = <&rbpcv3_imx477_vi_in0>;
								};
							};
						};
					};
					channel@1 {
						reg = <1>;
						ports {
							#address-cells = <1>;
							#size-cells = <0>;
							port@0 {
								reg = <0>;
								rbpcv3_imx477_csi_in1: endpoint@2 {
									port-index = <2>;
									bus-width = <4>;
									remote-endpoint = <&rbpcv3_imx477_out1>;
								};
							};
							port@1 {
								reg = <1>;
								rbpcv3_imx477_csi_out1: endpoint@3 {
									remote-endpoint = <&rbpcv3_imx477_vi_in1>;
								};
							};
						};
					};
				};
			};
			cam_i2cmux {
				status = "okay";
				compatible = "i2c-mux-gpio";
				#address-cells = <1>;
				#size-cells = <0>;
				mux-gpios = <&gpio_aon CAM_I2C_MUX GPIO_ACTIVE_HIGH>;
				i2c-parent = <&cam_i2c>;
				i2c@0 {
					status = "okay";
					reg = <0>;
					#address-cells = <1>;
					#size-cells = <0>;
					rbpcv2_imx219_a@10 {
						status = "disabled";
					};
					rbpcv3_imx477_a@1a {
						reset-gpios = <&gpio CAM0_PWDN GPIO_ACTIVE_HIGH>;
						compatible = "ridgerun,imx477";
						/* I2C device address */
						reg = <0x1a>;
						/* V4L2 device node location */
						devnode = "video0";
						/* Physical dimensions of sensor */
						physical_w = "3.680";
						physical_h = "2.760";
						sensor_model = "imx477";
						use_sensor_mode_id = "true";
						/**
						* ==== Modes ====
						* A modeX node is required to support v4l2 driver
						* implementation with NVIDIA camera software stack
						*
						* == Signal properties ==
						*
						* phy_mode = "";
						* PHY mode used by the MIPI lanes for this device
						*
						* tegra_sinterface = "";
						* CSI Serial interface connected to tegra
						* Incase of virtual HW devices, use virtual
						* For SW emulated devices, use host
						*
						* pix_clk_hz = "";
						* Sensor pixel clock used for calculations like exposure and framerate
						*
						* readout_orientation = "0";
						* Based on camera module orientation.
						* Only change readout_orientation if you specifically
						* Program a different readout order for this mode
						*
						* 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
						*
						* == Image format Properties ==
						*
						* active_w = "";
						* Pixel active region width
						*
						* active_h = "";
						* Pixel active region height
						*
						* pixel_t = "";
						* The sensor readout pixel pattern
						*
						* line_length = "";
						* Pixel line length (width) for sensor mode.
						*
						* == Source Control Settings ==
						*
						* Gain factor used to convert fixed point integer to float
						* Gain range [min_gain/gain_factor, max_gain/gain_factor]
						* Gain step [step_gain/gain_factor is the smallest step that can be configured]
						* Default gain [Default gain to be initialized for the control.
						*     use min_gain_val as default for optimal results]
						* Framerate factor used to convert fixed point integer to float
						* Framerate range [min_framerate/framerate_factor, max_framerate/framerate_factor]
						* Framerate step [step_framerate/framerate_factor is the smallest step that can be configured]
						* Default Framerate [Default framerate to be initialized for the control.
						*     use max_framerate to get required performance]
						* Exposure factor used to convert fixed point integer to float
						* For convenience use 1 sec = 1000000us as conversion factor
						* Exposure range [min_exp_time/exposure_factor, max_exp_time/exposure_factor]
						* Exposure step [step_exp_time/exposure_factor is the smallest step that can be configured]
						* Default Exposure Time [Default exposure to be initialized for the control.
						*     Set default exposure based on the default_framerate for optimal exposure settings]
						*
						* gain_factor = ""; (integer factor used for floating to fixed point conversion)
						* min_gain_val = ""; (ceil to integer)
						* max_gain_val = ""; (ceil to integer)
						* step_gain_val = ""; (ceil to integer)
						* default_gain = ""; (ceil to integer)
						* Gain limits for mode
						*
						* exposure_factor = ""; (integer factor used for floating to fixed point conversion)
						* min_exp_time = ""; (ceil to integer)
						* max_exp_time = ""; (ceil to integer)
						* step_exp_time = ""; (ceil to integer)
						* default_exp_time = ""; (ceil to integer)
						* Exposure Time limits for mode (sec)
						*
						* framerate_factor = ""; (integer factor used for floating to fixed point conversion)
						* min_framerate = ""; (ceil to integer)
						* max_framerate = ""; (ceil to integer)
						* step_framerate = ""; (ceil to integer)
						* default_framerate = ""; (ceil to integer)
						* Framerate limits for mode (fps)
						*
						* embedded_metadata_height = "";
						* Sensor embedded metadata height in units of rows.
						* If sensor does not support embedded metadata value should be 0.
						*/
						mode0 { /* IMX477_MODE_3840x2160 */
							mclk_khz = "24000";
							num_lanes = "4";
							tegra_sinterface = "serial_b";
							phy_mode = "DPHY";
							discontinuous_clk = "no";
							dpcm_enable = "false";
							cil_settletime = "0";
							lane_polarity = "6";
							active_w = "3840";
							active_h = "2160";
							mode_type = "bayer";
							pixel_phase = "rggb";
							csi_pixel_bit_depth = "10";
							readout_orientation = "90";
							line_length = "5832";
							inherent_gain = "1";
							mclk_multiplier = "80";
							pix_clk_hz = "600000000";
							gain_factor = "16";
							framerate_factor = "1000000";
							exposure_factor = "1000000";
							min_gain_val = "16"; /* 1.00x */
							max_gain_val = "356"; /* 22x */
							step_gain_val = "1";
							default_gain = "16"; /* 1.00x */
							min_hdr_ratio = "1";
							max_hdr_ratio = "1";
							min_framerate = "2000000"; /* 2.0 fps */
							max_framerate = "30000000"; /* 30.0 fps */
							step_framerate = "1";
							default_framerate = "30000000"; /* 30.0 fps */
							min_exp_time = "13"; /* us */
							max_exp_time = "683709"; /* us */
							step_exp_time = "1";
							default_exp_time = "2495"; /* us */
							embedded_metadata_height = "2";
						};
						mode1 { /* IMX477_MODE_1920X1080 */
							mclk_khz = "24000";
							num_lanes = "4";
							tegra_sinterface = "serial_b";
							phy_mode = "DPHY";
							discontinuous_clk = "no";
							dpcm_enable = "false";
							cil_settletime = "0";
							lane_polarity = "6";
							active_w = "1920";
							active_h = "1080";
							mode_type = "bayer";
							pixel_phase = "rggb";
							csi_pixel_bit_depth = "10";
							readout_orientation = "90";
							line_length = "3076";
							inherent_gain = "1";
							mclk_multiplier = "80";
							pix_clk_hz = "600000000";
							gain_factor = "16";
							framerate_factor = "1000000";
							exposure_factor = "1000000";
							min_gain_val = "16"; /* 1.00x */
							max_gain_val = "356"; /* 22x */
							step_gain_val = "1";
							default_gain = "16"; /* 1.00x */
							min_hdr_ratio = "1";
							max_hdr_ratio = "1";
							min_framerate = "2000000"; /* 2.0 fps */
							max_framerate = "60000000"; /* 60.0 fps */
							step_framerate = "1";
							default_framerate = "60000000"; /* 60.0 fps */
							min_exp_time = "13"; /* us */
							max_exp_time = "683709"; /* us */
							step_exp_time = "1";
							default_exp_time = "2495"; /* us */
							embedded_metadata_height = "2";
						};
						ports {
							#address-cells = <1>;
							#size-cells = <0>;
							port@0 {
								reg = <0>;
								rbpcv3_imx477_out0: endpoint {
									port-index = <1>;
									bus-width = <4>;
									remote-endpoint = <&rbpcv3_imx477_csi_in0>;
								};
							};
						};
					};
				};
				i2c@1 {
					status = "okay";
					reg = <1>;
					#address-cells = <1>;
					#size-cells = <0>;
					rbpcv2_imx219_c@10 {
						status = "disabled";
					};
					rbpcv3_imx477_c@1a {
						reset-gpios = <&gpio CAM1_PWDN GPIO_ACTIVE_HIGH>;
						compatible = "ridgerun,imx477";
						/* I2C device address */
						reg = <0x1a>;
						/* V4L2 device node location */
						devnode = "video1";
						/* Physical dimensions of sensor */
						physical_w = "3.680";
						physical_h = "2.760";
						sensor_model = "imx477";
						use_sensor_mode_id = "true";
						mode0 { /* IMX477_MODE_3840x2160 */
							mclk_khz = "24000";
							num_lanes = "4";
							tegra_sinterface = "serial_c";
							phy_mode = "DPHY";
							discontinuous_clk = "no";
							dpcm_enable = "false";
							cil_settletime = "0";
							lane_polarity = "0";
							active_w = "3840";
							active_h = "2160";
							mode_type = "bayer";
							pixel_phase = "rggb";
							csi_pixel_bit_depth = "10";
							readout_orientation = "90";
							line_length = "5832";
							inherent_gain = "1";
							mclk_multiplier = "80";
							pix_clk_hz = "600000000";
							gain_factor = "16";
							framerate_factor = "1000000";
							exposure_factor = "1000000";
							min_gain_val = "16"; /* 1.00x */
							max_gain_val = "356"; /* 22x */
							step_gain_val = "1";
							default_gain = "16"; /* 1.00x */
							min_hdr_ratio = "1";
							max_hdr_ratio = "1";
							min_framerate = "2000000"; /* 2.0 fps */
							max_framerate = "30000000"; /* 30.0 fps */
							step_framerate = "1";
							default_framerate = "30000000"; /* 30.0 fps */
							min_exp_time = "13"; /* us */
							max_exp_time = "683709"; /* us */
							step_exp_time = "1";
							default_exp_time = "2495"; /* us */
							embedded_metadata_height = "2";
						};
						mode1 { /* IMX477_MODE_1920X1080 */
							mclk_khz = "24000";
							num_lanes = "4";
							tegra_sinterface = "serial_c";
							phy_mode = "DPHY";
							discontinuous_clk = "no";
							dpcm_enable = "false";
							cil_settletime = "0";
							lane_polarity = "0";
							active_w = "1920";
							active_h = "1080";
							mode_type = "bayer";
							pixel_phase = "rggb";
							csi_pixel_bit_depth = "10";
							readout_orientation = "90";
							line_length = "3076";
							inherent_gain = "1";
							mclk_multiplier = "80";
							pix_clk_hz = "600000000";
							gain_factor = "16";
							framerate_factor = "1000000";
							exposure_factor = "1000000";
							min_gain_val = "16"; /* 1.00x */
							max_gain_val = "356"; /* 22x */
							step_gain_val = "1";
							default_gain = "16"; /* 1.00x */
							min_hdr_ratio = "1";
							max_hdr_ratio = "1";
							min_framerate = "2000000"; /* 2.0 fps */
							max_framerate = "60000000"; /* 60.0 fps */
							step_framerate = "1";
							default_framerate = "60000000"; /* 60.0 fps */
							min_exp_time = "13"; /* us */
							max_exp_time = "683709"; /* us */
							step_exp_time = "1";
							default_exp_time = "2495"; /* us */
							embedded_metadata_height = "2";
						};
						ports {
							#address-cells = <1>;
							#size-cells = <0>;
							port@0 {
								reg = <0>;
								rbpcv3_imx477_out1: endpoint {
									status = "okay";
									port-index = <2>;
									bus-width = <4>;
									remote-endpoint = <&rbpcv3_imx477_csi_in1>;
								};
							};
						};
					};
				};
			};

			gpio@6000d000 {
				camera-control-output-low {
					gpio-hog;
					output-low;
					gpios = < CAM1_PWDN 0  CAM0_PWDN 0>;
					label = "cam1-pwdn", "cam0-pwdn";
				};
			};
		};
	};
};

};

Hi @anadgar
Based on the photo of your Jetson Orin NX, we’ve confirmed that you’re using a third-party carrier board.
Not only our camera modules but also the corresponding drivers are designed specially to work with the Official carrier board, so it’s tricky for us to debug the issue on your setup…

Since the B0274 is fully compatible with the 4-lane mode on an Official board, we highly recommend reaching out to the board vendor you bought it from to request more details, especially in configuring the IMX477 4-lane mode.

We can currently provide you with the 4-lane dts file for the IMX477 on the Official carrier board if you need it.

Ok. Yes, please provide the 4-lane .dts file that you have used for the IMX477 on the official carrier board. Please could you also provide a data sheet for the B0274?
Thank you.

imx477_4lane.dts (12.1 KB)
Hi there,
Already attached it for your reference.

Regarding the data sheet for B0274, which type do you want? Sensor register map or specks, etc?

Hi Dion,

The drivers that I am using are what we get from NVIDIA’s jetpack 6.2. The .dts matches what we already have in jetpack 6.2

When you say official board do you mean - P3768-A04 Jetson Orin NX Carrier Board?

If possible we would like to have the datasheet for B0274, register maps, and the schematics. We think this will help us debug this issue.

Thank you.

Hi @anadgar

For a 4-lane data driver, we use the official one as well.

We’re using the carrier board from the following Dev Kit:

Cause you know, Jetson Orin NX and Jetson Orin Nano can share the same carrier board.

I’m not sure if they are open to the public, so I cannot provide them directly.
Please send an email to [email protected], it’s monitored on a daily basis, and your email will get forwarded to the right person. Thanks for your understanding.