Hello,
tl;dr: custom carrier board with two imagers doesn’t want to capture frames! Apologies for the lengthy post, I’ve tried to include as much data as possible.
I am bringing up the device tree for a custom Xavier NX carrier board (emmc version) which attaches CSI2 and 3 to one Arducam IMX477-based imager board, and CSI4 to another of the same imager board. That is, four lanes for each. To simplify things (I hope), my intention is to enable image acquisition from both imagers using two lanes each—so just CSI2 lane 0 and 1, as well as CSI4 0 and 1. That said, all four lanes and associated clocks for both are connected. I am also trying to use the provided IMX477 driver in Jetpack.
The i2c lines go through a muxing configuration similar to that of the Jakku developer kit. I’m convinced this part is working because I have two instances of the Jetpack-provided driver binding properly on boot (based on the output of dmesg | grep imx
:
[ 5.001496] imx477 9-001a: tegracam sensor driver:imx477_v2.0.6
[ 5.303345] imx477 10-001a: tegracam sensor driver:imx477_v2.0.6
[ 6.816693] tegra194-vi5 15c10000.vi: subdev imx477 9-001a bound
[ 6.825422] tegra194-vi5 15c10000.vi: subdev imx477 10-001a bound
And when I run various commands, I can see the i2c clock/data on the pins of both the imagers on a scope. Additionally, when I attempt to open the stream with v4l2-ctl
, I can also probe the CSI data lines and see signals that match those of a working system, sitting around the nominal 1.2V.
For the imager on CSI2 (serial C), I tried to match the device tree provided for use with Xavier NX developer kit[1]. For the imager on CSI4 (serial E), I confirmed in this post that I should have the right port indices designated in the device tree. However, this is the most suspicious bit for me: the sample dtsi for CSI 2/C and the aforementioned post for CS4 claim to need vi port-index 4, but I assume they can’t be the same (I haven’t tested this, but I don’t think it makes sense anyway), so I bumped the port for CSI-E to 6 (If C is 4, D could be 5, E as 6…!?), but this doesn’t work. Also, it doesn’t explain why the CSI-2 imager isn’t working either. Regardless, I intend to give this a try next time I’m in the lab.
Regardless, when I run sudo media-ctl -p
, I can see the elements of both pipelines are properly enabled:
sudo media-ctl -p
[sudo] password for ubuntu:
Media controller API version 0.1.0
Media device information
------------------------
driver tegra194-vi5
model NVIDIA Tegra Video Input Device
serial
bus info
hw revision 0x3
driver version 0.0.0
Device topology
- entity 1: imx477 9-001a (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev0
pad0: Source
[fmt:SRGGB10_1X10/1920x1080 field:none colorspace:srgb]
-> "15a00000.nvcsi--2":0 [ENABLED]
- entity 3: 15a00000.nvcsi--2 (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: Sink
<- "imx477 9-001a":0 [ENABLED]
pad1: Source
-> "vi-output, imx477 9-001a":0 [ENABLED]
- entity 6: vi-output, imx477 9-001a (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video0
pad0: Sink
<- "15a00000.nvcsi--2":1 [ENABLED]
- entity 18: imx477 10-001a (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev2
pad0: Source
[fmt:SRGGB10_1X10/3840x2160 field:none colorspace:srgb]
-> "15a00000.nvcsi--1":0 [ENABLED]
- entity 20: 15a00000.nvcsi--1 (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev3
pad0: Sink
<- "imx477 10-001a":0 [ENABLED]
pad1: Source
-> "vi-output, imx477 10-001a":0 [ENABLED]
- entity 23: vi-output, imx477 10-001a (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video1
pad0: Sink
<- "15a00000.nvcsi--1":1 [ENABLED]
However, neither interface is able to acquire frames. the v4l2-ctl
command just hangs, and I can see a loop of retries in dmesg -w
:
$ v4l2-ctl -d /dev/video0 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=3
───────────────────────────────────────────────────────────────────────────────────
[62735.930039] [RCE] vi5_hwinit: firmware CL2018101701 protocol version 2.2
[62738.410059] tegra194-vi5 15c10000.vi: no reply from camera processor
[62738.410220] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
[62738.410385] tegra194-vi5 15c10000.vi: err_rec: attempting to reset the capture channel
[62738.418915] tegra194-vi5 15c10000.vi: err_rec: successfully reset the capture channel
[62745.577923] tegra194-vi5 15c10000.vi: no reply from camera processor
[62745.578084] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
[62745.578266] tegra194-vi5 15c10000.vi: err_rec: attempting to reset the capture channel
[62745.581631] tegra194-vi5 15c10000.vi: err_rec: successfully reset the capture channel
[62748.105911] tegra194-vi5 15c10000.vi: no reply from camera processor
[62748.106066] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
The above output happens identically for both /dev/video0 and /dev/video1.
Through various posts I’ve found you can enable more verbose output, but I don’t know if it’s helpful:
$ sudo bash -c "echo 'file camera_common.c +p' > /sys/kernel/debug/dynamic_debug/control"
$ v4l2-ctl -d /dev/video1 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=3
<ctrl-c>
$ v4l2-ctl -d /dev/video0 --set-ctrl bypass_mode=0 --stream-mmap --stream-count=3
<ctrl-c>
───────────────────────────────────────────────────────────────────────────────────────
[62966.859423] imx477 10-001a: camera_common_mclk_enable: enable MCLK with 24000000 Hz
[62966.859501] imx477 10-001a: camera_common_dpd_disable: csi 4
[62967.219819] [RCE] vi5_hwinit: firmware CL2018101701 protocol version 2.2
[62969.831826] tegra194-vi5 15c10000.vi: no reply from camera processor
[62969.831985] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
[62969.832119] tegra194-vi5 15c10000.vi: err_rec: attempting to reset the capture channel
[62969.835592] tegra194-vi5 15c10000.vi: err_rec: successfully reset the capture channel
[62977.479724] tegra194-vi5 15c10000.vi: no reply from camera processor
...
[62977.479910] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
[62977.480050] tegra194-vi5 15c10000.vi: err_rec: attempting to reset the capture channel
[62977.483605] tegra194-vi5 15c10000.vi: err_rec: successfully reset the capture channel
[62977.508052] imx477 10-001a: camera_common_dpd_enable: csi 4
[62977.508063] imx477 10-001a: camera_common_mclk_disable: disable MCLK
[62984.904476] imx477 9-001a: camera_common_mclk_enable: enable MCLK with 24000000 Hz
[62984.904573] imx477 9-001a: camera_common_dpd_disable: csi 2
[62985.259675] [RCE] vi5_hwinit: firmware CL2018101701 protocol version 2.2
[62987.751643] tegra194-vi5 15c10000.vi: no reply from camera processor
[62987.751803] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
[62987.751961] tegra194-vi5 15c10000.vi: err_rec: attempting to reset the capture channel
[62987.759691] tegra194-vi5 15c10000.vi: err_rec: successfully reset the capture channel
[62990.311607] tegra194-vi5 15c10000.vi: no reply from camera processor
...
[62992.839780] tegra194-vi5 15c10000.vi: uncorr_err: request timed out after 2500 ms
[62992.839943] tegra194-vi5 15c10000.vi: err_rec: attempting to reset the capture channel
[62992.843612] tegra194-vi5 15c10000.vi: err_rec: successfully reset the capture channel
[62992.856687] imx477 9-001a: camera_common_dpd_enable: csi 2
[62992.856698] imx477 9-001a: camera_common_mclk_disable: disable MCLK
From this eLinux page mentioned in other forum posts, if I do:
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/tracing_on
echo 30720 > /sys/kernel/debug/tracing/buffer_size_kb
echo 1 > /sys/kernel/debug/tracing/events/tegra_rtcpu/enable
echo 1 > /sys/kernel/debug/tracing/events/freertos/enable
echo 2 > /sys/kernel/debug/camrtc/log-level
echo 1 > /sys/kernel/debug/tracing/events/camera_common/enable
echo > /sys/kernel/debug/tracing/trace"
And then sudo cat /sys/kernel/debug/tracing/trace
while doing the v4l2-ctl
command above, I get a bunch of stuff like this:
kworker/0:4-7046 [000] .... 383.885057: rtos_queue_peek_from_isr_failed: tstamp:12832960447 queue:0x0bcbb8b8
kworker/0:4-7046 [000] .... 384.053056: rtos_queue_peek_from_isr_failed: tstamp:12837960450 queue:0x0bcbb8b8
kworker/0:4-7046 [000] .... 384.221060: rtos_queue_peek_from_isr_failed: tstamp:12842960449 queue:0x0bcbb8b8
vi-output, imx4-9076 [001] .... 384.324082: tegra_channel_capture_setup: vnc_id 0 W 3840 H 2160 fmt c4
v4l2-ctl-9074 [000] .... 384.324540: tegra_channel_set_stream: enable : 0x0
v4l2-ctl-9074 [000] .... 384.324544: tegra_channel_set_stream: imx477 10-001a : 0x0
v4l2-ctl-9074 [000] .... 384.324742: tegra_channel_set_stream: 15a00000.nvcsi--1 : 0x0
v4l2-ctl-9074 [000] .... 384.324745: csi_s_stream: enable : 0x0
kworker/0:4-7046 [000] .... 384.333299: rtos_queue_send_from_isr_failed: tstamp:12847783462 queue:0x0bcb2b38
kworker/0:4-7046 [000] .... 384.333309: rtos_queue_send_from_isr_failed: tstamp:12847783610 queue:0x0bcb73a0
kworker/0:4-7046 [000] .... 384.333310: rtos_queue_send_from_isr_failed: tstamp:12847783755 queue:0x0bcb8f20
kworker/0:4-7046 [000] .... 384.333312: rtos_queue_send_from_isr_failed: tstamp:12847783894 queue:0x0bcb9ce0
kworker/0:4-7046 [000] .... 384.333313: rtos_queue_send_from_isr_failed: tstamp:12847784033 queue:0x0bcbaaa0
kworker/0:4-7046 [000] .... 384.333314: rtos_queue_send_from_isr_failed: tstamp:12847784234 queue:0x0bcb2ad0
kworker/0:4-7046 [000] .... 384.333315: rtos_queue_send_from_isr_failed: tstamp:12847784363 queue:0x0bcb2b38
The comment on that eLinux page for messages like this isn’t very helpful–“Didn’t receive any package from the MIPI bus. Make sure the sensor have output data to the MIPI bus”. As I’ve mentioned, scope captures show the sensor is outputting data on the CSI lines. I assume this means the CSI deserializer doesn’t think it’s receiving any data, and I assume this would have to be from misconfigured device tree ports or a hardware problem…?
Some other notes:
- System is running Jetpack 4.6.1
- I’m building the DTB with a modified version of the script in this post, flashing it with
flash.sh
[2], and confirming it’s taking effect withcat /proc/device-tree/nvidia,dtbbuildtime
. - When I probe the CSIX_CLK lines on the cable header on the imager board, I don’t see any clock. I’m not sure how this works, but when I probe the same signals on a working system, I also see no clock.
- The Arducam, like the Pi HQ cam, has an onboard oscillator for INCK on the IMX477, so I assume the Jetson does not need to generate the master clock. I’ve also probed this oscillator and found the ~25MHz clock. Without this, I expect I wouldn’t see any CSI signals anyway.
- Probing also shows high signals on the Arducam pins PWDN and LED Enable/XCLK. Without these, I expect I wouldn’t see binding drivers or CSI signals anyway.
- The issue has been reproduced on several systems
- I’ve looked for what I could as far as pinmuxing goes, but it seems like the only problematic signals are the CSI inputs to the Jetson. The CSI2 pin muxing should be identical to the Jakku carrier board configuration, and I don’t see any options about CSI4 in the dtsi files generated by the pinmuxing spreadsheet.
The associated DTSI files are available here and also reproduced below.
mux_config.dtsi (969 Bytes)
pipeline_config.dtsi (12.4 KB)
Here is the i2cmux configuration for our board. You can ignore mentions of CAM0, and it is accurate that our mux only uses channels 1 and 2, skipping 0.
#define CAM0_PWDN TEGRA194_MAIN_GPIO(P, 4)
#define CAM1_PWDN TEGRA194_MAIN_GPIO(P, 5)
#define CAM2_PWDN TEGRA194_MAIN_GPIO(Q, 6)
#define CAM_I2C_MUX_B TEGRA194_AON_GPIO(CC, 3)
#define CAM_I2C_MUX_A TEGRA194_MAIN_GPIO(R, 0)
/ {
cam_i2cmux {
compatible = "i2c-mux-gpio";
#address-cells = <1>;
#size-cells = <0>;
i2c-parent = <&cam_i2c>;
mux-gpios = <&tegra_main_gpio CAM_I2C_MUX_A GPIO_ACTIVE_HIGH &tegra_aon_gpio CAM_I2C_MUX_B GPIO_ACTIVE_HIGH>;
i2c@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
rbpcv3_imx477_c@1a {
reset-gpios = <&tegra_main_gpio CAM1_PWDN GPIO_ACTIVE_HIGH>;
};
};
i2c@2 {
reg = <2>;
#address-cells = <1>;
#size-cells = <0>;
rbpcv3_imx477_e@1a {
reset-gpios = <&tegra_main_gpio CAM2_PWDN GPIO_ACTIVE_HIGH>;
};
};
};
gpio@6000d000 {
camera-control-output-low {
gpio-hog;
output-low;
gpios = < CAM1_PWDN 0 CAM2_PWDN 0>;
label = "cam1-pwdn", "cam2-pwdn";
};
};
};
And here is the dtsi for the imager configuration.
/ {
host1x {
vi@15c10000 {
num-channels = <2>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
rbpcv3_imx477_vi_in0: endpoint {
port-index = <4>; // one of these has to be wrong...?
bus-width = <2>;
remote-endpoint = <&rbpcv3_imx477_csi_out0>;
};
};
port@1 {
reg = <1>;
rbpcv3_imx477_vi_in1: endpoint {
port-index = <6>; // one of these has to be wrong...?
bus-width = <2>;
remote-endpoint = <&rbpcv3_imx477_csi_out1>;
};
};
};
};
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 = <2>;
bus-width = <2>;
remote-endpoint = <&rbpcv3_imx477_dual_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@2 {
reg = <0>;
rbpcv3_imx477_csi_in1: endpoint@2 {
port-index = <4>;
bus-width = <2>;
remote-endpoint = <&rbpcv3_imx477_out1>;
};
};
port@3 {
reg = <1>;
rbpcv3_imx477_csi_out1: endpoint@3 {
remote-endpoint = <&rbpcv3_imx477_vi_in1>;
};
};
};
};
};
};
cam_i2cmux {
i2c@1 {
imx477_cam0: rbpcv3_imx477_c@1a {
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
*
* == 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_c";
phy_mode = "DPHY";
discontinuous_clk = "no";
dpcm_enable = "false";
cil_settletime = "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 = "840000000";
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";
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 = "840000000";
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_dual_out0: endpoint {
port-index = <2>;
bus-width = <2>;
remote-endpoint = <&rbpcv3_imx477_csi_in0>;
};
};
};
};
};
i2c@2 {
imx477_cam1: rbpcv3_imx477_e@1a {
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_e";
phy_mode = "DPHY";
discontinuous_clk = "no";
dpcm_enable = "false";
cil_settletime = "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 = "840000000";
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_e";
phy_mode = "DPHY";
discontinuous_clk = "no";
dpcm_enable = "false";
cil_settletime = "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 = "840000000";
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 {
port-index = <4>;
bus-width = <2>;
remote-endpoint = <&rbpcv3_imx477_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 = <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_IMX477";
position = "front";
orientation = "1";
drivernode0 {
pcl_id = "v4l2_sensor";
devname = "imx477 9-001a";
proc-device-tree = "/proc/device-tree/cam_i2cmux/i2c@1/rbpcv3_imx477_c@1a";
};
};
module1 {
badge = "jakku_rear_IMX477";
position = "rear";
orientation = "1";
drivernode0 {
pcl_id = "v4l2_sensor";
devname = "imx477 10-001a";
proc-device-tree = "/proc/device-tree/cam_i2cmux/i2c@2/rbpcv3_imx477_e@1a";
};
};
};
};
};
Would anyone have any idea what else I could be doing wrong? I’ve asked the hardware guys to probe the CSI signal as close to the SoM as possible to check for signal integrity issues. That said, any feedback on my configuration of the Jetson would be deeply appreciated.
Thank you immensely for reading and I appreciate your time.
[1] Using sources available here in /hardware/nvidia/platform/t19x/jakku/kernel-dts/common
, modified copies of tegra194-camera-jakku-rbpcv3-imx477.dtsi
and tegra194-camera-rbpcv3-imx477.dtsi
.
[2] Running sudo ./flash.sh -k kernel-dtb jetson-xavier-nx-devkit-emmc mmcblk0p1
on a host machine running Ubuntu 18 while the Jetson is in recovery mode connected to host via USB