来源:中国一卡通网 作者:刘春河,季昊 发布时间:2010-09-17 15:18:48 字体:[大 中 小]
摘 要:基于USB 的MBF200 指纹采集仪是AIFS 系统的重要组成部分,负责原始指纹图像的采集。根据MBF200 的芯片接口,加以必要的辅助电路,设计了指纹采集仪内部电路。基于KUDF 驱动框架,设计了核心态驱动程序,可以实现批量和单字节传输。根据指纹图像的特点,采用硬中断和软中断两种方式保证送入特征提取和比对模块的指纹图像质量。为了实现Win32 应用程序和驱动程序的通信,设计了统一的通信接口,完成了指纹图像的自动采集,效果较好。
图 5 USB 分层结构
如图 5 所示,总线驱动对应于PDO(Physical Device Object),功能驱动对应于FDO(Functional Device Object)。在功能驱动程序之上以及功能驱动程序和总线驱动程序之间可能存在着各种的过滤驱动程序(Filter Driver)。过滤驱动程序也可以创建过滤设备对象FiDO(Filter Device Object)。过滤驱动程序是一个中间层的驱动程序,它可以截获并处理经过它的I/O 请求。过滤驱动程序用于变更标准设备驱动程序的行为。
USB 设备驱动程序的工作原理如下:当应用程序和指纹采集仪进行通信时,必须设置DeviceControl 例程,然后使用Windows API 函数DeviceIoCtrl()对WIN32 子系统进行WIN32调用。此调用由I/O 系统服务接收并通知I/O 管理器,I/O 管理器将此请求构造成一个合适的I/O 请求包(I/O Request Packet,IRP)并把它传递给USB 功能驱动程序。
USB 功能驱动程序接收到这个IRP 以后,根据IRP 中包含的具体操作代码,构造相应的USB 请求块并把此URB 放到一个新的IRP 中,然后把此IRP 传递到USB 总线驱动程序,USB 总线驱动程序根据IRP 中所含的URB 执行相应的操作(如从USB 设备读取数据),并把操作结果通过IRP 返还给USB 功能驱动程序。USB 功能驱动程序接收到此IRP 后,将操作结果通过IRP 返还给I/O 管理器,最后I/O 管理器将此IRP 中的操作结果返还给应用程序,至此应用程序对USB设备的一次I/O 操作完成。USB 功能驱动程序除负责处理应用程序的I/O 请求外,还要处理PnP 管理器发送给它的PnP 请求。通过对这些PnP 请求的处理,USB 功能驱动程序可支持设备的热插拔和即插即用功能。
3.3.指纹采集仪通信与传输方式
USB 定义了四种传输类型:控制传输、中断传输、等时传输、批量传输。控制传输:可靠的、非周期性的、由主机软件发起的请求或者回应的传输,通常用于命令事务和状态事务。控制传输有两个功能,携带USB 规范的要求,让主机了解设备的功能与配置;携带群组或厂商定义的要求。控制传输用于在客户软件和它的应用设备之间的设置信息、命令信息、状态信息的传输,允许访问一个设备的不同部分。中断传输:小规模数据的、低速的、固定延迟的传输。中断传输用于只传送或接收少量数据,而且并不经常进行传送,但却有一个确定的服务周期。等时传输:在主机与设备之间的周期性的、连续的通信,一般用于传输与时间相关的信息。这种类型保留了将时间概念包含于数据中的能力。但这并不意味着,传送这样数据的时间总是很重要的,即传输并不一定很紧急。批量传输:非周期性的,大包的可靠的传输。典型地用于传输那些可以利用任何带宽的数据,而且这些数据当没有可用带宽时,可以容忍等待。批量传输是为了支持在某些在不确定的时间进行的相当大量的数据通信,对连续性不做要求。它可以利用任何可获得的带宽。
MBF200 使用内部ROM 作为配置寄存器,在主机发出GET--DESCRIPTOR 命令时,可以从内部ROM 中读取USB 的描述符来配置USB 接口。在MBF200 的USB 接口中,使用了以下三个端点:端点0:端点O 是控制端点,常用于设备的枚举和配置。FPS200 传感器的功能寄存器的读写,都是使用控制传输方式向端点O 写入厂商规定的命令字来完成。芯片初始化过程如图6。端点1 采用批量输入方式,专用来读取寄存器CTRLA,即A/D 转换器的输出缓冲区。数据以64 字节的长度包传送。如果是在GETROW 的图像读取方式下,根据行数的不同,最后一个数据包的长度可能会少于64 字节。端点2 是中断端点,如果有中断产生,ISR(Interrupt Status Register)的内容就被传送到端点2。如图6 所示。
图 6 MBF 初始化
4 指纹采集仪驱动设计
4.1 驱动程序设计
和 WDM 模型相同,KMDF 框架是面向对象、事件驱动的驱动程序模型。它定义了一系列的对象用来表示设备、驱动、中断、内存等,每个对象有对应的属性、方法和事件。驱动程序利用这些方法创建对象、设置属性和响应事件。框架定义的主要对象有:WDFDRIVER对象、WDFDEVICE 对象、WDFREQUEST 对象、WDFQUEUE 对象、WDFQUEUE 对象、WDFINTERRUPT 对象等。
WDF 的对象模型是层次化的模型。WDFDRIVER 对象是根对象,其他对象都是它的子对象。对于大多数对象,驱动程序在创建它们的时候可以指定父对象,如果没有指定,则框架默认其父对象为WDFDRIVER 对象。WDF 大大简化了WDM 中的PNP 和电源管理的开发。WDF 框架为设备停止、设备删除、电源状态切换等PNP 和电源管理事件提供了适合的缺省行为,驱动程序本身不再纠缠于复杂的PNP 和电源管理事件处理。在WDM 驱动程序中, I/O 请求的取消是一个复杂难以理解的过程,开发人员必须有对内核深刻的理解才能正确处理I/O 请求的取消。WDF 框架支持内建的I/O 请求取消处理,使得驱动程序处理取消I/O请求的工作大大简化。
USB 驱动入口函数[7]为DriverEntry(),其主要工作是把各种函数指针填入驱动程序对象。这些指针为操作系统指明了驱动程序容器中各种子例程的位置。根据 WDFUSBINTERFACE 和WDFUSBPIPE 对象方法,分别进行初始化。接口对象的初始化函数:m_Interface.Initialize()。端点对象的初始化函数:Pipe0.Initialize()和Pipe1.Initialize()。
例程的分发使用DeviceControl 函数,自己定义好要实现的具体例程,如下:
switch (I.IoctlCode())
{
case IOCTL_VENDOR_REQUEST:
status = IOCTL_VENDOR_REQUEST_Handler(I);//初始化
break;
case IOCTL_BULK_READ:
status = IOCTL_BULK_READ_Handler(I);//批量读
break;
case IOCTL_READ_INT:
status = IOCTL_READ_INT_Handler(I);//中断读
break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
break; }
在 IOCTL_VENDOR_REQUEST_Handler 中配置MBF200_DTR 为0x14,MBF200_DCR为0x06,MBF200_PGC 为0x08,MBF200_ICR 为0x09,MBF200_CTRLB 为0x0D。
4.2 软中断和硬中断设计
指纹的自动检测分为基于中断寄存器的检测和基于软中断的自动检测。基于中断寄存器的检测就是读取中断状态寄存器的值,当有指纹按下时,读取ISR 的值;基于软中断的自动检测是指自己设定检测窗口和阈值,根据窗口内指纹点的数目判断是否有指纹按下,这样,也可以滤出质量不合格的指纹。
推荐文章
论坛热帖