a&s专业的自动化&安全生态服务平台
公众号
安全自动化

安全自动化

安防知识网

安防知识网

手机站
手机站

手机站

大安防供需平台
大安防供需平台

大安防供需平台

资讯频道横幅A1
首页 > 资讯 > 正文

基于KMDF 的USB 指纹采集仪驱动程序

指纹识别利用了人体指纹的唯一性和不变性,是生物特征识别领域的重要手段,已广泛应用于信息安全领域。自动指纹识别系统(AIFS)[1]包含如下过程...
资讯频道文章B

【安防知识网】指纹识别利用了人体指纹的唯一性和不变性,是生物特征识别领域的重要手段,已广泛应用于信息安全领域。自动指纹识别系统(AIFS)[1]包含如下过程:

  

  图 1 AIFS 系统过程

  指纹采集过程作为指纹识别系统的第一步,负责原始指纹图像的采集,采集图像的质量直接影响到指纹处理结果。所以指纹采集仪的选取至关重要,影响整个系统的性能。较早出现的活体指纹采集仪主要采用光学方法,采用光的全反射原理取像;后来陆续出现了超声波扫描型、热敏型和半导体型的指纹采集仪。超声波采集仪虽然采集质量出色,但是由于造价高,不适于大批量应用;热敏型采集仪则由于采集质量差、采集面积小,使用较少。半导体型的大多是基于CMOS 压感特性,由于性价比高,占据了大部分的指纹采集设备市场。MBF200 是市场上先进的高性能、低功耗半导体型传感器。

  指纹采集器在系统中使用时,由于大多数产品和Windows 系统相连,所以在Windows操作系统下的驱动开发显得尤为重要。WDF 是微软下一代驱动模型[3],兼容Windows2000以后的所有平台,在Vista 操作系统和即将发布的Windows7 操作系统中均被采用,代表了驱动设计领域最先进的技术方向。

  WDF 封装了驱动程序中的某些共同行为:例如即插即用和电源管理就属于这种共同行为。因为大多数驱动程序中都需要处理即插即用和电源管理问题,据说这大概要上千行的代码,况且,没有相当水平还不一定能处理好。为了一劳永逸,WDF 干脆将即插即用和电源管理封装了进了对象之内,一举成了对象的缺省(默认)行为。

  WDF 改变了操作系统内核与驱动程序之间的关系,WDM 驱动程序中,一方面要处理硬件,另一方面要处理驱动程序与操作系统内核的交互。现在WDF 则将驱动程序与操作系统内核之间进行了分离,驱动程序与操作系统交互工作交给框架内封装的方法(函数)完成,这样驱动开发者只需专注处理硬件的行为即可。这不仅避免了顾此失彼两面不周的弊端,也指纹采集预处理 特征提取 比对 识别结果

  由于双方的分离,对操作系统内的某些改动和硬件制造商配套驱动程序的开发都有莫大的好处。

  1 MFB200 的结构和特性

  MBF200[4]具有256×300 传感器阵列和500dpi 的分辨率,集成8 位A/D 转换器,工作电压为3.3~5V,且有指纹自动检测功能。它提供3 种总线接口:8 位微处理器总线接口(MCU)、串行外围设备接口(SPI)和集成USB 全速接口。在计算机系统中采用它作为采集设备时,大多采用USB 接口。

  MBF200 的电容传感器阵列由二维金属电极组成.所有金属电极充当一个电容板,接触的手指充当第二个电容板。器件表面的钝化层作为两板的绝缘层。当手指触摸传感器表面时,指纹的高低不平就会在传感器阵列上产生变化的电容,从而引起二维阵列上电压的变化,并形成8 位灰度级的数字指纹图像。分辨率高达500DPI,信噪比高,反应速度快。传感器的灵敏度可通过读写其内部的放电电流寄存器(DCR)、放电时间寄存器(DTR)和增益控制寄存器(PGC)来进行控制。

