基于Linux操作系统的视频采集卡驱动程序设计
1 引言
Linux操作系统以其本身强大的性能、卓越的稳定性和开放源代码的优点正在得到越来越广泛的应用。设备驱动程序在linux内核中扮演着特殊的角色,它们是一个个独立的“黑盒子”,使得特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是驱动程序的任务[1]。
本文撰写的背景是源于我们自己开发的CDMA无线视频传输系统,该传输系统的视频采集模块使用Philip SAA7146+ SAA7111a,本文主要介绍linux环境下视频采集设备驱动程序的编写。
2 采集芯片简介[2][3]
开发驱动程序的第一步就是详细了解硬件设备的规格,这样才能具体操纵硬件,实现硬件特定的操作,因此首先介绍一下Philip SAA7146及7111A芯片。
Philip SAA7146是PCI总线控制设备,它负责初始化并处理PCI总线上的数据传输,在这个意义上说它是主设备;而7111a是从设备,它只是所谓的视频解码器,负责将模拟视频信号解码为数字比特流。对于后者,只需要通过I2C总线进行编程,而不必直接控制该设备。它并不具有总线控制能力,因此不能在PCI 总线上找到它。因此7111a并不需要专门的驱动程序,它是通过主控芯片(SAA7146)经由I2C总线来驱动的,我们只需要编写主控芯片的驱动程序即可。
3 V4L规范[4]
V4L与V4L2是Linux下开发视频采集设备驱动程序的一套规范,这套规范使用分层的方法给驱动程序的开发提供了清晰的模型和一致的接口。应用程序处于最上层,V4L或V4L2处于中间层,而实际的硬件设备处于下层。
3.1 V4L
V4L是Video forLinux的简写,它是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驱动程序初始化时候,它首先会枚举它将处理的系统中的设备,然后为每个设备填充structv4l2_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参数,该参数可以把设备的多次打开区分开来。
4 采集卡驱动程序的基本结构及实现
4.1 驱动程序基本结构
整个驱动程序分为三层:
模块Saa7146_v4l2直接操作硬件设备,它主要提供基于SAA7146芯片的采集设备的核心功能,也可将其称作核心驱动程序;同时驱动程序还提供了扩展机制,用于扩充核心驱动程序的功能,这样做的好处就是可以在extension模块当中实现自己想要的附加功能,而不用修改核心部分。显然,该扩展模块也对硬件设备具有完全的控制权。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)linux相关文章:linux教程
评论