camera驱动分析

1.

内核的 camera 控制器驱动 和 sensor 驱动是基于 v4l2 驱动架构编写的,应用程序可以使用 cimutils 进行测试

CIM 控制器驱动,基于 V4L2 架构,并采用 videobuf2。便于上层开发

drivers/media/platform/soc_camera/ingenic/x2000/ingenic_camera.c

static int __init ingenic_camera_probe(struct platform_device *pdev)

drivers/media/platform/soc_camera/soc_camera.c soc_camera 子系统

2.

sensor gc2155驱动

drivers/media/i2c/soc_camera/gc2155.c

static int gc2155_probe(struct i2c_client *client,const struct i2c_device_id *did)

Sensor 设备驱动:

drivers/media/i2c/soc_camera/gc2155.c

主要的数据结构为:

1)static struct v4l2_subdev_core_ops gc2155_subdev_core_ops{

.s_power

}

负责 sensor 初始化,主要工作是 sensor 上电,复位,通过 i2c 将 gc2155_init_regs

配置给 sensor。gc2155_init_regs 为 gc2155 厂家提供的初始化寄存器表。

2)static struct v4l2_subdev_video_ops gc2155_subdev_video_ops{

.s_mbus_fmt

}

在启动启动 sensor 前,上层会通过 v4l2 接口配置所需分辨率信息到 sensor,最终

也是通过 i2c 将 gc2155_vga_reg、sgc2155_qvga_regs、gc2155_720P_regs 配置给

sensor。

非常关键

在 gc2155_g_mbus_config 中,会设置 sensor 的 3 个管脚属性给控制器,就是我们

从 gc2155 手册中得到的信息

cfg->flags =

V4L2_MBUS_PCLK_SAMPLE_RISING |// 上升沿采样

V4L2_MBUS_VSYNC_ACTIVE_HIGH | // vsync 有效极性为高电平

V4L2_MBUS_HSYNC_ACTIVE_HIGH | // hsync 有效极性为高电平

V4L2_MBUS_MASTER //固定标识,必须有

V4L2_MBUS_DATA_ACTIVE_HIGH; //固定标识,必须有

这些宏定义在/include/media/v4l2-mediabus.h 中

V4L2_MBUS_PCLK_SAMPLE_RISING CIM 控制器在 pclk 上升沿处采样。

V4L2_MBUS_PCLK_SAMPLE_FALLING CIM 控制器在 pclk 下降沿处采样。

V4L2_MBUS_VSYNC_ACTIVE_HIGH CIM 控制器在 vsync 翻转为高电平时开始启动新的一帧采集。

V4L2_MBUS_VSYNC_ACTIVE_LOW CIM 控制器在 vsync 翻转为低电平时开始启动新的一帧采集。

V4L2_MBUS_HSYNC_ACTIVE_HIGH CIM 控制器在 hsync 为高电平时,采集期间每一个有效的 PCLK。

V4L2_MBUS_HSYNC_ACTIVE_LOW CIM 控制器在 hsync 为低电平时,采集期间每一个有效的 PCLK。

驱动中使用的两个 i2c 读写接口:

i2c_smbus_write_byte_data

i2c_smbus_read_byte_data

3.

在/dev/video2 的camera设备节点 字符设备

crw-rw---- 1 root root 81, 2 Jan 1 00:25 /dev/video2

cimutils应用代码

cim/video.c

int open_device(struct camera_info *camera_inf)去打开camera设备节点,通过系统调用进入我们的内核驱动

drivers/media/v4l2-core/v4l2-dev.c

__video_register_device(){

switch (type) {

case VFL_TYPE_GRABBER:

name_base = "video"; ///dev/video2

et = cdev_add(vdev->cdev, MKDEV(VIDEO_MAJOR, vdev->minor), 1); //添加字符设备

}

猜你喜欢

转载自blog.csdn.net/sinat_37817094/article/details/83815171
今日推荐