Multiple CSI RAW BAYER sensor support

L4T_Tegra_X1_Multimedia_User_Guide_Release_24.2.pdf doc says the following

This section describes the supported cameras.
CSI CAMERAS
 Jetson TX1 currently supports only 1 CSI RAW BAYER sensor.
 The platform has been validated with a single OV5693 sensor for capture on L4T.
 The camera module is interfaced with the Tegra platform via MIPI-CSI.
 Tested using the nvgstcapture application.

I can get two OV5693 sensors working simultaneously using V4l2 application, raw capture.

I can’t get two sensors working together using nvgstcapture, I need to disable one of them in the device tree and can get the other one working and vice versa.

I see that this file arch/arm64/mach-tegra/board-t210ref-camera.c shows six sensors support.

else if (of_machine_is_compatible(“nvidia,e2220”)) {
platform_device_register(&t210ref_ov5693_a_soc_camera_device);
platform_device_register(&t210ref_ov5693_b_soc_camera_device);
platform_device_register(&t210ref_ov5693_c_soc_camera_device);
platform_device_register(&t210ref_ov5693_d_soc_camera_device);
platform_device_register(&t210ref_ov5693_e_soc_camera_device);
platform_device_register(&t210ref_ov5693_f_soc_camera_device);
}

Have they ever been tested?

Could anyone shed some light on this?

Thanks,
Hakim

Hi hi-ca
You can find a 6 camera reference board call e3333 (tegra210-camera-e3333-a00.dtsi) and that have been verified by using nvgstcapture with r24.2.1

I’m using 24.2.1 and hoped that it would work.

The hardware uses two different I2C channels whereas e3333 uses same with I2C switch. Other than this all are same.

I’m pasting relevant device tree entries, please let me know where I’m having issues.

