Jetson-TX2 driver FPD-link bus camera

Hi,

System version: JetPack 4.2.2
sensor type: IMX224
Transformat:YUV422
Serializer:DS90UB913A
Deserializer:DS90UB954Q

Our hardware circuit uses DS90UB954Q to drive the camera. How to use TX2 to drive DS90UB954Q to realize two FPD-link interface cameras?

Attachment is the camera hardware schematic

Thanks.

hello lk_xiang,

Serializer and Deserializer playing signaling transmit, you still having two IMX224 as source inputs.
according to your camera hardware schematic, you’ll need to implement sensor device tree as dual camera nodes, then it should recognize as two camera device connected.

you may also refer to IMX390 reference driver,
$l4t-r32.2/public_sources/kernel_src/hardware/nvidia/platform/t18x/common/kernel-dts/t18x-common-modules/tegra186-camera-imx390-a00.dtsi

please also check Sensor Software Driver Programming Guide, you’ll need to configure [SerDes Pixel Clock] for the sensor modules that use serializer/deserializer chips.
thanks

lk_xiang,

D3 uses FPDLink serdes components in our products including the ub960, ub953, and ub954. You might find our source code helpful.

[url]https://github.com/D3Engineering/d3-jetson-bsp/tree/d3/1.3.3/kernel/d3/drivers/d3[/url]

There are some changes we’d like to make to our FPDLink drivers but haven’t had the opportunity to do so yet. In particular the deserializer should probably appear as an i2c-mux. Regardless, the code is functional and may be helpful to you.

Regards,
Greg

Hi,

System version: JetPack 4.2.2
Camera model: OV5693
Deserializer: DS90UB954
Video data format: yuv_yuyv8
1280x720
Camera driver ub954-ov5693.c referenced imx185_v1.c

The camera driver was detected, but there was an error when outputting the image. This driver is available for use on the JetPack 3.3 release.

The following is the error message for the prompt:

[  342.849567] [OV5693]-----camera_common_enum_framesizes: at740 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849577] [OV5693]-----camera_common_enum_frameintervals: at766 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849588] [OV5693]-----camera_common_enum_frameintervals: at766 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849601] [OV5693]-----camera_common_enum_framesizes: at740 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849612] [OV5693]-----camera_common_enum_framesizes: at740 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849618] [OV5693]-----camera_common_enum_frameintervals: at766 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849624] [OV5693]-----camera_common_enum_frameintervals: at766 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.849634] [OV5693]-----camera_common_enum_framesizes: at740 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c.
[  342.856526] [UB954-OV5693]-----ub954_ov5693_s_stream: at352 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/i2c/ov5693.c.s_data->mode:0
[  342.856531] [UB954-OV5693]-----ub954_ov5693_s_stream: at370 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/i2c/ov5693.c.s_data->mode:0
[  343.056868] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  343.063302] tegra-vi4 15700000.vi: tegra_channel_error_recovery: attempting to reset the capture channel
[  343.073183] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC1 = 0x00000006
[  343.081915] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x00010060
[  343.089777] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x00010060
[  343.300957] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  343.307488] tegra-vi4 15700000.vi: tegra_channel_error_recovery: attempting to reset the capture channel
[  343.317504] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC1 = 0x0000000e
[  343.326276] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x000000e0
[  343.334218] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x000000e0
[  343.544936] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  343.551431] tegra-vi4 15700000.vi: tegra_channel_error_recovery: attempting to reset the capture channel
[  343.561412] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC1 = 0x0000000e
[  343.570169] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x000100e0
[  343.578022] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x000100e0
[  343.788944] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  343.795437] tegra-vi4 15700000.vi: tegra_channel_error_recovery: attempting to reset the capture channel
[  343.805461] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC1 = 0x0000000e
[  343.814262] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x000000e0
[  343.822144] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x000000e0
[  344.032885] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  344.039428] tegra-vi4 15700000.vi: tegra_channel_error_recovery: attempting to reset the capture channel
[  344.049424] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC1 = 0x00000006
[  344.058255] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x00010060
[  344.066127] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x00010060
[  344.276935] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  344.283421] tegra-vi4 15700000.vi: tegra_channel_error_recovery: attempting to reset the capture channel
[  344.293440] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC1 = 0x0000000e
[  344.302207] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x000100c0
[  344.310088] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x000100c0
[  344.520984] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11

Attachments are modified source and log:

vedio-log.txt (256 KB)
src.zip (20.1 KB)

Hi,

I encountered a gain update failure while driving the ov5693 camera.

