V4L2框架概述
V4L2框架主要部分组成:
V4L2_device:管理所有设备;
media_device:media_device框架管理运行时的pipeline;
V4L2_device
这个是整个输入设备的总结构体,可以认为他是整个V4L2框架的入口,由该结构体引申出来v4L2_subdev。用于视频输入设备整体的管理,有多少输入设备就有多少个v4l2_device抽象(比如一个USB摄像头或者一个IPC等),再往下分时输入子设备例如:ISP,CSI,MIPI等。他们时从属于V4L2之下的。
struct v4l2_device {
charname[V4L2_DEVICE_NAME_SIZE]; //device 名字
structkref ref; //引用计数
structlist_head subdevs; //用链表管理注册的subdev
struct media_device *mdev; //管理组成media link的媒体设备
struct v4l2_ctrl_handler *ctrl_handler; //该v4l2设备的控制接口
……
};
media_device
用于运行时数据流的管理,嵌在V4L2_device内部,运行时的意思就是:一个V4L2_device下属可能有非常多同类型的子设备(两个或者多个sensor、ISP等),那么在设备运行时我怎么知道我的数据流需要用到哪一个类型的哪一个子设备呢。这时就需要media_device出手了,它为这一坨子设备建立一条虚拟的连线,建立起来一个运行时的pipeline(管道),并且可以在运行时动太改变、管理接入的设备。
V4L2视频驱动框架—meida_device管理模块简述
理解:
media frame的引入就是为了将各个subdev抽象成单独的模块,并将各个模块以管道的概念连接起来,从而组装成一个完整的数据流。
作用:
提供实时的pipeline管理,pipeline就理解为管道,想象一下水管,里面的水就是数据流,输入设备中的csi->isp->video就组成一个pipeline线路。media frame提供pipeline的开启、关停、效果、节点控制等功能。
说明:
内核当中主要利用四个结构体来把众多的节点组织起来:media_device,media_entity,media_link,meida_pad。整个media framework都围绕这四个结构体来进行使用的。
media_entity:硬件模块抽象(类比芯片)
media_pad:硬件端口抽象(类比芯片管脚)
media_link:硬件设备的链接抽象,link的两端是pad(类比元器件管脚连线)
media_entity中包含多个media_pad,同时media_pad又会指向它所属的media_entity;
#------------# #------------#
| __|__ __|__ |
| | | | link | | | |
| | pad |<-------->| pad | |
| |__|__| |__|__| |
| | | |
| entity | | entity |
#------------# #------------#