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.c
static 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)
};
想像是美好的,实现是残酷的。国内的厂商并没有完全按照这样做。比如一个型号的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 子系统。