基于V4L2的Linux摄像头驱动的实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式视频监控技术飞速发展,系统多采用 Linux 动,即 USB 接口层驱动,主要功能是为系统与设备的
操作系统作为其软件平台。V4L2( Video For Linux 2) 通信提 供 管 道。( 2 ) 实 现 硬 件 自 身 功 能 的 驱 动,即
是 Linux 2. 6 内核中广泛采用的内核视频驱动模型,与 V4L2 驱动。驱动层次如图 1 所示。
表 2 ioctl 常用命令标识符
操作函数
功能描述
VIDIOC_CROPCAP
视频信息的裁剪 和缩放
VIDIOC_G_CROP
读取当前裁剪的矩形区域
VIDIOC_S_CROP VIDIOC_G_FMT VIDIOC_S_FMT VIDIOC_G_STD VIDIOC_S_STD VIDIOC_QBUF VIDIOC_DQBUF VIDIOC_QUERYCAP
( 下转第 92 页)
www. dianzikeji. org
87
图像·编码与软件
张国飞,等: 基于 DSP / BIOS 大空间网络型火灾探测系统设计
采用了面向连接的 TCP 协议。该模式下的应用程序 是采用 Socket 网络编程的方式进行开发的,以太网在
4 结束语
链路层的最大传输单元为 1 500 Byte,所以必须对每帧
架构,对 V4L2 不兼容,一些高端应用如 ARtoolkit,也
仅支持 V4L 架构。因此,有必要基于 V4L2 驱动架构,
设计针对普通摄像头的驱动程序。
设计采用的摄像头型号为 Sonix 公司生产的 USB 摄像头,嵌入式开发平台为 gplugD,处理器为 Marvell
图 1 视频设备驱动层次
86
www. dianzikeji. org
王飞,等: 基于 V4L2 的 Linux 摄像头驱动的实现
图像·编码与软件
驱动所支持的 USB 设备列表,它指向 usb_device_id 结 构体,该结构体包含 USB 设备的制造商 ID、产品 ID、 产品版本、设备类等信息[3]。
USB 驱动根据 USB 设备的 ID 识别设备。当 USB
同时加载驱动程序的成员函数、次设备号以及其他相
关信息,使设备可以正常工作。V4L2 常用接口函数如
表 1 所示。
表 1 V4L2 常用接口函数
操作函数
功能描述
open( )
打开一个 V4L2 设备
close( )
关闭一个 V4L2 设备
ioctl( )
对 V4L2 的设置
mmap( )
映射内核空间到用户空间
视频设备。对 usb_driver 的注册和注销通过这两个函
收稿日期: 2011-07-20 作者简介: 王飞 ( 1986—) ,男,硕士研究生。研究方向: 嵌 入式系统设计。孔聪( 1986—) ,男,硕士研究生。研究方向: 嵌入式系统设计。
数完成: int usb_register( struct usb_driver * new_driver) ; void usb_deregister( struct usb_driver * driver) ; struct usb_dirver 中的 id_table 成员描述了该 USB
社,2007. [2] Philips Semiconductors. SAA7113H9 - bit video input pro-
cessor [M]. Netherlands: Philips Semiconductors,1999.
[3] Texas Instruments. TL16C752B3. 3 - V DUAL UART WITH 64
息以网页的形式送入局域网,再经过路由器的端口映 射传至因特网。例如,在局域网内部设置 Web 服务器
参考文献
的 IP 地 址 为 192. 168. 0. 11,在 地 址 栏 输 入 该 地 址, [1] 冬 雷. DSP 原 理 及 开 发 技 术[M]. 北 京: 清 华 大 学 出 版
Web 服务器访问结果如图 6 所示。
- BYTE FIFO[M]. United States: Texas Instruments,2000.
[4] 陈煜,胡剑凌,王超. 基于 DSP / BIOS 的 TI DSP 应用程序
框架设计[J]. 微计算机信息,2009,25( 5) : 130 - 132.
[5] 李晓静,鲁亿方,刘贺平. 基于 RF 框架的视频编解码系统
设备插入主机时,Linux 内核会根据 ID 和各 USB 驱动
模块 MODULE_DEVICE_TABLE 中的设备 ID 对比,找
到匹配的驱动模块后进行加载。
1. 2 V4L2 的视频采集模型
当视频设备连接到主机后,驱动程序会首先注册 一个主设备号为 81 的字符设备[4],它是硬件惟一的身 份标识。驱动程序利用主设备号识别硬件,而系统内 核则利用主设备号使设备与对应的驱动程序相结合,
3 视频采集应用程序及测试
可以使用支持 V4L2 标准的开源 LuvcView 打开设 备并进行测试,也可以按照 V4L2 规范自行编写,基于 V4L2 视频采集流程如图 3 所示。
其中,mmap( ) 实现了内存从内核空间到用户空间的 映射,不需要任何数据拷贝,提高了数据传输效率。ioctl ( ) 函数管理设备的 I / O 通道,设置视频制式和帧格式,同 时查询当前设备的属性。主要 ioctl 命令如表 2所示。
Implementation of Linux Video Capture Driver Based on V4L2 Architecture
WANG Fei,KONG Cong ( School of Electronic Engineering,Xidian University,Xi'an 710071,China) Abstract Video For Linux Two is the latest standard for Linux video capture driver. This article introduces the driver model of V4L2,on the basis of which a USB video capture driver is designed to achieve the function of video capture. Besides,transplantation and testing were implemented on the gplugD platform. This video capture driver can be easily applied to other hand-held devices and has good real-timeness. Keywords V4L2; USB video capture driver; Linux driver
过 usb_register( ) ,主要是向 USB 核心描述驱动,从而 创建 struct usb_driver 结构,在该结构中初始化 4 个指 针,即 指 向 驱 动 程 序 名 字 的 name,指 向 探 测 函 数 的 probe,指向断开函数的 disconnect 和指向设备列表的 id_table。
munmap
取消设备内存映射
read( )
从 V4L2 设备读取数据
write( )
向 V4L2 设备写入数据
Select( )
同步 I /O 复用
Poll( )
等待事件文件符
下步骤完成: ( 1) 首先确定驱动程序支持的设备,通过结构体
struct usb_device_id 定义驱动程序支持的设备。 ( 2) 调用 module_init 初始化模块,在初始化中通
的优化与仿真[J]. 计算机仿真,2008( 8) : 186 - 188.
[6] 王玮,张卫宁,史英,等. 基于 TMS320DM642 的网络功能开发
的研究与实现[J]. 计算机应用,2006,26( z2) : 300 - 302.
[7] 梁迅,熊水东,唐昆. DM642 嵌入 式 网 络 接 口 开 发 设 计
设置当前裁剪的矩形区域 读取数据格式并进行格式化 设置数据格式并进行格式化
读取当前输入的视频标准 设置当前输入的视频标准
缓存从队列中出列 缓存入列队列 查询设备属性
2 视频设备驱动程序实现
根据以上定义的驱动模型,视频驱动开发可按以
图 2 V4L2 视频采集流程图
( 1) 采用阻塞模式打开摄像头设备,获得文件描述符。 ( 2) 查看设备功能,是否支持视频捕获、是否支持 流采集等。 ( 3) 设 置 图 像 格 式,如 将 图 像 Width 设 为 640, Height 设为 480,像素格式设为 UYUV。 ( 4) 向驱动申请 4 个缓存区,分别在内核空间和 用户空间分配内存缓冲区,使用 mmap( ) 函数实现内 存映射。主要调用函数如下:
( 3) 根据 V4L2 协议规范,文件操作接口实现设备 的关键系统调用。
( 4) V4L2 可以自定义驱动缓存数量,主要通过 ioctl 命令 VIDIOC_REQBUFS 实现,图像数据缓存采用 FIFO 方式,缓存队列将已采集到的视频图像数据的设备缓存 出队列,此时与之映射的内存空间就存储了采集到得视 频图像数据,处理完毕使设备缓存重新加入队列。
通过实例介绍了基于 DSP / BIOS 的大空间网络型
视频在 IP 层进行分片操作。同时需要在上位机上开 火灾探测系统的具体开发流程。利用对 TMS320DM642
发基于VC ++ 6. 0 的客户端程序,为实现视频数据高 外围电路的分析和对接口驱动芯片的详细阐述,开发了
质量的显示效果,系统采用微软公司推出的流媒体处 基于 DSP / BIOS 与 RF5 系统架构的应用程序。另外,系
公司的 PXA168。该平台上移植了 Linux2. 6. 29 的操 作系统。
1. 1 USB 接口层驱动模型 编写 USB 设备驱动,主要应完成的工作是 probe
1 视频设备驱动模型
视频设备驱动分为两部分: ( 1) 硬件的接口层驱
Leabharlann Baidu
( ) 和 disconnect( ) 函数,即探测和断开函数,它们分别 在设备插入和拔出时被调用,用于初始化和释放软硬 件资源。probe( ) 函数的主要工作是配置 USB 设备为
图像·编码与软件
2012 年第 25 卷第 2 期 Electronic Sci. & Tech. / Feb. 15,2012
基于 V4L2 的 Linux 摄像头驱动的实现
王 飞,孔 聪
( 西安电子科技大学 电子工程学院,陕西 西安 710071) 摘 要 V4L2 是 Linux 下处理视频设备的最新标准,文中介绍了该标准的驱动模型,并在此基础上设计实现了普 通 USB 摄像头的驱动程序及图像采集程序。在 gplugD 平台上移植并测试,该驱动可以方便应用到各种嵌入式手持设 备中,实时性良好。 关键词 V4L2; USB 摄像头; Linux 驱动 中图分类号 TP334. 2 + 5 文献标识码 A 文章编号 1007 - 7820(2012)02 - 086 - 03
之前的 V4L 相比,有更好的扩展性和灵活性,V4L2 是
对 V4L 作了彻底改动,因此两者并不兼容,V4L2 的最
大优势是可以自定义设备驱动缓存数量,支持的硬件 设备也更多[1]。在对视频设备数据的读 / 写中,应用程
序可以通过内存映射方式获得位于内核空间的图像数
据。减少内核态到用户态的数据拷贝,显著提高了系 统的吞吐量[2]。但多数摄像头设备的驱动基于 V4L
[J]. 计算机工程,2007,33( 16) : 277 - 279.
图 6 Web 服务器访问结果
檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪檪
理开发包 Directshow 对视频数据进行译码显示。
统把烟雾、火焰检测算法集成于 RF5 架构的算法内核,
在 Browser / Server 模式中,利用 DM642 的嵌入式 并且采用 TI 的 NDK 进行网络开发,这样将更加有利于
文件系统创建 Web 服务器,便于将火灾现场的视频信 系统的移植以及产品的升级与推广。
相关文档
最新文档