OS08A10 Omnivision image sensor driver development for the TX2

Hi,

I have been trying to write a driver for one of Omnivision’s newer image sensors, OS08A10, but I am stuck. I have a bare-bones (but I believe functional) I2C driver and I have also updated the device tree as appear the driver development guide.

The driver binds successfully and I am able to see /dev/video0. However when I use GStreamer to stream data from the sensor all I see is just a green or sometimes red screen. When I do a single capture with v4l2-ctl the raw file is empty. I can’t figure out where the problem would be. I will attach relevant files below. If it helps you help me I can also put up the kernel log from dmesg later.

nvidia@tegra-ubuntu:~$ v4l2-ctl -d /dev/video0 --stream-mmap --stream-count=1 --stream-to=test.raw
VIDIOC_DQBUF: failed: Input/output error
[   31.651266] os08a10 30-0021: os08a10_s_stream: STREAM STARTING
[   31.657176] os08a10 30-0021: os08a10_s_stream: write mode table 0
[   31.716506] tegra-vi4 15700000.vi: Status:  2 channel:00 frame:0001
[   31.722811] tegra-vi4 15700000.vi:          timestamp sof 41338807744 eof 41353333184 data 0x000000a0
[   31.732062] tegra-vi4 15700000.vi:          capture_id 1 stream  0 vchan  0
[   32.698920] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[   33.702878] tegra-vi4 15700000.vi: ATOMP_FE syncpt timeout!
[  273.542795] os08a10 30-0021: os08a10_s_stream: STREAM STARTING
[  273.548656] os08a10 30-0021: os08a10_s_stream: write mode table 0
[  273.610098] tegra-vi4 15700000.vi: Status:  2 channel:00 frame:0001
[  273.616405] tegra-vi4 15700000.vi:          timestamp sof 283232359200 eof 283246884640 data 0x000000a0
[  273.625867] tegra-vi4 15700000.vi:          capture_id 3 stream  0 vchan  0
[  274.594351] tegra-vi4 15700000.vi: PXL_SOF syncpt timeout! err = -11
[  275.598080] tegra-vi4 15700000.vi: ATOMP_FE syncpt timeout!
[  275.604901] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERROR_STATUS2VI_VC0 = 0x0000000c
[  275.613735] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) INTR_STATUS 0x0000000c
[  275.621735] nvcsi 150c0000.nvcsi: csi4_stream_check_status (0) ERR_INTR_STATUS 0x0000000c

Driver:

/*
 * os08a10.c - os08a10 sensor driver
 */
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/gpio.h>
#include <linux/module.h>

#include <linux/seq_file.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>

#include <media/tegra_v4l2_camera.h>
#include <media/camera_common.h>

#include "os08a10_mode_tbls.h"

#define DEBUG
//#define TPG

/* OS08A10 Registers */
#define OS08A10_DEFAULT_I2C_ADDR_0			0x21
#define OS08A10_DEFAULT_I2C_ADDR_1			0x6D

#define OS08A10_SC_MODE_SELECT_ADDR			0x0100
#define OS08A10_SC_MODE_SELECT_STREAMING	0x01

#define OS08A10_CHIP_ID_HIGH_ADDR			0x300A
#define OS08A10_CHIP_ID_MID_ADDR			0x300B
#define OS08A10_CHIP_ID_LOW_ADDR			0x300C

#define OS08A10_GROUP_HOLD_ADDR				0x3208
#define OS08A10_GROUP_HOLD_START			0x00
#define OS08A10_GROUP_HOLD_END				0x10
#define OS08A10_GROUP_HOLD_LAUNCH			0xA0
#define OS08A10_GROUP_HOLD_FAST_LAUNCH		0xE0
#define OS08A10_GROUP_HOLD_BANK_0			0x00
#define OS08A10_GROUP_HOLD_BANK_1			0x01
#define OS08A10_GROUP_HOLD_BANK_2			0x02
#define OS08A10_GROUP_HOLD_BANK_3			0x03

#define OS08A10_LONG_EXPO_HIGH_ADDR			0x3501
#define OS08A10_LONG_EXPO_LOW_ADDR			0x3502
#define OS08A10_SHORT_EXPO_HIGH_ADDR		0x3511
#define OS08A10_SHORT_EXPO_LOW_ADDR			0x3512

#define OS08A10_GAIN_SHIFT_ADDR				0x3507
#define OS08A10_LONG_GAIN_HIGH_ADDR			0x3508
#define OS08A10_LONG_GAIN_LOW_ADDR			0x3509
#define OS08A10_SHORT_GAIN_HIGH_ADDR		0x350C
#define OS08A10_SHORT_GAIN_LOW_ADDR			0x350D

#define OS08A10_TIMING_HTS_HIGH_ADDR		0x380C
#define OS08A10_TIMING_HTS_LOW_ADDR			0x380D
#define OS08A10_TIMING_VTS_HIGH_ADDR		0x380E
#define OS08A10_TIMING_VTS_LOW_ADDR			0x380F
#define OS08A10_TIMING_RST_FSIN_HIGH_ADDR	0x3826
#define OS08A10_TIMING_RST_FSIN_LOW_ADDR	0x3827

#define OS08A10_OTP_BUFFER_ADDR				0x6000
#define OS08A10_OTP_BUFFER_SIZE				1024
#define OS08A10_OTP_STR_SIZE				(OS08A10_OTP_BUFFER_SIZE * 2)
#define OS08A10_FUSE_ID_OTP_BUFFER_ADDR		0x6000
#define OS08A10_FUSE_ID_OTP_BUFFER_SIZE		16
#define OS08A10_FUSE_ID_OTP_STR_SIZE		(OS08A10_FUSE_ID_OTP_BUFFER_SIZE * 2)
#define OS08A10_OTP_PROGRAM_CTRL_ADDR		0x3D80
#define OS08A10_OTP_LOAD_CTRL_ADDR			0x3D81
#define OS08A10_OTP_LOAD_CTRL_OTP_RD		0x01
#define OS08A10_OTP_RD_BUSY_MASK			0x80
#define OS08A10_OTP_BIST_ERROR_MASK			0x20

#define OS08A10_TEST_PATTERN_ADDR			0x5081
#define OS08A10_TEST_PATTERN_EN				(1 << 7)

#define OS08A10_DEFAULT_GAIN				0x0080
#define OS08A10_MIN_GAIN					0x0080
#define OS08A10_MAX_GAIN					0x07C0

#define OS08A10_DEFAULT_MODE				OS08A10_MODE_3840X2160_EVAL
#define OS08A10_DEFAULT_WIDTH				3840
#define OS08A10_DEFAULT_HEIGHT				2160

#define OS08A10_DEFAULT_DATAFMT				MEDIA_BUS_FMT_SBGGR10_1X10
#define OS08A10_DEFAULT_CLK_FREQ			26000000

/* OV9281 */

#define OV9281_DEFAULT_FRAME_LENGTH	0x038E
#define OV9281_MIN_FRAME_LENGTH		0x0001
#define OV9281_MAX_FRAME_LENGTH		0xFFFF

#define OV9281_MIN_EXPOSURE_COARSE	0x00000001
#define OV9281_MAX_EXPOSURE_COARSE	0x000FFFFF
#define OV9281_DEFAULT_EXPOSURE_COARSE	0x00002A90

struct os08a10 {
	struct camera_common_power_rail		power;
	int									num_ctrls;
	struct v4l2_ctrl_handler			ctrl_handler;
	struct i2c_client					*i2c_client;
	struct v4l2_subdev					*subdev;
	struct media_pad					pad;

	s32									group_hold_prev;
	bool								group_hold_en;
	struct regmap						*regmap;
	struct camera_common_data			*s_data;
	struct camera_common_pdata			*pdata;
	struct v4l2_ctrl					*ctrls[];
};

static const struct of_device_id os08a10_of_match[] = {
	{ .compatible = "nvidia,os08a10", },
	{ },
};

/* Register/regmap stuff */
static int os08a10_read_reg(struct camera_common_data *s_data, u16 addr, u8 *val)
{
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;
	int err = 0;
	u32 reg_val = 0;

	err = regmap_read(priv->regmap, addr, &reg_val);
	*val = reg_val & 0xFF;

	return err;
}

static int os08a10_write_reg(struct camera_common_data *s_data, u16 addr, u8 val)
{
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;
	int err;

	err = regmap_write(priv->regmap, addr, val);
	if (err)
		dev_err(&priv->i2c_client->dev,
			"%s:i2c write failed, %x = %x\n", __func__, addr, val);

	return err;
}

static int os08a10_write_table(struct os08a10 *priv, const os08a10_reg table[])
{
	return regmap_util_write_table_8(priv->regmap, table, NULL, 0,
					 OS08A10_TABLE_WAIT_MS,
					 OS08A10_TABLE_END);
}

static const struct regmap_config os08a10_regmap_config = {
	.reg_bits = 16,
	.val_bits = 8,
	.cache_type = REGCACHE_RBTREE,
	.use_single_rw = true,
};

/* NVIDIA camera_common stuff */
static int os08a10_power_on(struct camera_common_data *s_data)
{
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;
	struct camera_common_power_rail *pw = &priv->power;
	int err;

	dev_dbg(&priv->i2c_client->dev, "%s: power on\n", __func__);

	if (priv->pdata->power_on) {
		err = priv->pdata->power_on(pw);
		if (err)
			dev_err(&priv->i2c_client->dev, "%s failed.\n",
				__func__);
		else
			pw->state = SWITCH_ON;
		return err;
	}

	usleep_range(5350, 5360);
	pw->state = SWITCH_ON;
	return 0;
}

static int os08a10_power_off(struct camera_common_data *s_data)
{
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;
	struct camera_common_power_rail *pw = &priv->power;
	int err = 0;

	dev_dbg(&priv->i2c_client->dev, "%s: power off\n", __func__);
	os08a10_write_table(priv, os08a10_mode_table[OS08A10_MODE_STOP_STREAM]);

	if (priv->pdata->power_off) {
		err = priv->pdata->power_off(pw);
		if (err)
			dev_err(&priv->i2c_client->dev, "%s failed.\n",
				__func__);
		else
			goto power_off_done;
	}

	return err;

power_off_done:
	pw->state = SWITCH_OFF;
	return 0;
}

static int os08a10_power_put(struct os08a10 *priv)
{
	return 0;
}

static int os08a10_power_get(struct os08a10 *priv)
{
	struct camera_common_power_rail *pw = &priv->power;
	const char *mclk_name;
	int err = 0;

	mclk_name = priv->pdata->mclk_name ?
		    priv->pdata->mclk_name : "cam_mclk1";
	pw->mclk = devm_clk_get(&priv->i2c_client->dev, mclk_name);
	
	dev_info(&priv->i2c_client->dev, "%s\n", mclk_name);
	
	if (IS_ERR(pw->mclk)) {
		dev_err(&priv->i2c_client->dev,
			"unable to get clock %s\n", mclk_name);
		return PTR_ERR(pw->mclk);
	}

	pw->state = SWITCH_OFF;
	return err;
}

static struct camera_common_sensor_ops os08a10_common_ops = {
	.power_on = os08a10_power_on,
	.power_off = os08a10_power_off,
	.write_reg = os08a10_write_reg,
	.read_reg = os08a10_read_reg,
};

static int os08a10_set_group_hold(struct os08a10 *priv)
{
	int gh_prev = switch_ctrl_qmenu[priv->group_hold_prev];
	int err;

	if (priv->group_hold_en == true && gh_prev == SWITCH_OFF) {
		/* group hold start */
		err = os08a10_write_reg(priv->s_data, OS08A10_GROUP_HOLD_ADDR,
				       (OS08A10_GROUP_HOLD_START |
					OS08A10_GROUP_HOLD_BANK_0));
		if (err)
			goto fail;
		priv->group_hold_prev = 1;
	} else if (priv->group_hold_en == false && gh_prev == SWITCH_ON) {
		/* group hold end */
		err = os08a10_write_reg(priv->s_data, OS08A10_GROUP_HOLD_ADDR,
				       (OS08A10_GROUP_HOLD_END |
					OS08A10_GROUP_HOLD_BANK_0));
		/* quick launch */
		err |= os08a10_write_reg(priv->s_data,
				       OS08A10_GROUP_HOLD_ADDR,
				       (OS08A10_GROUP_HOLD_LAUNCH |
					OS08A10_GROUP_HOLD_BANK_0));
		if (err)
			goto fail;
		priv->group_hold_prev = 0;
	}

	return 0;

fail:
	dev_dbg(&priv->i2c_client->dev,
		 "%s: Group hold control error\n", __func__);
	return err;
}