[    3.767181] ov5693 2-0030: probing v4l2 sensor.
[    3.767242] ov5693 2-0030: ===ov5693_parse_dt====
[    3.767835] [OV5693]-----camera_common_initialize: at957 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/camera_common.c. 
[    3.767877] [OV5693]-----sensor_common_init_sensor_properties: at779 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/sensor_common.c. 
[    3.767881] [OV5693]-----sensor_common_parse_image_props: at245 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/sensor_common.c. 
[    3.767917] [OV5693]-----sensor_common_parse_image_props: at273 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/sensor_common.c. 
[    3.767924] [OV5693]-----sensor_common_parse_image_props: at312 in/home/lion/project/cpc1816/kernel_src32.2.1/kernel/nvidia/drivers/media/platform/tegra/camera/sensor_common.c. yuv_yuyv8 yuv_yuyv8
[    3.767957] ov5693 2-0030: pixel_format=1448695129
[    3.767963] ov5693 2-0030: def_clk_freq=25000000
[    3.767966] ov5693 2-0030: def_mode=0
[    3.767970] ov5693 2-0030: def_width=1280
[    3.767974] ov5693 2-0030: def_height=720
[    3.767983] ov5693 2-0030: tegracam sensor driver:ov5693_v2.0.6
[    3.770091] ov5693 2-0030: handler-numctrls=8
[    3.770098] ov5693 2-0030: TEGRA_CAMERA_CID_GAIN
[    3.770103] ov5693 2-0030: ctrl_id=10100745
[    3.770108] ov5693 2-0030: min_gain_val=0
[    3.770111] ov5693 2-0030: max_gain_val=0
[    3.770115] ov5693 2-0030: step_gain_val=0
[    3.770118] ov5693 2-0030: default_gain=0
[    3.770125] ov5693 2-0030: ctrl Gain range update failed
[    3.770131] ov5693 2-0030: Error -34 updating mode specific control ranges
[    3.770136] ov5693 2-0030: Error -34 updating control ranges
[    3.770148] ov5693 2-0030: Failed to init ctrls ov5693
[    3.770152] ov5693 2-0030: tegra camera subdev registration failed
[    3.770241] ov5693: probe of 2-0030 failed with error -34

I have set the corresponding gain value in the node attribute, but the gain value of debug print is zero.
tegra186-camera-e3326-a00.dtsi

