11-15.ov9281双摄-rk3399pro-续集

OV9281摄像头在首次启动时经历1-2分钟的自动调整期,导致使用卡顿。问题源于v4l2驱动在设置参数,特别是V4L2_CID_EXPOSURE、V4L2_CID_ANALOGUE_GAIN和V4L2_CID_VBLANK等。通过注释掉相关代码解决了此问题。调整过程中,驱动会修改寄存器值以优化显示效果。
摘要由CSDN通过智能技术生成

3399pro搭载的双摄ov9281,一直有个问题,就是第一次上电启动后,就会有一个1-2分钟的自动调整过程。

调整的过程比较卡顿,似乎是在调整曝光时间等一些参数。这就有点影响使用了。但是第二次启动应用是没这个问题了(不是reboot系统,只是重新启动应用)。

今天追查了一下,发现是v4l2驱动在进行参数调整

加几条打印语句:

static int ov9281_set_ctrl(struct v4l2_ctrl *ctrl)
{
	struct ov9281 *ov9281 = container_of(ctrl->handler,
					     struct ov9281, ctrl_handler);
	struct i2c_client *client = ov9281->client;
	s64 max;
	int ret = 0;

	/* Propagate change of current control to all related controls */
	switch (ctrl->id) {
	case V4L2_CID_VBLANK:
		/* Update max exposure while meeting expected vblanking */
		max = ov9281->cur_mode->height + ctrl->val - 4;
		__v4l2_ctrl_modify_range(ov9281->exposure,
					 ov9281->exposure->minimum, max,
					 ov9281->exposure->step,
					 ov9281->exposure->default_value);
		break;
	}

	if (pm_runtime_get(&client->dev) <= 0)
		return 0;

	switch (ctrl->id) {
	case V4L2_CID_EXPOSURE:
		/* 4 least significant bits of expsoure are fractional part */
		printk(KERN_ERR "V4L2_CID_EXPOSURE ctrl->val = %d\n",ctrl->val);
		ret = ov9281_write_reg(ov9281->client, OV9281_REG_EXPOSURE,
				       OV9281_REG_VALUE_24BIT, ctrl->val << 4);
		break;
	case V4L2_CID_ANALOGUE_GAIN:
		printk(KERN_ERR "V4L2_CID_ANALOGUE_GAIN ctrl->val = %d\n",ctrl->val);
		ret = ov9281_write_reg(ov9281->client, OV9281_REG_GAIN_H,
				       OV9281_REG_VALUE_08BIT,
				       (ctrl->val >> OV9281_GAIN_H_SHIFT) & OV9281_GAIN_H_MASK);
		ret |= ov9281_write_reg(ov9281->client, OV9281_REG_GAIN_L,
				       OV9281_REG_VALUE_08BIT,
				       ctrl->val & OV9281_GAIN_L_MASK);
		break;
	case V4L2_CID_VBLANK:
		printk(KERN_ERR "V4L2_CID_VBLANK ctrl->val = %d\n",ctrl->val);
		ret = ov9281_write_reg(ov9281->client, OV9281_REG_VTS,
				       OV9281_REG_VALUE_16BIT,
				       ctrl->val + ov9281->cur_mode->height);
		break;
	case V4L2_CID_TEST_PATTERN:
		printk(KERN_ERR "V4L2_CID_TEST_PATTERN ctrl->val = %d\n",ctrl->val);
		ret = ov9281_enable_test_pattern(ov9281, ctrl->val);
		break;
	default:
		dev_warn(&client->dev, "%s Unhandled id:0x%x, val:0x%x\n",
			 __func__, ctrl->id, ctrl->val);
		break;
	}

	pm_runtime_put(&client->dev);

	return ret;
}

发现启动软件后,就会在后台有打印

看来是驱动在捣鬼。

 

 

 被我注释掉了,果然就没事了,哈哈哈!!!

从这个来看,应该是驱动里面在训练参数,所以有一个自动调整时期。

同时,根据显示的效果,修改寄存器,使得显示正常一点:

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大智兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值