static int os08a10_set_gain(struct os08a10 *priv, s32 val)
{
	os08a10_reg regs[4];
	u16 gain;
	int err;

	if (val < OS08A10_MIN_GAIN)
		gain = OS08A10_MIN_GAIN;
	else if (val > OS08A10_MAX_GAIN)
		gain = OS08A10_MAX_GAIN;
	else
		gain = val;

	dev_dbg(&priv->i2c_client->dev, "%s: gain: %d\n", __func__, gain);

	regs[0].addr = OS08A10_GAIN_SHIFT_ADDR;
	regs[0].val = 0x03;
	regs[1].addr = OS08A10_LONG_GAIN_HIGH_ADDR;
	regs[1].val = gain >> 8;
	regs[2].addr = OS08A10_LONG_GAIN_LOW_ADDR;
	regs[2].val = gain & 0xff;
	regs[3].addr = OS08A10_TABLE_END;
	regs[3].val = 0;

	os08a10_set_group_hold(priv);
	err = os08a10_write_table(priv, regs);
	if (err)
		goto fail;

	return 0;

fail:
	dev_dbg(&priv->i2c_client->dev, "%s: GAIN control error\n", __func__);
	return err;
}

static int os08a10_set_frame_length(struct os08a10 *priv, s32 val)
{
	os08a10_reg regs[5];
	u16 frame_length;
	int err;

	frame_length = (u16)val;

	dev_dbg(&priv->i2c_client->dev,
		"%s: frame_length: %d\n", __func__, frame_length);

	regs[0].addr = OS08A10_TIMING_VTS_HIGH_ADDR;
	regs[0].val = (frame_length >> 8) & 0xff;
	regs[1].addr = OS08A10_TIMING_VTS_LOW_ADDR;
	regs[1].val = (frame_length) & 0xff;
	regs[2].addr = OS08A10_TABLE_END;
	regs[2].val = 0;

	os08a10_set_group_hold(priv);
	err = os08a10_write_table(priv, regs);
	if (err)
		goto fail;

	return 0;

fail:
	dev_dbg(&priv->i2c_client->dev,
		"%s: FRAME_LENGTH control error\n", __func__);
	return err;
}

static int os08a10_set_coarse_time(struct os08a10 *priv, s32 val)
{
	os08a10_reg regs[3];
	u16 coarse_time;
	int err;

	coarse_time = (u16)val;

	dev_dbg(&priv->i2c_client->dev,
		 "%s: coarse_time: %d\n", __func__, coarse_time);

	regs[0].addr = OS08A10_LONG_EXPO_HIGH_ADDR;
	regs[0].val = (coarse_time >> 8) & 0xff;
	regs[1].addr = OS08A10_SHORT_EXPO_LOW_ADDR;
	regs[1].val = (coarse_time & 0xff);
	regs[2].addr = OS08A10_TABLE_END;
	regs[2].val = 0;

	os08a10_set_group_hold(priv);
	err = os08a10_write_table(priv, regs);
	if (err)
		goto fail;

	return 0;

fail:
	dev_dbg(&priv->i2c_client->dev,
		 "%s: COARSE_TIME control error\n", __func__);
	return err;
}

/* OTP stuff */
/*
static int os08a10_read_otp(struct os08a10 *priv, u8 *buf, u16 addr, int size)
{
	int err;
	int i;

	err =  os08a10_write_table(priv, os08a10_mode_table[OS08A10_MODE_START_STREAM]);
	if (err)
		return err;

	for (i = 0; i < size; i++) {
		err = os08a10_write_reg(priv->s_data, addr + i, 0x00);
		if (err)
			return err;
	}

	err = os08a10_write_reg(priv->s_data, OS08A10_OTP_LOAD_CTRL_ADDR,
			       OS08A10_OTP_LOAD_CTRL_OTP_RD);
	if (err)
		return err;

	msleep(20);

	return regmap_bulk_read(priv->regmap, addr, buf, size);
}

static int os08a10_otp_setup(struct os08a10 *priv)
{
	struct v4l2_ctrl *ctrl;
	u8 otp_buf[OS08A10_OTP_BUFFER_SIZE];
	int i;
	int err;

	dev_info(&priv->i2c_client->dev, "%s\n", __func__);

	err = camera_common_s_power(priv->subdev, true);
	if (err)
		return -ENODEV;

	err = os08a10_read_otp(priv, otp_buf, OS08A10_OTP_BUFFER_ADDR,
			      OS08A10_OTP_BUFFER_SIZE);
	if (err)
		return err;

	ctrl = v4l2_ctrl_find(&priv->ctrl_handler, V4L2_CID_OTP_DATA);
	if (!ctrl) {
		dev_err(&priv->i2c_client->dev,
			"could not find device ctrl.\n");
		return -EINVAL;
	}

	for (i = 0; i < OS08A10_OTP_BUFFER_SIZE; i++)
		sprintf(&ctrl->p_new.p_char[i*2], "%02x", otp_buf[i]);
	ctrl->p_cur.p_char = ctrl->p_new.p_char;

	err = camera_common_s_power(priv->subdev, false);
	if (err)
		return -ENODEV;

	return 0;
}

static int os08a10_fuse_id_setup(struct os08a10 *priv)
{
	struct v4l2_ctrl *ctrl;
	u8 fuse_id[OS08A10_FUSE_ID_OTP_BUFFER_SIZE];
	int i;
	int err;

	dev_info(&priv->i2c_client->dev, "%s\n", __func__);

	err = camera_common_s_power(priv->subdev, true);
	if (err)
		return -ENODEV;

	err = os08a10_read_otp(priv, fuse_id, OS08A10_FUSE_ID_OTP_BUFFER_ADDR,
			      OS08A10_FUSE_ID_OTP_BUFFER_SIZE);
	if (err)
		return err;

	ctrl = v4l2_ctrl_find(&priv->ctrl_handler, V4L2_CID_FUSE_ID);
	if (!ctrl) {
		dev_err(&priv->i2c_client->dev,
			"could not find device ctrl.\n");
		return -EINVAL;
	}

	for (i = 0; i < OS08A10_FUSE_ID_OTP_BUFFER_SIZE; i++)
		sprintf(&ctrl->p_new.p_char[i*2], "%02x", fuse_id[i]);
	ctrl->p_cur.p_char = ctrl->p_new.p_char;

	err = camera_common_s_power(priv->subdev, false);
	if (err)
		return -ENODEV;

	return 0;
}
*/
/* V4L2 subdev stuff */
static int os08a10_s_stream(struct v4l2_subdev *sd, int enable)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct camera_common_data *s_data = to_camera_common_data(client);
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;
//	struct v4l2_control control;
	int err;

	if (!enable) {
		dev_dbg(&client->dev, "%s: stream off\n", __func__);
		return os08a10_write_table(priv,
			os08a10_mode_table[OS08A10_MODE_STOP_STREAM]);
	}
	
	dev_info(&client->dev, "%s: STREAM STARTING\n", __func__);
	dev_info(&client->dev, "%s: write mode table %d\n", __func__, s_data->mode);
	
	err = os08a10_write_table(priv, os08a10_mode_table[s_data->mode]);
	if (err)
		goto exit;

//	if (s_data->override_enable) {
		/* write list of override regs for the asking frame length, */
		/* coarse integration time, and gain. Failures to write */
		/* overrides are non-fatal. */
//		control.id = V4L2_CID_GAIN;
//		err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
//		err |= os08a10_set_gain(priv, control.value);
//		if (err)
//			dev_warn(&client->dev,
//				 "%s: error gain override\n", __func__);

//		control.id = V4L2_CID_FRAME_LENGTH;
//		err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
//		err |= os08a10_set_frame_length(priv, control.value);
//		if (err)
//			dev_warn(&client->dev,
//				 "%s: error frame length override\n", __func__);

//		control.id = V4L2_CID_COARSE_TIME;
//		err = v4l2_g_ctrl(&priv->ctrl_handler, &control);
//		err |= os08a10_set_coarse_time(priv, control.value);
//		if (err)
//			dev_warn(&client->dev,
//				 "%s: error coarse time override\n", __func__);
//	}

#ifdef TPG
	err = os08a10_write_reg(priv->s_data, OS08A10_TEST_PATTERN_ADDR,
			       OS08A10_TEST_PATTERN_EN);
	if (err)
		dev_warn(&client->dev, "%s: error enabling TPG\n", __func__);
#endif

	dev_dbg(&client->dev, "%s: stream on\n", __func__);
	err = os08a10_write_table(priv,
		os08a10_mode_table[OS08A10_MODE_START_STREAM]);
	if (err)
		goto exit;

	return 0;

exit:
	dev_err(&client->dev, "%s: error setting stream\n", __func__);
	return err;
}

static int os08a10_g_input_status(struct v4l2_subdev *sd, u32 *status)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	struct camera_common_data *s_data = to_camera_common_data(client);
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;
	struct camera_common_power_rail *pw = &priv->power;

	*status = pw->state == SWITCH_ON;
	return 0;
}

static int os08a10_set_fmt(struct v4l2_subdev *sd,
			  struct v4l2_subdev_pad_config *cfg,
			  struct v4l2_subdev_format *format)
{
	int err;

	if (format->which == V4L2_SUBDEV_FORMAT_TRY)
		err = camera_common_try_fmt(sd, &format->format);
	else
		err = camera_common_s_fmt(sd, &format->format);

	return err;
}

static int os08a10_get_fmt(struct v4l2_subdev *sd,
			  struct v4l2_subdev_pad_config *cfg,
			  struct v4l2_subdev_format *format)
{
	return camera_common_g_fmt(sd, &format->format);
}

static struct v4l2_subdev_core_ops os08a10_subdev_core_ops = {
	.s_power	= camera_common_s_power,
};

static struct v4l2_subdev_video_ops os08a10_subdev_video_ops = {
	.s_stream	= os08a10_s_stream,
	.g_mbus_config	= camera_common_g_mbus_config,
	.g_input_status	= os08a10_g_input_status,
};

static struct v4l2_subdev_pad_ops os08a10_subdev_pad_ops = {
	.set_fmt	= os08a10_set_fmt,
	.get_fmt	= os08a10_get_fmt,
	.enum_mbus_code	= camera_common_enum_mbus_code,
	.enum_frame_size	= camera_common_enum_framesizes,
	.enum_frame_interval	= camera_common_enum_frameintervals,
};

static struct v4l2_subdev_ops os08a10_subdev_ops = {
	.core		= &os08a10_subdev_core_ops,
	.video		= &os08a10_subdev_video_ops,
	.pad		= &os08a10_subdev_pad_ops,
};

/* V4L2 controls stuff */
static int os08a10_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
{
	struct os08a10 *priv =
		container_of(ctrl->handler, struct os08a10, ctrl_handler);
	int err = 0;

	if (priv->power.state == SWITCH_OFF)
		return 0;

	switch (ctrl->id) {
	default:
		dev_err(&priv->i2c_client->dev,
			"%s: unknown ctrl id.\n", __func__);
		return -EINVAL;
	}

	return err;
}

static int os08a10_s_ctrl(struct v4l2_ctrl *ctrl)
{
	struct os08a10 *priv =
		container_of(ctrl->handler, struct os08a10, ctrl_handler);
	int err = 0;

	if (priv->power.state == SWITCH_OFF)
		return 0;

	switch (ctrl->id) {
	case V4L2_CID_GAIN:
		err = os08a10_set_gain(priv, ctrl->val);
		break;
	case V4L2_CID_FRAME_LENGTH:
		err = os08a10_set_frame_length(priv, ctrl->val);
		break;
	case V4L2_CID_COARSE_TIME:
		err = os08a10_set_coarse_time(priv, ctrl->val);
		break;
	case V4L2_CID_GROUP_HOLD:
		if (switch_ctrl_qmenu[ctrl->val] == SWITCH_ON) {
			priv->group_hold_en = true;
		} else {
			priv->group_hold_en = false;
			err = os08a10_set_group_hold(priv);
		}
		break;
	case V4L2_CID_HDR_EN:
		break;
	default:
		dev_err(&priv->i2c_client->dev, "%s: unknown ctrl id.\n",
			__func__);
		return -EINVAL;
	}

	return err;
}

static const struct v4l2_ctrl_ops os08a10_ctrl_ops = {
	.g_volatile_ctrl = os08a10_g_volatile_ctrl,
	.s_ctrl		= os08a10_s_ctrl,
};

