camera: V4l2 data struct

来源:互联网 发布:wifi网络超时怎么解决 编辑:程序博客网 时间:2024/06/07 23:58

控制器组成的相关数据结构:

 在linux3.0以上的内核对这些结构的定义,从定义当中就可以窥探整个v4l2的框架。这些结构体有:

struct v4l2_device;

用来描述一个v4l2设备实例

描述整个host端的camera控制器的驱动

struct v4l2_subdev,

用来描述一个v4l2的子设备实例

描述控制器上的子设备,这些设备实际上完成了所有的任务,比如说(通过v4l2_subdev_ops)音视频的合成,编码,解码。对于webcam来说,子设备就是sensor和camera控制器。通常这些都是I2C设备,但也不是必须的。为了给这些子设备提供一个一致的接口,v4l2_subdev结构才应运而生。

v4l2_subdev_ops

subdev的ops种类:

struct v4l2_subdev_ops {

const struct v4l2_subdev_core_ops        *core;

const struct v4l2_subdev_tuner_ops        *tuner;

const struct v4l2_subdev_audio_ops        *audio;

const struct v4l2_subdev_video_ops        *video;

const struct v4l2_subdev_vbi_ops        *vbi;

const struct v4l2_subdev_ir_ops                *ir;

const struct v4l2_subdev_sensor_ops        *sensor;

const struct v4l2_subdev_pad_ops        *pad;

};

相关的注册包括两部分,例如:

    1) v4l2_subdev相关的ops:

     fimc_register_capture_device()--->fimc_create_capture_subdev()--->

             v4l2_subdev_init()注册pad(host端的pad配置)的ops

static struct v4l2_subdev_ops fimc_subdev_ops = {

.pad = &fimc_subdev_pad_ops,

};   

    2)mipi-csis.c mipi总线的驱动:完成subdev(也就是sensor相关的ops注册)

@s5pcsis_probe(struct platform_device *pdev)----》v4l2_subdev_init(&state->sd, &s5pcsis_subdev_ops);

 

struct video_device;

用来创建设备节点/dev/videoX

提供给用户的操作接口,用户通过它获得v4l2设备的控制方法ops

struct v4l2_fh;

用来跟踪文件句柄实例

在打开/dev/videoX设备的时候,才注册,例如:static int fimc_capture_open(struct file *file)-----》v4l2_fh_open(file);

v4l2_ctrl_handler

 

是用于保存子设备控制方法集(也就是说用来控制sensor的)的结构体,对于视频设备这些ctrls包括设置亮度、饱和度、对比度和清晰度等,用链表的方式来保存ctrls,可以通过v4l2_ctrl_new_std函数向链表添加ctrls。

V4l2_fh是每个子设备的文件句柄,在打开设备节点文件时设置,方便上层索引到v4l2_ctrl_handler,v4l2_ctrl_handler管理设备的ctrls

也是在在打开/dev/videoX设备的时候,才创建: fimc_capture_open()----》》》fimc_capture_ctrls_create(fimc);

v4l2_ctrl_add_handler()

 

其ops定义在:

fimc-core.c

static const struct v4l2_ctrl_ops fimc_ctrl_ops = {

.s_ctrl = fimc_s_ctrl,

};

至于可以控制那些功能,取决于cam控制?如

fimc_ctx{

....

 

struct v4l2_ctrl        *ctrl_rotate;

struct v4l2_ctrl        *ctrl_hflip;

struct v4l2_ctrl        *ctrl_vflip;

struct v4l2_ctrl        *ctrl_alpha;

….

}

 

 

 

 

基本的camif注册相关v4l2相关控制的数据顺序:(也就是基于v4l2的平台的video模块的驱动注册流程):

///step1 注册v4l2_device:v4l2_device

//step2:完成输入和输出设备操作的ops注册:v4l2_ioctl_ops   v4l2_file_operations

           ---1)完成输出io的ops注册,也就是输出到dispalay;

            ---2)完成输入io的ops注册,也就是采集camera的数据。

//step3 :注册subdev节点用来描述一个v4l2的子设备实例  v4l2_subdev

//step4:注册video_device供用户层操作。video_device

//step5:mipi-csis总线. mipi总线的驱动:完成subdev(也就是sensor控制相关的ops注册)

0 0