当前vicap驱动存在复位机制,该机制用于当vicap
出现异常情况时,对
vicap
进行
cru
复位操作。复位机制的4种模式,0,1,2,3在RK驱动文档里有详细介绍;
![](https://i-blog.csdnimg.cn/blog_migrate/3656f181ac4d635e6b92c74b11c211c7.png)
当进行rkcif_do_reset_work时,就会调用case RKMODULE_SET_QUICK_STREAM,可以在驱动中加下log打印,看reset success时,是否进入该case;
在cif/capture.c
ret = v4l2_subdev_call(p->subdevs[i], core, ioctl,RKMODULE_SET_QUICK_STREAM, &on);
if (ret)
v4l2_err(&cif_dev->v4l2_dev, "quick stream off subdev:%s failed\n", p->subdevs[i]->name);
***************************************************
而 RKMODULE_SET_QUICK_STREAM 主要是操作stream on和stream off寄存器
int XXXX_set_quick_stream(struct i2c_client *client, u32 stream)
{
if (stream) {
techpoint_write_reg(client, 0x40, 0x8);
techpoint_write_reg(client, 0x23, 0x0);
} else {
techpoint_write_reg(client, 0x40, 0x8);
techpoint_write_reg(client, 0x23, 0x2);
}
return 0;
}
之前调试遇到客户,在PC端使用会议软件通话时概率性出现csi fifo overflow的问题,画面死机,uvc应用挂了,uac应用还在;也就是预览画面是正常的,只是启动uac时,会出现分屏的现象;
最后加入复位机制:rockchip, cif-monitor = < 3 2 10 1000 5>;之前模式0,1,2都试过了,log中有看到reset success,但是sensor驱动中没有进入case RKMODULE_SET_QUICK_STREAM;后面将模式修改为3,即热插拔模式(可能兼容了前面的一些模式),进行复位时就会进入RKMODULE_SET_QUICK_STREAM;此时不会出现分屏了。
需要注意一点的是当vicap出现异常报错时,90%以上都能通过复位机制解决,剩下10%排查硬件!