linux学习记录
分类:
2010-08-04 14:05:45
source: http://jqiaoqiao.spaces.live.com/blog/cns!DF4CC04C9EF224EC!161.entry
这一部分看来总是弄不明白,先放在这等慢慢整明白了再 总结
V4L规范[4]
V4L与V4L2是Linux下开发视频采集设备驱动程序的一套规范,这套规范使用分层的方法给驱动程序的开发提供了清晰的模型和一致的接口。应用程序处于最上层,V4L或V4L2处于中间层,而实际的硬件设备处于下层。
3.1 V4L
V4L是Video for Linux的简写,它是Alan Cox为了给Linux下视频采集设备驱动程序的编写提供统一的接口而提出的一套规范(API),它将所有的视频采集设备的驱动程序都纳入它的管理之中,给驱动程序编写者带来极大的方便。
3.2 V4L2
鉴于V4L的种种不足,Bill Dirks重新设计了一套API和数据结构,并把它称作Video for Linux Two(V4L2)。与V4L相比,它的扩展性和灵活性都得到了极大的提高,并且支持的硬件设备也更多。但是也由于它对V4L做了彻底的改造,使得它与 V4L并不兼容。
V4L2是一个两层驱动结构:上层是videodev模块,当videodev初始化后,它 把自己注册一个主设备号为81的字符设备,同时注册自己的字符驱动成员函数;下层是V4L2驱动程序,它实际上是videodev的客户 端,videodev通过V4L2驱动程序的成员函数来调用V4L2驱动程序。当V4L2驱动程序初始化后,它把一个包含V4L2 驱动程序成员函数,次设备号以及其他相关信息的结构传递给videodev,从而把它要处理的设备注册到videodev。当应用程序触发了一个驱动程序 调用时,控制权首先传递给videodev中的函数,videodev负责将应用程序传递的文件或i节点结构指针转化为相应V4L2结构的指针,并调用 V4L2驱动中的处理函数。
当V4L2驱动程序初始化时候,它首先会枚举它将处理的系统中的设备,然后为每个设备填充 struct v4l2_device结构,并把指向该结构的指针传递给v4l2_register _device ()函数,该函数调用v4l2_device结构中的初始化函数对设备进行初始化。
Struct v4l2_device结构中的主要域说明如下:
Char name[32]:设备的名字,该名字会出现在/proc/Videodev文件中;
Int type:V4L2设备类型;
Int minor:设备得次设备号;
Int(*open)():当打开新的文件描述符时调用;
Int(*close)():当关闭文件描述符时调用;
Int(*read)():调用read();
Int(*write)():调用write();
Int(*ioctl)():调用ioctl();
Int(*mmap)():调用mmap();
Int(*poll)():调用select();
Int(*initialize)():当设备注册时调用;
Int busy:设备的打开计数,由videodev维护;
设备通过函数v4l2_unregister_device()取消注册;V4L2允许设备多次打开,上面的v4l2_device结构中的成员函数都具有一个id参数,该参数可以把设备的多次打开区分开来。