Hi,
I am trying to interface a FPD link III camera (IMX290) with my customised board based on Jetson Nano.
I have created a dts file for it. After board is booted, i can see my camera sensor got detected (i2c address 0x1a) and deserializer(0x30). But “/dev/video0” node is not created.
MY dts file is like below:
/ {
host1x {
vi {
num-channels = <3>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@2 {
reg = <2>;
tis_imx290_vi_in2: endpoint {
vc-id = <0>;
port-index = <5>;
bus-width = <2>;
remote-endpoint = <&tis_imx290_csi_out2>;
};
};
};
};
nvcsi {
num-channels = <3>;
channel@2 {
reg = <2>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
tis_imx290_csi_in2: endpoint@4 {
port-index = <5>;
bus-width = <2>;
remote-endpoint = <&tis_imx290_out2>;
};
};
port@1 {
reg = <1>;
tis_imx290_csi_out2: endpoint@5 {
remote-endpoint = <&tis_imx290_vi_in2>;
};
};
};
};
};
};
i2c@7000c000 {
tis_fpdlink_a: tis_fpdlink@30 {
compatible = "tis,tis-fpdlink", "tis,tis-fpdlink-deser";
status = "okay";
reg = <0x30>;
gpio_addr_base = /bits/ 8 <0x60>;
gpio-controller;
#gpio-cells = <2>;
ngpios = <8>;
deser_lanes = <2>;
pdb-gpios = <&gpio TEGRA_GPIO(C, 2) GPIO_ACTIVE_HIGH>;
clkout_hz = <37000000>;
slave_map = /bits/ 8 <0x1a 0x1a>;
ser_map_addr = /bits/ 8 <0x20>;
ser_lanes = <2>;
vc_map = /bits/ 8 <0x0>;
tis_fpdlink_a_input {
status = "okay";
input;
gpios = <7 0>;
label = "tis_fpdlink_a_chn0_input_0";
};
tis_fpdlink_a_outlow {
status = "okay";
gpio-hog;
output-low;
gpios = <0 0 1 0 2 0 3 0 4 0 5 0 6 0>;
label = "tis_fpdlink_a_chn0_CAM_PWR", "tis_fpdlink_a_chn0_RESET", "tis_fpdlink_a_chn0_GPOUT_LEVEL", "tis_fpdlink_a_chn0_GPOUT_PUSHPULL", "tis_fpdlink_a_chn0_GPOUT_SELECT", "tis_fpdlink_a_chn0_TRIG_LVL_SEL", "tis_fpdlink_a_chn0_TRIG_SRC_SEL";
};
tis_fpdlink_a_outhigh {
status = "disabled";
};
};
tis_imx290_a@1a {
compatible = "tis,tis_imx290";
reg = <0x1a>;
status = "okay";
reset-gpios = <&tis_fpdlink_a 1 GPIO_ACTIVE_HIGH>;
pwdn-gpios = <&tis_fpdlink_a 0 GPIO_ACTIVE_HIGH>;
devnode = "video2";
physical_w = "5.640";
physical_h = "3.216";
sensor_model = "imx290";
use_decibel_gain = "true";
use_sensor_mode_id = "true";
fpdlink = <&tis_fpdlink_a>;
mode0 {
mclk_khz = "37000";
num_lanes = "2";
tegra_sinterface = "serial_b";
vc_id = "0";
phy_mode = "DPHY";
discontinuous_clk = "yes";
dpcm_enable = "false";
cil_settletime = "0";
active_w = "1948";
active_h = "1096";
dynamic_pixel_bit_depth = "12";
csi_pixel_bit_depth = "12";
mode_type = "bayer";
pixel_phase = "rggb";
pixel_t = "bayer_rggb12";
readout_orientation = "0";
line_length = "2200";
inherent_gain = "1";
pix_clk_hz = "297000000";
gain_factor = "10";
framerate_factor = "1000000";
exposure_factor = "1000000";
min_gain_val = "0";
max_gain_val = "300";
step_gain_val = "3";
default_gain = "1";
min_hdr_ratio = "1";
max_hdr_ratio = "1";
min_framerate = "2000000";
max_framerate = "60000000";
step_framerate = "1";
default_framerate = "60000000";
min_exp_time = "15";
max_exp_time = "16650";
step_exp_time = "1";
default_exp_time = "2495";
embedded_metadata_height = "1";
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
tis_imx290_out2: endpoint {
port-index = <5>;
bus-width = <2>;
remote-endpoint = <&tis_imx290_csi_in2>;
};
};
};
};
};
lens_imx290@0 {
min_focus_distance = "0.0";
hyper_focal = "0.0";
focal_length = "3.04";
f_number = "2.0";
aperture = "0.0";
};
};
/ {
tegra-camera-platform {
compatible = “nvidia, tegra-camera-platform”;
num_csi_lanes = <6>;
max_lane_speed = <1500000>;
min_bits_per_pixel = <12>;
vi_peak_byte_per_pixel = <2>;
vi_bw_margin_pct = <25>;
max_pixel_rate = <240000>;
isp_peak_byte_per_pixel = <5>;
isp_bw_margin_pct = <25>;
modules {
module2 {
status = “okay”;
badge = “neuron_center_imx290”;
position = “center”;
orientation = “1”;
drivernode0 {
status = “okay”;
pcl_id = “v4l2_sensor”;
devname = “tis_imx290 0-001a”;
proc-device-tree = “/proc/device-tree/i2c@7000c000/tis_imx290_a@1a”;
};
drivernode1 {
status = “okay”;
pcl_id = “v4l2_lens”;
proc-device-tree = “/proc/device-tree/lens_imx290@0/”;
};
};
};
};
};