V4L2学习流程

Posted zongzi10010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了V4L2学习流程相关的知识,希望对你有一定的参考价值。


title: V4L2学习流程
date: 2019/4/23 18:00:00
toc: true
---

V4L2学习流程

参考资料

关键资料,插图让人一下子就理解了

Linux摄像头驱动1——vivid

Linux摄像头驱动2——UVC

重写uvc比较完整注释版本

从更大的角度去看V4L2框架,不局限在摄像头

V4L2框架概述

排版不错的笔记

USB摄像头驱动框架分析

从零写USB摄像头驱动之分析描述符

从零写USB摄像头驱动之实现数据传输1_框架

从零写USB摄像头驱动之实现数据传输2_简单函数

从零写USB摄像头驱动之实现数据传输3_设置参数

下面的排版不太好,但是更具体

摄像头驱动之实现数据传输1_框架_学习笔记

摄像头驱动之实现数据传输2_简单函数_学习笔记

摄像头驱动之实现数据传输3_设置参数_学习笔记

摄像头驱动之实现数据传输4_URB_学习笔记

摄像头驱动之实现数据传输5_调试_学习笔记

摄像头驱动之设置属性_学习笔记

其他系列文章笔记

USB摄像头驱动配置及V4L2编程
UVC 摄像头驱动(三)配置摄像头,实时数据采集
UVC 摄像头驱动(三)配置摄像头,实时数据采集
USB驱动函数总结
UVC 摄像头驱动(二)描述符分析
UVC 摄像头驱动(一)硬件描述
V4L2(三)编写虚拟摄像头驱动
V4L2(二)虚拟摄像头驱动vivi深入分析
V4L2(一)框架浅析

学习流程

  1. 学习vivi的代码,抛开USB相关的细节,去了解linux下的v4l2的框架
  2. 自己编写vivi的代码,实现在ubuntu下的使用
  3. 学习具体的uvc规范
  4. 学习uvc的代码,了解下usb如何鱼v4l2搭配使用
  5. 自己编写一个uvc代码

其实自己压根没敲代码,只是学习框架,以后用到的时候再去试试,各个版本的代码调用都不一样,新的linux4.x的videobuf 封装的更好了,好像都能直接用的那种

插图一览

这是参考资料的大图Linux摄像头驱动2——UVC,本人还没有那么高的功底 哈哈

几个基本概念:
1.应用层有五个操作函数,其中ioctl下至少有11个基本的操作函数;
2.USB摄像头有且只有一个VC接口用于控制,可有多个VS接口用于数据传输;
3.11个操作函数可以分为四类:数据buf的操作、摄像头格式的操作、摄像头属性的操作、摄像头的启动与停止;
4.数据buf的操作:
  a.根据应用层参数生成指定个数的v4l2_buffer,这些buf又同时在两个队列上:mianququeirqquque
  b.摄像头产生的数据通过VS接口和USB核心的URB,放入irqquque队列的首buf,并将该buf从该队列删除;
  c.应用层取出mianquque队列的首buf,得到数据,并将该buf从该队列删除,此时该buf同时不在两个队列上,将被重新放在尾部;
5.摄像头格式的操作:使用interface_to_usbdev()得到对应接口的USB设备描述符,描述符包含摄像头的各种特性信息,保存在v4l2_format结构体中;
6.摄像头属性的操作:使用·usb_control_msg()通过VC接口设置相关属性;

有了上面的基本概念,现在开始调用vidioc_streamon()启动传输:
1.设置USB摄像头对应带宽接口等;
2.分配usb_buffersurb,设置urb
3.上报urb,USB核心解析urb,向指定接口(摄像头VS接口)接收数据(放在usb_buffers);
4.urb传输完成后产生中断,中断里取出irqquque队列首buf,将usb_buffers数据放入,并唤醒休眠的poll
5.poll唤醒,vidioc_dqbuf()mianquque队列取出首buf,返回给应用层,完成了摄像头数据到应用层的传输。

技术图片

技术图片

技术图片

技术图片

这里的队列图

技术图片

技术图片

以上是关于V4L2学习流程的主要内容,如果未能解决你的问题,请参考以下文章

linux之V4L2摄像头应用流程

v4l2读取摄像头程序流程解析

V4l2视频输出实现流程

android摄像头(camera)之 v4l2的c测试代码

V4L2学习笔记

V4L2学习笔记