/*
 * Copyright (c) 2015-2019, NVIDIA CORPORATION.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/ {
	host1x {
		vi@15700000 {
			num-channels = <1>;
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				port@0 {
					reg = <0>;
					e3326_vi_in0: endpoint {
						status = "okay";/*add by lk*/
						port-index = <0>;/*org 2*/
						bus-width = <4>;/*org 2*/
						remote-endpoint = <&e3326_csi_out0>;
					};
				};
			};
		};

		nvcsi@150c0000 {
			num-channels = <1>;
			#address-cells = <1>;
			#size-cells = <0>;
			channel@0 {
				reg = <0>;
				ports {
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						reg = <0>;
						e3326_csi_in0: endpoint@0 {
							status = "okay";/*add by lk*/
							port-index = <0>;/*org 2*/
							bus-width = <4>;/*org 2*/
							remote-endpoint = <&e3326_ov5693_out0>;
						};
					};
					port@1 {
						reg = <1>;
						e3326_csi_out0: endpoint@1 {
							status = "okay";/*add by lk*/
							remote-endpoint = <&e3326_vi_in0>;
						};
					};
				};
			};
		};
	};

	i2c@3180000 {
		status = "okay";/*add by lk*/
		ov5693_c@30 {
			compatible = "nvidia,ov5693";
			/* I2C device address */
			reg = <0x30>;

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

			/* Physical dimensions of sensor */
			physical_w = "3.674";
			physical_h = "2.738";

			/* Define any required hw resources needed by driver */
			/* ie. clocks, io pins, power sources */
			avdd-reg = "vana";
			iovdd-reg = "vif";

			/* Sensor output flip settings */
			vertical-flip = "true";

			/**
			* A modeX node is required to support v4l2 driver
			* implementation with NVIDIA camera software stack
			*
			* mclk_khz = "";
			* Standard MIPI driving clock, typically 24MHz
			*
			* num_lanes = "";
			* Number of lane channels sensor is programmed to output
			*
			* tegra_sinterface = "";
			* The base tegra serial interface lanes are connected to
			* Incase of virtual HW devices, use virtual
			* For SW emulated devices, use host
			*
			* phy_mode = "";
			* PHY mode used by the MIPI lanes for this device
			*
			* discontinuous_clk = "";
			* The sensor is programmed to use a discontinuous clock on MIPI lanes
			*
			* dpcm_enable = "true";
			* The sensor is programmed to use a DPCM modes
			*
			* cil_settletime = "";
			* MIPI lane settle time value.
			* A "0" value attempts to autocalibrate based on mclk_multiplier
			*
			*
			*
			*
			* active_w = "";
			* Pixel active region width
			*
			* active_h = "";
			* Pixel active region height
			*
			* pixel_t = "";
			* The sensor readout pixel pattern
			*
			* readout_orientation = "0";
			* Based on camera module orientation.
			* Only change readout_orientation if you specifically
			* Program a different readout order for this mode
			*
			* line_length = "";
			* Pixel line length (width) for sensor mode.
			* This is used to calibrate features in our camera stack.
			*
			* mclk_multiplier = "";
			* Multiplier to MCLK to help time hardware capture sequence
			* TODO: Assign to PLL_Multiplier as well until fixed in core
			*
			* pix_clk_hz = "";
			* Sensor pixel clock used for calculations like exposure and framerate
			*
			*
			*
			*
			* inherent_gain = "";
			* Gain obtained inherently from mode (ie. pixel binning)
			*
			* == 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 (us)
			*
			*
			* min_hdr_ratio = "";
			* max_hdr_ratio = "";
			* HDR Ratio limits for mode
			*
			* framerate_factor = ""; (integer factor used for floating to fixed point conversion)
			* min_framerate = "";
			* max_framerate = "";
			* step_framerate = ""; (ceil to integer)
			* default_framerate = ""; (ceil to integer)
			* Framerate limits for mode (fps)
			*/
		    mode0 { //OV5693_MODE_1280X720
				mclk_khz = "25000";
				num_lanes = "4";
				tegra_sinterface = "serial_a";
				phy_mode = "DPHY";
				discontinuous_clk = "yes";
				dpcm_enable = "false";
				cil_settletime = "0";

				active_w = "1280";
				active_h = "720";
				mode_type = "yuv";
				pixel_phase = "yuyv";
				csi_pixel_bit_depth = "8";
				readout_orientation = "0";
				line_length = "1280";
				inherent_gain = "1";
				mclk_multiplier = "2.21";
				pix_clk_hz = "55219200";

				//gain_factor = "10";
				min_gain_val = "1.0";/* 1DB*/
				max_gain_val = "16";/* 16DB*/
				step_gain_val = "1";
				default_gain = "1.0";
				min_hdr_ratio = "1";
				max_hdr_ratio = "64";
				//framerate_factor = "1000000";
				min_framerate = "1.816577";/* 2.787078 */
				max_framerate = "30";/* 120*/
				step_framerate = "1";
				default_framerate = "30";/*120000000*/
				//exposure_factor = "1000000";
				min_exp_time = "34";/* us */
				max_exp_time = "550385";/* us */
				step_exp_time = "1";
				default_exp_time = "8334";/* us */
				embedded_metadata_height = "1";
			};

			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				status = "okay";/*add by lk*/

				port@0 {
					status = "okay";/*add by lk*/
					reg = <0>;
					e3326_ov5693_out0: endpoint {
						status = "okay";/*add by lk*/
						port-index = <0>;/*org 2*/
						bus-width = <4>;/*org 2*/
						remote-endpoint = <&e3326_csi_in0>;
					};
				};
			};
		};
	};

	e3326_lens_ov5693@P5V27C {
		min_focus_distance = "0.0";
		hyper_focal = "0.0";
		focal_length = "2.67";
		f_number = "2.0";
		aperture = "2.0";
	};

	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 = <4>;/*org 2*/
		max_lane_speed = <1500000>;
		min_bits_per_pixel = <8>;/*org 10*/
		vi_peak_byte_per_pixel = <2>;
		vi_bw_margin_pct = <25>;
		max_pixel_rate = <160000>;
		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 vender.
		*/
		modules {
			module0 {
				badge = "e3326_front_P5V27C";
				position = "rear";
				orientation = "1";
				drivernode0 {
					status = "okay";/*add by lk*/
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "ov5693 2-0030";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/ov5693_c@30";
				};
				drivernode1 {
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_lens";
					proc-device-tree = "/proc/device-tree/e3326_lens_ov5693@P5V27C/";
				};
			};
		};
	};
};

Thanks.

hello lk_xiang,

please refer to below kernel sources for the details of your gain range update failure.
$l4t-r32.2/public_sources/kernel/nvidia/drivers/media/platform/tegra/camera/tegracam_ctrls.c

please also check Sensor Software Driver Programming Guide, and review your device tree properties settings.
thanks