Jetson NX core board 3 Camera (4 csi lane for each camera) design check

Hi all~
We need to use NX core board to develop a system with 3 camera, and 4 lanes output for each camera,we use 3 LT6911UXC (HDMI to MIPI/CSI) chips on the carrier board designed by ourselves, camera1 connects CSI0 2 lane + CSI1 2 lane, camera2 connects to CSI2 2 lane + CSI3 2 lane, camera3 connects to CSI4 4 lane. And mounted on three different i2c buses, as shown in the figure.

image
image

Is the description of our dts file correct? Thanks for giving tips.

#include <dt-bindings/media/camera.h>
/ {
host1x {
vi@15c10000 {
num-channels = <3>;
ports {
#address-cells = <1>;
#size-cells = <0>;
vi_port0: port@0 {
reg = <0>;
rbpcv2_lt6911_vi_in0: endpoint {
port-index = <0>;
bus-width = <4>;
remote-endpoint = <&rbpcv2_lt6911_csi_out0>
status = “okay”;
};
};
vi_port1: port@1 {
reg = <1>;
rbpcv2_lt6911_vi_in1: endpoint {
port-index = <2>;
bus-width = <4>;
remote-endpoint = <&rbpcv2_lt6911_csi_out1>;
status = “okay”;
};
};
vi_port2: port@2 {
reg = <2>;
rbpcv2_lt6911_vi_in2: endpoint {
port-index = <4>;
bus-width = <4>;
remote-endpoint = <&rbpcv2_lt6911_csi_out2>;
status = “okay”;
};
};
};
};

	nvcsi@15a00000 {
		**num-channels = <3>;**
		#address-cells = <1>;
		#size-cells = <0>;
		status = "okay";
		csi_chan0: channel@0 {
			reg = <0>;
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				csi_chan0_port0: port@0 {
					reg = <0>;
					rbpcv2_lt6911_csi_in0: **endpoint@0** {
						port-index = <0>;
						bus-width = <4>;
						remote-endpoint = <&rbpcv2_lt6911_out0>;
						status = "okay";
					};
				};
				csi_chan0_port1: port@1 {
					reg = <1>;
					rbpcv2_lt6911_csi_out0: **endpoint@1** {
						remote-endpoint = <&rbpcv2_lt6911_vi_in0>;
						**status = "okay";**
					};
				};
			};
		};
		csi_chan1: channel@1 {
			reg = <1>;
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				csi_chan1_port0: port@0 {
					reg = <0>;
					rbpcv2_lt6911_csi_in1: **endpoint@2** {
						port-index = <2>;
						bus-width = <4>;
						remote-endpoint = <&rbpcv2_lt6911_out1>;
						**status = "okay";**
					};
				};
				csi_chan1_port1: port@1 {
					reg = <1>;
					rbpcv2_lt6911_csi_out1: **endpoint@3** {
						remote-endpoint = <&rbpcv2_lt6911_vi_in1>;
						**status = "okay";**
					};
				};
			};
		};
		csi_chan2: channel@2 {
			reg = <2>;
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				csi_chan2_port0: port@0 {
					reg = <0>;
					rbpcv2_lt6911_csi_in2: **endpoint@4** {
						port-index = <0>;
						bus-width = <4>;
						remote-endpoint = <&rbpcv2_lt6911_out2>;
						status = "okay";
					};
				};
				csi_chan2_port1: port@1 {
					reg = <1>;
					rbpcv2_lt6911_csi_out2: **endpoint@5** {
						remote-endpoint = <&rbpcv2_lt6911_vi_in2>;
						**status = "okay";**
					};
				};
			};
		};
	};
};