[nextpage]  2 指纹采集仪电路设计

  指纹采集仪分为电源模块、USB 连接模块、时钟模块、模式控制模块和辅助外围电路。电源模块负责向传感器芯片提供3.3~3.6V 的电压;时钟模块采用外部晶体振荡电路,有助于降低功耗;模式控制模块负责选择芯片的接口模式和ROM 配置方式;USB 连接模块负责芯片和USB 连接器的连接,为了使采集器在数据传输速度和信号质量上取得较好的效果,该模式下采用带屏蔽层的电缆。USB 设备与主机相连接的控制电路如图2 所示,其中R3 是全速USB 设备必须要求的上拉电阻,为1.5K,R1、R2 是起阻抗匹配用,均为43。

  

  图 2 USB 连接模块

  MBF200 内部嵌有USB 控制器,Firmware 也已经固化在了芯片中。芯片主要用到的引脚如图2:MODE 分别置为1、0,表示采用USB 模式并使用内部ROM;XTAL1 和XTAL2连接12MHz 晶振,ISET 用于设置内部参考电流,FSET 用于设置内部多频振荡器及自动指纹检测速率。AIN 用于模拟信号输入方式选择,USB 接口使用三个端点;其中端点0 是控制端点,用来控制对功能寄存器的读写;端点1 是读端点,用来读取经过AD 转换后的指纹图像数据,它是以块方式进行读取的,每次64 个字节;端点2 是中断端点,当ISR 被置位时,由它向端点2 发送中断信号。

  

  图 3 指纹采集仪原理图

[nextpage]  3 基于KMDF 的USB 驱动架构

  3.1 WDF 框架

  微软操作系统下的驱动模型,最开始采用的是VxD(VIRTUAL X DRIVER),现早已经废弃。自Windows 2000 开始,驱动开发基于WDM(Windows Driver Model)标准驱动模型。WDF[5] (Windows Driver Foundation)是微软提出的下一代全新的驱动程序模型,它是在WDM(windows Driver Model)的基础上发展而来的;WDF 是Vista 系统及其以后的版本采用的驱动模型,全面向上兼容WDM。最新发布的Windows7 中就采用了WDF。WDF 支持面向对象、事件驱动的驱动程序开发,提供了比WDM 更高层次抽象的高度灵活、可扩展、可诊断的驱动程序框架。WDF 框架管理了大多数与操作系统相关的交互,实现了公共的驱动程序功能(如电源管理、PnP 支持),隔离了设备驱动程序与操作系统内核,降低了驱动程序对内核的影响。

  

  图 4 WDF 驱动栈模型

  对应于驱动模型,分别有相应的驱动开发套件。WDM 驱动模型对应于DDK(Driver Develop Kit),而WDF 驱动模型对应于WDK(Windows Driver Kit)。WDK 提供了两个框架:KMDF(内核模式驱动程序框架)和UMDF(用户模式驱动程序框架)。对内核模式和用户模式对象来说,WDF 是两者的父对象。相对于内核模式,派生出的对象称为“KMD 框架”,即KMDF;相对于用户模式,派生出的模型称为“UMD 框架”,即UMDF。具体到实现,KMDF 对应于.Sys 文件,负责硬件交互和处理;UMDF 对应于.Dll 文件,负责和用户的交互。

  3.2.Windows USB 驱动原理

  在 KMDF 中,USB 通信使用分层驱动模型,每层处理一部分通信任务。把通信分成层,可以使不同的设备在一些任务上使用相同的驱动。如图5 所示,Windows 对构成一个USB主机的不同软件部分进行了清楚的划分。USB 设备驱动程序通过Windows 定义的软件接口与根集线器驱动程序进行通信,而USB 总线根集线器驱动程序则通过包含在USBD 中的USBDI(通用串行总线驱动程序接口)实现与通用串行总线驱动程序(USBD)的通信。然后,USBD 选择两种主机控制器驱动程序之一,同其下方的主控制器通信。最后,主控制器驱动程序通过PCI 枚举器软件直接实现对USB 物理总线的访问。

  USB 总线驱动程序由操作系统提供,它位于USB 功能驱动程序的下面,负责与实际的硬件打交道,实现繁琐的底层通信[6]。USB 功能驱动程序由设备开发者编写,位于USB 总线驱动程序的上面,不与实际的硬件打交道,而是通过向USB 总线驱动程序发送包含URB(USB Request Block,USB 请求块)的IRP(I/0 Request Packet,I/O 请求包),来实现对USB设备信息的发送或接收。

  

  图 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 功能驱动程序可支持设备的热插拔和即插即用功能。

[nextpage]  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。

