V4L2 Device Driver详解<一> 基础知识
(2012-12-26 11:02:43)
标签:
kernelv4l2 |
分类: linux_kernel |
作者: Sam (甄峰) sam_code@hotmail.com
Sam当前开发程序的核心模块是在Linux (Android)下设置和读取Camera各类信息。但之前对V4L2
的研究都是断断续续,且只是从应用层编码实现。知识结构和其内部的前因后果并不是特别清楚。这对Sam来说是个隐患。现决定研究V4L2
Device Driver,来切实消除这个隐患。
先从基础的V4L2 kernel功能函数说起:
1. 注册V4L2 device.
int video_register_device(struct video_device *vdev, int type,
int nr)
参数一:struct video_device *
vdev:
我们想要注册的Video Device结构体。
参数二:int type:
要注册的device类型。其中包括:
#define VFL_TYPE_GRABBER 0 //图像采集设备,包括摄像头,调谐器等。
#define VFL_TYPE_VBI 1
//从视频消隐的时间段取得信息的设备(注1)
#define VFL_TYPE_RADIO 2
//无线电设备
#define VFL_TYPE_VTX 3
// 视频传播设备
#define VFL_TYPE_MAX 4
参数三: int nr:
device node number
(0 == /dev/video0, 1 == /dev/video1, ... -1
== first free)
此函数注册一个V4L2 Device。 指定类型,指定device
node.(通过参数3)
int video_register_device(struct video_device *vdev, int
type, int nr)
它只是非常简单的调用了以下function:
return __video_register_device(vdev, type, nr,
1);
注意,在调用此注册Function时,参数一:vdev(struct
video_device)中一些项目已经被定义,而另一些项目则等待被填充定义。且这些将要被填充定义的项目内容,与已经定义的内容息息相关。
此函数主要做以下工作:
1. 初始化一些值:
它通过参数2 type来确定 devicename.
例如:type 为 VFL_TYPE_GRABBER。 则device
name应该就是video.
2. 创建字符模式驱动:
利用cdev_xxx系列函数,创建了字符模式驱动,注意,其ops采用的是V4L2公用的v4l2_fops.
其放置在driver/media/video/v4l2-dev.c中。
利用cdev_add()将driver注册入系统,并将driver与主设备号81相联系起来。
3. 注册字符设备:
利用device_register()注册设备。此设备主设备号也为81。此时,将通过type得到的devicename与次设备号结合,产生/dev/videoX的node.
当用户通过open(),
read(),write(),close()访问此node时,系统会通过这个主设备号81找到fops.采用字符设备驱动程序中的fops.
注1:VBI:
VBI= vertical blanking interval,也就是我们讲的场消隐期间。
VBI在电视处理中是用来是垂直扫描完成从屏幕底部回到屏幕顶部的时间。在这期间,没有任何的图像信息,在原来是基本废置不用的。后来,利用这期间来传输一些信息,比如CC,图文,VPS/PDC,GEMSTAR等等信息服务。
VBI在电视处理中是用来是垂直扫描完成从屏幕底部回到屏幕顶部的时间。在这期间,没有任何的图像信息,在原来是基本废置不用的。后来,利用这期间来传输一些信息,比如CC,图文,VPS/PDC,GEMSTAR等等信息服务。