i2c@3160000 {
		lt6911_cam0: rbpcv2_lt6911_a@2b {

			**compatible = "nvidia,lt6911uxc";**
			/* I2C device address */
			**reg = <0x2b>;**

			/* V4L2 device node location */
			devnode = "video0";

			/* Physical dimensions of sensor */
			physical_w = "5.6";
			physical_h = "3.1";

			sensor_model = "lt6911";

			use_sensor_mode_id = "false";

			mode0 { /* CS307_MODE_1920X1080_30FPS */
				mclk_khz = "24000";
				num_lanes = "2";
				tegra_sinterface = "serial_a";
				phy_mode = "DPHY";
				discontinuous_clk = "yes";
				dpcm_enable = "false";
				cil_settletime = "0";

				active_w = "1920";
				active_h = "1080";
				pixel_t = "yuv_uyvy16";
				readout_orientation = "0";
				line_length = "2200";
				inherent_gain = "1";
				mclk_multiplier = "2";
				pix_clk_hz = "74250000";

				gain_factor = "16";
				framerate_factor = "1000000";
				exposure_factor = "1000000";
				min_gain_val = "16"; /* 1.00x */
				max_gain_val = "170"; /* 10.66x */
				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 fps */
				step_framerate = "1";
				default_framerate = "30000000"; /* 30 fps */
				min_exp_time = "13"; /* us */
				max_exp_time = "333333"; /* us */
				step_exp_time = "1";
				default_exp_time = "2495"; /* us */

				embedded_metadata_height = "0";
			};
            mode1 { /* CS307_MODE_1280X720_CROP_60FPS */
				mclk_khz = "24000";
				num_lanes = "2";
				tegra_sinterface = "serial_a";
				phy_mode = "DPHY";
				discontinuous_clk = "yes";
				dpcm_enable = "false";
				cil_settletime = "0";

				active_w = "1280";
				active_h = "720";
				pixel_t = "yuv_uyvy16";
				readout_orientation = "0";
				line_length = "1650";
				inherent_gain = "1";
				mclk_multiplier = "2";
				pix_clk_hz = "74250000";

				gain_factor = "16";
				framerate_factor = "1000000";
				exposure_factor = "1000000";
				min_gain_val = "16"; /* 1.00x */
				max_gain_val = "170"; /* 10.66x */
				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 fps */
				step_framerate = "1";
				default_framerate = "60000000"; /* 60 fps */
				min_exp_time = "13"; /* us */
				max_exp_time = "166666"; /* us */
				step_exp_time = "1";
				default_exp_time = "2495"; /* us */

				embedded_metadata_height = "0";
			};
            mode2 { /* CS307_MODE_640X480_CROP_130FPS */
				mclk_khz = "24000";
				num_lanes = "2";
				tegra_sinterface = "serial_a";
				phy_mode = "DPHY";
				discontinuous_clk = "yes";
				dpcm_enable = "false";
				cil_settletime = "0";

				active_w = "640";
				active_h = "480";
				pixel_t = "yuv_uyvy16";
				readout_orientation = "0";
				line_length = "1100";
				inherent_gain = "1";
				mclk_multiplier = "2";
				pix_clk_hz = "74250000";

				gain_factor = "16";
				framerate_factor = "1000000";
				exposure_factor = "1000000";
				min_gain_val = "16"; /* 1.00x */
				max_gain_val = "170"; /* 10.66x */
				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 = "130000000"; /* 130 fps */
				step_framerate = "1";
				default_framerate = "130000000"; /* 130 fps */
				min_exp_time = "13"; /* us */
				max_exp_time = "7692"; /* us */
				step_exp_time = "1";
				default_exp_time = "2495"; /* us */

				embedded_metadata_height = "0";
			};
			ports {
				#address-cells = <1>;
				#size-cells = <0>;

				port@0 {
					reg = <0>;
					rbpcv2_lt6911_out0: endpoint {
						port-index = <0>;
						bus-width = <4>;
						remote-endpoint = <&rbpcv2_lt6911_csi_in0>;
					};
				};
			};
		};
	};


	i2c@c240000 {
			lt6911_cam1: rbpcv2_lt6911_b@2b {

				**compatible = "nvidia,lt6911uxc";**
				/* I2C device address */
				**reg = <0x2b>;**

				/* V4L2 device node location */
				devnode = "video1";

				/* Physical dimensions of sensor */
				physical_w = "5.6";
				physical_h = "3.1";

				sensor_model = "lt6911";

				use_sensor_mode_id = "false";

				mode0 { /* CS307_MODE_1920X1080_30FPS */
					mclk_khz = "24000";
					num_lanes = "2";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "yes";
					dpcm_enable = "false";
					cil_settletime = "0";

					active_w = "1920";
					active_h = "1080";
					pixel_t = "yuv_uyvy16";
					readout_orientation = "0";
					line_length = "2200";
					inherent_gain = "1";
					mclk_multiplier = "2";
					pix_clk_hz = "74250000";

					gain_factor = "16";
					framerate_factor = "1000000";
					exposure_factor = "1000000";
					min_gain_val = "16"; /* 1.00x */
					max_gain_val = "170"; /* 10.66x */
					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 fps */
					step_framerate = "1";
					default_framerate = "30000000"; /* 30 fps */
					min_exp_time = "13"; /* us */
					max_exp_time = "333333"; /* us */
					step_exp_time = "1";
					default_exp_time = "2495"; /* us */

					embedded_metadata_height = "0";
				};
				mode1 { /* CS307_MODE_1280X720_CROP_60FPS */
					mclk_khz = "24000";
					num_lanes = "2";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "yes";
					dpcm_enable = "false";
					cil_settletime = "0";

					active_w = "1280";
					active_h = "720";
					pixel_t = "yuv_uyvy16";
					readout_orientation = "0";
					line_length = "1650";
					inherent_gain = "1";
					mclk_multiplier = "2";
					pix_clk_hz = "74250000";

					gain_factor = "16";
					framerate_factor = "1000000";
					exposure_factor = "1000000";
					min_gain_val = "16"; /* 1.00x */
					max_gain_val = "170"; /* 10.66x */
					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 fps */
					step_framerate = "1";
					default_framerate = "60000000"; /* 60 fps */
					min_exp_time = "13"; /* us */
					max_exp_time = "166666"; /* us */
					step_exp_time = "1";
					default_exp_time = "2495"; /* us */

					embedded_metadata_height = "0";
				};
				mode2 { /* CS307_MODE_640X480_CROP_130FPS */
					mclk_khz = "24000";
					num_lanes = "2";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "yes";
					dpcm_enable = "false";
					cil_settletime = "0";

					active_w = "640";
					active_h = "480";
					pixel_t = "yuv_uyvy16";
					readout_orientation = "0";
					line_length = "1100";
					inherent_gain = "1";
					mclk_multiplier = "2";
					pix_clk_hz = "74250000";

					gain_factor = "16";
					framerate_factor = "1000000";
					exposure_factor = "1000000";
					min_gain_val = "16"; /* 1.00x */
					max_gain_val = "170"; /* 10.66x */
					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 = "130000000"; /* 130 fps */
					step_framerate = "1";
					default_framerate = "130000000"; /* 130 fps */
					min_exp_time = "13"; /* us */
					max_exp_time = "7692"; /* us */
					step_exp_time = "1";
					default_exp_time = "2495"; /* us */

					embedded_metadata_height = "0";
				};
				ports {
					#address-cells = <1>;
					#size-cells = <0>;

					port@0 {
						reg = <0>;
						rbpcv2_lt6911_out1: endpoint {
							port-index = <0>;
							bus-width = <4>;
							remote-endpoint = <&rbpcv2_lt6911_csi_in1>;
						};
					};
				};
			};
		};


	i2c@3180000 {
			lt6911_cam2: rbpcv2_lt6911_c@2b {

				**compatible = "nvidia,lt6911uxc";**
				/* I2C device address */
				**reg = <0x2b>;**

				/* V4L2 device node location */
				devnode = "video2";

				/* Physical dimensions of sensor */
				physical_w = "5.6";
				physical_h = "3.1";

				sensor_model = "lt6911";

				use_sensor_mode_id = "false";

				mode0 { /* CS307_MODE_1920X1080_30FPS */
					mclk_khz = "24000";
					num_lanes = "2";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "yes";
					dpcm_enable = "false";
					cil_settletime = "0";

					active_w = "1920";
					active_h = "1080";
					pixel_t = "yuv_uyvy16";
					readout_orientation = "0";
					line_length = "2200";
					inherent_gain = "1";
					mclk_multiplier = "2";
					pix_clk_hz = "74250000";

					gain_factor = "16";
					framerate_factor = "1000000";
					exposure_factor = "1000000";
					min_gain_val = "16"; /* 1.00x */
					max_gain_val = "170"; /* 10.66x */
					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 fps */
					step_framerate = "1";
					default_framerate = "30000000"; /* 30 fps */
					min_exp_time = "13"; /* us */
					max_exp_time = "333333"; /* us */
					step_exp_time = "1";
					default_exp_time = "2495"; /* us */

					embedded_metadata_height = "0";
				};
				mode1 { /* CS307_MODE_1280X720_CROP_60FPS */
					mclk_khz = "24000";
					num_lanes = "2";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "yes";
					dpcm_enable = "false";
					cil_settletime = "0";

					active_w = "1280";
					active_h = "720";
					pixel_t = "yuv_uyvy16";
					readout_orientation = "0";
					line_length = "1650";
					inherent_gain = "1";
					mclk_multiplier = "2";
					pix_clk_hz = "74250000";

					gain_factor = "16";
					framerate_factor = "1000000";
					exposure_factor = "1000000";
					min_gain_val = "16"; /* 1.00x */
					max_gain_val = "170"; /* 10.66x */
					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 fps */
					step_framerate = "1";
					default_framerate = "60000000"; /* 60 fps */
					min_exp_time = "13"; /* us */
					max_exp_time = "166666"; /* us */
					step_exp_time = "1";
					default_exp_time = "2495"; /* us */

					embedded_metadata_height = "0";
				};
				mode2 { /* CS307_MODE_640X480_CROP_130FPS */
					mclk_khz = "24000";
					num_lanes = "2";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "yes";
					dpcm_enable = "false";
					cil_settletime = "0";

					active_w = "640";
					active_h = "480";
					pixel_t = "yuv_uyvy16";
					readout_orientation = "0";
					line_length = "1100";
					inherent_gain = "1";
					mclk_multiplier = "2";
					pix_clk_hz = "74250000";

					gain_factor = "16";
					framerate_factor = "1000000";
					exposure_factor = "1000000";
					min_gain_val = "16"; /* 1.00x */
					max_gain_val = "170"; /* 10.66x */
					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 = "130000000"; /* 130 fps */
					step_framerate = "1";
					default_framerate = "130000000"; /* 130 fps */
					min_exp_time = "13"; /* us */
					max_exp_time = "7692"; /* us */
					step_exp_time = "1";
					default_exp_time = "2495"; /* us */

					embedded_metadata_height = "0";
				};
				ports {
					#address-cells = <1>;
					#size-cells = <0>;

					port@0 {
						reg = <0>;
						rbpcv2_lt6911_out2: endpoint {
							port-index = <0>;
							bus-width = <4>;
							remote-endpoint = <&rbpcv2_lt6911_csi_in2>;
						};
					};
				};
			};
		};

};