[nextpage]  4.2 软中断和硬中断设计

  指纹的自动检测分为基于中断寄存器的检测和基于软中断的自动检测。基于中断寄存器的检测就是读取中断状态寄存器的值,当有指纹按下时,读取ISR 的值;基于软中断的自动检测是指自己设定检测窗口和阈值,根据窗口内指纹点的数目判断是否有指纹按下,这样,也可以滤出质量不合格的指纹。

  MBF200 的中断状态寄存器非常灵敏,只要有手指按下,就能被捕捉,改变状态值。如果严格按照硬中断来采集指纹,容易捕捉到不合格的指纹。故本文采用了两级中断。当根据硬中断采集到指纹时,采用软中断判断是否符合所要求的指纹图像标准。最后滤去不合格图像(模糊、偏离中心等),送到特征提取和比对模块进行处理。采用软中断,需要自己实现指纹图像的判决函数Read_Threshold()。所用算法如下:

  

  图 7 软中断检测指纹图像

  4.3 应用程序与驱动程序的接口

  应用程序和驱动程序通信,主要有两种方式:为设备创建的一个符号链;输出到一个接口。

  WDM 驱动程序建议使用输出到一个接口而不推荐使用创建符号链的方法。这个接口保证PDO 的安全,也保证安全地创建一个惟一的、独立于语言的访问设备的方法。一个应用程序使用Win32APIs 来调用设备。在某个Win32 APIs 和设备对象的分发函数之间存在一个映射关系。获得对设备对象访问的第一步就是打开一个设备对象的句柄。

  1.用符号链打开一个设备的句柄

  为了打开一个设备,应用程序需要使用CreateFile。如果该设备有一个符号链出口,应用程序可以用下面这个例子的形式打开句柄:hDevice = CreateFile(…);文件路径名需要一个前缀,用来告诉系统本调用希望打开一个设备。这个设备必须有一个符号链,以便应用程序能够打开它。

  2.使用一个输出接口打开句柄

  DriverWorks 库提供两个助手类来使获得对该接口的访问容易一些,这两个类是CDeviceInterface, 和 CdeviceInterfaceClasCdeviceInterfaceClass 类封装了一个设备信息集,该信息集包含了特殊类中的所有设备接口信息。

  应用程序能有用CdeviceInterfaceClass 类的一个实例来获得一个或更多的CdeviceInterface 类的实例。CdeviceInterface 类是一个单一设备接口的抽象。它的成员函数DevicePath()返回一个路径名的指针,该指针可以在CreateFile 中使用来打开设备。

  采用第二种方法如下:

  自己构造通信函数OpenByInterface,根据ClassGuid 号来识别驱动程序。

  CDeviceInterfaceClass DevClass(pClassGuid)

  ClassGuid 号在驱动程序的INF 文件中可以读取:

  [Version]

  Signature="$WINDOWS NT$"

  Class=mbf200_4

  ClassGUID={83999D72-9A60-4D5A-A611-F9934FEBDDDB}

  Provider=%Provider%

  DriverVer=4/8/2008,1.00.0000

  CatalogFile=mbf200_4.cat

  在应用程序中,若想调用调用驱动,只需要使用函数DeviceIoControl()即可:

  4.4 驱动的安装和发布

  把驱动程序的INF 文件和SYS 文件打包,系统会根据INF 文件,自动搜索SYS 文件,并安装,拷贝到系统目录下。如图7 所示:

  

  图 8 驱动安装

  4.5 试验结果

  经过测试,采集的指纹图像如图8 所示:

  

  图 9 采集结果

  5 结语

  本文研究了基于MBF200 芯片的指纹采集仪的硬件设计,基于KMDF 架构设计了USB驱动程序。采用MBF200 芯片,辅以外围芯片和电路,实现了指纹采集仪的硬件电路设计。并设计了应用程序和驱动程序的接口,通过这个接口,用户可以方便的设计Windows 应用程序,只要根据自己设计的驱动例程,设计好输入输出缓冲区,使用DeviceIoControl 调用即可。

参与评论
回复:
0/300
文明上网理性发言,评论区仅供其表达个人看法,并不表明a&s观点。
0
关于我们

a&s是国际知名展览公司——德国法兰克福展览集团旗下专业的自动化&安全生态服务平台,为智慧安防、智慧生活、智能交通、智能建筑、IT通讯&网络等从业者提供市场分析、技术资讯、方案评估、行业预测等,为读者搭建专业的行业交流平台。

免责声明:本站所使用的字体和图片文字等素材部分来源于互联网共享平台。如使用任何字体和图片文字有冒犯其版权所有方的,皆为无意。如您是字体厂商、图片文字厂商等版权方,且不允许本站使用您的字体和图片文字等素材,请联系我们,本站核实后将立即删除!任何版权方从未通知联系本站管理者停止使用,并索要赔偿或上诉法院的,均视为新型网络碰瓷及敲诈勒索,将不予任何的法律和经济赔偿!敬请谅解!
© 2020 Messe Frankfurt (Shenzhen) Co., Ltd, All rights reserved.
法兰克福展览(深圳)有限公司版权所有 粤ICP备12072668号 粤公网安备 44030402000264号
用户
反馈