Camera驱动调试小记
应用使用V4L2 API操作Camera设备是比较统一的,但是对Camera驱动的实现是多种多样了,比如UVC(USB免驱摄像头)以及SoC-Camera。
前者不需要额外的驱动程序,所以不用过多关心;后者是片上系统Camera的支持。针对SoC-Camera内核中标准的文档是Linux-3.0-soc-camera。SoC-Camera和ASoC是一样的思想,最终实现SoC端的Host驱动与Guest端进行分离,这样就可以很方便地通过link将独立的host端驱动和独立的Guest端驱动联合起来。这么说来也可以分三个部分:
Machine、Platform和Sensor。其中Platform是CPU上的Camera Interface驱动(由CPU厂商提供),Sensor是具体的Camera模组驱动(由模组厂商提供),Machine驱动是具体自定义PCB的主板相关,将Platform和Sensor驱动连接起来(由具体主板设计者开发)。
drivers/media/video/rk30_camera_oneframe.cstatic struct soc_camera_host_ops rk_soc_camera_host_ops ={ .owner = THIS_MODULE, .add = rk_camera_add_device, .remove = rk_camera_remove_device, .suspend = rk_camera_suspend, .resume = rk_camera_resume, .enum_frameinervals = rk_camera_enum_frameintervals, .cropcap = rk_camera_cropcap, .set_crop = rk_camera_set_crop, .get_crop = rk_camera_get_crop, .get_formats = rk_camera_get_formats, .put_formats = rk_camera_put_formats, .set_fmt = rk_camera_set_fmt, .try_fmt = rk_camera_try_fmt, .init_videobuf = rk_camera_init_videobuf, .reqbufs = rk_camera_reqbufs, .poll = rk_camera_poll, .querycap = rk_camera_querycap, .set_bus_param = rk_camera_set_bus_param, .s_stream = rk_camera_s_stream, /* ddl@rock-chips.com : Add stream control for host */ .set_ctrl = rk_camera_set_ctrl, .controls = rk_camera_controls, .num_controls = ARRAY_SIZE(rk_camera_controls)};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
想像是美好的,实现是残酷的。国内的厂商并没有完全按照这样做。比如一个型号的Sensor如果要应用在ROCKCHIP和Allwinner平台上,原本应该就提供同一个驱动程序就可以了,但是目前的情况是Sensor厂商提供各自针对相应平台的驱动程序。没有达到设计思想中的各司其职的效果,不过最终会朝着好的方向走的。
调试顺序:
1.(可不连接模组)上电时序 根据手册时序将AVDD,DVDD,IOVDD上电。
2.(可不连接模组)上电正常后,检测MCLK是否正常,一般为24MHz/48MHz。
3.(可不连接模组)PWDN和RESTB信号是否正常,重点在于电平切换有没有在正确的时间点上。
4.(可不连接模组)I2C信号是否正常,主要观察I2C寻址地址是否正确。
5.(需要连接模组)I2C信号信号第9个脉冲对应的SDA是否为低电平,是代表有ACK,反之无。
6.(打开相机应用)测试是否有PCLK/H/V/这三个信号致命,如果不正常会导致无法显示图像
7.(打开相机应用)DATA信号完全没有会使得绿屏(不一定全是这样),图像显示正常与否和DATA有关。
参考文档还有Video for Linux Two(V4L2)——驱动编写指南;测试工具有v4l-utils,还有V4L2 soc-camera 子系统。