Hi,
We have a custom MIPI camera board interfaced to the Jetson TX2i SOM on P3310 carrier board. The MIPI video output of the camera is similar to IMX219, operated in mode IMX219_3264x2464_21FPS. The custom camera board has no i2c line and the board starts streaming video as soon as it is powered on.
We are using tegra186-camera-e3326-a00.dtsi for device tree and OV5693 as a reference. for developing the driver.
We have gone through the sensor development guide and various posts on the forum and have followed following steps:
- Disabled camera plugin manager and camera module and included e3326 dtsi as below
#include <t18x-common-platforms/tegra186-quill-common-p3489-1000-a00.dtsi>
#include <t18x-common-platforms/tegra186-quill-power-tree-p3489-1000-a00-00.dtsi>
/*#include <t18x-common-platforms/tegra186-quill-camera-modules.dtsi>*/
#include <t18x-common-modules/tegra186-display-e3320-1000-a00.dtsi>
#include <t18x-common-modules/tegra186-camera-e3326-a00.dtsi>
/* comms dtsi file should be included after gpio dtsi file */
#include <t18x-common-plugin-manager/tegra186-quill-p3489-1000-a00-plugin-manager.dtsi>
#include <t18x-common-modules/tegra186-super-module-e2614-p2597-1000-a00.dtsi>
#include <t18x-common-plugin-manager/tegra186-quill-display-plugin-manager.dtsi>
#include <t18x-common-prod/tegra186-priv-quill-p3489-1000-a00-prod.dtsi>
/*#include <t18x-common-plugin-manager/tegra186-quill-camera-plugin-manager.dtsi>*/
- Modified tegra186-camera-e3326-a00.dtsi as below:
/*
* Copyright (c) 2015-2020, 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 = <1>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
status = "okay";
reg = <0>;
e3326_vi_in0: endpoint {
status = "okay";
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&e3326_csi_out0>;
};
};
};
};
nvcsi@150c0000 {
num-channels = <1>;
#address-cells = <1>;
#size-cells = <0>;
channel@0 {
status = "okay";
reg = <0>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
status = "okay";
reg = <0>;
e3326_csi_in0: endpoint@0 {
status = "okay";
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&e3326_ov5693_out0>;
};
};
port@1 {
status = "okay";
reg = <1>;
e3326_csi_out0: endpoint@1 {
status = "okay";
remote-endpoint = <&e3326_vi_in0>;
};
};
};
};
};
};
i2c@3180000 {
ov5693_c@36 {
status = "okay";
compatible = "nvidia,ov5693";
/* I2C device address */
reg = <0x36>;
/* V4L2 device node location */
devnode = "video0";
/* Physical dimensions of sensor */
physical_w = "3.674";
physical_h = "2.738";
/* Define any required hw resources needed by driver */
/* ie. clocks, io pins, power sources */
/* avdd-reg = "vana";
iovdd-reg = "vif"; */
/* Sensor output flip settings */
vertical-flip = "true";
/* Enable EEPROM support */
has-eeprom = "0"; /* changed it to 0, as our camera doesnot have EEPROM */
/**
* 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 s1x {
status="okay";
vi@15c10000 {ensor is programmed to output
*
* tegra_sinterface = "";
* The base tegra serial interface lanes are connected to
* Incase of virtual HW devices, use virtual
* For SW emulated devices, use host
*
* phy_mode = "";
* PHY mode used by the MIPI lanes for this device
*
* 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
*
* pixel_t = "";
* The sensor readout pixel pattern
*
* 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)
*
* == 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 (us)
*
*
* min_hdr_ratio = "";
* max_hdr_ratio = "";
* HDR Ratio limits for mode
*
* framerate_factor = ""; (integer factor used for floating to fixed point conversion)
* min_framerate = "";
* max_framerate = "";
* step_framerate = ""; (ceil to integer)
* default_framerate = ""; (ceil to integer)
* Framerate limits for mode (fps)
*/
mode0 { // OV5693_MODE_2592X1944
mclk_khz = "24000";
num_lanes = "2";
tegra_sinterface = "serial_a";
phy_mode = "DPHY";
discontinuous_clk = "yes";
dpcm_enable = "false";
cil_settletime = "0";
active_w = "3264"; /* changed original value*/
active_h = "2464"; /* changed original value*/
/*mode_type = "bayer";
pixel_phase = "bggr"; */ /*imx219 doesnot have it*/
pixel_t = "bayer_rggb";
/* csi_pixel_bit_depth = "10"; */
readout_orientation = "90";
line_length = "3448"; /*2688 replaced with imx219*/
inherent_gain = "1";
/* mclk_multiplier = "9.33"; 6.67 replaced with imx219 value */
pix_clk_hz = "182400000"; /* 160000000 replaced with imx219 value*/
gain_factor = "16"; /* 10 replaced with imx219 value*/
min_gain_val = "16";/* 1DB*/ /*10 replaced with imx219*/
max_gain_val = "170";/* 16DB*/ /* 160 replaced with imx219 value*/
step_gain_val = "1";
default_gain = "16"; /* 10 replaced with imx219 value*/
min_hdr_ratio = "1";
max_hdr_ratio = "1";
framerate_factor = "1000000";
min_framerate = "2000000";/*1.816577 */ /* 1816577 replaced with imx219 value i.e 2fps*/
max_framerate = "21000000";/*30*/ /* 30000000 replaced with imx219 value i.e 21 fps*/
step_framerate = "1";
default_framerate = "21000000"; /* 30000000 replaced with imx219 value i.e. 21 fps */
exposure_factor = "1000000";
min_exp_time = "13";/* us */ /* 34 replaced with imx219 value*/
max_exp_time = "683709";/* us */ /* 550385 replaced with imx219 value*/
step_exp_time = "1";
default_exp_time = "2495";/* us */ /* 33334 replaced with imx219 value */
embedded_metadata_height = "2"; /* 0 replaced with imx219 value*/
};
/* Removed two modules, we need only one and our custom MIPI doesnot have multiple modes */
ports {
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
port@0 {
status = "okay";
reg = <0>;
e3326_ov5693_out0: endpoint {
status = "okay";
port-index = <0>;
bus-width = <2>;
remote-endpoint = <&e3326_csi_in0>;
};
};
};
};
};
/* Removed lens */
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 = <2>;
max_lane_speed = <1500000>;
min_bits_per_pixel = <10>;
vi_peak_byte_per_pixel = <2>;
vi_bw_margin_pct = <25>;
max_pixel_rate = <160000>;
isp_peak_byte_per_pixel = <5>;
isp_bw_margin_pct = <25>;
/**
* The general guideline for naming 1x {
status="okay";
vi@15c10000 {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 = "e3326_front_P5V27C";
position = "rear";
orientation = "1";
drivernode0 {
status = "okay";
/* Declare PCL support driver (classically known as guid) */
pcl_id = "v4l2_sensor";
/* Driver v4l2 device name */
devname = "ov5693 2-0036";
/* Declare the device-tree hierarchy to driver instance */
proc-device-tree = "/proc/device-tree/i2c@3180000/ov5693_c@36";
};
drivernode1 {
/* Declare PCL support driver (classically known as guid) */
status = "okay";
pcl_id = "v4l2_lens";
proc-device-tree = "/proc/device-tree/e3326_lens_ov5693@P5V27C/";
};
};
};
};
};
-
We modified OV5693.c and OV5693_mode_tbls.h as below:
ov5693.c (15.0 KB)
ov5693_mode_tbls.h (1.3 KB) -
After compiling we flashed Jetson TX2i
However, we are not able to register /dev/video0, following are the output of the dmesg:
dmesg | grep ov5693
vte-developer@vtedeveloper-desktop:~$ dmesg | grep ov5693
[ 3.455700] ov5693 2-0036: probing v4l2 sensor no i2c.
[ 3.455738] ov5693 2-0036: Failed to find clocks
[ 3.485726] ov5693 2-0036: tegracam sensor driver:ov5693_v2.0.6
[ 3.485733] ov5693 2-0036: TEGRA_CAMERA_CID_GROUP_HOLD contorl is enabled in framework by default, no need to add it in driver
[ 3.504782] ov5693 2-0036: Error -22 in control ops setup
[ 3.526425] ov5693 2-0036: Failed to init ctrls ov5693
[ 3.532897] ov5693 2-0036: tegra camera subdev registration failed
[ 3.576008] ov5693: probe of 2-0036 failed with error -22
dmesg | grep cam
vte-developer@vtedeveloper-desktop:~$ dmesg | grep camera
[ 0.993446] tegra_camera_platform tegra-camera-platform: tegra_camera_probe:camera_platform_driver probe
[ 0.993561] misc tegra_camera_ctrl: tegra_camera_isomgr_register isp_iso_bw=1000000, vi_iso_bw=750000, max_bw=1000000
[ 3.532897] ov5693 2-0036: tegra camera subdev registration failed
vte-developer@vtedeveloper-desktop:~$ dmesg | grep cam
[ 0.543122] en-vdd-cam: 1800 mV
[ 0.555155] en-vdd-cam-hv-2v8: 2800 mV
[ 0.555783] en-vdd-cam-1v2: 1200 mV
[ 0.561458] camchar: rtcpu character device driver loaded
[ 0.993446] tegra_camera_platform tegra-camera-platform: tegra_camera_probe:camera_platform_driver probe
[ 0.993561] misc tegra_camera_ctrl: tegra_camera_isomgr_register isp_iso_bw=1000000, vi_iso_bw=750000, max_bw=1000000
[ 1.284502] tegra186-cam-rtcpu b000000.rtcpu: Trace buffer configured at IOVA=0xbff00000
[ 1.287275] tegra186-cam-rtcpu b000000.rtcpu: no priority specified, using 99 as default
[ 1.288655] tegra186-cam-rtcpu b000000.rtcpu: using cam RTCPU IRQ (52)
[ 1.288657] tegra186-cam-rtcpu b000000.rtcpu: tegra_camrtc_mon_create is successful
[ 1.289154] tegra186-cam-rtcpu b000000.rtcpu: firmware version cpu=sce cmd=5 sha1=c73bbe92930645be44530c166eb578bfbb9499c3
[ 3.485726] ov5693 2-0036: tegracam sensor driver:ov5693_v2.0.6
[ 3.532897] ov5693 2-0036: tegra camera subdev registration failed
[ 31.817929] en-vdd-cam: disabling
[ 31.817991] en-vdd-cam-hv-2v8: disabling
[ 31.818001] en-vdd-cam-1v2: disabling
ls /dev/video0
vte-developer@vtedeveloper-desktop:~$ ls /dev/video0
ls: cannot access '/dev/video0': No such file or directory
sudo media-ctl -p -d /dev/media0
vte-developer@vtedeveloper-desktop:~$ sudo media-ctl -p -d /dev/media0
Media controller API version 0.1.0
Media device information
------------------------
driver tegra-vi4
model NVIDIA Tegra Video Input Device
serial
bus info
hw revision 0x3
driver version 0.0.0
Device topology
- entity 1: 150c0000.nvcsi--1 (2 pads, 0 link)
type V4L2 subdev subtype Unknown flags 0
pad0: Sink
pad1: Source
As driver itself is not getting registered, what else can we do to resolve this issue.
I have attached dmesg log below.
dmesg (89.2 KB)