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); //添加字符设备
}