Jetson cannot open the csi camera, but the v4l2 command can get the stream

I use an IMX477 camera. When I try to open it using nvgstcapture-1.0 or gst-launch-1.0 commands, an error message appears. However, I use

`v4l2-ctl –stream-mmap -d /dev/video0` can get the data stream, is there any other configuration required? The following is my device tree:

// SPDX-License-Identifier: GPL-2.0-only
// SPDX-FileCopyrightText: Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

/dts-v1/;
/plugin/;

#define CAM0_PWDN	TEGRA234_MAIN_GPIO(H, 6)
#define CAM1_PWDN	TEGRA234_MAIN_GPIO(AC, 0)
#define CAM_I2C_MUX 	TEGRA234_AON_GPIO(CC, 3)

#include <dt-bindings/tegra234-p3767-0000-common.h>

/ {
	overlay-name = "Camera IMX477 Dual Seeed";
	jetson-header-name = "Jetson 24pin CSI Connector";
	compatible = JETSON_COMPATIBLE_P3768;

	fragment@0 {
		target-path = "/";
		__overlay__ {
			tegra-capture-vi  {
				num-channels = <2>;
				ports {
					#address-cells = <1>;
					#size-cells = <0>;
					port@0 {
						reg = <0>;
						rbpcv3_imx477_vi_in0: endpoint {
							port-index = <0>;
							bus-width = <2>;
							remote-endpoint = <&rbpcv3_imx477_csi_out0>;
						};
					};
					port@1 {
						reg = <1>;
						rbpcv3_imx477_vi_in1: endpoint {
							port-index = <2>;
							bus-width = <2>;
							remote-endpoint = <&rbpcv3_imx477_csi_out1>;
						};
					};
				};
			};
			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>;
				max_lane_speed = <1500000>;
				min_bits_per_pixel = <10>;
				vi_peak_byte_per_pixel = <2>;
				vi_bw_margin_pct = <25>;
				max_pixel_rate = <7500000>;
				isp_peak_byte_per_pixel = <5>;
				isp_bw_margin_pct = <25>;
				/**
				 * The general guideline for naming badge_info contains 3 parts, and is as follows,
				 * The first part is the camera_board_id for the module; if the module is in a FFD
				 * platform, then use the platform name for this part.
				 * The second part contains the position of the module, ex. "rear" or "front".
				 * The third part contains the last 6 characters of a part number which is found
				 * in the module's specsheet from the vendor.
				 */
				modules {
					module0 {
						badge = "jakku_front_RBPCV3";
						position = "front";
						orientation = "1";
						drivernode0 {
							pcl_id = "v4l2_sensor";
							sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/cam_i2cmux/i2c@0/rbpcv3_imx477_a@1a";
						};
					};
					module1 {
						badge = "jakku_rear_RBPCV3";
						position = "rear";
						orientation = "1";
						drivernode0 {
							pcl_id = "v4l2_sensor";
							sysfs-device-tree = "/sys/firmware/devicetree/base/bus@0/cam_i2cmux/i2c@1/rbpcv3_imx477_c@1a";
						};
					};
				};
			};
			bus@0 {
				host1x@13e00000 {
					nvcsi@15a00000 {
						num-channels = <2>;
						#address-cells = <1>;
						#size-cells = <0>;
						channel@0 {
							reg = <0>;
							ports {
								#address-cells = <1>;
								#size-cells = <0>;
								port@0 {
									reg = <0>;
									rbpcv3_imx477_csi_in0: endpoint@0 {
										port-index = <0>;
										bus-width = <2>;
										remote-endpoint = <&rbpcv3_imx477_out0>;
									};
								};
								port@1 {
									reg = <1>;
									rbpcv3_imx477_csi_out0: endpoint@1 {
										remote-endpoint = <&rbpcv3_imx477_vi_in0>;
									};
								};
							};
						};
						channel@1 {
							reg = <1>;
							ports {
								#address-cells = <1>;
								#size-cells = <0>;
								port@0 {
									reg = <0>;
									rbpcv3_imx477_csi_in1: endpoint@2 {
										port-index = <2>;
										bus-width = <2>;
										remote-endpoint = <&rbpcv3_imx477_out1>;
									};
								};
								port@1 {
									reg = <1>;
									rbpcv3_imx477_csi_out1: endpoint@3 {
										remote-endpoint = <&rbpcv3_imx477_vi_in1>;
									};
								};
							};
						};
					};
				};
				cam_i2cmux {
					status = "okay";
					compatible = "i2c-mux-gpio";
					#address-cells = <1>;
					#size-cells = <0>;
					mux-gpios = <&gpio_aon CAM_I2C_MUX GPIO_ACTIVE_HIGH>;
					i2c-parent = <&cam_i2c>;
					i2c@0 {
						status = "okay";
						reg = <0>;
						#address-cells = <1>;
						#size-cells = <0>;
						rbpcv2_imx219_a@10 {
							status = "disabled";
						};
						rbpcv3_imx477_a@1a {
							reset-gpios = <&gpio CAM0_PWDN GPIO_ACTIVE_HIGH>;
							compatible = "ridgerun,imx477";
							/* I2C device address */
							reg = <0x1a>;
							/* V4L2 device node location */
							devnode = "video0";
							/* Physical dimensions of sensor */
							physical_w = "3.680";
							physical_h = "2.760";
							sensor_model = "imx477";
							use_sensor_mode_id = "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
							*
							* lane_polarity
							* Based on the camera connector pin.
							* CSIx_D0 | CSIx_D1 | CSI(X+1)_D0 | CSI(X+1)CSIx_D1
							*    LSB  |   BIT1  |     BIT2    |      MSB
							* if there is a polarity swap on any lane, the bit corrsponding
							* to the lane should be set
							* e.g. polarity swap on CSIx_D0 only -> lane_polarity = "1"; 0001
							* e.g. polarity swap on CSIx_D1 and CSI(X+1)_D0 -> lane_polarity = "6"; 0110
							*
							* == 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 { /* IMX477_MODE_3840x2160 */
								mclk_khz = "24000";
								num_lanes = "2";
								tegra_sinterface = "serial_a";
								phy_mode = "DPHY";
								discontinuous_clk = "no";
								dpcm_enable = "false";
								cil_settletime = "0";
								lane_polarity = "6";
								active_w = "3840";
								active_h = "2160";
								mode_type = "bayer";
								pixel_phase = "rggb";
								csi_pixel_bit_depth = "10";
								readout_orientation = "90";
								line_length = "11200";
								inherent_gain = "1";
								mclk_multiplier = "80";
								pix_clk_hz = "300000000";
								gain_factor = "16";
								framerate_factor = "1000000";
								exposure_factor = "1000000";
								min_gain_val = "16"; /* 1.00x */
								max_gain_val = "356"; /* 22x */
								step_gain_val = "1";
								default_gain = "16"; /* 1.00x */
								min_hdr_ratio = "1";
								max_hdr_ratio = "1";
								min_framerate = "2000000"; /* 2.0 fps */
								max_framerate = "30000000"; /* 30.0 fps */
								step_framerate = "1";
								default_framerate = "30000000"; /* 30.0 fps */
								min_exp_time = "13"; /* us */
								max_exp_time = "683709"; /* us */
								step_exp_time = "1";
								default_exp_time = "2495"; /* us */
								embedded_metadata_height = "2";
							};
							mode1 { /* IMX477_MODE_1920X1080 */
								mclk_khz = "24000";
								num_lanes = "2";
								tegra_sinterface = "serial_a";
								phy_mode = "DPHY";
								discontinuous_clk = "no";
								dpcm_enable = "false";
								cil_settletime = "0";
								lane_polarity = "6";
								active_w = "1920";
								active_h = "1080";
								mode_type = "bayer";
								pixel_phase = "rggb";
								csi_pixel_bit_depth = "10";
								readout_orientation = "90";
								line_length = "7000";
								inherent_gain = "1";
								mclk_multiplier = "80";
								pix_clk_hz = "300000000";
								gain_factor = "16";
								framerate_factor = "1000000";
								exposure_factor = "1000000";
								min_gain_val = "16"; /* 1.00x */
								max_gain_val = "356"; /* 22x */
								step_gain_val = "1";
								default_gain = "16"; /* 1.00x */
								min_hdr_ratio = "1";
								max_hdr_ratio = "1";
								min_framerate = "2000000"; /* 2.0 fps */
								max_framerate = "60000000"; /* 60.0 fps */
								step_framerate = "1";
								default_framerate = "60000000"; /* 60.0 fps */
								min_exp_time = "13"; /* us */
								max_exp_time = "683709"; /* us */
								step_exp_time = "1";
								default_exp_time = "2495"; /* us */
								embedded_metadata_height = "2";
							};
							ports {
								#address-cells = <1>;
								#size-cells = <0>;
								port@0 {
									reg = <0>;
									rbpcv3_imx477_out0: endpoint {
										status = "okay";
										port-index = <0>;
										bus-width = <2>;
										remote-endpoint = <&rbpcv3_imx477_csi_in0>;
									};
								};
							};
						};
					};
					i2c@1 {
						status = "okay";
						reg = <1>;
						#address-cells = <1>;
						#size-cells = <0>;
						rbpcv2_imx219_c@10 {
							status = "disabled";
						};
						rbpcv3_imx477_c@1a {
							reset-gpios = <&gpio CAM1_PWDN GPIO_ACTIVE_HIGH>;
							compatible = "ridgerun,imx477";
							/* I2C device address */
							reg = <0x1a>;
							/* V4L2 device node location */
							devnode = "video1";
							/* Physical dimensions of sensor */
							physical_w = "3.680";
							physical_h = "2.760";
							sensor_model = "imx477";
							use_sensor_mode_id = "true";
							mode0 { /* IMX477_MODE_3840x2160 */
								mclk_khz = "24000";
								num_lanes = "2";
								tegra_sinterface = "serial_c";
								phy_mode = "DPHY";
								discontinuous_clk = "no";
								dpcm_enable = "false";
								cil_settletime = "0";
								lane_polarity = "0";
								active_w = "3840";
								active_h = "2160";
								mode_type = "bayer";
								pixel_phase = "rggb";
								csi_pixel_bit_depth = "10";
								readout_orientation = "90";
								line_length = "11200";
								inherent_gain = "1";
								mclk_multiplier = "80";
								pix_clk_hz = "300000000";
								gain_factor = "16";
								framerate_factor = "1000000";
								exposure_factor = "1000000";
								min_gain_val = "16"; /* 1.00x */
								max_gain_val = "356"; /* 22x */
								step_gain_val = "1";
								default_gain = "16"; /* 1.00x */
								min_hdr_ratio = "1";
								max_hdr_ratio = "1";
								min_framerate = "2000000"; /* 2.0 fps */
								max_framerate = "30000000"; /* 30.0 fps */
								step_framerate = "1";
								default_framerate = "30000000"; /* 30.0 fps */
								min_exp_time = "13"; /* us */
								max_exp_time = "683709"; /* us */
								step_exp_time = "1";
								default_exp_time = "2495"; /* us */
								embedded_metadata_height = "2";
							};
							mode1 { /* IMX477_MODE_1920X1080 */
								mclk_khz = "24000";
								num_lanes = "2";
								tegra_sinterface = "serial_c";
								phy_mode = "DPHY";
								discontinuous_clk = "no";
								dpcm_enable = "false";
								cil_settletime = "0";
								lane_polarity = "0";
								active_w = "1920";
								active_h = "1080";
								mode_type = "bayer";
								pixel_phase = "rggb";
								csi_pixel_bit_depth = "10";
								readout_orientation = "90";
								line_length = "7000";
								inherent_gain = "1";
								mclk_multiplier = "80";
								pix_clk_hz = "300000000";
								gain_factor = "16";
								framerate_factor = "1000000";
								exposure_factor = "1000000";
								min_gain_val = "16"; /* 1.00x */
								max_gain_val = "356"; /* 22x */
								step_gain_val = "1";
								default_gain = "16"; /* 1.00x */
								min_hdr_ratio = "1";
								max_hdr_ratio = "1";
								min_framerate = "2000000"; /* 2.0 fps */
								max_framerate = "60000000"; /* 60.0 fps */
								step_framerate = "1";
								default_framerate = "60000000"; /* 60.0 fps */
								min_exp_time = "13"; /* us */
								max_exp_time = "683709"; /* us */
								step_exp_time = "1";
								default_exp_time = "2495"; /* us */
								embedded_metadata_height = "2";
							};
							ports {
								#address-cells = <1>;
								#size-cells = <0>;
								port@0 {
									reg = <0>;
									rbpcv3_imx477_out1: endpoint {
										status = "okay";
										port-index = <2>;
										bus-width = <2>;
										remote-endpoint = <&rbpcv3_imx477_csi_in1>;
									};
								};
							};
						};
					};
				};

				gpio@6000d000 {
					camera-control-output-low {
						gpio-hog;
						output-low;
						gpios = <CAM1_PWDN 0  CAM0_PWDN 0>;
						label = "cam1-pwdn", "cam0-pwdn";
					};
				};
			};
		};
	};
};

*** Please note that this reply is generated by LLM automatically ***

Based on the provided context, it appears that you are experiencing issues with opening the IMX477 camera on the Jetson Orin NX using certain commands, but you are able to get the data stream using v4l2ctl streammmap -d /dev/video0.

To troubleshoot this issue, let’s break down the possible causes and compare the configurations:

  1. Device Tree: You provided the device tree configuration, but it’s not shown in the text. However, I can guide you on what to check. Make sure that the device tree is correctly configured for the IMX477 camera. Verify that the camera module is enabled, and the correct pins are assigned for the camera interface (e.g., CSI).
  2. Camera Driver: The IMX477 camera driver might not be properly loaded or configured. Check the kernel logs (dmesg) for any errors related to the camera driver. You can also try to manually load the driver using modprobe or insmod.
  3. v4l2 Configuration: The v4l2ctl command is able to get the data stream, which suggests that the v4l2 configuration is correct. However, you might need to adjust the v4l2 settings for the camera to work properly. Check the v4l2 documentation for the IMX477 camera to ensure that the correct settings are applied.
  4. Other Configurations: There might be other configurations that need to be adjusted, such as the camera’s pixel format, resolution, or framerate. Check the camera’s datasheet and the Jetson Orin NX documentation to ensure that the correct settings are applied.

Comparison with other configurations:

  • In the provided context, there are several other topics related to camera issues on the Jetson Orin NX and other Jetson modules. For example, “CSI-0 with MIPI 4 lane is not working properly” and “Capturing Image from custom sensor fails with 4-csi lanes” might be related to similar issues. However, without more information, it’s difficult to determine if these topics are directly relevant to your issue.
  • The “Color casting during live preview” topic might be related to a different issue, as it appears to be a problem with the camera’s color output.

To resolve your issue, I recommend:

  1. Verify the device tree configuration for the IMX477 camera.
  2. Check the kernel logs for any errors related to the camera driver.
  3. Adjust the v4l2 settings for the camera, if necessary.
  4. Consult the camera’s datasheet and the Jetson Orin NX documentation to ensure that the correct settings are applied.

If you provide more information about your device tree configuration and the exact error messages you’re seeing, I can offer more specific guidance.

*** Please give the thumbs up if you get answers you like. Or provide feedback to help us improve the answer. ***

This answer is not helpful

The fact that V4l2-ctl can capture data seems to indicate that the data link is working properly. What additional configuration is required to capture images using nvgstcapture-1.0? What is the process?

Hi @shuisheng.peng,

What error do you get when you run with gst-launch-1.0 or nvgstcapture-1.0?

