camera驱动框架分析(上)【转】

  camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连接到soc的camif口上的,有些是通过usb接口导出的,如usb camera。我这里主要讨论前者,也就是与soc直连的。我认为凡是涉及到usb的,都不是一两句话可以说明白的!如有错误,欢迎指正,谢谢!!!

环境说明

涉及到的基础知识点:
字符设备驱动
设备模型
平台设备驱动
v4l2框架
i2c驱动框架

涉及到的术语:
camera : 指的是整个camera,包括它本身的硬件连接方式及支持i2c控制的i2c设备
sensor : 指的是支持i2c控制的i2c设备,它属于camera的一部分,在内核实现里也能体现出来
camera host: 指的是与camera相连接的,一般内嵌在soc里面的控制器

涉及到的文件夹:
drivers/media/platform/soc_camera/ 主要存放camera host驱动,通用的camera驱动也存放在此
drivers/media/i2c/soc_camera/ 主要存放sensor驱动

分析所采用的内核版本:

VERSION = 3 PATCHLEVEL = 15 SUBLEVEL = 0 EXTRAVERSION = NAME = Shuffling Zombie Juror

camera的驱动包括通用camera的驱动、camera host的驱动以及sensor的驱动,下面一个个来分析

这里先插一张图,来自:(该图片及图片后的文字是在我写完这篇博文后发现的,我认为对理解camera驱动会有帮助,所以就摘抄了^_^)

soc camera 子系统 系统架构图

Soc camera sub-system对应着drivers/media/video/下的soc_camera.c soc_camera_platform.c

Soc camera host 是host端实现,是由平台厂商实现的,向上实现soc_camera_host_ops接口,向下操作Camera host硬件以及通过平台特定的接口操作Soc camera device

Soc camera device 是平台的camera device(同时也是subdev),由驱动开发者来实现v4l2_subdev_call调用的subdev 接口,同时还要为soc camera host实现平台特定的操作接口;向下操作camera sensor或者video AD芯片。

Camera host hardware是平台硬件相关的,不同的平台有不同的host硬件,比如imx51的ipu,三星s5pv210的fimc控制器等。

soc_camera_host,soc_camera_device,v4l2_device,v4l2_subdev关系如下: 理论上系统内可以有多个soc_camera_host,物理上soc_camera_host就是系统的camera处理模块驱动 一个soc_camera_host可以对应多个soc_camera_device,物理上soc_camera_device是一个camera接口,每个soc_camera_host对应一个v4l2_dev 每个soc_camera_device,系统会为他们创建设备节点/dev/videoX。 每个soc_camera_device有多个v4l2_subdev,物理上v4l2_subdev可以是sensor,video AD芯片 v4l2_subdev可以通过i2c挂接到v4l2_device,也可以通过soc_camera_link提供的add_device来增加,这依赖于sensor和video AD芯片挂接到MCU camera接口的方式。 通用camera驱动

对应文件drivers/media/platform/soc_camera/soc_camera.c:

static struct platform_driver __refdata soc_camera_pdrv = { .probe = soc_camera_pdrv_probe, .remove = soc_camera_pdrv_remove, .driver = { .name = "soc-camera-pdrv", .owner = THIS_MODULE, }, }; module_platform_driver(soc_camera_pdrv);

从这里可以看出,我们要使该驱动probe得到调用,先得注册一个平台设备,且名字为soc-camera-pdrv。通用camera的驱动就是定义了一套数据结构,然后告诉大家,你如果想用通用的camera驱动,那就照着数据结构填好,然后用soc-camera-pdrv的名字通过平台总线注册上来就可以了。平台设备的注册可以通过两种方式来实现,一种是通过设备树,它是最新的一种机制,通过dts文件来描述硬件信息,使得内核里面不会再硬编码一堆和用于描述硬件信息的代码。对应到这里的硬件信息就是camera sensor硬件信息以及camera硬件布线信息。另一种就是以前采用的方式,直接用代码在板子相关的启动文件里来描述那些信息并通过平台设备的注册。soc_camera_pdrv里面没有设备树的相关支持,说明这类设备的添加还是采用后面那种方式,通过下面的命令输出也可以证实这一点:

我用命令(grep -rns soc-camera-pdrv arch/arm*/)搜索一下,就可以得到以下结果:

arch/arm/mach-shmobile/board-lager.c:394: platform_device_register_data(&platform_bus, "soc-camera-pdrv", 1, arch/arm/mach-shmobile/board-bockw.c:606: platform_device_register_data(&platform_bus, "soc-camera-pdrv", 0, arch/arm/mach-shmobile/board-bockw.c:609: platform_device_register_data(&platform_bus, "soc-camera-pdrv", 1, arch/arm/mach-shmobile/board-mackerel.c:1224: .name = "soc-camera-pdrv", arch/arm/mach-shmobile/board-armadillo800eva.c:910: .name = "soc-camera-pdrv", arch/arm/mach-shmobile/board-marzen.c:299: .name = "soc-camera-pdrv", \ arch/arm/mach-at91/board-sam9m10g45ek.c:241: .name = "soc-camera-pdrv", arch/arm/mach-omap1/board-ams-delta.c:435: .name = "soc-camera-pdrv", arch/arm/mach-pxa/ezx.c:788: .name = "soc-camera-pdrv", arch/arm/mach-pxa/ezx.c:1062: .name = "soc-camera-pdrv", arch/arm/mach-pxa/em-x270.c:1034: .name = "soc-camera-pdrv", arch/arm/mach-pxa/palmz72.c:339: .name = "soc-camera-pdrv", arch/arm/mach-pxa/pcm990-baseboard.c:507: .name = "soc-camera-pdrv", arch/arm/mach-pxa/pcm990-baseboard.c:513: .name = "soc-camera-pdrv", arch/arm/mach-pxa/mioa701.c:682:MIO_SIMPLE_DEV(mioa701_camera, "soc-camera-pdrv",&iclink); arch/arm/mach-imx/mach-imx27_visstrim_m10.c:572: platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0, arch/arm/mach-imx/mach-mx31_3ds.c:248: .name = "soc-camera-pdrv", arch/arm/mach-imx/mach-mx31_3ds.c:412: REGULATOR_SUPPLY("cmos_2v8", "soc-camera-pdrv.0"), arch/arm/mach-imx/mach-mx31_3ds.c:444: REGULATOR_SUPPLY("cmos_vcore", "soc-camera-pdrv.0"), arch/arm/mach-imx/mach-mx35_3ds.c:305: .name = "soc-camera-pdrv", arch/arm/mach-imx/mach-mx35_3ds.c:324: REGULATOR_SUPPLY("cmos_vio", "soc-camera-pdrv.0"), arch/arm/mach-imx/mach-mx27_3ds.c:272: REGULATOR_SUPPLY("cmos_2v8", "soc-camera-pdrv.0"), arch/arm/mach-imx/mach-mx27_3ds.c:302: REGULATOR_SUPPLY("cmos_vcore", "soc-camera-pdrv.0"), arch/arm/mach-imx/mach-mx27_3ds.c:410: .name = "soc-camera-pdrv", arch/arm/mach-imx/mx31moboard-smartbot.c:91: .name = "soc-camera-pdrv", arch/arm/mach-imx/mx31moboard-marxbot.c:181: .name = "soc-camera-pdrv", arch/arm/mach-imx/mach-pcm037.c:329: .name = "soc-camera-pdrv", arch/arm/mach-imx/mach-pcm037.c:337: .name = "soc-camera-pdrv",

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwpwss.html