static struct v4l2_ctrl_config ctrl_config_list[] = {
/* Do not change the name field for the controls! */
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_GAIN,
		.name = "Gain",
		.type = V4L2_CTRL_TYPE_INTEGER,
		.flags = V4L2_CTRL_FLAG_SLIDER,
		.min = OS08A10_MIN_GAIN,
		.max = OS08A10_MAX_GAIN,
		.def = OS08A10_DEFAULT_GAIN,
		.step = 1,
	},
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_FRAME_LENGTH,
		.name = "Frame Length",
		.type = V4L2_CTRL_TYPE_INTEGER,
		.flags = V4L2_CTRL_FLAG_SLIDER,
		.min = OV9281_MIN_FRAME_LENGTH,
		.max = OV9281_MAX_FRAME_LENGTH,
		.def = OV9281_DEFAULT_FRAME_LENGTH,
		.step = 1,
	},
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_COARSE_TIME,
		.name = "Coarse Time",
		.type = V4L2_CTRL_TYPE_INTEGER,
		.flags = V4L2_CTRL_FLAG_SLIDER,
		.min = OV9281_MIN_EXPOSURE_COARSE,
		.max = OV9281_MAX_EXPOSURE_COARSE,
		.def = OV9281_DEFAULT_EXPOSURE_COARSE,
		.step = 1,
	},
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_GROUP_HOLD,
		.name = "Group Hold",
		.type = V4L2_CTRL_TYPE_INTEGER_MENU,
		.min = 0,
		.max = ARRAY_SIZE(switch_ctrl_qmenu) - 1,
		.menu_skip_mask = 0,
		.def = 0,
		.qmenu_int = switch_ctrl_qmenu,
	},
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_HDR_EN,
		.name = "HDR enable",
		.type = V4L2_CTRL_TYPE_INTEGER_MENU,
		.min = 0,
		.max = ARRAY_SIZE(switch_ctrl_qmenu) - 1,
		.menu_skip_mask = 0,
		.def = 0,
		.qmenu_int = switch_ctrl_qmenu,
	},
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_OTP_DATA,
		.name = "OTP Data",
		.type = V4L2_CTRL_TYPE_STRING,
		.flags = V4L2_CTRL_FLAG_READ_ONLY,
		.min = 0,
		.max = OS08A10_OTP_STR_SIZE,
		.step = 2,
	},
	{
		.ops = &os08a10_ctrl_ops,
		.id = V4L2_CID_FUSE_ID,
		.name = "Fuse ID",
		.type = V4L2_CTRL_TYPE_STRING,
		.flags = V4L2_CTRL_FLAG_READ_ONLY,
		.min = 0,
		.max = OS08A10_FUSE_ID_OTP_STR_SIZE,
		.step = 2,
	},
};

static int os08a10_ctrls_init(struct os08a10 *priv)
{
	struct i2c_client *client = priv->i2c_client;
	struct v4l2_ctrl *ctrl;
	int num_ctrls;
	int i;
	int err;

	dev_dbg(&client->dev, "%s++\n", __func__);

	num_ctrls = ARRAY_SIZE(ctrl_config_list);
	v4l2_ctrl_handler_init(&priv->ctrl_handler, num_ctrls);

	for (i = 0; i < num_ctrls; i++) {
		ctrl = v4l2_ctrl_new_custom(&priv->ctrl_handler,
			&ctrl_config_list[i], NULL);
		if (ctrl == NULL) {
			dev_err(&client->dev, "Failed to init %s ctrl\n",
				ctrl_config_list[i].name);
			continue;
		}

		if (ctrl_config_list[i].type == V4L2_CTRL_TYPE_STRING &&
			ctrl_config_list[i].flags & V4L2_CTRL_FLAG_READ_ONLY) {
			ctrl->p_new.p_char = devm_kzalloc(&client->dev,
				ctrl_config_list[i].max + 1, GFP_KERNEL);
		}
		priv->ctrls[i] = ctrl;
	}

	priv->num_ctrls = num_ctrls;
	priv->subdev->ctrl_handler = &priv->ctrl_handler;
	if (priv->ctrl_handler.error) {
		dev_err(&client->dev, "Error %d adding controls\n",
			priv->ctrl_handler.error);
		err = priv->ctrl_handler.error;
		goto error;
	}

	err = v4l2_ctrl_handler_setup(&priv->ctrl_handler);
	if (err) {
		dev_err(&client->dev,
			"Error %d setting default controls\n", err);
		goto error;
	}

	return 0;

error:
	v4l2_ctrl_handler_free(&priv->ctrl_handler);
	return err;
}

static const struct media_entity_operations os08a10_media_ops = {
	.link_validate	= v4l2_subdev_link_validate,
};

/* Driver probe helper stuff */
static int os08a10_parse_dt(struct i2c_client *client, struct os08a10 *priv)
{
	struct device_node *np = client->dev.of_node;
	const struct of_device_id *match;
	
	int err;
	
	match = of_match_device(os08a10_of_match, &client->dev);
	if (!match) {
		dev_err(&client->dev, "Failed to find matching dt id\n");
		return -EINVAL;
	}

	err = of_property_read_string(np, "mclk", &priv->pdata->mclk_name);
	if (err) {
		dev_err(&client->dev, "mclk not in DT\n");
		return -EINVAL;
	}
	
	return 0;
}

static int os08a10_verify_chip_id(struct os08a10 *priv)
{
	struct i2c_client *client = priv->i2c_client;
	struct camera_common_data *s_data = priv->s_data;
	u8 chip_id_hi, chip_id_mi, chip_id_lo;
	u32 chip_id;
	int err;

	err = camera_common_s_power(priv->subdev, true);
	if (err)
		return -ENODEV;

	err = os08a10_read_reg(s_data, OS08A10_CHIP_ID_HIGH_ADDR, &chip_id_hi);
	if (err) {
		dev_err(&client->dev, "Failed to read chip ID\n");
		return err;
	}
	err = os08a10_read_reg(s_data, OS08A10_CHIP_ID_MID_ADDR, &chip_id_mi);
	if (err) {
		dev_err(&client->dev, "Failed to read chip ID\n");
		return err;
	}
	err = os08a10_read_reg(s_data, OS08A10_CHIP_ID_LOW_ADDR, &chip_id_lo);
	if (err) {
		dev_err(&client->dev, "Failed to read chip ID\n");
		return err;
	}

	chip_id = (chip_id_hi << 16) | (chip_id_mi << 8) | chip_id_lo;
	dev_info(&client->dev, "Read chip ID 0x%06x\n", chip_id);
	if (chip_id != 0x530841) {
		dev_err(&client->dev, "Read unknown chip ID 0x%06x\n", chip_id);
		return -EINVAL;
	}

	err = camera_common_s_power(priv->subdev, false);
	if (err)
		return -ENODEV;

	return 0;
}

MODULE_DEVICE_TABLE(of, os08a10_of_match);

static int os08a10_probe(struct i2c_client *client,
			const struct i2c_device_id *id)
{
	struct camera_common_data *common_data;
	struct os08a10 *priv;
	char dev_name[10];
	int err;

	dev_info(&client->dev, "Probing v4l2 sensor.\n");

	common_data = devm_kzalloc(&client->dev,
				   sizeof(struct camera_common_data),
				   GFP_KERNEL);

	priv = devm_kzalloc(&client->dev,
			    sizeof(struct os08a10) +
			    (sizeof(struct v4l2_ctrl *) *
			     ARRAY_SIZE(ctrl_config_list)),
			    GFP_KERNEL);
	if (!priv) {
		dev_err(&client->dev,
			"unable to allocate camera_common_data\n");
		return -ENOMEM;
	}

	priv->regmap = devm_regmap_init_i2c(client, &os08a10_regmap_config);
	if (IS_ERR(priv->regmap)) {
		dev_err(&client->dev,
			"regmap init failed: %ld\n", PTR_ERR(priv->regmap));
		return -ENODEV;
	}

	priv->pdata = devm_kzalloc(&client->dev,
				   sizeof(struct camera_common_pdata),
				   GFP_KERNEL);
	if (!priv->pdata) {
		dev_err(&client->dev,
			"unable to allocate camera_common_pdata\n");
		return -ENOMEM;
	}

	err = os08a10_parse_dt(client, priv);
	if (err)
		return err;

	common_data->ops		= &os08a10_common_ops;
	common_data->ctrl_handler	= &priv->ctrl_handler;
	common_data->i2c_client		= client;
	common_data->frmfmt		= os08a10_frmfmt;
	common_data->colorfmt		=
		camera_common_find_datafmt(OS08A10_DEFAULT_DATAFMT);
	common_data->power		= &priv->power;
	common_data->ctrls		= priv->ctrls;
	common_data->priv		= (void *)priv;
	common_data->numctrls		= ARRAY_SIZE(ctrl_config_list);
	common_data->numfmts		= ARRAY_SIZE(os08a10_frmfmt);
	common_data->def_mode		= OS08A10_DEFAULT_MODE;
	common_data->def_width		= OS08A10_DEFAULT_WIDTH;
	common_data->def_height		= OS08A10_DEFAULT_HEIGHT;
	common_data->def_clk_freq	= OS08A10_DEFAULT_CLK_FREQ;
	common_data->fmt_width		= common_data->def_width;
	common_data->fmt_height		= common_data->def_height;

	priv->i2c_client		= client;
	priv->s_data			= common_data;
	priv->subdev			= &common_data->subdev;
	priv->subdev->dev		= &client->dev;
	priv->group_hold_prev		= 0;

	err = os08a10_power_get(priv);
	if (err)
		return err;

	err = camera_common_parse_ports(client, common_data);
	if (err) {
		dev_err(&client->dev, "Failed to find port info\n");
		return err;
	}
	sprintf(dev_name, "os08a10%c", common_data->csi_port + 'a');
	dev_dbg(&client->dev, "%s: name %s\n", __func__, dev_name);
	camera_common_create_debugfs(common_data, dev_name);

	v4l2_i2c_subdev_init(&common_data->subdev, client,
			     &os08a10_subdev_ops);

	err = os08a10_ctrls_init(priv);
	if (err)
		return err;

	err = os08a10_verify_chip_id(priv);
	if (err)
		return err;

/*	err = os08a10_otp_setup(priv);
	if (err) {
		dev_err(&client->dev, "Error %d reading otp data\n", err);
		return err;
	}

	err = os08a10_fuse_id_setup(priv);
	if (err) {
		dev_err(&client->dev, "Error %d reading fuse id data\n", err);
		return err;
	}
*/
	priv->subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
		     V4L2_SUBDEV_FL_HAS_EVENTS;

#if defined(CONFIG_MEDIA_CONTROLLER)
	priv->pad.flags = MEDIA_PAD_FL_SOURCE;
	priv->subdev->entity.type = MEDIA_ENT_T_V4L2_SUBDEV_SENSOR;
	priv->subdev->entity.ops = &os08a10_media_ops;
	err = media_entity_init(&priv->subdev->entity, 1, &priv->pad, 0);
	if (err < 0) {
		dev_err(&client->dev, "unable to init media entity\n");
		return err;
	}
#endif

	err = v4l2_async_register_subdev(priv->subdev);
	if (err)
		return err;

	dev_info(&client->dev, "Probed v4l2 sensor.\n");

	return 0;
}

static int
os08a10_remove(struct i2c_client *client)
{
	struct camera_common_data *s_data = to_camera_common_data(client);
	struct os08a10 *priv = (struct os08a10 *)s_data->priv;

	v4l2_async_unregister_subdev(priv->subdev);
#if defined(CONFIG_MEDIA_CONTROLLER)
	media_entity_cleanup(&priv->subdev->entity);
#endif
	v4l2_ctrl_handler_free(&priv->ctrl_handler);
	os08a10_power_put(priv);
	camera_common_remove_debugfs(s_data);

	return 0;
}

static const struct i2c_device_id os08a10_id[] = {
	{ "os08a10", 0 },
	{ }
};

MODULE_DEVICE_TABLE(i2c, os08a10_id);

static struct i2c_driver os08a10_i2c_driver = {
	.driver = {
		.name = "os08a10",
		.owner = THIS_MODULE,
		.of_match_table = of_match_ptr(os08a10_of_match),
	},
	.probe = os08a10_probe,
	.remove = os08a10_remove,
	.id_table = os08a10_id,
};

module_i2c_driver(os08a10_i2c_driver);

Device-Tree:

