基于PCI总线的视频采集卡驱动程序的设计与实现

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

第5卷 第10期 中 国 水 运 Vol.5 No.10 2007年 10月 China Water Transport October 2007

收稿日期:2007-8-4

作者简介:周敏均 (1983-) 杭州电子科技大学 自动化学院 研究生 (310012) 研究方向:检测技术与自动化装置

基于PCI 总线的视频采集卡驱动程序的设计与实现

周敏均 杨成忠 江加加

摘 要:本文介绍了基于PCI 总线的视频采集卡驱动程序的设计和实现。视频采集卡基于PCI 总线的设计更好地满足了高速大容量的数据传输需求;针对视频设备的内核流驱动的设计更方便了上层应用软件的开发。该视频采集卡驱动已经成功应用于视频监控系统中,有效地提高了视频监控系统的功效。 关键词:PCI 总线 视频采集卡 内核流驱动

中图分类号:TP311.131 文献标识码:A 文章编号:1006-7973(2007)10-0149-03

一、引言

随着计算机、网络、多媒体技术以及全球安防事业的迅猛发展,数字视频技术得到了长足地发展,视频采集卡的应用也越来越广泛。但是由于视频数据传输高速、大量的特点,传统的使用基于串口、并口或ISA 总线传输数据的方式已经不能满足其传输的需求。同时,由于其复杂性,现在各厂商都是自己提供采集卡的SDK,没有统一的界面,使得上层应用的开发和设备的使用非常不便,而基于内核流的驱动程序能够很好的解决这个问题,上层应用程序能够通过系统提供的统一接口访问底层硬件。当前,基于PCI 总线的视频采集卡以其强大而灵活的功能、高度的集成性成为主流产品。为此,本文设计了基于PCI 总线的视频采集卡,并开发了相应的基于内核流的驱动程序。

二、视频采集卡硬件系统

PCI 总线是近年来出现的一种高性能的局部总线,它理论上提供133MB/s 的传输速率,支持猝发式读写,具备完整的多总线主控能力,支持即插即用,很适合网络适配器、硬盘驱动器、全动态数字视频卡、图形卡及各类高速外设应用。PCI 总线规范十分复杂,其接口的实现比ISA、EISA 困难,目前实现PCI 接口的有效方案有使用可编程逻辑器件和使用专门芯片两种。 图1 视频监控系统总体框图

在高分辨率图像实时处理中数据量相当庞大,视频采集卡必须不间断地采集视频序列中的每帧图像,同时在采集下一帧视频数据时必须把这些数据传入PC 系统。如果不能及时地处理第一帧数据,使得处理时间超过相邻两帧之间的间

隔时间,则会出现数据丢失现象。该视频采集卡采用SAA7130HL 视频采集芯片将模

拟视频信号转化为数字图像数据,再通过PCI 总线接口芯片PCI6150将数字图像

数据读入计算机,最后通过应用程序将图像显示出来。这个设计能充分满足视频传输及处理的需求。视频监控系统总体框图如图1。

三、视频采集卡驱动程序设计

为了支持新的业务和新的PC 外部设备类型对驱动程序的开发,微软推出了用于Windows2000和Windows NT 的统一的WDM(Windows Driver Model,简称WDM)驱动程序模型。而内核流驱动是针对多媒体设备的驱动模型,它是WDM 重要组成部分。它的存在将使上层应用程序的开发更加方便,应用程序通过系统提供的统一接口即可使用设备。

1.驱动工作原理

内核流驱动是一种内核模式驱动。它的工作原理为: (1)当视频采集卡插入PCI 插槽,系统的PnP 管理器检测到和内核流驱动匹配的视频设备时,便通过I/O 管理器向流类驱动(Stream class driver)发送设备的I/O 请求,如:对设备的初始化等。

(2)同时,流小驱动(stream minidriver)向流类驱动进行注册,告知流类驱动它是合法的,接着流类驱动把接收到的I/O 请求以SRB (流请求块)的形式发送给流小驱动。

(3)流小驱动得到SRB 后,将其进行解析并把得到的信息(如对设备进行初始化)通过回调函数返送给流类驱动,流类驱动便根据流小驱动返送的信息创建相应的功能设备对象、DMA 适配器以及分配缓存等。

(4)建立video capture、preview 和VBI 输出pin 的过滤器,以及输入资源选择的crossbar。

(5)当驱动得到视频流数据后一路直接送到显卡进行显示,另一路则进行视频压缩保存起来。

2.驱动的初始化

150 中 国 水 运 第5卷

内核流驱动进行初始化时,操作系统首先调用DriverEntry 程序去初始化小驱动。小驱动向类驱动注册时,小驱动会调用StreamClassRegisterMinidriver 函数传递一个HW_INITIALIZATION_DATA 的结构给流类驱动。而流类驱动通过调用该结构的信息对流小驱动进行初始化,其中包含一些回调函数和DMA 配置等。HW_INITIALIZA TION_DATA 结构如下:

