现在的位置: 首页 > 综合 > 正文

v4l2-驱动编程指导

2013年07月10日 ⁄ 综合 ⁄ 共 1827字 ⁄ 字号 评论关闭

Video for Linux Two - Driver Writer's Guide

Bill Dirks - December 23, 1999(注v4l2子系统的作者)

Modified by Luc Gallant - November 9, 2005(lucgallant(_AT_)gmail_com)

 译者:围补

简介

既然有了那个涵盖了所有函数的API说明,为什么还要有这个文档呢?因为API说明文档仅仅说明了用户模式下的调用,但v4l2还有只跟内核模式相关的代码。这篇文档的目的是要描述v4l2驱动模块是怎样挂载到系统内的,说明v4l2内核模式的API,讨论驱动的实现问题,并且提供一些额外的驱动编程人员可使用的文件。

这篇文档假设读者熟悉v4l2用户模式API说明文档,也熟悉linux设备驱动编程相关的规则。《Linux Device Drivers》,作者Allessandro Rubini,ISBN 1-56592-292-1,应该是本标准的参考。

V4l2 Driver & videodev

V4l2是一个两层驱动系统。顶层是videodev模块。当video初始化时,会作为字符设备81来注册,并且注册他的一套字符驱动函数。所有v4l2驱动实际上是videodev的用户(client),并且videodev通过v4l2驱动函数调用该client驱动。When a V4L2 driver initializes, it registerseach device it will handle with videodev by passing to videodev a structurewhich
contains the V4L2 driver methods, a minor device number, and a coupleother details.(这几句没读懂,不清楚谁处理谁,要对照代码理解)。V4l2的函数与一般的linux字符驱动函数相似,但有一些v4l2驱动的特殊参数。当一个应用做驱动调用时,控制命令首先到达videodev的函数,再有它将该文件(file)或者节点(inode)结构体指针转换为相应的v4l2类型结构体指针,继而调用v4l2驱动的函数。因此,videodev的角色是作为一个壳包裹着v4l2驱动。Videodev是通过一个模块实现的,而且所有v4l2驱动也都是模块。

Videodev模块还包括一套帮助函数,v4l2驱动编程者可能会觉得有用。例如,一些简单的队列管理,将一个结构体指针file*转换为对应的v4l2结构体,还有内存映射帮助函数等等。

Driver Registration andMethod Calls

当一个驱动初始化的时候,它会枚举系统中的所有它将要处理的设备,而且它将每一个设备填充到一个单独的struct v4l2_device结构体中,并且把指向该结构体(the struct,不知道指哪个结构体)的指针传递给video_register_device()(分析代码,以参数形式传递给此函数的指针为struct video_device*类型的指针,即摄像头设备结构体指针)。video_register_device()将会保证次设备号(minor number)是可用的,且调用结构体struct
video_device的函数class_device_register。class_device_register is passed the devmember contained in the video_device pointer that was passed to video_register_device()。(关系没理清楚,翻译不了,请对照代码理解,且代码中找不到class_device_register这个函数!!)。如果class_device_register成功,那么注册完成了。Videodev会保存这个在内部表格中的指针,并像应用访问驱动那样来调用其函数。

在调用v4l2_register_device()之前,驱动必须填充name,type和minor字段,以及open函数。其他的函数和字段是可选的。字段type与结构体struct v4l2_capability中的type字段使用相同的值,它是V4L2_TYPE_*的标签。可以在完成注册之后改变函数字段。当驱动卸载是,它使用它的release()通过设备指针调用video_unregister_device()。

 译者:围补

抱歉!评论已关闭.