Jetson AGX Orin FPD-LinkIII_ds90ub95x Devicetree How to configuration?

We have a jeston agx orin platform, the software version is jack5.1, we customized a switching board, and accessed the camera through FPD-Link-III (DS90UB954/DS90UB953). We want to complete the integration of fpd-link based on the driver of imx185 in SDK. How do I need to configure it in the device tree?

hello 1508723374,

please refer to developer guide, Jetson Virtual Channel with GMSL Camera Framework.
you may see-also reference camera driver which using SerDes chip.
for instance,
$public_sources/kernel_src/hardware/nvidia/platform/t23x/common/kernel-dts/t234-common-modules/tegra234-camera-imx390-a00.dtsi

I have seen many posts on the forum that ds90ub954/ds90ub953 needs a driver, is it necessary to port this driver to the orin platform?
InES-HPMM/FPD-LinkIII_ds90ub95x: FDP Link III driver for ds90ub954/ds90ub953 (github.com)

hello 1508723374,

yes, please port the driver, it’s not supported by default.
you may see-also Jetson Linux 36.3 | NVIDIA Developer for [Driver Package (BSP) Sources].

I couldn’t catch the video stream through v4l2, and the cmos register configuration was all right. My suspicion may be that csi is not properly connected, please help me to see where the problem is. The following is the configuration of my device tree and the design schematic diagram of the custom adapter board.


tegra234-camera-imx185-a00.zip (3.9 KB)

hello 1508723374,

is it possible to probe the MIPI signaling via oscilloscope to confirm there’re packets on the CSI channel?

No mipi signal was measured. I don’t know why. There is another point I did not think about, there are four seats on the board, but I actually only used one, but generated video0~3, and then I set any device node can be enough to execute.ko files, and can read the register data, is it the characteristics of I2C_Mux? I don’t even know if the cmos register configuration Settings are in effect.

hello 1508723374,

there’s nothing software can be done without MIPI signaling on the CSI channel.
please review your hardware schematic and also power supply to ensure you’ve output the frame packets correctly.

Ok, let’s not worry about the mipi signal, let’s assume that the cmos register is not configured so that no data comes out. Then, as I mentioned above, the device tree is configured with four nodes, generating video0~3, but I directly a cmos, why can each device stage access this cmos, should not be able to access only one of them?

hello 1508723374,

I didn’t get you, are you talking from hardware point-of-view?

I am speaking from the software level, I use v4l2 to grab four data streams will execute drivers to configure registers, can read and write.
v4l2-ctl --set-fmt-video=width=3840,height=2160,pixelformat=BG10 --set-ctrl bypass_mode=0 --stream-skip=30 --stream-mmap --stream-count=1 --stream-to=ov1081.raw -d /dev/video0~3

hello 1508723374,

it was these two comments confused me.

it’s V4L2 IOCTL to verify basic camera functionality.
anyways, if you’re able to fetch the stream via v4l2, what’s the failure approach?
also, may I know which Jetpack release version you’re working with.

I can now grab the data stream, but it’s random.

Like that sometimes you catch it and sometimes you don’t.

hello 1508723374,

please review your pixel clock settings with SerDes Pixel Clock section.
may I also confirm the data-rate, is it larger than 1.5Gbps which related to skew calibration?

yes,My deserializer output is 1.6Gbps,I am still confused about how to configure this parameter serdes_pix_clk_hz.
serdes_pix_clk_hz=1.6Gbps*4/10=640000000

                                        mode0 {
                                                mclk_khz = "37125";
                                                num_lanes = [34 00];
                                                tegra_sinterface = "serial_a";
                                                phy_mode = "DPHY";
                                                discontinuous_clk = "yes";
                                                dpcm_enable = "false";
                                                cil_settletime = [30 00];
                                                active_w = "3840";
                                                active_h = "2160";
                                                dynamic_pixel_bit_depth = "10";
                                                csi_pixel_bit_depth = "10";
                                                mode_type = "bayer";
                                                pixel_phase = "bggr";
                                                readout_orientation = [30 00];
                                                line_length = "4512";
                                                inherent_gain = [31 00];
                                                pix_clk_hz = "640000000";
                                                serdes_pix_clk_hz = "640000000";
                                                gain_factor = "10";
                                                min_gain_val = [30 00];
                                                max_gain_val = "480";
                                                step_gain_val = [31 00];
                                                default_gain = [30 00];
                                                min_hdr_ratio = [31 00];
                                                max_hdr_ratio = [31 00];
                                                framerate_factor = "1000000";
                                                min_framerate = "1500000";
                                                max_framerate = "15000000";
                                                step_framerate = [31 00];
                                                default_framerate = "15000000";
                                                exposure_factor = "1000000";
                                                min_exp_time = "11";
                                                step_exp_time = [31 00];
                                                max_exp_time = "660000";
                                                default_exp_time = "10000";
                                                embedded_metadata_height = [30 00];
                                        };

