1 V4L2
1 V4L2简介
11 VV44LL22
video4linux2(V4L2)是Linux内核中关于视频设备的内核驱动,它为Linux
中视频设备访问提供了通用接口,在Linux系统中,V4L2驱动的Video设备节点
路径通常/dev/video/中的videoX
V4L2驱动对用户空间提供字符设备,主设备号为81,对于视频设备,其次设备号
为0-63。除此之外,次设备号为64-127的Radio设备,次设备号为192-223的是
Teletext设备,次设备号为224-255的是VBI设备
V4L2驱动的Video设备在用户空间通过各种ioctl调用进行控制,并且可以使用
mmap进行内存映射
1.1 V4L2驱动主要使用的ioctl
1.1 V4L2驱动主要使用的ioctl
11..11VV44LL22驱驱动动主主要要使使用用的的iiooccttll
命令值如下所示:
#define VIDIOC_QUERYCAP _IOR('V', 0, struct v4l2_capability) /*查询能
力*/
#define VIDIO_G_FMT _IOWR('V', 4, struct v4l2_format) /*获得格式*/
#define VIDIOC_S_FMT _IOWR('V', 5, struct v4l2_format) /*设置格式*/
#define VIDIOC_REQBUFS _IOWR('V', 8, strut v4l2_requestbuffers) /*申请
内存*/
#define VIDIOC_G_FBUF _IOW('V', 10, struct v4l2_framebuffer) /*获得
Framebuffer*/
#define VIDIOC_S_BUF _IOW('V', 11, struct v4l2_framebuffer) /*设置
Framebuffer*/
#define VIDIOC_OVERLAY _IOW('V', 14, int) /*设置Overlay*/
#define VIDIOC_QBUF _IOWR('V', 15, struct v4l2_buffer) /*将内存加入队
列*/
#define VIDIOC_DQBUF _IOWR('V', 17, strut v4l2_buffer) /*从队列取出内
存*/
#define VIDIOC_STREAMON _IOW('V', 18, int) /*开始流*/
#define VIDIOC_STREAMOFF _IOW('V', 19, int) /*停止流*/
#define VIDIOC_G_CTRL _IOWR('V', 27, struct v4l2_control) /*得到控制*/
#define VIDIOC_S_CTRL _IOWR('V', 28, struct v4l2_control) /*设置控制*/
1.2 重要结构
1.2 重要结构
11..22 重重要要结结构构
头文件 include/linux/videodev2.h
include/media/v4l2-dev.h
V4L2驱动核心实现文件:driver/media/video/v4l2-dev.c
v4l2-dev.h中定义的video_device 是V4L2驱动程序的核心数据结构
structvideo_device
{
const struct v4l2_file_operations *fops;
struct cdev*cdev;//字符设备
struct device *parent;//父设备
struct v4l2_device*v4l2_dev;//父v4l2_device
charname[32];//名称
int vfl_type;//类型
int minor;//次设备号
/*释放回调*/
void (*release)(structvideo_device *vdev);
/*ioctl 回调*/
const struct v4l2_ioctl_ops *ioctl_ops;
}
常用的结构
参见/include/linux/videodev2.h
1)设备能力结构
structv4l2_capability
{
__u8 driver[16];//驱动名
__u8 card[32];//例如Haup