nvcsi@150c0000 {
			reg = <0x0 0x150c0000 0x0 0x40000>;
			interrupts = <0x0 0x77 0x4>;
			num-channels = <0x3>;
			compatible = "nvidia,tegra186-nvcsi";
			clock-names = "nvcsi", "nvcsilp", "nvcsi_parent", "nvcsilp_parent";
			num-ports = <0x6>;
			clocks = <0xd 0xb4 0xd 0xb5 0xd 0x20e 0xd 0x10d>;
			power-domains = <0xa2>;
			resets = <0xd 0x58>;
			status = "okay";
			#address-cells = <0x1>;
			phandle = <0x4b>;
			#stream-id-cells = <0x1>;
			#size-cells = <0x0>;
			linux,phandle = <0x4b>;
			nvidia,csi_regulator = "avdd_dsi_csi";

			channel@0 {
				reg = <0x0>;

				ports {
					#address-cells = <0x1>;
					#size-cells = <0x0>;

					port@0 {
						reg = <0x0>;

						os08a10_csi_in0: endpoint@0 {
							csi-port = <0x0>;
							bus-width = <0x4>;
							remote-endpoint = <&os08a10_out0>;
						};
					};

					port@1 {
						reg = <0x1>;

						os08a10_csi_out0: endpoint@1 {
							remote-endpoint = <&os08a10_vi_in0>;
						};
					};
				};
			};

			channel@1 {
				reg = <0x1>;

				ports {
					#address-cells = <0x1>;
					#size-cells = <0x0>;

					port@0 {
						reg = <0x0>;

						os08a10_csi_in1: endpoint@0 {
							csi-port = <0x2>;
							bus-width = <0x4>;
							remote-endpoint = <&os08a10_out1>;
						};
					};

					port@1 {
						reg = <0x1>;

						os08a10_csi_out1: endpoint@1 {
							remote-endpoint = <&os08a10_vi_in1>;
						};
					};
				};
			};

			channel@2 {
				reg = <0x2>;

				ports {
					#address-cells = <0x1>;
					#size-cells = <0x0>;

					port@0 {
						reg = <0x0>;

						os08a10_csi_in2: endpoint@0 {
							csi-port = <0x4>;
							bus-width = <0x4>;
							remote-endpoint = <&os08a10_out2>;
						};
					};

					port@1 {
						reg = <0x1>;

						os08a10_csi_out2: endpoint@1 {
							remote-endpoint = <&os08a10_vi_in2>;
						};
					};
				};
			};
		};

		vi@15700000 {
			reg = <0x0 0x15700000 0x0 0x100000>;
			interrupts = <0x0 0xc9 0x4 0x0 0xca 0x4 0x0 0xcb 0x4>;
			num-channels = <0x3>;
			compatible = "nvidia,tegra186-vi";
			clock-names = "vi", "nvcsi", "nvcsilp";
			reset-names = "vi", "tsctnvi";
			avdd_dsi_csi-supply = <0x27>;
			clocks = <0xd 0x33 0xd 0xb4 0xd 0xb5>;
			power-domains = <0xa2>;
			resets = <0xd 0x33 0xd 0x8f>;
			status = "okay";
			phandle = <0x41>;
			#stream-id-cells = <0x1>;
			linux,phandle = <0x41>;

			ports {
				#address-cells = <0x1>;
				#size-cells = <0x0>;

				port@0 {
					reg = <0x0>;

					os08a10_vi_in0: endpoint {
						csi-port = <0x0>;
						bus-width = <0x4>;
						remote-endpoint = <&os08a10_csi_out0>;
					};
				};

				port@1 {
					reg = <0x1>;

					os08a10_vi_in1: endpoint {
						csi-port = <0x2>;
						bus-width = <0x4>;
						remote-endpoint = <&os08a10_csi_out1>;
					};
				};

				port@2 {
					reg = <0x2>;

					os08a10_vi_in2: endpoint {
						csi-port = <0x4>;
						bus-width = <0x4>;
						remote-endpoint = <&os08a10_csi_out2>;
					};
				};
			};
		};

	tegra-camera-platform {
		compatible = "nvidia, tegra-camera-platform";
		min_bits_per_pixel = <0xa>;
		max_pixel_rate = <0xb71b0>;
		num_csi_lanes = <0x4>;
		isp_bw_margin_pct = <0x19>;
		max_lane_speed = <0x16e360>;
		vi_peak_byte_per_pixel = <0x2>;
		vi_bw_margin_pct = <0x19>;
		isp_peak_byte_per_pixel = <0x5>;

		modules {

			module0 {
				badge = "os08a10_bottom";
				position = "bottom";
				orientation = [31 00];

				drivernode0 {
					devname = "os08a10 32-0021";
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9546@70/i2c@2/os08a10_e@21";
					pcl_id = "v4l2_sensor";
				};
			};

			module1 {
				badge = "os08a10_top";
				position = "top";
				orientation = [31 00];

				drivernode0 {
					devname = "os08a10 31-0021";
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9546@70/i2c@1/os08a10_c@21";
					pcl_id = "v4l2_sensor";
				};
			};

			module2 {
				badge = "os08a10_center";
				position = "center";
				orientation = [31 00];

				drivernode0 {
					devname = "os08a10 30-0021";
					proc-device-tree = "/proc/device-tree/i2c@3180000/tca9546@70/i2c@0/os08a10_a@21";
					pcl_id = "v4l2_sensor";
				};
			};
		};
	};

	i2c@3180000 {
		reg = <0x0 0x3180000 0x0 0x100>;
		dmas = <0x19 0x17 0x19 0x17>;
		interrupts = <0x0 0x1b 0x4>;
		compatible = "nvidia,tegra186-i2c";
		clock-names = "div-clk", "parent", "slow-clk";
		reset-names = "i2c";
		clock-frequency = <0x61a80>;
		scl-gpio = <0x12 0x72 0x0>;
		sda-gpio = <0x12 0x73 0x0>;
		clocks = <0xd 0x4b 0xd 0x10d 0xd 0x5c>;
		resets = <0xd 0x15>;
		status = "okay";
		#address-cells = <0x1>;
		phandle = <0x84>;
		#stream-id-cells = <0x1>;
		#size-cells = <0x0>;
		dma-names = "rx", "tx";
		linux,phandle = <0x84>;

		prod-settings {

			prod_c_fmplus {
				prod = <0x6c 0xffff0000 0x100000 0x94 0x3f00 0x200>;
			};

			prod_c_fm {
				prod = <0x6c 0xffff0000 0x190000 0x94 0x3f00 0x200>;
			};

			prod_c_hs {
				prod = <0x6c 0xffff 0x2 0x9c 0x3f00 0x300>;
			};

			prod_c_sm {
				prod = <0x6c 0xffff0000 0x160000 0x94 0x3f00 0x300>;
			};
		};

		tca9546@70 {
			reg = <0x70>;
			vcc-pullup-supply = <0x1a>;
			force_bus_start = <0x1e>;
			compatible = "nxp,pca9546";
			vcc-supply = <0x1f>;
			vcc_lp = "vif";
			#address-cells = <0x1>;
			vif-supply = <0x1f>;
			#size-cells = <0x0>;
			skip_mux_detect = "yes";

			i2c@0 {
				reg = <0x0>;
				#address-cells = <0x1>;
				i2c-mux,deselect-on-exit;
				#size-cells = <0x0>;

				os08a10_a@21 {
					reg = <0x21>;
					devnode = "video0";
					compatible = "nvidia,os08a10";
					
					mclk = "extperiph1";
					clock-names = "extperiph1";
					clocks = <0xd 0x59 0xd 0x10d>;
					
					physical_h = "6.340";
					physical_w = "8.939";
					
					avdd-reg = "vana";
					vana-supply = <0x20>;
					iovdd-reg = "vif";
					vif-supply = <0x1f>;
					dvdd-reg = "vdig";
					vdig-supply = <0x21>;

					mode0 {
						mclk_khz = "24000";
						num_lanes = "4";
						tegra_sinterface = "serial_a";
						discontinuous_clk = "no";
						dpcm_enable = "false";
						cil_settletime = [30 00];
						
						active_h = "2160";
						active_w = "3840";
						pixel_t = "bayer_bggr10";
						mode_type = "bayer";
						csi_pixel_bit_depth = "10";
						pixel_phase = "bggr";
						readout_orientation = [30 00];
						line_length = "4000";
						inherent_gain = "1";
						mclk_multiplier = "25";
						pix_clk_hz = "576000000";
						
						min_gain_val = "1.0";
						max_gain_val = "15.5";
						min_hdr_ratio = [31 00];
						max_hdr_ratio = "64";
						min_framerate = "2.9658";
						max_framerate = "30";
						max_exp_time = "333277";
						min_exp_time = "3.653";
						embedded_metadata_height = "0";
					};

					ports {
						#address-cells = <0x1>;
						#size-cells = <0x0>;

						port@0 {
							reg = <0x0>;

							os08a10_out0: endpoint {
								bus-width = <0x4>;
								remote-endpoint = <&os08a10_csi_in0>;
								phandle = <0xa3>;
								csi-port = <0x0>;
								linux,phandle = <0xa3>;
							};
						};
					};
				};
			};

			i2c@1 {
				reg = <0x1>;
				#address-cells = <0x1>;
				i2c-mux,deselect-on-exit;
				#size-cells = <0x0>;

				os08a10_c@21 {
					reg = <0x21>;
					devnode = "video1";
					compatible = "nvidia,os08a10";
					
					mclk = "extperiph1";
					clock-names = "extperiph1";
					clocks = <0xd 0x59 0xd 0x10d>;
					
					physical_h = "6.340";
					physical_w = "8.939";
					
					avdd-reg = "vana";
					vana-supply = <0x20>;
					iovdd-reg = "vif";
					vif-supply = <0x1f>;
					dvdd-reg = "vdig";
					vdig-supply = <0x21>;

					mode0 {
						mclk_khz = "24000";
						num_lanes = "4";
						tegra_sinterface = "serial_c";
						discontinuous_clk = "no";
						dpcm_enable = "false";
						cil_settletime = [30 00];
						
						active_h = "2160";
						active_w = "3840";
						pixel_t = "bayer_bggr10";
						mode_type = "bayer";
						csi_pixel_bit_depth = "10";
						pixel_phase = "bggr";
						readout_orientation = [30 00];
						line_length = "4000";
						inherent_gain = "1";
						mclk_multiplier = "25";
						pix_clk_hz = "576000000";
						
						min_gain_val = "1.0";
						max_gain_val = "15.5";
						min_hdr_ratio = [31 00];
						max_hdr_ratio = "64";
						min_framerate = "2.9658";
						max_framerate = "30";
						max_exp_time = "333277";
						min_exp_time = "3.653";
						embedded_metadata_height = "0";
					};

					ports {
						#address-cells = <0x1>;
						#size-cells = <0x0>;

						port@0 {
							reg = <0x0>;

							os08a10_out1: endpoint {
								bus-width = <0x4>;
								remote-endpoint = <&os08a10_csi_in1>;
								phandle = <0xa5>;
								csi-port = <0x2>;
								linux,phandle = <0xa5>;
							};
						};
					};
				};
			};

			i2c@2 {
				reg = <0x2>;
				#address-cells = <0x1>;
				i2c-mux,deselect-on-exit;
				#size-cells = <0x0>;

				os08a10_e@21 {
					reg = <0x21>;
					devnode = "video2";
					compatible = "nvidia,os08a10";
					
					mclk = "extperiph1";
					clock-names = "extperiph1";
					clocks = <0xd 0x59 0xd 0x10d>;
					
					physical_h = "6.340";
					physical_w = "8.939";
					
					avdd-reg = "vana";
					vana-supply = <0x20>;
					iovdd-reg = "vif";
					vif-supply = <0x1f>;
					dvdd-reg = "vdig";
					vdig-supply = <0x21>;

					mode0 {
						mclk_khz = "24000";
						num_lanes = "4";
						tegra_sinterface = "serial_e";
						discontinuous_clk = "no";
						dpcm_enable = "false";
						cil_settletime = [30 00];
						
						active_h = "2160";
						active_w = "3840";
						mode_type = "bayer";
						pixel_t = "bayer_bggr10";
						csi_pixel_bit_depth = "10";
						pixel_phase = "bggr";
						readout_orientation = [30 00];
						line_length = "4000";
						inherent_gain = "1";
						mclk_multiplier = "25";
						pix_clk_hz = "576000000";
						
						min_gain_val = "1.0";
						max_gain_val = "15.5";
						min_hdr_ratio = [31 00];
						max_hdr_ratio = "64";
						min_framerate = "2.9658";
						max_framerate = "30";
						max_exp_time = "333277";
						min_exp_time = "3.653";
						embedded_metadata_height = "0";
					};

					ports {
						#address-cells = <0x1>;
						#size-cells = <0x0>;

						port@0 {
							reg = <0x0>;

							os08a10_out2: endpoint {
								bus-width = <0x4>;
								remote-endpoint = <&os08a10_csi_in2>;
								phandle = <0xa7>;
								csi-port = <0x4>;
								linux,phandle = <0xa7>;
							};
						};
					};
				};
			};
		};
	};

@randyzhg
Follow below link to enable the trace to get more information to know what happened.

https://elinux.org/Jetson_TX2/28.1_Camera_BringUp

Here’s the trace and the log from nvcamera-daemon

root@tegra-ubuntu:/sys/kernel/debug# cat tracing/trace
# tracer: nop
#
# entries-in-buffer/entries-written: 21/21   #P:4
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
     kworker/4:1-106   [004] ...1    83.868371: rtos_queue_peek_from_isr_failed: tstamp:2922087637 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    83.868375: rtcpu_start: tstamp:2922088858
     kworker/4:1-106   [004] ...1    83.920444: rtcpu_vinotify_handle_msg: tstamp:2923794771 tag:CHANSEL_PXL_SOF channel:0x00 frame:1 vi_tstamp:2923794181 data:0x00000001
     kworker/4:1-106   [004] ...1    83.920450: rtcpu_vinotify_handle_msg: tstamp:2923794999 tag:ATOMP_FS channel:0x00 frame:1 vi_tstamp:2923794184 data:0x00000000
     kworker/4:1-106   [004] ...1    83.920452: rtcpu_vinotify_handle_msg: tstamp:2923797315 tag:CHANSEL_LOAD_FRAMED channel:0x01 frame:1 vi_tstamp:2923796880 data:0x08000000
     kworker/4:1-106   [004] ...1    83.972469: rtcpu_vinotify_handle_msg: tstamp:2924248850 tag:CSIMUX_FRAME channel:0x00 frame:1 vi_tstamp:2924248100 data:0x000000a0
     kworker/4:1-106   [004] ...1    83.972477: rtcpu_vinotify_handle_msg: tstamp:2924249093 tag:CHANSEL_SHORT_FRAME channel:0x01 frame:1 vi_tstamp:2924248101 data:0x00000001
     kworker/4:1-106   [004] ...1    83.972480: rtcpu_vinotify_handle_msg: tstamp:2924249259 tag:ATOMP_FE channel:0x00 frame:1 vi_tstamp:2924248104 data:0x00000000
     kworker/4:1-106   [004] ...1    84.024448: rtos_queue_peek_from_isr_failed: tstamp:2927088542 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    84.180409: rtos_queue_peek_from_isr_failed: tstamp:2932089033 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    84.336420: rtos_queue_peek_from_isr_failed: tstamp:2937089543 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    84.492388: rtos_queue_peek_from_isr_failed: tstamp:2942090063 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    84.700435: rtos_queue_peek_from_isr_failed: tstamp:2947090586 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    84.856423: rtos_queue_peek_from_isr_failed: tstamp:2952091064 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.012465: rtos_queue_peek_from_isr_failed: tstamp:2957091569 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.168440: rtos_queue_peek_from_isr_failed: tstamp:2962092108 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.324406: rtos_queue_peek_from_isr_failed: tstamp:2967092639 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.480411: rtos_queue_peek_from_isr_failed: tstamp:2972093078 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.636413: rtos_queue_peek_from_isr_failed: tstamp:2977093593 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.792451: rtos_queue_peek_from_isr_failed: tstamp:2982094080 queue:0x0b4a3c58
     kworker/4:1-106   [004] ...1    85.948430: rtos_queue_peek_from_isr_failed: tstamp:2986538662 queue:0x0b4a3c58
Thread 1 getting next capture
Thread 1 is waiting
Thread 2 getting next capture
Thread 2 is waiting
Thread 3 getting next capture
Thread 3 is waiting
Thread 4 getting next capture
Thread 4 is waiting
Thread 5 getting next capture
Thread 5 is waiting
Thread 6 getting next capture
Thread 6 is waiting
Thread 7 getting next capture
Thread 7 is waiting
Thread 8 getting next capture
Thread 8 is waiting
Thread 9 getting next capture
Thread 9 is waiting
Thread 10 getting next capture
Thread 10 is waiting
Thread 11 getting next capture
Thread 11 is waiting
Thread 12 getting next capture
Thread 12 is waiting
Starting services...
Worker thread IspHw statsComplete start
Worker thread IspHw frameComplete start
Worker thread CaptureScheduler checkFramePending start
Worker thread CaptureScheduler frameStart start
Worker thread V4L2CaptureScheduler checkCaptureComplete start
Worker thread V4L2CaptureScheduler issueCaptures start
Worker thread PS handleRequests start
getInstance: s_instance(0x7fa8b92570)
getInstance: s_instance(0x7fa8b92570)
subscribe: create SensorType(gyroscope) sensor(0x7fa8b946f0)
subscribe: create SensorType(accelerometer) sensor(0x7fa8b99b50)
AC plugin not present: dlopen "acplugin.so", acplugin.so: cannot open shared object file: No such file or directory
Services are started
NvPclSetHotplugCallback: ++++++++++++++++++++++
---- Imager: Calibration blob file handling supported in this build ----
NvPclHwGetModuleList: OFParserListModules Succeeded
NvPclHwGetModuleList: WARNING: Could not map module to ISP config string
NvPclHwGetModuleList: No module data found
NvPclHwPrintModuleDefinition -- Name: os08a10_center
NvPclHwPrintModuleDefinition -- Position: 2
NvPclHwPrintModuleDefinition -- CalibrationData Found: 1
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].Name: v4l2_sensor
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].DevName: os08a10 30-0021
NvPclHwGetModuleList: WARNING: Could not map module to ISP config string
NvPclHwGetModuleList: No module data found
NvPclHwPrintModuleDefinition -- Name: os08a10_top
NvPclHwPrintModuleDefinition -- Position: 1
NvPclHwPrintModuleDefinition -- CalibrationData Found: 1
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].Name: v4l2_sensor
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].DevName: os08a10 31-0021
NvPclHwGetModuleList: WARNING: Could not map module to ISP config string
NvPclHwGetModuleList: No module data found
NvPclHwPrintModuleDefinition -- Name: os08a10_bottom
NvPclHwPrintModuleDefinition -- Position: 0
NvPclHwPrintModuleDefinition -- CalibrationData Found: 1
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].Name: v4l2_sensor
NvPclHwPrintCameraSubModule -- HwCamSubModule[0].DevName: os08a10 32-0021
NvPclHwGetModuleList: OFParserListModules Succeeded
NvPclModuleListInitialize: NvPclModule list[0]: os08a10_center position2
NvPclModuleListInitialize: NvPclModule list[1]: os08a10_top position1
NvPclModuleListInitialize: NvPclModule list[2]: os08a10_bottom position0
NvPclHwScanExternalCameras -- adding video0 to discover list
NvPclHwScanExternalCameras -- adding video0 to discover list
initialize: /dev/video0
NvPclHwScanExternalCameras -- adding video0 to discover list
initialize: /dev/video0
getHotplugMonitor: Getting hotplug monitor instance
 initializeHotplug++
 hotPlugfunc ++ 
 addWatch: Watch added wd='1'
CheckProcDTExists: INFO: accessing /proc/device-tree/tegra-virtual-camera-platform/modules; No such file or directory
PCLHW_DTParser
setHotplugCallback: Registered new callback client
NvPclSetHotplugCallback: ----------------------
NvPclOpen: ++++++++++++++++++++++
NvPclStateControllerOpen: Found GUID 2 match at index[0]
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bbc2a0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bbc330
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bbc3c0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd5d80
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd5e10
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd5ea0
LoadOverridesFile: looking for override file [/Calib/camera_override.isp] 1/16CheckOverridesPermissions: cannot stat file [/Calib/camera_override.isp]
LoadOverridesFile: looking for override file [/data/nvcam/settings/camera_overrides.isp] 2/16CheckOverridesPermissions: cannot stat file [/data/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/opt/nvidia/nvcam/settings/camera_overrides.isp] 3/16CheckOverridesPermissions: cannot stat file [/opt/nvidia/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/var/nvidia/nvcam/settings/camera_overrides.isp] 4/16CheckOverridesPermissions: cannot stat file [/var/nvidia/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/data/nvcam/camera_overrides.isp] 5/16CheckOverridesPermissions: cannot stat file [/data/nvcam/camera_overrides.isp]
LoadOverridesFile: looking for override file [/data/nvcam/settings/os08a10_center.isp] 6/16CheckOverridesPermissions: cannot stat file [/data/nvcam/settings/os08a10_center.isp]
LoadOverridesFile: looking for override file [/opt/nvidia/nvcam/settings/os08a10_center.isp] 7/16CheckOverridesPermissions: cannot stat file [/opt/nvidia/nvcam/settings/os08a10_center.isp]
LoadOverridesFile: looking for override file [/var/nvidia/nvcam/settings/os08a10_center.isp] 8/16CheckOverridesPermissions: cannot stat file [/var/nvidia/nvcam/settings/os08a10_center.isp]
---- imager: No override file found. ----
Imager: looking for override file [/mnt/factory/camera/factory.bin] 1/16
Imager: looking for override file [/Calib/factory.bin] 2/16
Imager: looking for override file [/Calib/calibration.bin] 3/16
Imager: looking for override file [(null)] 4/16
Imager: looking for override file [(null)] 5/16
Imager: looking for override file [(null)] 6/16
Imager: looking for override file [(null)] 7/16
Imager: looking for override file [(null)] 8/16
Imager: looking for override file [(null)] 9/16
Imager: looking for override file [(null)] 10/16
Imager: looking for override file [(null)] 11/16
Imager: looking for override file [(null)] 12/16
Imager: looking for override file [(null)] 13/16
Imager: looking for override file [(null)] 14/16
Imager: looking for override file [(null)] 15/16
Imager: looking for override file [(null)] 16/16
Imager: looking for override file [/data/nvcam/settings/factory.bin] 1/16
Imager: looking for override file [/data/nvcam/settings/os08a10_center.bin] 2/16
Imager: looking for override file [/opt/nvidia/nvcam/settings/os08a10_center.bin] 3/16
Imager: looking for override file [/var/nvidia/nvcam/settings/os08a10_center.bin] 4/16
Imager: looking for override file [(null)] 5/16
Imager: looking for override file [(null)] 6/16
Imager: looking for override file [(null)] 7/16
Imager: looking for override file [(null)] 8/16
Imager: looking for override file [(null)] 9/16
Imager: looking for override file [(null)] 10/16
Imager: looking for override file [(null)] 11/16
Imager: looking for override file [(null)] 12/16
Imager: looking for override file [(null)] 13/16
Imager: looking for override file [(null)] 14/16
Imager: looking for override file [(null)] 15/16
Imager: looking for override file [(null)] 16/16
NvPclCreateDriver: Found NvPcl Driver Hal dev_name match (v4l2_sensor)
NvPclCreateDriver: Found a Driver name match (v4l2_sensor)
NvPclConnectDrivers: hImager was NULL, creating new imager
NvPclInitializeDrivers: v4l2_sensor ++++++++++++++++++
OFDPropertyGetString: could not read property [devnode-bus]
initialize: os08a10 30-0021
OFDPropertyGetString: could not read property [use_decibel_gain]
OFDPropertyGetString: could not read property [use_sensor_mode_id]
OFDPropertyGetString: could not read property [delayed_gain]
OFDPropertyCopyToLong: could not read property [has-eeprom]
Control Frame Rate not found
Control Exposure not found
Control Coarse Time Short not found
Control Coarse Time Short not found
findCustomCids: calculated MaxCoarseDiff -9986
loadBinaryBlob: Binary read 0
loadBinaryBlob: Binary read 0
OFDPropertyGetString: could not read property [type]
loadSubType: Sensor type missing in DT, 180
OFDPropertyCopyToLong: could not read property [mode0.dynamic_pixel_bit_depth]
OFDPropertyGetString: could not read property [mode0.x_start]
OFDPropertyGetString: could not read property [mode0.y_start]
OFDPropertyGetString: could not read property [mode0.x_end]
OFDPropertyGetString: could not read property [mode0.y_end]
OFDPropertyGetString: could not read property [mode0.h_scaling]
OFDPropertyGetString: could not read property [mode0.v_scaling]
OFDPropertyGetString: could not read property [sensor_model]
initialize: Loaded Driver: 1 Modes Available--------------
NvPclInitializeDrivers: v4l2_sensor ------------------
NvPclOpen: ----------------------
LSC: LSC surface is not based on full res!
NvPclOpen: ++++++++++++++++++++++
NvPclStateControllerOpen: Found GUID 1 match at index[1]
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc45f0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc4680
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc4710
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc47a0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd66f0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd6780
LoadOverridesFile: looking for override file [/Calib/camera_override.isp] 1/16CheckOverridesPermissions: cannot stat file [/Calib/camera_override.isp]
LoadOverridesFile: looking for override file [/data/nvcam/settings/camera_overrides.isp] 2/16CheckOverridesPermissions: cannot stat file [/data/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/opt/nvidia/nvcam/settings/camera_overrides.isp] 3/16CheckOverridesPermissions: cannot stat file [/opt/nvidia/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/var/nvidia/nvcam/settings/camera_overrides.isp] 4/16CheckOverridesPermissions: cannot stat file [/var/nvidia/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/data/nvcam/camera_overrides.isp] 5/16CheckOverridesPermissions: cannot stat file [/data/nvcam/camera_overrides.isp]
LoadOverridesFile: looking for override file [/data/nvcam/settings/os08a10_top.isp] 6/16CheckOverridesPermissions: cannot stat file [/data/nvcam/settings/os08a10_top.isp]
LoadOverridesFile: looking for override file [/opt/nvidia/nvcam/settings/os08a10_top.isp] 7/16CheckOverridesPermissions: cannot stat file [/opt/nvidia/nvcam/settings/os08a10_top.isp]
LoadOverridesFile: looking for override file [/var/nvidia/nvcam/settings/os08a10_top.isp] 8/16CheckOverridesPermissions: cannot stat file [/var/nvidia/nvcam/settings/os08a10_top.isp]
---- imager: No override file found. ----
Imager: looking for override file [/mnt/factory/camera/factory.bin] 1/16
Imager: looking for override file [/Calib/factory.bin] 2/16
Imager: looking for override file [/Calib/calibration.bin] 3/16
Imager: looking for override file [(null)] 4/16
Imager: looking for override file [(null)] 5/16
Imager: looking for override file [(null)] 6/16
Imager: looking for override file [(null)] 7/16
Imager: looking for override file [(null)] 8/16
Imager: looking for override file [(null)] 9/16
Imager: looking for override file [(null)] 10/16
Imager: looking for override file [(null)] 11/16
Imager: looking for override file [(null)] 12/16
Imager: looking for override file [(null)] 13/16
Imager: looking for override file [(null)] 14/16
Imager: looking for override file [(null)] 15/16
Imager: looking for override file [(null)] 16/16
Imager: looking for override file [/data/nvcam/settings/factory.bin] 1/16
Imager: looking for override file [/data/nvcam/settings/os08a10_top.bin] 2/16
Imager: looking for override file [/opt/nvidia/nvcam/settings/os08a10_top.bin] 3/16
Imager: looking for override file [/var/nvidia/nvcam/settings/os08a10_top.bin] 4/16
Imager: looking for override file [(null)] 5/16
Imager: looking for override file [(null)] 6/16
Imager: looking for override file [(null)] 7/16
Imager: looking for override file [(null)] 8/16
Imager: looking for override file [(null)] 9/16
Imager: looking for override file [(null)] 10/16
Imager: looking for override file [(null)] 11/16
Imager: looking for override file [(null)] 12/16
Imager: looking for override file [(null)] 13/16
Imager: looking for override file [(null)] 14/16
Imager: looking for override file [(null)] 15/16
Imager: looking for override file [(null)] 16/16
NvPclCreateDriver: Found NvPcl Driver Hal dev_name match (v4l2_sensor)
NvPclCreateDriver: Found a Driver name match (v4l2_sensor)
NvPclConnectDrivers: hImager was NULL, creating new imager
NvPclInitializeDrivers: v4l2_sensor ++++++++++++++++++
OFDPropertyGetString: could not read property [devnode-bus]
initialize: os08a10 31-0021
(NvOdmDevice) Error ModuleNotPresent: V4L2Device not available (in dvs/git/dirty/git-master_linux/camera-partner/imager/src/V4L2Device.cpp, function findDevice(), line 231)
(NvOdmDevice) Error ModuleNotPresent:  (propagating from dvs/git/dirty/git-master_linux/camera-partner/imager/src/V4L2Device.cpp, function initialize(), line 54)
(NvOdmDevice) Error ModuleNotPresent:  (propagating from dvs/git/dirty/git-master_linux/camera-partner/imager/src/devices/V4L2SensorViCsi.cpp, function initialize(), line 97)
NvPclDriverInitializeData: Unable to initialize driver v4l2_sensor
NvPclInitializeDrivers: error: Failed to init camera sub module v4l2_sensor
NvPclStartPlatformDrivers: Failed to start module drivers
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc47a0
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bd66f0
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bd6780
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc45f0
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc4680
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc4710
NvPclStateControllerOpen: Failed ImagerGUID 1. (error 0xA000E)
NvPclStateControllerClose: Module os08a10_top closed
NvPclOpen: PCL Open Failed. Error: 0xf
NvPclClose: ++++++++++++++++++++++
NvPclClose: ----------------------
NvPclOpen: ----------------------
SCF: Error BadParameter: Sensor could not be opened. (in src/services/capture/CaptureServiceDeviceSensor.cpp, function getSourceFromGuid(), line 596)
SCF: Error BadParameter:  (propagating from src/services/capture/CaptureService.cpp, function addSourceByGuid(), line 781)
SCF: Error BadParameter:  (propagating from src/api/CameraDriver.cpp, function addSourceByIndex(), line 276)
SCF: Error BadParameter:  (propagating from src/api/CameraDriver.cpp, function getSource(), line 439)
NvPclOpen: ++++++++++++++++++++++
NvPclStateControllerOpen: Found GUID 0 match at index[2]
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc45f0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc4680
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc4710
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bc47a0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd66f0
NvPclHwInitializeModule: allocate overrides pathname @ 0x7fa8bd6780
LoadOverridesFile: looking for override file [/Calib/camera_override.isp] 1/16CheckOverridesPermissions: cannot stat file [/Calib/camera_override.isp]
LoadOverridesFile: looking for override file [/data/nvcam/settings/camera_overrides.isp] 2/16CheckOverridesPermissions: cannot stat file [/data/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/opt/nvidia/nvcam/settings/camera_overrides.isp] 3/16CheckOverridesPermissions: cannot stat file [/opt/nvidia/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/var/nvidia/nvcam/settings/camera_overrides.isp] 4/16CheckOverridesPermissions: cannot stat file [/var/nvidia/nvcam/settings/camera_overrides.isp]
LoadOverridesFile: looking for override file [/data/nvcam/camera_overrides.isp] 5/16CheckOverridesPermissions: cannot stat file [/data/nvcam/camera_overrides.isp]
LoadOverridesFile: looking for override file [/data/nvcam/settings/os08a10_bottom.isp] 6/16CheckOverridesPermissions: cannot stat file [/data/nvcam/settings/os08a10_bottom.isp]
LoadOverridesFile: looking for override file [/opt/nvidia/nvcam/settings/os08a10_bottom.isp] 7/16CheckOverridesPermissions: cannot stat file [/opt/nvidia/nvcam/settings/os08a10_bottom.isp]
LoadOverridesFile: looking for override file [/var/nvidia/nvcam/settings/os08a10_bottom.isp] 8/16CheckOverridesPermissions: cannot stat file [/var/nvidia/nvcam/settings/os08a10_bottom.isp]
---- imager: No override file found. ----
Imager: looking for override file [/mnt/factory/camera/factory.bin] 1/16
Imager: looking for override file [/Calib/factory.bin] 2/16
Imager: looking for override file [/Calib/calibration.bin] 3/16
Imager: looking for override file [(null)] 4/16
Imager: looking for override file [(null)] 5/16
Imager: looking for override file [(null)] 6/16
Imager: looking for override file [(null)] 7/16
Imager: looking for override file [(null)] 8/16
Imager: looking for override file [(null)] 9/16
Imager: looking for override file [(null)] 10/16
Imager: looking for override file [(null)] 11/16
Imager: looking for override file [(null)] 12/16
Imager: looking for override file [(null)] 13/16
Imager: looking for override file [(null)] 14/16
Imager: looking for override file [(null)] 15/16
Imager: looking for override file [(null)] 16/16
Imager: looking for override file [/data/nvcam/settings/factory.bin] 1/16
Imager: looking for override file [/data/nvcam/settings/os08a10_bottom.bin] 2/16
Imager: looking for override file [/opt/nvidia/nvcam/settings/os08a10_bottom.bin] 3/16
Imager: looking for override file [/var/nvidia/nvcam/settings/os08a10_bottom.bin] 4/16
Imager: looking for override file [(null)] 5/16
Imager: looking for override file [(null)] 6/16
Imager: looking for override file [(null)] 7/16
Imager: looking for override file [(null)] 8/16
Imager: looking for override file [(null)] 9/16
Imager: looking for override file [(null)] 10/16
Imager: looking for override file [(null)] 11/16
Imager: looking for override file [(null)] 12/16
Imager: looking for override file [(null)] 13/16
Imager: looking for override file [(null)] 14/16
Imager: looking for override file [(null)] 15/16
Imager: looking for override file [(null)] 16/16
NvPclCreateDriver: Found NvPcl Driver Hal dev_name match (v4l2_sensor)
NvPclCreateDriver: Found a Driver name match (v4l2_sensor)
NvPclConnectDrivers: hImager was NULL, creating new imager
NvPclInitializeDrivers: v4l2_sensor ++++++++++++++++++
OFDPropertyGetString: could not read property [devnode-bus]
initialize: os08a10 32-0021
(NvOdmDevice) Error ModuleNotPresent: V4L2Device not available (in dvs/git/dirty/git-master_linux/camera-partner/imager/src/V4L2Device.cpp, function findDevice(), line 231)
(NvOdmDevice) Error ModuleNotPresent:  (propagating from dvs/git/dirty/git-master_linux/camera-partner/imager/src/V4L2Device.cpp, function initialize(), line 54)
(NvOdmDevice) Error ModuleNotPresent:  (propagating from dvs/git/dirty/git-master_linux/camera-partner/imager/src/devices/V4L2SensorViCsi.cpp, function initialize(), line 97)
NvPclDriverInitializeData: Unable to initialize driver v4l2_sensor
NvPclInitializeDrivers: error: Failed to init camera sub module v4l2_sensor
NvPclStartPlatformDrivers: Failed to start module drivers
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc47a0
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bd66f0
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bd6780
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc45f0
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc4680
NvPclCloseModuleDrivers: deallocate/free overrides pathname @ 0x7fa8bc4710
NvPclStateControllerOpen: Failed ImagerGUID 0. (error 0xA000E)
NvPclStateControllerClose: Module os08a10_bottom closed
NvPclOpen: PCL Open Failed. Error: 0xf
NvPclClose: ++++++++++++++++++++++
NvPclClose: ----------------------
NvPclOpen: ----------------------
SCF: Error BadParameter: Sensor could not be opened. (in src/services/capture/CaptureServiceDeviceSensor.cpp, function getSourceFromGuid(), line 596)
SCF: Error BadParameter:  (propagating from src/services/capture/CaptureService.cpp, function addSourceByGuid(), line 781)
SCF: Error BadParameter:  (propagating from src/api/CameraDriver.cpp, function addSourceByIndex(), line 276)
SCF: Error BadParameter:  (propagating from src/api/CameraDriver.cpp, function getSource(), line 439)
sourceRegistry[0] assigned

ispRegistry[0] assigned

Using Source GUID 2
Worker thread ViCsiHw frameComplete start
Worker thread ViCsiHw frameStart start
NvPclPowerOn: +++++++++++
NvPclPowerOn: -----------
Using ISP A
LSC: LSC surface is not based on full res!
AC plugin not present: dlopen "acplugin.so", acplugin.so: cannot open shared object file: No such file or directory
No library found, disabling AC plugin.
Worker thread CaptureDispatcher start
NvPclSettingsUpdate: Sending Updated Settings through PCL
NvPclSettingsApply: Applying last settings through PCL
apply:+++++++++++++++++++++++
writeMode: Target mode Id(0): Resolution 3840x2160
setActiveBufferMemory: 2
setActivePixelFormat: 808535890
INPUT: Width 3840 Height 2160 pixelformat RG10
writeFrameRate:	INPUT frameLength:4800, frameRate:30.000000
writeGain:	INPUT gainCtrl:80 analogGain:1.000000
writeExposure:	INPUT coarseTime:14786, expTime:0.102681
updateOutputSettings:	OUTPUT frameLength:4800, frameRate:30.000000
updateOutputSettings:	OUTPUT analogGain:1.000000
updateOutputSettings:	OUTPUT coarseTime:14786, expTime:0.102681
apply:-----------------------
NvPclSettingsApply: Reading PCL settings
PowerServiceUtils:calculateReqClock: entered
PowerServiceHw:addRequest: table size: before: 0, after:1
	request table for VI 0:
	req[0]: guID=2, stageID=SensorCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=3840, outH=2160, outBpp=10
	req[0]: out1W=0, out1H=0, out1Bpp=0
	req[0]: out2W=0, out2H=0, out2Bpp=0
	req[0]: clock=100800000, pixelRate=576000000, timeout=900
	req[0]: isoBw=1008000, timeout=900
	req[0]: non_isoBw=0, timeout=900
PowerServiceUtils:calculateReqClock: entered
PowerServiceHw:addRequest: table size: before: 0, after:1
	request table for CSI 0:
	req[0]: guID=2, stageID=SensorCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=3840, outH=2160, outBpp=10
	req[0]: out1W=0, out1H=0, out1Bpp=0
	req[0]: out2W=0, out2H=0, out2Bpp=0
	req[0]: clock=117000000, pixelRate=576000000, timeout=900
	req[0]: isoBw=0, timeout=900
	req[0]: non_isoBw=0, timeout=900
PowerServiceHwVi:setIso: m_bwVal_Iso=1008000
PowerServiceHw:setClock: PowerServiceHw[1]: requested_clock_Hz=100800000
PowerServiceHw:setClock: PowerServiceHw[0]: requested_clock_Hz=117000000
PowerServiceCore:setCameraBw: totalIsoBw=1008000
NvPclSettingsUpdate: Sending Updated Settings through PCL
NvPclSettingsApply: Applying last settings through PCL
apply:+++++++++++++++++++++++
apply:-----------------------
NvPclSettingsApply: Reading PCL settings
No output buffers for 2