hello 1508723374,

there’re fixes added to support deskew calibration for high data rate sensors (> 1.5 Gbps).
please moving to the latest Jetpack-5 release version (i.e. Jetpack-5.1.3) if that’s possible.

I solved this problem by making 1.6Gbps->800Mbps, v4l2-ctl was able to grab video streams normally, but gst-launch-1.0 had no way to grab data.

hl@hl-desktop:~$ v4l2-ctl --set-fmt-video=width=3840,height=2160,pixelformat=BG10 --set-ctrl bypass_mode=0 --stream-skip=30 --stream-mmap --stream-count=1 --stream-to=ov1081.raw -d /dev/video1
<<<<<<<<<<<<<<<<< 15.00 fps
<<<<<<<<<<<<<<
hl@hl-desktop:~$ gst-launch-1.0 nvarguscamerasrc sensor-id=1 ! 'video/x-raw(memory:NVMM),width=3840, height=2160, framerate=15/1, format=NV12' ! nvvidconv ! 'video/x-raw(memory:NVMM),format=I420' ! fpsdisplaysink text-overlay=0 video-sink=fakesink sync=0 -v
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
Setting pipeline to PLAYING ...
New clock: GstSystemClock
/GstPipeline:pipeline0/GstNvArgusCameraSrc:nvarguscamerasrc0.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, format=(string)NV12, framerate=(fraction)15/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, format=(string)NV12, framerate=(fraction)15/1
/GstPipeline:pipeline0/Gstnvvconv:nvvconv0.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, framerate=(fraction)15/1, format=(string)I420
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, framerate=(fraction)15/1, format=(string)I420
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, framerate=(fraction)15/1, format=(string)I420
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, framerate=(fraction)15/1, format=(string)I420
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, framerate=(fraction)15/1, format=(string)I420
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, framerate=(fraction)15/1, format=(string)I420
/GstPipeline:pipeline0/Gstnvvconv:nvvconv0.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, format=(string)NV12, framerate=(fraction)15/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw(memory:NVMM), width=(int)3840, height=(int)2160, format=(string)NV12, framerate=(fraction)15/1
GST_ARGUS: Creating output stream
CONSUMER: Waiting until producer is connected...
GST_ARGUS: Available Sensor modes :
GST_ARGUS: 3840 x 2160 FR = 15.000000 fps Duration = 66666668 ; Analog Gain range min 1.000000, max 251.188705; Exposure Range min 11000, max 660000000;

GST_ARGUS: Running with following settings:
   Camera index = 1 
   Camera mode  = 0 
   Output Stream W = 3840 H = 2160 
   seconds to Run    = 0 
   Frame Rate = 15.000000 
