解决泰山派RK3566与OV5695无法使用的问题
1.现象
使用Qt调用摄像头的程序(测试Qt摄像头https://github.com/HXBJ1737/Linux_Qt_app)
或者执行gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! kmssink
来调用摄像头时会分别出现CameraBin error: "Failed to allocate required memory."CameraBin error: "Failed to allocate required memory."
与

并且是概率问题,我使用的是下图这种OV5695,不知道官方使用的那种OV5695有没有这种问题。

一个简单的方法是重启大概率解决,但不稳定
2.研究
通过查询设备树,可以看到OV5695的i2c地址是0x36,使用i2cdetect -y 4
正常情况下得到的

失败情况下得到的

于是我用串口看上电打印的log,发现
正常情况下

失败情况下

可以发现不论失败还是成功,0x36都能检测到,于是查看linux_sdk\kernel\drivers\media\i2c\ov5695.c 驱动代码



可以发现,ov5695_check_sensor_id()函数会用于检查摄像头的id,比如OV5695的CHIP_ID就是5695,但如果没检测到,就会goto到err_power_off执行下面的三个语句,销毁释放摄像头的一切资源。
3.解决
一个简单的方法是直接注释这个goto 语句(linux_sdk\kernel\drivers\media\i2c\ov5695.c)

经验证,即使这个函数没有正确返回,也不影响摄像头i2c地址读取,
可以看到,即使下图未能正确读取sensor id,返回-5,但仍然能检测到i2c的0x36地址。


并且执行gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! kmssink
也可以正常显示