vi {
compatible = “nvidia,tegra210-vi”, “simple-bus”;
power-domains = <0x6f>;
reg = <0x0 0x54080000 0x0 0x40000>;
interrupts = <0x0 0x45 0x4>;
iommus = <0x46 0x12>;
status = “okay”;
clocks = <0x70 0x14 0x70 0x34 0x70 0xf3 0x70 0x90 0x70 0x91 0x70 0x92>;
clock-names = “vi”, “csi”, “pll_d”, “cilab”, “cilcd”, “cile”;
resets = <0x70 0x14>;
reset-names = “vi”;
#address-cells = <0x1>;
#size-cells = <0x0>;
avdd_dsi_csi-supply = <&cti_buck>;
num-channels = <0x2>;
linux,phandle = <0xc7>;
phandle = <0xc7>;

		ports {
			#address-cells = <0x1>;
			#size-cells = <0x0>;

			port@0 {
				reg = <0x0>;
				status = "okay";
				linux,phandle = <0xc8>;
				phandle = <0xc8>;

				endpoint {
					csi-port = <0x0>;
					bus-width = <0x2>;
					remote-endpoint = <&AS2_OV5693_01>;
					status = "okay";
					linux,phandle = <0x85>;
					phandle = <0x85>;
				};
			};

			port@1 {
				reg = <0x1>;
				status = "okay";
				linux,phandle = <0xd2>;
				phandle = <0xd2>;

				endpoint {
					csi-port = <0x1>;
					bus-width = <0x2>;
					remote-endpoint = <&AS2_OV5693_02>;
					status = "okay";
					linux,phandle = <0x88>;
					phandle = <0x88>;
				};
			};
			
			...................
			
i2c@546c0000 {
		#address-cells = <0x1>;
		#size-cells = <0x0>;
		compatible = "nvidia,tegra210-vii2c";
		reg = <0x0 0x546c0000 0x0 0x34000>;
		iommus = <0x46 0x12>;
		interrupts = <0x0 0x11 0x4>;
		scl-gpio = <0x6a 0x92 0x0>;
		sda-gpio = <0x6a 0x93 0x0>;
		status = "okay";
		clock-frequency = <0x61a80>;
		bus-pullup-supply = <0x56>;
		avdd_dsi_csi-supply = <0x56>;
		linux,phandle = <0xc2>;
		phandle = <0xc2>;
		
	e3326_cam0: ov5693_a@36{
			compatible = "nvidia,ov5693";
			reg = <0x36>;
			devnode = "video0";
			physical_w = "3.674";
			physical_h = "2.738";
			avdd-reg = "vana";
			iovdd-reg = "vif";		
			clocks = <0x70 0x135>;
			post_crop_frame_drop = [30 00];
			clock-names = "mclk";				
			sensor_model = "ov5693";
			clock-frequency = <0x16e3600>;
			mclk = "cam_mclk1";
			reset-gpios = <0x6a 0x94 0x0>;
			pwdn-gpios = <0x6a 0x97 0x0>;
			vana-supply = <&cti_buck>;
			vif-supply = <&cti_buck>;
			status = "okay";
			
			mode0 {
				mclk_khz = "24000";
				num_lanes = [32 00];
				tegra_sinterface = "serial_a";
				discontinuous_clk = "no";
				dpcm_enable = "false";
				cil_settletime = [30 00];
				active_w = "2592";
				active_h = "1944";
				pixel_t = "bayer_bggr";
				readout_orientation = "90";
				line_length = "2688";
				inherent_gain = [31 00];
				mclk_multiplier = "17.0";
				pix_clk_hz = "160000000";
				min_gain_val = "1.0";
				max_gain_val = "16";
				min_hdr_ratio = [31 00];
				max_hdr_ratio = "64";
				min_framerate = "1.816577";
				max_framerate = "30";
				min_exp_time = "34";
				max_exp_time = "550385";
			};

			mode1 {
				mclk_khz = "24000";
				num_lanes = [32 00];
				tegra_sinterface = "serial_a";
				discontinuous_clk = "no";
				dpcm_enable = "false";
				cil_settletime = [30 00];
				active_w = "2592";
				active_h = "1458";
				pixel_t = "bayer_bggr";
				readout_orientation = "90";
				line_length = "2688";
				inherent_gain = [31 00];
				mclk_multiplier = "17.0";
				pix_clk_hz = "160000000";
				min_gain_val = "1.0";
				max_gain_val = "16";
				min_hdr_ratio = [31 00];
				max_hdr_ratio = "64";
				min_framerate = "1.816577";
				max_framerate = "30";
				min_exp_time = "34";
				max_exp_time = "550385";
			};

			mode2 {
				mclk_khz = "24000";
				num_lanes = [32 00];
				tegra_sinterface = "serial_a";
				discontinuous_clk = "no";
				dpcm_enable = "false";
				cil_settletime = [30 00];
				active_w = "1280";
				active_h = "720";
				pixel_t = "bayer_bggr";
				readout_orientation = "90";
				line_length = "1752";
				inherent_gain = [31 00];
				mclk_multiplier = "17.0";
				pix_clk_hz = "160000000";
				min_gain_val = "1.0";
				max_gain_val = "16";
				min_hdr_ratio = [31 00];
				max_hdr_ratio = "64";
				min_framerate = "2.787078";
				max_framerate = "120";
				min_exp_time = "22";
				max_exp_time = "358733";
			};

			mode3 {
				mclk_khz = "24000";
				num_lanes = [32 00];
				tegra_sinterface = "serial_a";
				discontinuous_clk = "no";
				dpcm_enable = "false";
				cil_settletime = [30 00];
				active_w = "2592";
				active_h = "1944";
				pixel_t = "hdr_bggr";
				readout_orientation = "90";
				line_length = "3696";
				inherent_gain = [31 00];
				mclk_multiplier = "19.0";
				pix_clk_hz = "176000000";
				min_gain_val = "1.0";
				max_gain_val = "16";
				min_hdr_ratio = [31 00];
				max_hdr_ratio = "64";
				min_framerate = "1.453262";
				max_framerate = "24";
				min_exp_time = "42";
				max_exp_time = "687981";
			};

			ports {
				#address-cells = <0x1>;
				#size-cells = <0x0>;

				port@0 {
					reg = <0x0>;

					AS2_OV5693_01: endpoint {
						csi-port = <0x0>;
						bus-width = <0x2>;
						remote-endpoint = <0x85>;							
					};
				};
			};
		};				

i2c@7000c000 {
#address-cells = <0x1>;
#size-cells = <0x0>;
compatible = “nvidia,tegra210-i2c”;
reg = <0x0 0x7000c000 0x0 0x100>;
interrupts = <0x0 0x26 0x4>;
iommus = <0x46 0xe>;
status = “okay”;
clock-frequency = <0x61a80>;
nvidia,clock-always-on;
linux,phandle = <0xbf>;
phandle = <0xbf>;

	ov5693_b@36 {
		compatible = "nvidia,ov5693";
		reg = <0x36>;
		devnode = "video1";
		physical_w = "3.674";
		physical_h = "2.738";
		avdd-reg = "vana";
		iovdd-reg = "vif";
		clocks = <0x70 0x135>;
		post_crop_frame_drop = [30 00];
		clock-names = "mclk";
		clock-frequency = <0x16e3600>;
		sensor_model = "ov5693";
		mclk = "cam_mclk1";
		reset-gpios = <0x6a 0x95 0x0>;
		pwdn-gpios = <0x6a 0x98 0x0>;
		vana-supply = <&cti_buck>;
		vif-supply = <&cti_buck>;
		status = "okay";
			
		mode0 {
			mclk_khz = "24000";
			num_lanes = [32 00];
			tegra_sinterface = "serial_b";
			discontinuous_clk = "no";
			dpcm_enable = "false";
			cil_settletime = [30 00];
			active_w = "2592";
			active_h = "1944";
			pixel_t = "bayer_bggr";
			readout_orientation = "90";
			line_length = "2688";
			inherent_gain = [31 00];
			mclk_multiplier = "17.0";
			pix_clk_hz = "160000000";
			min_gain_val = "1.0";
			max_gain_val = "16";
			min_hdr_ratio = [31 00];
			max_hdr_ratio = "64";
			min_framerate = "1.816577";
			max_framerate = "30";
			min_exp_time = "34";
			max_exp_time = "550385";
		};

		mode1 {
			mclk_khz = "24000";
			num_lanes = [32 00];
			tegra_sinterface = "serial_b";
			discontinuous_clk = "no";
			dpcm_enable = "false";
			cil_settletime = [30 00];
			active_w = "2592";
			active_h = "1458";
			pixel_t = "bayer_bggr";
			readout_orientation = "90";
			line_length = "2688";
			inherent_gain = [31 00];
			mclk_multiplier = "17.0";
			pix_clk_hz = "160000000";
			min_gain_val = "1.0";
			max_gain_val = "16";
			min_hdr_ratio = [31 00];
			max_hdr_ratio = "64";
			min_framerate = "1.816577";
			max_framerate = "30";
			min_exp_time = "34";
			max_exp_time = "550385";
		};

		mode2 {
			mclk_khz = "24000";
			num_lanes = [32 00];
			tegra_sinterface = "serial_b";
			discontinuous_clk = "no";
			dpcm_enable = "false";
			cil_settletime = [30 00];
			active_w = "1280";
			active_h = "720";
			pixel_t = "bayer_bggr";
			readout_orientation = "90";
			line_length = "1752";
			inherent_gain = [31 00];
			mclk_multiplier = "17.0";
			pix_clk_hz = "160000000";
			min_gain_val = "1.0";
			max_gain_val = "16";
			min_hdr_ratio = [31 00];
			max_hdr_ratio = "64";
			min_framerate = "2.787078";
			max_framerate = "120";
			min_exp_time = "22";
			max_exp_time = "358733";
		};

		mode3 {
			mclk_khz = "24000";
			num_lanes = [32 00];
			tegra_sinterface = "serial_b";
			discontinuous_clk = "no";
			dpcm_enable = "false";
			cil_settletime = [30 00];
			active_w = "2592";
			active_h = "1944";
			pixel_t = "hdr_bggr";
			readout_orientation = "90";
			line_length = "3696";
			inherent_gain = [31 00];
			mclk_multiplier = "19.0";
			pix_clk_hz = "176000000";
			min_gain_val = "1.0";
			max_gain_val = "16";
			min_hdr_ratio = [31 00];
			max_hdr_ratio = "64";
			min_framerate = "1.453262";
			max_framerate = "24";
			min_exp_time = "42";
			max_exp_time = "687981";
		};

		ports {
			#address-cells = <0x1>;
			#size-cells = <0x0>;

			port@0 {
				reg = <0x0>;

				AS2_OV5693_02: endpoint {
					csi-port = <0x1>;
					bus-width = <0x2>;
					remote-endpoint = <0x88>;						
				};
			};
		};
	};

tegra-camera-platform {
compatible = “nvidia, tegra-camera-platform”;
num_csi_lanes = <0x2>;
max_lane_speed = <0x16e360>;
min_bits_per_pixel = <0xa>;
vi_peak_byte_per_pixel = <0x2>;
vi_bw_margin_pct = <0x19>;
max_pixel_rate = <0x639c0>;
isp_peak_byte_per_pixel = <0x2>;
isp_bw_margin_pct = <0x19>;
linux,phandle = <0xc9>;
phandle = <0xc9>;

	modules {

		module0 {
			badge = "e3326_front_P5V27C";
			position = "front";
			orientation = [31 00];
			status = "okay";
			linux,phandle = <0xc4>;
			phandle = <0xc4>;

			drivernode0 {
				pcl_id = "v4l2_sensor";
				devname = "ov5693 6-0036";
				proc-device-tree = "/proc/device-tree/host1x/i2c@546c0000/ov5693_a@36";
				status = "okay";
				linux,phandle = <0xc5>;
				phandle = <0xc5>;
			};

			drivernode1 {
				pcl_id = "v4l2_focuser_stub";
				devname = "lc898212 6-0072";
				proc-device-tree = [00];
				status = "okay";
				linux,phandle = <0xc6>;
				phandle = <0xc6>;
			};
		};

		module1 {
			badge = "e3326_rear_P5V27C";
			position = "rear";
			orientation = [33 00];
			status = "okay";
			linux,phandle = <0xcc>;
			phandle = <0xcc>;

			drivernode0 {
				pcl_id = "v4l2_sensor";
				devname = "ov5693 0-0036";
				proc-device-tree = "/proc/device-tree/i2c@7000c000/ov5693_b@36";
				status = "okay";
				linux,phandle = <0xcd>;
				phandle = <0xcd>;
			};

			drivernode1 {
				pcl_id = "v4l2_focuser_stub";
				devname = "lc898212 0-0072";
				proc-device-tree = [00];
				status = "okay";
				linux,phandle = <0xd0>;
				phandle = <0xd0>;
			};
		};

Could you remove both of the focuser to try?

drivernode1 {
pcl_id = “v4l2_focuser_stub”;
devname = “lc898212 6-0072”;
proc-device-tree = [00];
status = “okay”;
linux,phandle = <0xc6>;
phandle = <0xc6>;
};

Unfortunately it did not help.

I’m adding debug log from nvcamera daemon.
nvdbg-video0.txt (373 KB)
nvdbg-video1.txt (423 KB)

Both of the “Position” for the front and rear shouldn’t the same.

NvPclHwPrintModuleDefinition -- Name: e3326_front_P5V27C
NvPclHwPrintModuleDefinition -- Position: 0
NvPclHwPrintModuleDefinition -- CalibrationData Found: 1
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].Name: v4l2_sensor
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].DevName: ov5693 6-0036
NvPclHwPrintCameraSubModule -- HwCamSubModule[1].Name: v4l2_focuser_stub
NvPclHwPrintCameraSubModule -- HwCamSubModule[1].DevName:
NvPclHwMatchPartNum: Found calibration Part#:P5V27CCV:"P5V27C"
NvPclHwGetModuleList: No module data found
NvPclHwPrintModuleDefinition -- Name: e3326_rear_P5V27C
NvPclHwPrintModuleDefinition -- Position: 0
NvPclHwPrintModuleDefinition -- CalibrationData Found: 1
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].Name: v4l2_sensor
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].DevName: ov5693 0-0036

OK thanks, this solved the issue.

I’d like to mention that position was “front” and “rear” in the device tree and it did not work, position is 0 for both. So, I changed centerleft and centerright and found working by changing sensor ID by sid:0/1, --cap-dev-node=0/1 did not work.