V4L2 soc-camera 子系统

2014-11-24 08:47:23 ? 作者: ? 浏览: 1

soc-camera的作者之所以引入这个子系统,我想一个主要目的就是把camera驱动划分为camera host端,camera sensor端,这样同一个camera sensor驱动就可以方便的移植到多个camera host下,而无须做较多的改动。


本译文取自kernel文档:Documentation/video4linux/soc-camera.txt


术语


在阅读本文档前先明确几个术语:


soc-camera subsystem的目的


soc-camera 子系统在camera host驱动和camera sensor驱动间提供了统一的接口。子系统向上提供了V4L2接口,当前仅支持mmap method。


这个子系统连接SoC video capture接口和CMOS camera sensor chips,使得sensor驱动可以在其他的hosts驱动上复用。子系统在设计时也考虑到了多个camera host接口的存在,以及每个接口存在多个camera sensor,尽管在大部分情况下仅有一个camera sensor。


现存的驱动


在2.6.27-rc4中,主线内核有两个host 驱动:PXA27x的pxa_camera.c和SuperH SoCs的sh_mobile_ceu_camera.c,有四个sensor驱动:mt9m001.c,mt9v002.c以及一个通用的soc_camera_platform.c驱动。这个列表可能不是最新的,所以在你的源码树中查看,可能有更多的例子存在。


实际开发中,新的sensor驱动可以参照mt9m001.c和mt9v002.c这两个sensor驱动框架,根据项目所用的sensor稍加修改即可。


Camera host API


一个host camera driver使用soc_camera_host_register(struct soc_camera_host *)函数来注册。host object可以如下初始化


static struct soc_camera_host pxa_soc_camera_host = {
.drv_name = PXA_CAM_DRV_NAME,
.ops = &pxa_soc_camera_host_ops,
};


所有的方法都是通过struct soc_camera_host_ops


static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
.owner = THIS_MODULE,
.add = pxa_camera_add_device,
.remove = pxa_camera_remove_device,
.suspend = pxa_camera_suspend,
.resume = pxa_camera_resume,
.set_fmt_cap = pxa_camera_set_fmt_cap,
.try_fmt_cap = pxa_camera_try_fmt_cap,
.init_videobuf = pxa_camera_init_videobuf,
.reqbufs = pxa_camera_reqbufs,
.poll = pxa_camera_poll,
.querycap = pxa_camera_querycap,
.try_bus_param = pxa_camera_try_bus_param,
.set_bus_param = pxa_camera_set_bus_param,
};


.add和 .remove方法是sensro接入host和从host卸载时调用,除了执行host内部的初始化工作,还会调用sensor的.init和.release方法。


.suspend和.resume方法实现host的电源管理功能, 他们要负责调用相应的sensor 方法。


.try_bus_param和.set_bus_param用来协商host和sensor间的物理连接参数。


.init_videobuf是当一个video-device被打开时调用,video-buffer管理的实现是完全依赖于特定的host


其余部分被V4L2的相应部分调用。


-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: