两类IOCTL调用流程: 上层调用ioctl->v4l2_ioctl//次设备号找到video_device->vdev->fops->unlocked_ioctl(filp, cmd, arg);//一般这个unlocked_ioctl都等于内核提供的video_ioctl2->video_usercopy(file, cmd, arg, __video_do_ioctl);//调用__video_do_ioctl->__video_do_ioctl//v4l2_ioctl_ops *ops ...
conststruct v4l2_ioctl_ops *ops = vfd->ioctl_ops;---|video_device->ioctl_ops(注意 video_device这几个函数的调用,要明白他们的作用) boolwrite_only =false; struct v4l2_ioctl_info default_info; conststruct v4l2_ioctl_info *info; void*fh = file->private_data; struct v4l2_fh *vfh =NULL; ...
在调用之前应用程序需要设定 v4l2_buffer 中的两个参数,一个是 buffer 类型,另外一个是 index number( 有效值从 0 到申请的 buffer 数目减 1) ,调用这个 ioctl 会将相应 buffer 中的 flag : V4L2_BUF_FLAG_MAPPED, V4L2_BUF_FLAG_QUEUED 和 V4L2_BUF_FLAG_DONE 设置为有效。
驱动程序需要重点实现两个操作集:struct v4l2_file_operations和struct v4l2_ioctl_ops,V4L2架构最终会调用这两个操作集中的函数接口,来完成对视频设备硬件的控制。其实现流程如下图所示: 对于melis的porting来说,v4l2_file_operations有两个,一个是struct v4l2_file_operations vin_fops,另一个是struct v4l2_file_...
其中大多数操作都是通过应用层调用ioctl实现的,可以将这些ioctl分为下面几类 2.1 查询设备的功能 由于V4L2涵盖了各种各样的设备,因此并非API的所有方面都适用于所有类型的设备,在使用v4l2设备时,必须调用此API,获得设备支持的功能(capture、output、overlay…) ...
因为V4L2要求所有driver和device都支持这个ioctl。所以,通过VIDIOC_QUERYCAP命令是否成功来判断当前device和driver是否符合V4L2规范。当然,这个命令执行成功的同时还能够得到设备足够的信息,如struct v4l2_capability结构体所示内容。86~98行代码检查当前设备是否为capture设备,并检查使用内存映射还是直接读的方式获取图像数据。
#define V4L2_CAP_READWRITE 0x01000000 // 支持read、write系统调用 #define V4L2_CAP_ASYNCIO 0x02000000 // 支持异步I/O #define V4L2_CAP_STREAMING 0x04000000 // 支持流式I/O ioctl功能 #define V4L2_CAP_DEVICE_CAPS 0x80000000 /* sets device capabilities field */ ...
具体的程序实现流程可以参考下面的流程图: 其实其他的都比较简单,就是通过ioctl这个接口去设置一些参数。最主要的就是buf管理。他有一个或者多个输入队列和输出队列。 启动视频采集后,驱动程序开始采集一帧数据,把采集的数据放入视频采集输入队列的第一个帧缓冲区,一帧数据采集完成,也就是第一个帧缓冲区存满一帧数据...
//2.获取摄像头支持的格式 ioctl(文件描述符,命令,与命令对应的结构体) //查询并显示所有支持的格式:VIDIOC_ENUM_FMT ,获取对应结构体 /*struct v4l2_fmtdesc { u32 index; // 要查询的格式序号,应用程序设置 enum v4l2_buf_type type; // 帧类型,应用程序设置 ...