GST_ARGUS: Setup Complete, Starting captures for 0 seconds
GST_ARGUS: Starting repeat capture requests.
CONSUMER: Producer has connected; continuing.
nvbuf_utils: dmabuf_fd -1 mapped entry NOT found
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadExecute:694 NvBufSurfaceFromFd Failed.
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, threadFunction:247 (propagating)
/GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstFakeSink:fakesink0: sync = false
Got EOS from element "pipeline0".
Execution ended after 0:00:04.027649312
Setting pipeline to NULL ...
GST_ARGUS: Cleaning up
^C
root@hl-desktop:/home/hl# /usr/sbin/nvargus-daemon    
=== NVIDIA Libargus Camera Service (0.99.33)=== Listening for connections...=== gst-launch-1.0[2572]: Connection established (FFFF9D6FD900)OFParserListModules: module list: /proc/device-tree/tegra-camera-platform/modules/module0
OFParserListModules: module list: /proc/device-tree/tegra-camera-platform/modules/module1
OFParserListModules: module list: /proc/device-tree/tegra-camera-platform/modules/module2
OFParserListModules: module list: /proc/device-tree/tegra-camera-platform/modules/module3
NvPclHwGetModuleList: No module data found
NvPclHwGetModuleList: No module data found
NvPclHwGetModuleList: No module data found
OFParserGetVirtualDevice: NVIDIA Camera virtual enumerator not found in proc device-tree
---- imager: No override file found. ----
---- imager: No override file found. ----
---- imager: No override file found. ----
---- imager: No override file found. ----
=== gst-launch-1.0[2572]: CameraProvider initialized (0xffff98af1b00)SCF: Error BadValue: NvPHSSendThroughputHints (in src/common/CameraPowerHint.cpp, function sendCameraPowerHint(), line 56)
SCF: Error InvalidState: Timeout waiting on frame start sensor guid 1, capture sequence ID = 0 (in src/services/capture/FusaCaptureViCsiHw.cpp, function waitCsiFrameStart(), line 514)
SCF: Error InvalidState:  (propagating from src/common/Utils.cpp, function workerThread(), line 114)
SCF: Error InvalidState: Worker thread ViCsiHw frameStart failed (in src/common/Utils.cpp, function workerThread(), line 133)
SCF: Error Timeout:  (propagating from src/services/capture/FusaCaptureViCsiHw.cpp, function waitCsiFrameEnd(), line 600)
SCF: Error Timeout:  (propagating from src/common/Utils.cpp, function workerThread(), line 114)
SCF: Error Timeout: Worker thread ViCsiHw frameComplete failed (in src/common/Utils.cpp, function workerThread(), line 133)
SCF: Error Timeout:  (propagating from src/services/capture/CaptureServiceEvent.cpp, function wait(), line 59)
Error: Camera HwEvents wait, this may indicate a hardware timeout occured,abort current/incoming cc
SCF: Error InvalidState: 2 buffers still pending during EGLStreamProducer destruction (propagating from src/services/gl/EGLStreamProducer.cpp, function freeBuffers(), line 300)
SCF: Error InvalidState:  (propagating from src/services/gl/EGLStreamProducer.cpp, function ~EGLStreamProducer(), line 49)
waitForIdleLocked remaining request 102 
waitForIdleLocked remaining request 101 
SCF: Error Timeout: waitForIdle() timed out (in src/api/Session.cpp, function waitForIdleLocked(), line 922)
(Argus) Error Timeout:  (propagating from src/api/CaptureSessionImpl.cpp, function destroy(), line 216)
^C

kernel_tegra234-p3701-0000-p3737-0000.zip (53.7 KB)

hello 1508723374,

it’s v4l2 to verify the camera stream,
regarding to below…

this may be something incorrect in the sensor specific settings.
you may examine the device tree settings, especially the Property-Value Pairs.

I’ve been looking for a lot of posts on forums with similar questions, mostly via tegra-camera-platform {… } and tegra_sinterface solve this problem.
The following is my device tree configuration, please help me to see if there is any special problem.

/*
 * Copyright (c) 2016-2021, NVIDIA CORPORATION.  All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope 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/>.
 */

