two cameras, system hang up

Hi:
I have a problem on jestson tx2 with my custom board. I have drived the IMX385 sensor successful. Now I want to add one more camera. But when I modify the dts to add the camera, re-flash, and the system can not run.

The console log show below repeatly:

xhci-tegra 3530000.xhci:cannot find firmware...retry after 1 second
xhci-tegra 3530000.xhci:Direct firmware load for tegra18x_xusb_firmware failed with error -2
xhci-tegra 3530000.xhci:Falling back to user helper
.......

My dts :

/*
 * Copyright (c) 2016, 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 = <2>;
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				port@0 {
					reg = <0>;
					liimx385_vi_in0: endpoint {
						csi-port = <0>;
						bus-width = <4>;
						remote-endpoint = <&liimx385_csi_out0>;
					};
				};
				port@1 {
					reg = <1>;
					litc358746_vi_in1: endpoint {
						csi-port = <2>;
						bus-width = <4>;
						remote-endpoint = <&litc358746_csi_out1>;
					};
				};
			};
		};

		nvcsi@150c0000 {
			num-channels = <2>;
			#address-cells = <1>;
			#size-cells = <0>;
			channel@0 {
				reg = <0>;
				ports {
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						reg = <0>;
						liimx385_csi_in0: endpoint@0 {
							csi-port = <0>;
							bus-width = <4>;
							remote-endpoint = <&liimx385_imx385_out0>;
						};
					};
					port@1 {
						reg = <1>;
						liimx385_csi_out0: endpoint@1 {
							remote-endpoint = <&liimx385_vi_in0>;
						};
					};
				};
			};
			channel@1 {
				reg = <1>;
				ports {
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						reg = <0>;
						litc358746_csi_in1: endpoint@2 {
							csi-port = <2>;
							bus-width = <4>;
							remote-endpoint = <&litc358746_tc358746_out1>;
						};
					};
					port@1 {
						reg = <1>;
						litc358746_csi_out1: endpoint@3 {
							remote-endpoint = <&litc358746_vi_in1>;
						};
					};
				};
			};
		};
	};

	i2c@3180000 {
		imx385_a@1a {
			compatible = "nvidia,imx385";

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

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

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

			/* 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 = "true";

			/* enable CID_SENSOR_MODE_ID for sensor modes selection */
			use_sensor_mode_id = "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
			*
			* 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
			*
			* dynamic_pixel_bit_depth = "";
			* sensor dynamic bit depth for sensor mode
			*
			* csi_pixel_bit_depth = "";
			* sensor output bit depth for sensor mode
			*
			* mode_type="";
			* Sensor mode type, For eg: yuv, Rgb, bayer, bayer_wdr_pwl
			*
			* pixel_phase="";
			* Pixel phase for sensor mode, For eg: rggb, vyuy, rgb888
			*
			* 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)
			*
			* min_gain_val = ""; (floor to 6 decimal places)
			* max_gain_val = ""; (floor to 6 decimal places)
			* Gain limits for mode
			* if use_decibel_gain = "true", please set the gain as decibel
			*
			* min_exp_time = ""; (ceil to integer)
			* max_exp_time = ""; (ceil to integer)
			* Exposure Time limits for mode (us)
			*
			*
			* min_hdr_ratio = "";
			* max_hdr_ratio = "";
			* HDR Ratio limits for mode
			*
			* min_framerate = "";
			* max_framerate = "";
			* 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 imx385_MODE_1920X1080_CROP_30FPS
				mclk_khz = "37125";
				num_lanes = "4";
				tegra_sinterface = "serial_a";
				discontinuous_clk = "no";
				dpcm_enable = "false";
				cil_settletime = "0";
				dynamic_pixel_bit_depth = "12";
				csi_pixel_bit_depth = "12";
				mode_type = "bayer";
				pixel_phase = "rggb";

				active_w = "1924";
				active_h = "1080";
				readout_orientation = "0";
				line_length = "2200";
				inherent_gain = "1";
				mclk_multiplier = "4";
				pix_clk_hz = "148500000";

				min_gain_val = "0"; //dB 
				max_gain_val = "72"; //dB 
				min_hdr_ratio = "1";
				max_hdr_ratio = "1";
				min_framerate = "1.5";
				max_framerate = "30";
				min_exp_time = "30";
				max_exp_time = "660000";
				embedded_metadata_height = "1";
			};
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				port@0 {
					reg = <0>;
					liimx385_imx385_out0: endpoint {
						csi-port = <0>;
						bus-width = <4>;
						remote-endpoint = <&liimx385_csi_in0>;
					};
				};
			};
		};
		tc358746_b@0e {
			compatible = "nvidia,tc358746";
			reg = <0x0e>;
			devnode = "video1";
			/* Physical dimensions of sensor */
			physical_w = "15.0";
			physical_h = "12.5";

			sensor_model ="tc358746";
			avdd-reg = "vana";
			iovdd-reg = "vif";
			dvdd-reg = "vdig";
			post_crop_frame_drop = "0";
			use_decibel_gain = "true";
			delayed_gain = "true";
			use_sensor_mode_id = "true";
			mode0 {
				mclk_khz = "16600";
				num_lanes = "4";
				tegra_sinterface = "serial_c";
				discontinuous_clk = "no";
				dpcm_enable = "false";
				cil_settletime = "0";
				dynamic_pixel_bit_depth = "16";
				csi_pixel_bit_depth = "16";
				mode_type = "bayer";
				pixel_phase = "uyvy";

				active_w = "720";
				active_h = "576";
				readout_orientation = "0";
				line_length = "1440";
				inherent_gain = "1";
				mclk_multiplier = "4";
				pix_clk_hz = "66400000";

				min_gain_val = "0"; //dB 
				max_gain_val = "72"; //dB 
				min_hdr_ratio = "1";
				max_hdr_ratio = "1";
				min_framerate = "1.5";
				max_framerate = "30";
				min_exp_time = "30";
				max_exp_time = "660000";
				embedded_metadata_height = "0";
			};
			ports {
				#address-cells = <1>;
				#size-cells = <0>;
				port@0 {
					reg = <0>;
					litc358746_tc358746_out1: endpoint {
						csi-port = <2>;
						bus-width = <4>;
						remote-endpoint = <&litc358746_csi_in1>;
					};
				};
			};
		};
	};
};

