(一)V4L2学习流程
V4L2学习流程
参考资料
关键资料,插图让人一下子就理解了
从更大的角度去看V4L2框架,不局限在摄像头
排版不错的笔记
下面的排版不太好,但是更具体
其他系列文章笔记
USB摄像头驱动配置及V4L2编程
UVC 摄像头驱动(三)配置摄像头,实时数据采集
UVC 摄像头驱动(三)配置摄像头,实时数据采集
USB驱动函数总结
UVC 摄像头驱动(二)描述符分析
UVC 摄像头驱动(一)硬件描述
V4L2(三)编写虚拟摄像头驱动
V4L2(二)虚拟摄像头驱动vivi深入分析
V4L2(一)框架浅析
学习流程
- 学习vivi的代码,抛开USB相关的细节,去了解linux下的v4l2的框架
- 自己编写vivi的代码,实现在ubuntu下的使用
- 学习具体的uvc规范
- 学习uvc的代码,了解下usb如何鱼v4l2搭配使用
- 自己编写一个uvc代码
其实自己压根没敲代码,只是学习框架,以后用到的时候再去试试,各个版本的代码调用都不一样,新的linux4.x的videobuf 封装的更好了,好像都能直接用的那种
插图一览
这是参考资料的大图Linux摄像头驱动2——UVC,本人还没有那么高的功底 哈哈
几个基本概念:
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()
启动传输:
1.设置USB摄像头对应带宽接口等;
2.分配usb_buffers
和urb
,设置urb
;
3.上报urb
,USB核心解析urb
,向指定接口(摄像头VS接口)接收数据(放在usb_buffers
);
4.urb
传输完成后产生中断,中断里取出irqquque
队列首buf,将usb_buffers
数据放入,并唤醒休眠的poll
;
5.poll
唤醒,vidioc_dqbuf()
从mianquque
队列取出首buf,返回给应用层,完成了摄像头数据到应用层的传输。
这里的队列图