/ {
	tegra-capture-vi {
		status = "okay";
		num-channels = <4>;
		ports {
			status = "okay";
			#address-cells = <1>;
			#size-cells = <0>;
			port@0 {
				status = "okay";
				reg = <0>;
				liimx185_vi_in0: endpoint {
					status = "okay";
					port-index = <0>;
					bus-width = <4>;
					remote-endpoint = <&liimx185_csi_out0>;
				};
			};
			port@1 {
				status = "okay";
				reg = <1>;
				liimx185_vi_in1: endpoint {
					status = "okay";
					port-index = <2>;
					bus-width = <4>;
					remote-endpoint = <&liimx185_csi_out1>;
				};
			};
			port@2 {
				status = "okay";
				reg = <2>;
				liimx185_vi_in2: endpoint {
					status = "okay";
					port-index = <4>;
					bus-width = <4>;
					remote-endpoint = <&liimx185_csi_out2>;
				};
			};
			port@3 {
				status = "okay";
				reg = <3>;
				liimx185_vi_in3: endpoint {
					status = "okay";
					port-index = <5>;
					bus-width = <4>;
					remote-endpoint = <&liimx185_csi_out3>;
				};
			};
		};
	};

	host1x@13e00000 {
		nvcsi@15a00000 {
			status = "okay";
			num-channels = <4>;
			#address-cells = <1>;
			#size-cells = <0>;
			channel@0 {
				status = "okay";
				reg = <0>;
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_csi_in0: endpoint@0 {
							status = "okay";
							port-index = <0>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_imx185_out0>;
						};
					};
					port@1 {
						status = "okay";
						reg = <1>;
						liimx185_csi_out0: endpoint@1 {
							remote-endpoint = <&liimx185_vi_in0>;
						};
					};
				};
			};
			channel@1 {
				status = "okay";
				reg = <1>;
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_csi_in1: endpoint@2 {
							status = "okay";
							port-index = <2>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_imx185_out1>;
						};
					};
					port@1 {
						status = "okay";
						reg = <1>;
						liimx185_csi_out1: endpoint@3 {
							remote-endpoint = <&liimx185_vi_in1>;
						};
					};
				};
			};
			channel@2 {
				status = "okay";
				reg = <2>;
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_csi_in2: endpoint@4 {
							status = "okay";
							port-index = <4>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_imx185_out2>;
						};
					};
					port@1 {
						status = "okay";
						reg = <1>;
						liimx185_csi_out2: endpoint@5 {
							remote-endpoint = <&liimx185_vi_in2>;
						};
					};
				};
			};
			channel@3 {
				status = "okay";
				reg = <3>;
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_csi_in3: endpoint@6 {
							status = "okay";
							port-index = <6>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_imx185_out3>;
						};
					};
					port@1 {
						status = "okay";
						reg = <1>;
						liimx185_csi_out3: endpoint@7 {
							remote-endpoint = <&liimx185_vi_in3>;
						};
					};
				};
			};
		};
	};

	i2c@3180000 {
		tca9544@70 {
			status = "okay";
			i2c@0 {
			status = "okay";
			fpdlink_0: ds90ub954_a@30 {
				compatible = "ti,ds90ub954";
				reg = <0x30>;
				status = "okay";
				csi-lane-count = <4>;
				csi-lane-speed = <800>;

				serializers {
					status = "okay";
					num-channels = <1>;
					#address-cells = <1>;
					#size-cells = <0>;

					serializer@0 {
						status = "okay";
						rx-channel=<0>;
						i2c-address=<0x18>;
						csi-lane-count = <4>;
					};
				};
			};
			imx185_a@36 {
				status = "okay";
				compatible = "sony,imx185";

				reg = <0x36>;
				devnode = "video0";

				/* Physical dimensions of sensor */
				physical_w = "15.0";
				physical_h = "12.5";

				sensor_model ="imx185";
				/* Define any required hw resources needed by driver */
				/* ie. clocks, io pins, power sources */

				/* Defines number of frames to be dropped by driver internally after applying */
				/* sensor crop settings. Some sensors send corrupt frames after applying */
				/* crop co-ordinates */
				post_crop_frame_drop = "0";

				/* Convert Gain to unit of dB (decibel) befor passing to kernel driver */
				use_decibel_gain = "true";

				/* if true, delay gain setting by one frame to be in sync with exposure */
				delayed_gain = "false";

				/* enable CID_SENSOR_MODE_ID for sensor modes selection */
				use_sensor_mode_id = "false";

				/* WAR to prevent banding by reducing analog gain. Bug 2229902 */
				limit_analog_gain = "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
				*
				* == 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 {/*mode IMX185_MODE_1920X1080_CROP_30FPS*/
					mclk_khz = "37125";
					num_lanes = "4";
					tegra_sinterface = "serial_g";
					phy_mode = "DPHY";
					discontinuous_clk = "no";
                    dpcm_enable = "false";
                    cil_settletime = "0";
                    active_w = "3840";
                    active_h = "2160";
                    dynamic_pixel_bit_depth = "10";
                    csi_pixel_bit_depth = "10";
                    mode_type = "bayer";
                    pixel_phase = "bggr";
                    readout_orientation = "0";
                    line_length = "4512";
                    inherent_gain = "1";
                    pix_clk_hz = "320000000";
                    gain_factor = "10";
                    min_gain_val = "0";
                    max_gain_val = "480";
                    step_gain_val = "1";
                    default_gain = "0";
                    min_hdr_ratio = "1";
                    max_hdr_ratio = "1";
                    framerate_factor = "1000000";
                    min_framerate = "1500000";
                    max_framerate = "15000000";
                    step_framerate = "1";
                    default_framerate = "15000000";
                    exposure_factor = "1000000";
                    min_exp_time = "11";
                    step_exp_time = "1";
                    max_exp_time = "660000";
                    default_exp_time = "10000";
                    embedded_metadata_height = "0";
				};
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_imx185_out0: endpoint {
							status = "okay";
							port-index = <0>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_csi_in0>;
							};
						};
					};
				};
			};
			i2c@1 {
				status = "okay";
				fpdlink_1: ds90ub954_b@30 {
				compatible = "ti,ds90ub954";
				reg = <0x30>;
				status = "okay";
				csi-lane-count = <4>;
				csi-lane-speed = <800>;

				serializers {
					status = "okay";
					num-channels = <1>;
					#address-cells = <1>;
					#size-cells = <0>;

					serializer@0 {
						status = "okay";
						rx-channel=<0>;
						i2c-address=<0x18>;
						csi-lane-count = <4>;
					};
				};
			};

				imx185_b@36 {
				status = "okay";
				compatible = "sony,imx185";

				reg = <0x36>;
				devnode = "video1";

				/* Physical dimensions of sensor */
				physical_w = "15.0";
				physical_h = "12.5";

				sensor_model ="imx185";
				/* Define any required hw resources needed by driver */
				/* ie. clocks, io pins, power sources */

				/* Defines number of frames to be dropped by driver internally after applying */
				/* sensor crop settings. Some sensors send corrupt frames after applying */
				/* crop co-ordinates */
				post_crop_frame_drop = "0";

				/* Convert Gain to unit of dB (decibel) befor passing to kernel driver */
				use_decibel_gain = "true";

				/* if true, delay gain setting by one frame to be in sync with exposure */
				delayed_gain = "false";

				/* enable CID_SENSOR_MODE_ID for sensor modes selection */
				use_sensor_mode_id = "false";

				/* WAR to prevent banding by reducing analog gain. Bug 2229902 */
				limit_analog_gain = "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
				*
				* == 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 {/*mode IMX185_MODE_1920X1080_CROP_30FPS*/
					mclk_khz = "37125";
					num_lanes = "4";
					tegra_sinterface = "serial_e";
					phy_mode = "DPHY";
					discontinuous_clk = "no";
                    dpcm_enable = "false";
                    cil_settletime = "0";
                    active_w = "3840";
                    active_h = "2160";
                    dynamic_pixel_bit_depth = "10";
                    csi_pixel_bit_depth = "10";
                    mode_type = "bayer";
                    pixel_phase = "bggr";
                    readout_orientation = "0";
                    line_length = "4512";
                    inherent_gain = "1";
                    pix_clk_hz = "320000000";
                    gain_factor = "10";
                    min_gain_val = "0";
                    max_gain_val = "480";
                    step_gain_val = "1";
                    default_gain = "0";
                    min_hdr_ratio = "1";
                    max_hdr_ratio = "1";
                    framerate_factor = "1000000";
                    min_framerate = "1500000";
                    max_framerate = "15000000";
                    step_framerate = "1";
                    default_framerate = "15000000";
                    exposure_factor = "1000000";
                    min_exp_time = "11";
                    step_exp_time = "1";
                    max_exp_time = "660000";
                    default_exp_time = "10000";
                    embedded_metadata_height = "0";
				};
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_imx185_out1: endpoint {
							status = "okay";
							port-index = <2>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_csi_in1>;
							};
						};
					};
				};
			};
			i2c@2 {
			status = "okay";
			fpdlink_2: ds90ub954_c@30 {
				compatible = "ti,ds90ub954";
				reg = <0x30>;
				status = "okay";
				csi-lane-count = <4>;
				csi-lane-speed = <800>;

				serializers {
					status = "okay";
					num-channels = <1>;
					#address-cells = <1>;
					#size-cells = <0>;

					serializer@0 {
						status = "okay";
						rx-channel=<0>;
						i2c-address=<0x18>;
						csi-lane-count = <4>;
					};
				};
			};

				imx185_c@36 {
				status = "okay";
				compatible = "sony,imx185";

				reg = <0x36>;
				devnode = "video2";

				/* Physical dimensions of sensor */
				physical_w = "15.0";
				physical_h = "12.5";

				sensor_model ="imx185";
				/* Define any required hw resources needed by driver */
				/* ie. clocks, io pins, power sources */

				/* Defines number of frames to be dropped by driver internally after applying */
				/* sensor crop settings. Some sensors send corrupt frames after applying */
				/* crop co-ordinates */
				post_crop_frame_drop = "0";

				/* Convert Gain to unit of dB (decibel) befor passing to kernel driver */
				use_decibel_gain = "true";

				/* if true, delay gain setting by one frame to be in sync with exposure */
				delayed_gain = "false";

				/* enable CID_SENSOR_MODE_ID for sensor modes selection */
				use_sensor_mode_id = "false";

				/* WAR to prevent banding by reducing analog gain. Bug 2229902 */
				limit_analog_gain = "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
				*
				* == 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 {/*mode IMX185_MODE_1920X1080_CROP_30FPS*/
					mclk_khz = "37125";
					num_lanes = "4";
					tegra_sinterface = "serial_c";
					phy_mode = "DPHY";
					discontinuous_clk = "no";
                    dpcm_enable = "false";
                    cil_settletime = "0";
                    active_w = "3840";
                    active_h = "2160";
                    dynamic_pixel_bit_depth = "10";
                    csi_pixel_bit_depth = "10";
                    mode_type = "bayer";
                    pixel_phase = "bggr";
                    readout_orientation = "0";
                    line_length = "4512";
                    inherent_gain = "1";
                    pix_clk_hz = "320000000";
                    gain_factor = "10";
                    min_gain_val = "0";
                    max_gain_val = "480";
                    step_gain_val = "1";
                    default_gain = "0";
                    min_hdr_ratio = "1";
                    max_hdr_ratio = "1";
                    framerate_factor = "1000000";
                    min_framerate = "1500000";
                    max_framerate = "15000000";
                    step_framerate = "1";
                    default_framerate = "15000000";
                    exposure_factor = "1000000";
                    min_exp_time = "11";
                    step_exp_time = "1";
                    max_exp_time = "660000";
                    default_exp_time = "10000";
                    embedded_metadata_height = "0";
				};
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_imx185_out2: endpoint {
							status = "okay";
							port-index = <4>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_csi_in2>;
							};
						};
					};
				};
			};
			i2c@3 {
				status = "okay";
				fpdlink_3: ds90ub954_d@30 {
				compatible = "ti,ds90ub954";
				reg = <0x30>;
				status = "okay";
				csi-lane-count = <4>;
				csi-lane-speed = <800>;

				serializers {
					status = "okay";
					num-channels = <1>;
					#address-cells = <1>;
					#size-cells = <0>;

					serializer@0 {
						status = "okay";
						rx-channel=<0>;
						i2c-address=<0x18>;
						csi-lane-count = <4>;
					};
				};
			};
				imx185_d@36 {
				status = "okay";
				compatible = "sony,imx185";

				reg = <0x36>;
				devnode = "video3";

				/* Physical dimensions of sensor */
				physical_w = "15.0";
				physical_h = "12.5";

				sensor_model ="imx185";
				/* Define any required hw resources needed by driver */
				/* ie. clocks, io pins, power sources */

				/* Defines number of frames to be dropped by driver internally after applying */
				/* sensor crop settings. Some sensors send corrupt frames after applying */
				/* crop co-ordinates */
				post_crop_frame_drop = "0";

				/* Convert Gain to unit of dB (decibel) befor passing to kernel driver */
				use_decibel_gain = "true";

				/* if true, delay gain setting by one frame to be in sync with exposure */
				delayed_gain = "false";

				/* enable CID_SENSOR_MODE_ID for sensor modes selection */
				use_sensor_mode_id = "false";

				/* WAR to prevent banding by reducing analog gain. Bug 2229902 */
				limit_analog_gain = "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
				*
				* == 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 {/*mode IMX185_MODE_1920X1080_CROP_30FPS*/
					mclk_khz = "37125";
					num_lanes = "4";
					tegra_sinterface = "serial_a";
					phy_mode = "DPHY";
					discontinuous_clk = "no";
                    dpcm_enable = "false";
                    cil_settletime = "0";
                    active_w = "3840";
                    active_h = "2160";
                    dynamic_pixel_bit_depth = "10";
                    csi_pixel_bit_depth = "10";
                    mode_type = "bayer";
                    pixel_phase = "bggr";
                    readout_orientation = "0";
                    line_length = "4512";
                    inherent_gain = "1";
                    pix_clk_hz = "320000000";
                    gain_factor = "10";
                    min_gain_val = "0";
                    max_gain_val = "480";
                    step_gain_val = "1";
                    default_gain = "0";
                    min_hdr_ratio = "1";
                    max_hdr_ratio = "1";
                    framerate_factor = "1000000";
                    min_framerate = "1500000";
                    max_framerate = "15000000";
                    step_framerate = "1";
                    default_framerate = "15000000";
                    exposure_factor = "1000000";
                    min_exp_time = "11";
                    step_exp_time = "1";
                    max_exp_time = "660000";
                    default_exp_time = "10000";
                    embedded_metadata_height = "0";
				};
				ports {
					status = "okay";
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						status = "okay";
						reg = <0>;
						liimx185_imx185_out3: endpoint {
							status = "okay";
							port-index = <6>;
							bus-width = <4>;
							remote-endpoint = <&liimx185_csi_in3>;
							};
						};
					};
				};
			};
		};
	};
};

