V4L2视频驱动主要涉及到以下几个知识点:摄像头方面的知识、Camera解码器、控制器、V4L2的API和数据结构、V4L2的驱动架构。
一. 视频驱动的整体框架
Video的基本框架图如下:
对驱动程序员来说,主要是关心camera驱动这部分代码的实现。
二. V4L2重要的数据结构
常用的结构体在内核文件 include/linux/videodev2.h与v4l2-dev.h中定义,重要的数据结构如下面这些。
1. struct v4l2_requestbuffers //申请帧缓冲,对应命令 VIDIOC_REQBUFS
struct v4l2_requestbuffers{
__u32 count; //缓存数量,也就是说在缓存队列里保持多少张照片
enum v4l2_buf_type type; //数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
enum v4l2_memory memory; //V4L2_MEMORY_MMAP或V4L2_MEMORY_USERPTR
__u32 reserved[2];
};
2. struct v4l2_capability //视频设备的功能,对应命令 VIDIOC_QUERYCAP
struct v4l2_capability{
__u8 driver[16]; //驱动名称
__u8 card[32];
__u8 bus_info[32]; //总线信息
__u32 version;
__u32 capabilities; //设备能力
__u32 device_caps;
__u32 reserved[3];
};
3. struct v4l2_input //视频输入信息,对应命令 VIDIOC_ENUMINPUT
struct v4l2_input{
__u32 index; /* Which input */ //应用关注的输入的索引号; 这是惟一一个用户空间设定的字段. 驱动要分配索引号给输入,从0开始,依次往上增加.
__u8 name[32]; /* Label */ //输入的名字,由驱动设定.简单起见,可以设为”Camera”,如果卡上有多个输入,名称就要与接口的打印相符合.
__u32 type; /* Type of input */ //输入的类型,现在只有两个值可选:V4L2_INPUT_TYPE_TUNER 和V4L2_INPUT_TYPE_CAMERA.
__u32 audioset; /* Associated audios (bitfield) *///描述哪个音频输入可以与些视频输入相关联.如果没有音频输入可以与之关联,或是只有一个可选,那么就可以简单地把这个字段置0.
__u32 tuner; /* Associated tuner *///如果输入是一个调谐器 (type 字段置为V4L2_INPUT_TYPE_TUNER), 这个字段就是会包含一个相应的调谐设备的索引号.
v4l2_std_id std; //描述设备支持哪个或哪些视频标准.
__u32 status; //给出输入的状态.,status 中设置的每一位都代表一个问题. 这些问题包括没有电源,没有信号,没有同频锁,或是其他一些不幸的问题.
__u32 capabilities;
__u32 reserved[3];
};
4. struct v4l2_standard //视频的制式,比如PAL ,NTSC ,对应命令 VIDIOC_ENUMSTD
struct v4l2_standard{
__u32 index;
v4l2_std_id id;
__u8 name[24];
struct v4l2_fract frameperiod; /* Frames, not fields */
__u32 framelines;
__u32 reserved[4];
};
5. struct v4l2_format //帧的格式,对应命令VIDIOC_G_FMT 、VIDIOC_S_FMT 等
struct v4l2_format{
enum v4l2_buf_type type; //数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
union {
st