NT下视频采集及解压驱动程序的设计6/14

摘要:分析了多媒体设备驱动程序的体系结构及视频采集与解压卡的驱动程序设计方案。描述了核心态驱动程序的处理流程,提供了用户态驱动程序的设计思路和具体算法。


    关键词:驱动程序 IRP(输入输出请求包) 驱动程序对象 设备对象


    Windows NT的结构决定了应用程序不能直接操作硬件设备,它只能通过一个中间层来读写和控制设备,这个中间层就是驱动程序。驱动程序位于计算机软件的最低层(HAL 为硬件抽象层),直接与硬件设备的特性联系在一起。编写驱动程序不仅要了解设备的特性,而且还要了解操作系统的结构,难度较大。本文比较详细地分析了视频采集与解压卡的驱动程序设计思路。
    1 视频采集与解压卡驱动程序的结构
    多媒体设备相对变通设备来说,有两个特点:数据流量大;对最终期限要求高(即实时性要求比较高)。对于视频采集与解压卡这类多媒体设备来说,驱动程序的编写有其特定的方式。多媒体驱动程序的结构如图1所示。一般说来,根据其代码运行的特权级可分为两层:核心态的驱动程序和用户态的驱动程序。核心态的驱动程序运行于内核模式。可以执行特权级指令,对任何I/O设备有全部的访问权,还能够访问任何虚地址和控制虚拟内存硬件。
    用户模式的驱动程序实质上是一个动态链接库(DLL)。它运行在用户态,应用程序向这个接口发出消息请求一定的操作。它们调用WIN32函数与内核模式的驱动程序通讯(WIN32函数又调用NT执行体提供的函数,这些执行体函数提供从用户态到核心态的上下文转换)。用户模式的驱动程序根据接收的消息采取适当的操作,完成操作后将结果返回给应用程序。但是这种结构只适用于解压一幅幅的位图,并不适合采集和解压本设备产生的视频流。
    此卡既要采集又要解压,若用标准模式进行设计,就要同时编写视频采集和视频解压的驱动程序,其中还要对解压程序进行改造,编写复杂,尤其调试会很困难。在这种情况下,使用本设计方案,既可满足要求,又可减小设计难度。
    内核模式的驱动程序与一般驱动程序无多大的区别,只负责读取数据和进行设备控制。用户模式的驱动程序要处理大部分的事务。在解压时,驱动程序要向设备写入待解压的数据,从设备中取得解压后的数据,向应用程序提供一帧图像的RGB数据。从设备得到的数据是分场存放的4:2:2的YcrCb格式的数据,驱动程序将每帧数据按行进行格式转换,组合成完整的一帧数据(QCIF)交付给应用程序。
    2 内核模式的驱动程序的设计
    由于多媒体的数据量很大,按照常规的方法(采用IRP包进行数据传输)设计将面临着一个无法解决的问题——中断太快驱动程序将来不及处理。因此必须采用一种新的方法:在驱动程序中建立两块缓冲区(分别用于读写),应用层驱动程序与核心层驱动程序共用缓冲区。当设备中断发生时,根据发生的中断进行处理。如果是读中断,先把数据从设备中读到缓冲区中,发出一个DPC(推迟过程调用),通知应用层驱动程序该缓冲区数据可用,可以取走数据了。如果是写中断,先把缓冲区中的数据写到设备的FIFO中,然后发出一个DPC,通知用户模式驱动程序该缓冲区数据已失效,需要写入新数据。
    内核模式向外显露DriverEntry(驱动程序必须要有的一个全程)接口,其它的全程没有固定的名字,为了让I/O管理器找到这些例程,DriverEntry例程负责建立这些函数指针。I/O管理器从非分页系统内存分配一个IRP,响应一个I/O请求,基于由用户指定的I/O函数,把IRP传送给合适的驱动程序Dispatch例程,Dispatch例程检查请求的参数,如果它们是有效的,使用IRP的内容设置设备操作。当操作完成时,在IRP中存放最后的状态代码,并把它送回I/O管理器;I/O管理器使用IRP中的信息完成请求,并把最后状态发送给请求者。
    

    当驱动程序被加载到系统中时,I/O管理器将创建一个驱动程序对象(在系统中代表一个独立的驱动程序,并且为I/O管理记录每个驱动程序的调度例程的地址),然后调用其初始化例程。
    在DriverEntry这个初始化例程中完成的任务是:
    ·把驱动程序的入口真入该驱动程序对象中。
    ·用设备的VID和DID查代每条总线上的每个插槽,找到这块图像压缩解压卡,并且IoCreateDevice创建设备对象,用IoCreateSymbolicLink建立符号连接。
    ·初始化放在非分页区中的Device Extension中的各个分量。包括读写的IRP,以及保护各自队列的自旋锁等。
    ·设备有两块专有内存,必须将其总线相关地址转换成系统范围内的地址,并将其映射到系统虚空间。对于I/O端口,将其总线相关地址转换成系统范围内的地址即可。
    ·用ExAllocatePool()分配两块非分页缓存,并把它映射到用户地址中。
    在驱动程序读写设备之前,必须进一步初始化,表明设备驱动程序的用途:解码或编码。上层的驱动程序调用DeviceIoControl对工作模式进行设置,驱动程序收到此IRP后设置压缩解压芯片的工作模式及视频采集芯片、总线接口芯片的参数。在开始编码或解码之前,上层的驱动程序必须调用DeviceIoC

 

你可能感兴趣的:(算法,工作,dll,任务,通讯)