/ {

	tegra-camera-platform {
		status = "okay";
		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 = <16>;
		max_lane_speed = <1500000>;
		min_bits_per_pixel = <10>;
		vi_peak_byte_per_pixel = <2>;
		vi_bw_margin_pct = <25>;
		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 {
				status = "okay";
				badge = "imx185_bottomleft_liimx185";
				position = "bottomleft";
				orientation = "0";
				drivernode0 {
					status = "okay";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "imx185 30-0036";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9544@70/i2c@0/imx185_a@36";
				};
				drivernode1 {
					status = "disabled";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_lens";
					proc-device-tree = "/proc/device-tree/lens_imx185@A6V26/";
				};
			};
			module1 {
				status = "okay";
				badge = "imx185_bottomright_liimx185";
				position = "bottomright";
				orientation = "0";
				drivernode0 {
					status = "okay";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "imx185 31-0036";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9544@70/i2c@1/imx185_b@36";
				};
				drivernode1 {
					status = "disabled";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_lens";
					proc-device-tree = "/proc/device-tree/lens_imx185@A6V26/";
				};
			};
			module2 {
				status = "okay";
				badge = "imx185_centerleft_liimx185";
				position = "centerleft";
				orientation = "0";
				drivernode0 {
					status = "okay";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "imx185 32-0036";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9544@70/i2c@2/imx185_c@36";
				};
				drivernode1 {
					status = "disabled";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_lens";
					proc-device-tree = "/proc/device-tree/lens_imx185@A6V26/";
				};
			};
			module3 {
				status = "okay";
				badge = "imx185_centerright_liimx185";
				position = "centerright";
				orientation = "0";
				drivernode0 {
					status = "okay";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "imx185 33-0036";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9544@70/i2c@3/imx185_d@36";
				};
				drivernode1 {
					status = "disabled";
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_lens";
					proc-device-tree = "/proc/device-tree/lens_imx185@A6V26/";
				};
			};
		};
	};
};

hello 1508723374,

it looks all of your camera nodes using incorrect tegra_sinterface settings,
for example,
it should be serial_a for your camera node imx185_a.

since you’re developing your camera drivers based-on IMX185,
in order to avoid loading IMX185’s ISP override file, please update badge property to another unique string.