Also, do you get a sensible image if you capture with v4l2-ctl to a file? For example, if you run something like:

v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=sample.raw --stream-count=1

Regards,
Francis Guindon
Embedded SW Engineer at RidgeRun

Contact us: support@ridgerun.com
Developers wiki: https://developer.ridgerun.com/
Website: http://www.ridgerun.com/

This is the output of nvgstcapture-1.0:

** Message: 09:28:04.171: <main:4732> iterating capture loop ....
Error generated. /dvs/git/dirty/git-master_linux/multimedia/nvgstreamer/gst-nvarguscamera/gstnvarguscamerasrc.cpp, execute:794 No cameras available

Output using v4l2-ctl --stream-mmap -d /dev/video0:

pss@jetson:~$ v4l2-ctl --stream-mmap -d /dev/video0 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<^C


v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=sample.raw --stream-count=1 can get a sample.raw file, but I try to double-click it to open it and it seems to be unable to open.

The amazing thing is that I used media-ctl -p to see that the name of the camera entity was imx477 11-001a. Then I added the devname = “imx477 11-001a”; property to drivernode0 in the tegra-camera-platform in the device tree, and then I was able to find and open the camera. So I would like to ask why this is necessary. Do other mipi cameras also require this configuration?

Hello @shuisheng.peng,

Great to hear you managed to fix the issue!!

To answer your question, yes, it is necessary.

This is because camera device tree configurations on NVIDIA Jetson have 3 main sections:

  1. The NVCSI and CSI section which is in charge of defining the CSI port configuration. This is mostly used by V4L2.
  2. The camera module section, where you configure the actual module (capture modes, pixel clock, i2c,… etc)
  3. And then tegra-camera-platform which helps with configuring the Tegra specific side of the camera subsystem.

This is the reason why v4l2 was able to capture from your camera, however, when using nvarguscamerasrc it was failing.

Hope this clarifies a bit more your situation.

Please do not hesitate to reach out in case you have further questions or require support.

best regards,
Andrew
Embedded Software Engineer at ProventusNova

The error tell the device tree config problem.

If using jetson-io to enable IMX477 shouldn’t have this kind of problem.

execute:794 No cameras available

Yes, this error was resolved after I configured the name of the drivernode0 node in tegra-camera-platform, so I am very curious about what the workflow of nvgstcapture-1.0 looks like. It seems that it needs to rely on the properties of tegra-camera-platform.

Check this document for the detail.

Hi @shuisheng.peng,

I’m glad it seems you managed to resolve the issue you were having!

Just as a quick follow up regarding the raw capture from v4l2-ctl, this image cannot be opened directly because it does not have a standard image format. Instead it will have the raw format sent from the IMX477 sensor, which would be a bayer of some kind. Usually it can be analyzed through tools like Vooya or Raw Pixels.

We have this wiki describing some methods for converting a raw format into a standard image format. We also have this wiki that quickly describes how a Bayer image is converted to an RGB image.

Regards,
Embedded SW Engineer at RidgeRun

Contact us: support@ridgerun.com
Developers wiki: https://developer.ridgerun.com/
Website: http://www.ridgerun.com/

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.