视频监控—V4L2框架的简单分析
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:Video for Linux Two - Driver Writer’s Guide、《Android驱动开发权威指南》
- 开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
目录
一、概述
1、V4L2
V4L,其全称是Ⅴideo4 Linux(即 Video for Linux),是 Linux内核中关于视频设备的API接口,涉及开关视频设备,以及从该类设备采集并处理相关的音、视频信息。
现在 Linux内核中用的是V4L2,即 Video4 Linux2(即 Video for Linux Two),其是修改V4L相关Bug后的一个升级版,始于 Linux2.5内核。
V4L2的主设备号是81,次设备号为0~255。这些次设备号里又分为多类设备:视频设备、 Radio(收音机)设备、 Teletext on VBI等。因此V4L2设备对应的文件节点有:/dev/videoX、/dev/vbix、/dev/ radioX。
2、UVC
UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准,在不需要安装任何的驱动程序下即插即用,包括摄像头、数字摄影机、模拟视频转换器、电视卡及静态视频相机。
二、从UVC设备文件反推V4L2框架
备注
- 涉及文件:uvc_driver.c、v4l2-dev.c、v4l2-ctrls.c、v4l2-iocl.c、vivi.c
- 下面的分析为个人看法,肯定有所不足,望各位提出宝贵修改意见
1、uvc_driver
- uvc_driver结构体:
从图中可以看出uvc_driver采用platform平台机制进行管理,其中比较关键的函数就是.probe
- uvc_probe():
在这个函数中主要进行如下设置,其中我们会看到
一个比较显眼的函数v4l2_device_register()
,这个函数并不是实际意义上的v4l2_device注册函数(可以理解为v4l2_device_init()
,进行一些相关初始化工作),但是是后面介绍到的V4L2框架的一员。