微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 视频信号采集与图象传输技术的研究----基于USB的图像传输接口设计

视频信号采集与图象传输技术的研究----基于USB的图像传输接口设计

时间:01-25 来源:3721RD 点击:

3.5.2设备驱动程序的功能

一个驱动程序可以做的工作有:

• 初始化它自己

• 创建和删除设备

• 处理Win32打开和关闭文件句柄的请求

• 处理Win32输入/输出(I/O)请求

• 串行化对设备的访问。访问硬件

• 调用其他驱动程序。取消I/O请求和超时I/O请求

• 处理一个可热插拔的设备被加入或删除的情况

• 处理电源管理请求

• 使用Windows Management Instrumentation(Windows管理诊断,WMI)和NT事件向系统管理员报告设备驱动程序在操作系统中的位置,以及它如何起作用,下图4-14说明得很清楚:

3.5.3 USB客户驱动程序流程USB客户驱动程序是支持即插即用的标准WDM驱动程序。所有USB设备向客户驱动程序显露一个编程接口USBDI,客户驱动程序使用USB类驱动程序(USBD.sys)访问它。USBD.sys已经实现了USB设备大多数共同的功能,客户USB设备驱动程序的编写实际上是调用这些功能。

USBD处理连接USB设备的大多数繁杂的工作。在内核级,命令由客户驱动程序使用内部IOCTL发送给USB系统。表4-1列出了所有内部IOCTL.最有用的IOCTL是IOCTL_INTERNAL_USB_SUBMIT_URB,它允许发出USB请求块(URB)给USBD,让USBD处理。URB允许发出多个功能调用给USB系统。由于它们都是内部的IOCTL,根据WINDOWS的规定,它们只能用于内核态(包括客户驱动程序),而不能用于用户的应用程序。用户态USB应用程序也可以发出几个普通的IOCTL给USB设备,目地仅仅是得到连接设备的信息。

以下是整个USB客户驱动程序的流程。

(1)驱动程序安装:USB hub驱动程序检测一个新的USB设备何时插入。PnP管理器使用厂商ID或设备类信息选择要运行的驱动程序并安装。

(2)驱动程序初始化:


DriverEntry例程还根据需要设置Unload、AddDevice和StartIo等回调(callback)例程。只要告诉内核该例程的名字,内核会在合适的环境下调用它。
随后PnP管理器调用AddDevice回调例程,创建设备,内容主要包括:

• 检查设备是否启用如果必要,复位并启用设备

• 在某个配置中选择一个接口

• 可能读其他描述符

• 访问设备,发出相关的命令,读取设备的状态,以及初始化管道

(3)等待客户程序调用,准备接受IRP大多数的常规IRP,客户USB驱动程序无需处理,只需传递给下层驱动程序处理。USB类驱动程序主要通过USB驱动程序接口(USBDI)的内部IOCTL使用。如前所述,最重要的内部IOCTL是IOCTL_INTERNAL_USB_SUBMIT_URB,它发出USB请求块URB由USB类驱动程序处理。

客户驱动程序为内部IOCTL创建一个新的IRP,填写该IRP,并沿设备栈向下把这个IRP发送到USB系统驱动程序,然后等待,直到该IRP被处理。

(4)读、写IRP的处理在客户驱动程序中,重点部分是对读写IRP的处理。以读为例,对于大块数据的读,客户驱动程序将其分割成若干个长度较小的部分,为每个部分创建一个IRP,依次发送给设备栈中的下一个驱动程序,等待全部完成后,再返回这一IRP已完成的消息[46]。

3. 6基于USB的视频信号采集系统的应用程序设计

D12接口板的驱动程序开发完成后,这个设备已经象是PC上的硬盘一样,我们可以对它进行任意的读写。当然,这个设备操作起来似乎还很困难。比如,在Visual C++或者Visual Basic中,对D12接口板读写仍然要调用CreatFile,CloseFile,ReadFile,WriteFile,IOControl等这些对设备直接操作的函数,对于一个不熟悉C++操作的编程人员来说,这样做很容易造成系统的瘫痪。因此,应该提供安全的访问设备的函数入口,就象Visual Basic访问硬盘那样。正是居于此想法,编写了此应用程序。

该应用程序有两部分组成:使用Visual C++编写的Win32 DLL程序和使用Visual Basic编写客户应用程序。

Win32动态连接库(Dynamic Link Library)是包含共享函数库的二进制文件,可以被多个应用程序同时使用。建立应用程序的可执行文件,不必将DLL链接到应用程序中,而是在运行时动态装载DLL,装载时DLL被映射到调用进程的地址空间中。DLL中定义有两种函数:导出函数(export function)和内部函数(internal function),导出函数可以被其它模块调用,内部函数只能在内部使用[47]。

DLL与可执行文件非常相似,不同之处在于DLL包含在导出表(Export Table)。导出表包含DLL中每个导出函数的名字,这些函数是进入DLL的入口点。只有导出表中的函数可以被其它可执行程序调用。

首先,定义文件从DLL中导出函数有两种方法:一种是创建定义文件(。DEF)

并在建立DLL时使用。DEF文件;另一种是在函数的定义中使用关键字_declspec(dll export)。这里使用第一种方法,定义文件dll.def源代码如下所示:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top