No output buffers for 1

InstructionList:
  + GraphSettings
      | SensorMode: 3840x2160 BayerS16BGGR 30.0fps
      | output 0: 3840x2160 BL Y8 420

  + Instruction List
      | id: 0
      +  0: CCDataSetupStage
          | EstimatedIspOutLatencyFrames: 5
          | NumConcurrentCaptures: 1
          | UnprocessedYuvBufferMask: 0
      +  1: ACSynchronizeStage
      +  2: AeAfApplyStage
      +  3: AcPluginStage
          | operation: opApply
      +  4: AcMergeStage
          | IspIn: [3840, 2160]
          | IspOut0: [3840, 2160]
      +  5: StatsBufferAcquireStage
          | Buffer Index: 1
          | BufferRequirements: 640x360 Pitch Y8 420
      +  6: TempBufferAcquireStage
          | Buffer Index: 2
          | BufferRequirements: 3840x1 Pitch NonColor8
      +  7: SensorISPCaptureStage
          | Source GUID: 2
          | Output A Buffer: 0
          | Output Thumb Buffer: 1
          | SensorMetadata Buffer: 2
      +  8: StatsUpdateStage
          | Outut Meta Buffer: 2
      +  9: BufferReturnStage
          | Output A Buffer: 2
      + 10: AcPluginStage
          | operation: opAnalyze
      + 11: AfAnalysisStage

      + 12: MonitorStage
      + 13: ExifStage
      + 14: MakerNoteStage
      + 15: BufferReturnStage
          | Output A Buffer: 0
      + 16: MetadataReturnStage
      + 17: PerfStatsStage

Created fiber 0x7f640008c0 for CC 101 globalID 101 session 2Thread 1 is working on CC 101 session 2 globalID 101 step 0

CC 101 session 2 completed step 0 in fiber 0x7f640008c0
cc 101(0) session 2 runCount=0 runIspOut=0, latest ccId=0
CC 101 session 2 completed step 1 in fiber 0x7f640008c0
NV AE and AfApply algorithms are active.
CC 101 session 2 completed step 2 in fiber 0x7f640008c0
CC 101 session 2 completed step 3 in fiber 0x7f640008c0
Created fiber 0x7f64000b70 for CC 102 globalID 102 session 2
CC 101 session 2 completed step 4 in fiber 0x7f640008c0
CC 101 session 2 completed step 5 in fiber 0x7f640008c0
Thread 2 is working on CC 102 session 2 globalID 102 step 0
CC 102 session 2 completed step 0 in fiber 0x7f64000b70
cc 102(1) session 2 runCount=1 runIspOut=0, latest ccId=0
CC 102 session 2 completed step 1 in fiber 0x7f64000b70
NV AE and AfApply algorithms are active.
CC 101 session 2 completed step 6 in fiber 0x7f640008c0
CC 101 session 2 processing step 7 in fiber 0x7f640008c0
FiberScheduler: cc 101, session 2, fiber 0x7f640008c0 in progress...

Thread 1 getting next capture
Thread 1 is waiting
Thread 3 is waiting
CC 102 session 2 completed step 2 in fiber 0x7f64000b70
CC 102 session 2 completed step 3 in fiber 0x7f64000b70
NvPclSettingsUpdate: Sending Updated Settings through PCL
NvPclSettingsApply: Applying last settings through PCL
apply:+++++++++++++++++++++++
writeExposure:	INPUT coarseTime:4799, expTime:0.033330
CC 102 session 2 completed step 4 in fiber 0x7f64000b70
CC 102 session 2 completed step 5 in fiber 0x7f64000b70
CC 102 session 2 completed step 6 in fiber 0x7f64000b70
CC 102 session 2 processing step 7 in fiber 0x7f64000b70
FiberScheduler: cc 102, session 2, fiber 0x7f64000b70 in progress...

Thread 2 getting next capture
Thread 4 is waiting
Thread 2 is waiting
updateOutputSettings:	OUTPUT coarseTime:4799, expTime:0.033326
apply:-----------------------
NvPclSettingsApply: Reading PCL settings
PowerServiceUtils:calculateReqClock: entered
PowerServiceHw:addRequest: table size: before: 1, after:2
	request table for VI 0:
	req[0]: guID=2, stageID=SensorCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=3840, outH=2160, outBpp=10
	req[0]: out1W=0, out1H=0, out1Bpp=0
	req[0]: out2W=0, out2H=0, out2Bpp=0
	req[0]: clock=100800000, pixelRate=576000000, timeout=900
	req[0]: isoBw=1008000, timeout=900
	req[0]: non_isoBw=0, timeout=900
	req[1]: guID=2, stageID=SensorIspCapture
	req[1]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[1]: outW=3840, outH=2160, outBpp=16
	req[1]: out1W=0, out1H=0, out1Bpp=0
	req[1]: out2W=0, out2H=0, out2Bpp=0
	req[1]: clock=100800000, pixelRate=576000000, timeout=450
	req[1]: isoBw=0, timeout=450
	req[1]: non_isoBw=0, timeout=450
PowerServiceUtils:calculateReqClock: entered
PowerServiceHw:addRequest: table size: before: 1, after:2
	request table for CSI 0:
	req[0]: guID=2, stageID=SensorCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=3840, outH=2160, outBpp=10
	req[0]: out1W=0, out1H=0, out1Bpp=0
	req[0]: out2W=0, out2H=0, out2Bpp=0
	req[0]: clock=117000000, pixelRate=576000000, timeout=900
	req[0]: isoBw=0, timeout=900
	req[0]: non_isoBw=0, timeout=900
	req[1]: guID=2, stageID=SensorIspCapture
	req[1]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[1]: outW=3840, outH=2160, outBpp=16
	req[1]: out1W=0, out1H=0, out1Bpp=0
	req[1]: out2W=0, out2H=0, out2Bpp=0
	req[1]: clock=117000000, pixelRate=576000000, timeout=450
	req[1]: isoBw=0, timeout=450
	req[1]: non_isoBw=0, timeout=450
PowerServiceUtils:calculateReqClock: entered
PowerServiceHw:addRequest: table size: before: 0, after:1
	request table for ISP 0:
	req[0]: guID=2, stageID=SensorIspCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=258, outH=146, outBpp=16
	req[0]: out1W=320, out1H=200, out1Bpp=16
	req[0]: out2W=320, out2H=200, out2Bpp=16
	req[0]: clock=316800000, pixelRate=576000000, timeout=450
	req[0]: isoBw=3801600, timeout=450
	req[0]: non_isoBw=0, timeout=450
PowerServiceHw:updateRequests: table size: before: 1, after:1
	request table for ISP 0:
	req[0]: guID=2, stageID=SensorIspCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=258, outH=146, outBpp=16
	req[0]: out1W=320, out1H=200, out1Bpp=16
	req[0]: out2W=320, out2H=200, out2Bpp=16
	req[0]: clock=316800000, pixelRate=576000000, timeout=230
	req[0]: isoBw=3801600, timeout=230
	req[0]: non_isoBw=0, timeout=230
PowerServiceHw:updateRequests: table size: before: 2, after:2
	request table for VI 0:
	req[0]: guID=2, stageID=SensorCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=3840, outH=2160, outBpp=10
	req[0]: out1W=0, out1H=0, out1Bpp=0
	req[0]: out2W=0, out2H=0, out2Bpp=0
	req[0]: clock=100800000, pixelRate=576000000, timeout=680
	req[0]: isoBw=1008000, timeout=680
	req[0]: non_isoBw=0, timeout=680
	req[1]: guID=2, stageID=SensorIspCapture
	req[1]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[1]: outW=3840, outH=2160, outBpp=16
	req[1]: out1W=0, out1H=0, out1Bpp=0
	req[1]: out2W=0, out2H=0, out2Bpp=0
	req[1]: clock=100800000, pixelRate=576000000, timeout=230
	req[1]: isoBw=0, timeout=230
	req[1]: non_isoBw=0, timeout=230
PowerServiceHw:updateRequests: table size: before: 2, after:2
	request table for CSI 0:
	req[0]: guID=2, stageID=SensorCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=3840, outH=2160, outBpp=10
	req[0]: out1W=0, out1H=0, out1Bpp=0
	req[0]: out2W=0, out2H=0, out2Bpp=0
	req[0]: clock=117000000, pixelRate=576000000, timeout=680
	req[0]: isoBw=0, timeout=680
	req[0]: non_isoBw=0, timeout=680
	req[1]: guID=2, stageID=SensorIspCapture
	req[1]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[1]: outW=3840, outH=2160, outBpp=16
	req[1]: out1W=0, out1H=0, out1Bpp=0
	req[1]: out2W=0, out2H=0, out2Bpp=0
	req[1]: clock=117000000, pixelRate=576000000, timeout=230
	req[1]: isoBw=0, timeout=230
	req[1]: non_isoBw=0, timeout=230
PowerServiceHwIsp:setLaBw: m_bwVal_Iso=3801600 and m_bwVal_NonIso=0 KBpS

PowerServiceHw:setClock: PowerServiceHw[2]: requested_clock_Hz=316800000
NvPclSettingsUpdate: Sending Updated Settings through PCL
NvPclSettingsApply: Applying last settings through PCL
apply:+++++++++++++++++++++++
apply:-----------------------
PowerServiceCore:setCameraBw: totalIsoBw=3801600
NvPclSettingsApply: Reading PCL settings
NvPclSettingsUpdate: Sending Updated Settings through PCL
NvPclSettingsApply: Applying last settings through PCL
apply:+++++++++++++++++++++++
apply:-----------------------
NvPclSettingsApply: Reading PCL settings
PowerServiceUtils:calculateReqClock: entered
PowerServiceHw:addRequest: table size: before: 1, after:2
	request table for ISP 0:
	req[0]: guID=2, stageID=SensorIspCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=258, outH=146, outBpp=16
	req[0]: out1W=320, out1H=200, out1Bpp=16
	req[0]: out2W=320, out2H=200, out2Bpp=16
	req[0]: clock=316800000, pixelRate=576000000, timeout=449
	req[0]: isoBw=3801600, timeout=449
	req[0]: non_isoBw=0, timeout=449
	req[1]: guID=2, stageID=SensorIspCapture
	req[1]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[1]: outW=3840, outH=2160, outBpp=12
	req[1]: out1W=320, out1H=200, out1Bpp=16
	req[1]: out2W=640, out2H=360, out2Bpp=13
	req[1]: clock=316800000, pixelRate=576000000, timeout=450
	req[1]: isoBw=3247200, timeout=450
	req[1]: non_isoBw=0, timeout=450
PowerServiceHw:updateRequests: table size: before: 2, after:2
	request table for ISP 0:
	req[0]: guID=2, stageID=SensorIspCapture
	req[0]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[0]: outW=258, outH=146, outBpp=16
	req[0]: out1W=320, out1H=200, out1Bpp=16
	req[0]: out2W=320, out2H=200, out2Bpp=16
	req[0]: clock=316800000, pixelRate=576000000, timeout=448
	req[0]: isoBw=3801600, timeout=448
	req[0]: non_isoBw=0, timeout=448
	req[1]: guID=2, stageID=SensorIspCapture
	req[1]: inW=3840, inH=2160, inBpp = 10, fps=30
	req[1]: outW=3840, outH=2160, outBpp=12
	req[1]: out1W=320, out1H=200, out1Bpp=16
	req[1]: out2W=640, out2H=360, out2Bpp=13
	req[1]: clock=316800000, pixelRate=576000000, timeout=449
	req[1]: isoBw=3247200, timeout=449
	req[1]: non_isoBw=0, timeout=449
Created fiber 0x7f64000d10 for CC 103 globalID 103 session 2
Thread 5 is working on CC 103 session 2 globalID 103 step 0
CC 103 session 2 completed step 0 in fiber 0x7f64000d10
cc 103(2) session 2 runCount=2 runIspOut=0, latest ccId=0
CC 103 session 2 completed step 1 in fiber 0x7f64000d10
NV AE and AfApply algorithms are active.
CC 103 session 2 completed step 2 in fiber 0x7f64000d10
CC 103 session 2 completed step 3 in fiber 0x7f64000d10
CC 103 session 2 completed step 4 in fiber 0x7f64000d10
CC 103 session 2 completed step 5 in fiber 0x7f64000d10
CC 103 session 2 completed step 6 in fiber 0x7f64000d10
CC 103 session 2 processing step 7 in fiber 0x7f64000d10
FiberScheduler: cc 103, session 2, fiber 0x7f64000d10 in progress...

Thread 5 getting next capture
Thread 5 is waiting
Thread 6 is waiting
NvViCsiAbort - close channel, release syncpts
captureErrorCallback Stream 0.0 capture 1 failed: ts 269291208928 frame 12 error 2 data 0x000000a0

