控制器组成的相关数据结构:
在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注册)