title: V4L2学习流程
date: 2019/4/23 18:00:00 toc: true ---V4L2学习流程
参考资料
关键资料,插图让人一下子就理解了
从更大的角度去看V4L2框架,不局限在摄像头
排版不错的笔记
下面的排版不太好,但是更具体
其他系列文章笔记
学习流程
- 学习vivi的代码,抛开USB相关的细节,去了解linux下的v4l2的框架
- 自己编写vivi的代码,实现在ubuntu下的使用
- 学习具体的uvc规范
- 学习uvc的代码,了解下usb如何鱼v4l2搭配使用
- 自己编写一个uvc代码
其实自己压根没敲代码,只是学习框架,以后用到的时候再去试试,各个版本的代码调用都不一样,新的linux4.x的videobuf 封装的更好了,好像都能直接用的那种
插图一览
这是参考资料的大图,本人还没有那么高的功底 哈哈
几个基本概念:
1.应用层有五个操作函数,其中ioctl
下至少有11个基本的操作函数; 2.USB摄像头有且只有一个VC
接口用于控制,可有多个VS
接口用于数据传输; 3.11个操作函数可以分为四类:数据buf的操作、摄像头格式的操作、摄像头属性的操作、摄像头的启动与停止; 4.数据buf的操作: a.根据应用层参数生成指定个数的v4l2_buffer
,这些buf又同时在两个队列上:mianquque
和irqquque
; 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()
启动传输:
usb_buffers
和urb
,设置urb
; 3.上报urb
,USB核心解析urb
,向指定接口(摄像头VS接口)接收数据(放在usb_buffers
); 4.urb
传输完成后产生中断,中断里取出irqquque
队列首buf,将usb_buffers
数据放入,并唤醒休眠的poll
; 5.poll
唤醒,vidioc_dqbuf()
从mianquque
队列取出首buf,返回给应用层,完成了摄像头数据到应用层的传输。 这里的队列图