/ {

	tegra-camera-platform {
		compatible = "nvidia, tegra-camera-platform";
		/**
		* Physical settings to calculate max ISO BW
		*
		* num_csi_lanes = <>;
		* Total number of CSI lanes when all cameras are active
		*
		* max_lane_speed = <>;
		* Max lane speed in Kbit/s
		*
		* min_bits_per_pixel = <>;
		* Min bits per pixel
		*
		* vi_peak_byte_per_pixel = <>;
		* Max byte per pixel for the VI ISO case
		*
		* vi_bw_margin_pct = <>;
		* Vi bandwidth margin in percentage
		*
		* max_pixel_rate = <>;
		* Max pixel rate in Kpixel/s for the ISP ISO case
		*
		* isp_peak_byte_per_pixel = <>;
		* Max byte per pixel for the ISP ISO case
		*
		* isp_bw_margin_pct = <>;
		* Isp bandwidth margin in percentage
		*/
		num_csi_lanes = <8>;
		max_lane_speed = <1500000>;
		min_bits_per_pixel = <10>;
		vi_peak_byte_per_pixel = <2>;
		vi_bw_margin_pct = <25>;
		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 = "imx385_bottom_liimx385";
				position = "rear";
				orientation = "0";
				drivernode0 {
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "imx385 2-001a";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/imx385_a@1a";
				};
			};
			module1 {
				badge = "tc358746_front_litc358746";
				position = "front";
				orientation = "1";
				drivernode0 {
					/* Declare PCL support driver (classically known as guid)  */
					pcl_id = "v4l2_sensor";
					/* Driver v4l2 device name */
					devname = "tc358746 2-000e";
					/* Declare the device-tree hierarchy to driver instance */
					proc-device-tree = "/proc/device-tree/i2c@3180000/tc358746_b@0e";
				};
			};
		};
	};
};

In addition, If I change the num_csi_lanes from 8 to 4, vi and cis num-channels from 2 to 1, everything is ok. when I change the num-channels from 1 to 2, the system hang up again. I dont understand why this dts have the effect that make failure of the system boot.

hello heyan3502,

it doesn’t make sense that camera device tree changes trigger the xhci-tegra failures.
may I know what’s additional device you had connected to the tegra board.
could you please review your customize board schematic again, thanks

Hello JerryChang:

there is a wired network link, a microusb for flash, and the uart0 for debug, two MIPI camera sensor.

As the hardware engineer saided, there is nothing difference from demo board. ( ¯ □ ¯ )

I just wonder how to debug the xhci-tegra failure. Any good ideas to suggest?

hello heyan3502,

since it is a customize board, I would suggest you start with [Tegra Linux Driver Package TX2 Adaptation Guide]
had you also update pinmux spreadsheets to have customize configuration files, you may refer to [L4T Documentation]-> [NVIDIA Tegra Linux Driver Package]-> [TX2 Configuring Pinmux GPIO and PAD] for more details.
thanks