typedef struct HW_INITIALIZATION_DATA {

ULONG HwInitializationDataSize; PHW_INTERRUPT HwInterrupt; PHW_RECEIVE_DEVICE_SRB HwReceivePacket;

PHW_CANCEL_SRB HwCancelPacket; PHW_REQUEST_TIMEOUT_HANDLER HwRequestTimeoutHandler;

ULONG DeviceExtensionSize; ULONG PerRequestExtensionSize; ULONG PerStreamExtensionSize; ULONG FilterInstanceExtensionSize; BOOLEAN BusMasterDMA; BOOLEAN Dma24BitAddresses; ULONG BufferAlignment;

BOOLEAN TurnOffSynchronization; ULONG DmaBufferSize; ULONG Reserved[2];

} HW_INITIALIZATION_DATA, *PHW_INITIALIZATI ON_DATA;

然后,类驱动使用StrMiniReceiveDevicePacket 通知流小驱动初始化设备。它发送SRB_INITIALIZE_DEVICE 请求,同时传送包含所需硬件信息的PROT_CONFIGURAT ION_ INFORMATION 结构给流小驱动。当完成此请求后,类驱动使用StrMiniReceiveDevicePacket 发送SRB_GET_STREAM _INFO 请求去向流小驱动得到所有流信息及每个流的回调函数。一旦类驱动完成流数据的处理便使用StrMi niReceive DevicePacket 去发送SRB_INITIAL IZATION_ COMPLETE 请求。这时,流小驱动便准备开始处理每个流请求。

3.流请求块(SRB)处理

流请求块是流小驱动对命令和信息控制的最基本机制。通过它流小驱动可以对其某个特定功能进行访问。操作系统把视频采集卡的I/O 请求分发给流类驱动,流类驱动再把这些请求以流请求块的形式传递给流小驱动。当流小驱动解析出相关硬件的信息再用派遣函数返还给流类驱动,以此流类驱动完成相应的硬件操作。

总的来说,流小驱动和每个流都可能接收I/O 请求。小驱动必须提供StrMiniReceiveDevicePacket 程序去处理各种设备请求。每个流都必须有两个程序去处理I/O 请求:数据请求和控制请求。类驱动通过调用数据请求回调函数Str-

MiniReceiveStreamDataPacket 去处理所有的流读写请求。所有其他的流请求通过strMiniReceiveStream ControlPacket 去传送。假如类驱动正在处理小驱动的同步操作,它便把这些请求排队,一次次地把这些请求分发给小驱动。类驱动维持着三个分离的队列,也就是流请求块的请求类型可分为三类:

(1)设备请求 (2)流控制请求 (3)流数据请求

流小驱动针对这三类请求有相应的例程,如表1:

请求类型 例程

例程变量的消息类型 设备请求 StreamClassDeviceNotification ReadyForNextDeviceRequest 流控制请求 StreamClassStreamNotification ReadyForNextStreamControlRequest 流数据请求

StreamClassStreamNotification

ReadyForNextStreamDataRequest

表1 流请求对应例程

例如当操作系统接收到的视频采集卡I/O 请求是对设备的初始化。它便把这个请求分发给流类驱动。流类驱动再把此设备请求以SRB_INITIALIZE_DEVICE 形式传递给流小驱动。由于SRB_INITIALIZE_DEVICE 带有视频卡初始化的信息,所以当流小驱动再把解析出来的信息返还给流类驱动时,就可以通过调用函数OnCreateAdapter()来创建设备的适配器完成设备的初始化。

流请求SRB_INITIALIZE_DEVICE 的处理流程如图2

图2 SRB_INITIALIZE_DEVICE 处理流程

4.流小驱动的控制

PnP 管理器检测到流小驱动支持的硬件适配器,然后管理器核查注册表去解析符号应用,同时把请求传送给I/O 子系统。I/O 子系统装载流小驱动,调用小驱动的DriverEntry 例程。在DriverEntry 例程中,将分配和初始化HW_INITIALIZATION_DATA 结构。根据DriverEntry 程序中的信息,一个文件对象将被创建。然后,流小驱动的DriverEntry 例程调用流类驱动的StreamClassRegiste rMinidriver 函数,同时把HW_INITIALIZATION_DATA 结

构作为参数传递给此函数。HW_INITIALIZATION_DATA 结构包含处理SRBs 的流小驱动函数的地址。这样流小驱动就能对类驱动发送的SRBs 做出反应。在初始化过程中,流类驱动调用在HW_INITIALIZATION_DATA 结构中指定的接收SRB_INITIALIZE_DEVICE 的函数。随后,流小驱动初始化硬件适配器。

相关文档
最新文档