Created fiber 0x7f64000eb0 for CC 104 globalID 104 session 2
Thread 7 is working on CC 104 session 2 globalID 104 step 0
CC 104 session 2 completed step 0 in fiber 0x7f64000eb0
cc 104(3) session 2 runCount=3 runIspOut=0, latest ccId=0
CC 104 session 2 completed step 1 in fiber 0x7f64000eb0
NV AE and AfApply algorithms are active.
CC 104 session 2 completed step 2 in fiber 0x7f64000eb0
CC 104 session 2 completed step 3 in fiber 0x7f64000eb0
CC 104 session 2 completed step 4 in fiber 0x7f64000eb0
CC 104 session 2 completed step 5 in fiber 0x7f64000eb0
CC 104 session 2 completed step 6 in fiber 0x7f64000eb0
CC 104 session 2 processing step 7 in fiber 0x7f64000eb0
FiberScheduler: cc 104, session 2, fiber 0x7f64000eb0 in progress...

Thread 7 getting next capture
Thread 7 is waiting
Thread 8 is waiting
SCF: Error Timeout: ISP port 0 timed out! (in src/services/capture/CaptureServiceDeviceIsp.cpp, function waitIspFrameEnd(), line 702)
SCF: Error Timeout:  (propagating from src/services/capture/CaptureServiceEvent.cpp, function wait(), line 59)
Error: Camera HwEvents wait, this may indicate a hardware timeout occured,abort current/incoming cc
Created fiber 0x7f64001050 for CC 105 globalID 105 session 2
Thread 9 is working on CC 105 session 2 globalID 105 step 0
Fiber 0x7f64001050 is aborting in CC 105 Session 2
FiberScheduler: cc 105 session 2, fiber 0x7f64001050 aborted

launchCC abort cc 106 session 2
Created fiber 0x7fa8fc5b80 for CC 106 globalID 106 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Thread 10 is working on CC 106 session 2 globalID 106 step 0
Fiber 0x7fa8fc5b80 is aborting in CC 106 Session 2
FiberScheduler: cc 106 session 2, fiber 0x7fa8fc5b80 aborted

launchCC abort cc 107 session 2
FiberScheduler: fiber 0x7f64001050 exiting
Thread 9 getting next capture
disposing CC 105 Session 2
Created fiber 0x7fa8fc39d0 for CC 107 globalID 107 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Thread 9 is working on CC 107 session 2 globalID 107 step 0
Fiber 0x7fa8fc39d0 is aborting in CC 107 Session 2
FiberScheduler: cc 107 session 2, fiber 0x7fa8fc39d0 aborted

launchCC abort cc 108 session 2
Created fiber 0x7fa8fc6090 for CC 108 globalID 108 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Thread 11 is working on CC 108 session 2 globalID 108 step 0
Fiber 0x7fa8fc6090 is aborting in CC 108 Session 2
FiberScheduler: cc 108 session 2, fiber 0x7fa8fc6090 aborted

launchCC abort cc 109 session 2
Created fiber 0x7fa8fcca40 for CC 109 globalID 109 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
launchCC abort cc 110 session 2
Created fiber 0x7fa8fcdbb0 for CC 110 globalID 110 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
FiberScheduler: fiber 0x7fa8fc6090 exiting
Thread 11 getting next capture
disposing CC 108 Session 2
Thread 2 is working on CC 109 session 2 globalID 109 step 0
Fiber 0x7fa8fcca40 is aborting in CC 109 Session 2
Thread 3 is working on CC 110 session 2 globalID 110 step 0
Fiber 0x7fa8fcdbb0 is aborting in CC 110 Session 2
FiberScheduler: cc 110 session 2, fiber 0x7fa8fcdbb0 aborted

Thread 5 is waiting
Thread 6 is waiting
Thread 1 is waiting
FiberScheduler: fiber 0x7fa8fc39d0 exiting
Thread 9 getting next capture
disposing CC 107 Session 2
Thread 9 is waiting
Thread 7 is waiting
Thread 8 is waiting
FiberScheduler: fiber 0x7fa8fc5b80 exiting
Thread 10 getting next capture
disposing CC 106 Session 2
Thread 5 is waiting
Thread 6 is waiting
Thread 10 is waiting
Thread 12 is waiting
FiberScheduler: cc 109 session 2, fiber 0x7fa8fcca40 aborted

FiberScheduler: fiber 0x7fa8fcca40 exiting
Thread 2 getting next capture
disposing CC 109 Session 2
Thread 1 is waiting
Thread 9 is waiting
Thread 2 is waiting
Thread 11 is waiting
FiberScheduler: fiber 0x7fa8fcdbb0 exiting
Thread 3 getting next capture
Thread 3 is waiting
Thread 7 is waiting
Thread 8 is waiting
Thread 4 is waiting
disposing CC 110 Session 2
launchCC abort cc 111 session 2
Created fiber 0x7fa8fcb9a0 for CC 111 globalID 111 session 2
Thread 5 is working on CC 111 session 2 globalID 111 step 0SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)

Fiber 0x7fa8fcb9a0 is aborting in CC 111 Session 2
FiberScheduler: cc 111 session 2, fiber 0x7fa8fcb9a0 aborted

FiberScheduler: fiber 0x7fa8fcb9a0 exiting
Thread 5 getting next capture
Thread 5 is waiting
Thread 6 is waiting
Thread 10 is waiting
disposing CC 111 Session 2
launchCC abort cc 112 session 2
Created fiber 0x7fa8fcbe90 for CC 112 globalID 112 session 2
Thread 12 is working on CC 112 session 2 globalID 112 step 0SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)

Fiber 0x7fa8fcbe90 is aborting in CC 112 Session 2
FiberScheduler: cc 112 session 2, fiber 0x7fa8fcbe90 aborted

FiberScheduler: fiber 0x7fa8fcbe90 exiting
Thread 12 getting next capture
Thread 12 is waiting
Thread 1 is waiting
Thread 9 is waiting
disposing CC 112 Session 2
launchCC abort cc 113 session 2
Created fiber 0x7fa8fc5d20 for CC 113 globalID 113 session 2
Thread 2 is working on CC 113 session 2 globalID 113 step 0SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)

Fiber 0x7fa8fc5d20 is aborting in CC 113 Session 2
FiberScheduler: cc 113 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 2 getting next capture
Thread 2 is waiting
Thread 11 is waiting
Thread 3 is waiting
disposing CC 113 Session 2
launchCC abort cc 114 session 2
Created fiber 0x7fa8fc5d20 for CC 114 globalID 114 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Thread 7 is working on CC 114 session 2 globalID 114 step 0
Fiber 0x7fa8fc5d20 is aborting in CC 114 Session 2
FiberScheduler: cc 114 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 7 getting next capture
Thread 4 is waiting
Thread 7 is waiting
Thread 8 is waiting
disposing CC 114 Session 2
launchCC abort cc 115 session 2
Created fiber 0x7fa8fc5d20 for CC 115 globalID 115 session 2
Thread 5 is working on CC 115 session 2 globalID 115 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 115 Session 2
FiberScheduler: cc 115 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 5 getting next capture
Thread 5 is waiting
Thread 6 is waiting
Thread 10 is waiting
disposing CC 115 Session 2
launchCC abort cc 116 session 2
Created fiber 0x7fa8fc5d20 for CC 116 globalID 116 session 2
Thread 12 is working on CC 116 session 2 globalID 116 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 116 Session 2
FiberScheduler: cc 116 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 12 getting next capture
Thread 12 is waiting
Thread 1 is waiting
Thread 9 is waiting
disposing CC 116 Session 2
launchCC abort cc 117 session 2
Created fiber 0x7fa8fc5da0 for CC 117 globalID 117 session 2
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Thread 2 is working on CC 117 session 2 globalID 117 step 0
Fiber 0x7fa8fc5da0 is aborting in CC 117 Session 2
FiberScheduler: cc 117 session 2, fiber 0x7fa8fc5da0 aborted

FiberScheduler: fiber 0x7fa8fc5da0 exiting
Thread 2 getting next capture
Thread 2 is waiting
Thread 11 is waiting
Thread 3 is waiting
disposing CC 117 Session 2
launchCC abort cc 118 session 2
Created fiber 0x7fa8fc5d20 for CC 118 globalID 118 session 2
Thread 4 is working on CC 118 session 2 globalID 118 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 118 Session 2
FiberScheduler: cc 118 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 4 getting next capture
Thread 4 is waiting
Thread 7 is waiting
Thread 8 is waiting
disposing CC 118 Session 2
launchCC abort cc 119 session 2
Created fiber 0x7fa8fc5d20 for CC 119 globalID 119 session 2
Thread 5 is working on CC 119 session 2 globalID 119 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 119 Session 2
FiberScheduler: cc 119 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 5 getting next capture
Thread 5 is waiting
Thread 6 is waiting
Thread 10 is waiting
disposing CC 119 Session 2
launchCC abort cc 120 session 2
Created fiber 0x7fa8fc5d20 for CC 120 globalID 120 session 2
Thread 12 is working on CC 120 session 2 globalID 120 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 120 Session 2
FiberScheduler: cc 120 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 12 getting next capture
Thread 1 is waiting
Thread 12 is waiting
Thread 9 is waiting
disposing CC 120 Session 2
launchCC abort cc 121 session 2
Created fiber 0x7fa8fc5d20 for CC 121 globalID 121 session 2
Thread 2 is working on CC 121 session 2 globalID 121 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 121 Session 2
FiberScheduler: cc 121 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 2 getting next capture
Thread 3 is waiting
Thread 2 is waiting
Thread 11 is waiting
disposing CC 121 Session 2
launchCC abort cc 122 session 2
Created fiber 0x7fa8fc5d20 for CC 122 globalID 122 session 2
Thread 4 is working on CC 122 session 2 globalID 122 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fc5d20 is aborting in CC 122 Session 2
FiberScheduler: cc 122 session 2, fiber 0x7fa8fc5d20 aborted

FiberScheduler: fiber 0x7fa8fc5d20 exiting
Thread 4 getting next capture
Thread 7 is waiting
Thread 4 is waiting
Thread 8 is waiting
disposing CC 122 Session 2
launchCC abort cc 123 session 2
Created fiber 0x7fa8fcb950 for CC 123 globalID 123 session 2
Thread 5 is working on CC 123 session 2 globalID 123 step 0
Fiber 0x7fa8fcb950 is aborting in CC 123 Session 2SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)

FiberScheduler: cc 123 session 2, fiber 0x7fa8fcb950 aborted

FiberScheduler: fiber 0x7fa8fcb950 exiting
Thread 5 getting next capture
Thread 5 is waiting
Thread 6 is waiting
Thread 10 is waiting
disposing CC 123 Session 2
launchCC abort cc 124 session 2
Created fiber 0x7fa8fcb950 for CC 124 globalID 124 session 2
Thread 1 is working on CC 124 session 2 globalID 124 step 0SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)

Fiber 0x7fa8fcb950 is aborting in CC 124 Session 2
FiberScheduler: cc 124 session 2, fiber 0x7fa8fcb950 aborted

FiberScheduler: fiber 0x7fa8fcb950 exiting
Thread 1 getting next capture
Thread 1 is waiting
Thread 9 is waiting
Thread 12 is waiting
disposing CC 124 Session 2
launchCC abort cc 125 session 2
Created fiber 0x7fa8fcb950 for CC 125 globalID 125 session 2
Thread 3 is working on CC 125 session 2 globalID 125 step 0
SCF: Error Timeout:  (propagating from src/api/Session.cpp, function capture(), line 830)
Fiber 0x7fa8fcb950 is aborting in CC 125 Session 2
FiberScheduler: cc 125 session 2, fiber 0x7fa8fcb950 aborted

I’m not quite sure what it all means. But it seems like the driver is at least doing something. Also FYI the final design will have three cameras but for driver development I only have one of the three plugged in, so that’s why it only found one.

@randyzhg
The log shows the “CHANSEL_SHORT_FRAME” that means the sensor output not as expected.

kworker/4:1-106   [004] ...1    83.972477: rtcpu_vinotify_handle_msg: tstamp:2924249093 tag:CHANSEL_SHORT_FRAME channel:0x01 frame:1 vi_tstamp:2924248101 data:0x00000001

Do you have any idea or inkling of what the root cause of the problem is and how I might be able to fix it? Thanks in advance.

So I see this error has something to do with the output size from other topics. I think I configured the output size correctly to 4k resolution on the control registers. But the error still persists.

Well you may need to check with sensor vendor to make sure the output data package is exactly as the REG setting. You can try to reduce the height to try and error.

Ok thanks, I will try to get in touch with Omnivision.

Hello, I am also trying to write the OCHSA10 driver on Jeston AGX platform. I just learned this knowledge. May I ask which file did you refer to to write this device tree file and driver? For example, which file do you get the values of parameters in the device tree? Thanks for your advice