/ {
tcp: tegra-camera-platform {
compatible = “nvidia, tegra-camera-platform”;

	**num_csi_lanes = <12>;**
	max_lane_speed = <1500000>;
	min_bits_per_pixel = <8>;
	vi_peak_byte_per_pixel = <2>;
	vi_bw_margin_pct = <25>;
	max_pixel_rate = <240000>;
	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 {
		cam_module0: module0 {
			**badge = "jakku_bottom_lt6911";**
			position = "bottom";
			orientation = "1";
			cam_module0_drivernode0: drivernode0 {
				pcl_id = "v4l2_sensor";
				devname = "lt6911 0-002b";
				proc-device-tree = "/proc/device-tree/i2c@3160000/rbpcv2_lt6911_a@2b";
				**status = "okay";**
			};

		};
		cam_module1: module1 {
			**badge = "jakku_center_lt6911";**
			position = "center";
			orientation = "1";
			cam_module1_drivernode0: drivernode0 {
				pcl_id = "v4l2_sensor";
				devname = "lt6911 1-002b";
				proc-device-tree = "/proc/device-tree/i2c@c240000/rbpcv2_lt6911_b@2b";		
				**status = "okay";**
			};
		};
		cam_module2: module2 {
			**badge = "jakku_top_lt6911";**
			position = "top";
			orientation = "1";
			cam_module2_drivernode0: drivernode0 {
				pcl_id = "v4l2_sensor";
				devname = "lt6911 2-002b";
				proc-device-tree = "/proc/device-tree/i2c@3180000/rbpcv2_lt6911_c@2b";
				**status = "okay";**					
			};
		};

	};
};

};

1 Like

The port-index in csi_chan2: channel@2 is 4 not 0
And the tegra_sinterface for second and third need to modify to serial_c/serial_e

Thank you for your guidance!