【安防知識網(wǎng)】指紋識別利用了人體指紋的唯一性和不變性,是生物特征識別領(lǐng)域的重要手段,已廣泛應(yīng)用于信息安全領(lǐng)域。自動指紋識別系統(tǒng)(AIFS)[1]包含如下過程:
圖 1 AIFS 系統(tǒng)過程
指紋采集過程作為指紋識別系統(tǒng)的第一步,負責(zé)原始指紋圖像的采集,采集圖像的質(zhì)量直接影響到指紋處理結(jié)果。所以指紋采集儀的選取至關(guān)重要,影響整個系統(tǒng)的性能。較早出現(xiàn)的活體指紋采集儀主要采用光學(xué)方法,采用光的全反射原理取像;后來陸續(xù)出現(xiàn)了超聲波掃描型、熱敏型和半導(dǎo)體型的指紋采集儀。超聲波采集儀雖然采集質(zhì)量出色,但是由于造價高,不適于大批量應(yīng)用;熱敏型采集儀則由于采集質(zhì)量差、采集面積小,使用較少。半導(dǎo)體型的大多是基于CMOS 壓感特性,由于性價比高,占據(jù)了大部分的指紋采集設(shè)備市場。MBF200 是市場上先進的高性能、低功耗半導(dǎo)體型傳感器。
指紋采集器在系統(tǒng)中使用時,由于大多數(shù)產(chǎn)品和Windows 系統(tǒng)相連,所以在Windows操作系統(tǒng)下的驅(qū)動開發(fā)顯得尤為重要。WDF 是微軟下一代驅(qū)動模型[3],兼容Windows2000以后的所有平臺,在Vista 操作系統(tǒng)和即將發(fā)布的Windows7 操作系統(tǒng)中均被采用,代表了驅(qū)動設(shè)計領(lǐng)域最先進的技術(shù)方向。
WDF 封裝了驅(qū)動程序中的某些共同行為:例如即插即用和電源管理就屬于這種共同行為。因為大多數(shù)驅(qū)動程序中都需要處理即插即用和電源管理問題,據(jù)說這大概要上千行的代碼,況且,沒有相當(dāng)水平還不一定能處理好。為了一勞永逸,WDF 干脆將即插即用和電源管理封裝了進了對象之內(nèi),一舉成了對象的缺省(默認)行為。
WDF 改變了操作系統(tǒng)內(nèi)核與驅(qū)動程序之間的關(guān)系,WDM 驅(qū)動程序中,一方面要處理硬件,另一方面要處理驅(qū)動程序與操作系統(tǒng)內(nèi)核的交互。現(xiàn)在WDF 則將驅(qū)動程序與操作系統(tǒng)內(nèi)核之間進行了分離,驅(qū)動程序與操作系統(tǒng)交互工作交給框架內(nèi)封裝的方法(函數(shù))完成,這樣驅(qū)動開發(fā)者只需專注處理硬件的行為即可。這不僅避免了顧此失彼兩面不周的弊端,也指紋采集預(yù)處理 特征提取 比對 識別結(jié)果
由于雙方的分離,對操作系統(tǒng)內(nèi)的某些改動和硬件制造商配套驅(qū)動程序的開發(fā)都有莫大的好處。
1 MFB200 的結(jié)構(gòu)和特性
MBF200[4]具有256×300 傳感器陣列和500dpi 的分辨率,集成8 位A/D 轉(zhuǎn)換器,工作電壓為3.3~5V,且有指紋自動檢測功能。它提供3 種總線接口:8 位微處理器總線接口(MCU)、串行外圍設(shè)備接口(SPI)和集成USB 全速接口。在計算機系統(tǒng)中采用它作為采集設(shè)備時,大多采用USB 接口。
MBF200 的電容傳感器陣列由二維金屬電極組成.所有金屬電極充當(dāng)一個電容板,接觸的手指充當(dāng)?shù)诙€電容板。器件表面的鈍化層作為兩板的絕緣層。當(dāng)手指觸摸傳感器表面時,指紋的高低不平就會在傳感器陣列上產(chǎn)生變化的電容,從而引起二維陣列上電壓的變化,并形成8 位灰度級的數(shù)字指紋圖像。分辨率高達500DPI,信噪比高,反應(yīng)速度快。傳感器的靈敏度可通過讀寫其內(nèi)部的放電電流寄存器(DCR)、放電時間寄存器(DTR)和增益控制寄存器(PGC)來進行控制。
[nextpage] 2 指紋采集儀電路設(shè)計
指紋采集儀分為電源模塊、USB 連接模塊、時鐘模塊、模式控制模塊和輔助外圍電路。電源模塊負責(zé)向傳感器芯片提供3.3~3.6V 的電壓;時鐘模塊采用外部晶體振蕩電路,有助于降低功耗;模式控制模塊負責(zé)選擇芯片的接口模式和ROM 配置方式;USB 連接模塊負責(zé)芯片和USB 連接器的連接,為了使采集器在數(shù)據(jù)傳輸速度和信號質(zhì)量上取得較好的效果,該模式下采用帶屏蔽層的電纜。USB 設(shè)備與主機相連接的控制電路如圖2 所示,其中R3 是全速USB 設(shè)備必須要求的上拉電阻,為1.5K,R1、R2 是起阻抗匹配用,均為43。
圖 2 USB 連接模塊
MBF200 內(nèi)部嵌有USB 控制器,F(xiàn)irmware 也已經(jīng)固化在了芯片中。芯片主要用到的引腳如圖2:MODE 分別置為1、0,表示采用USB 模式并使用內(nèi)部ROM;XTAL1 和XTAL2連接12MHz 晶振,ISET 用于設(shè)置內(nèi)部參考電流,F(xiàn)SET 用于設(shè)置內(nèi)部多頻振蕩器及自動指紋檢測速率。AIN 用于模擬信號輸入方式選擇,USB 接口使用三個端點;其中端點0 是控制端點,用來控制對功能寄存器的讀寫;端點1 是讀端點,用來讀取經(jīng)過AD 轉(zhuǎn)換后的指紋圖像數(shù)據(jù),它是以塊方式進行讀取的,每次64 個字節(jié);端點2 是中斷端點,當(dāng)ISR 被置位時,由它向端點2 發(fā)送中斷信號。
圖 3 指紋采集儀原理圖
[nextpage] 3 基于KMDF 的USB 驅(qū)動架構(gòu)
3.1 WDF 框架
微軟操作系統(tǒng)下的驅(qū)動模型,最開始采用的是VxD(VIRTUAL X DRIVER),現(xiàn)早已經(jīng)廢棄。自Windows 2000 開始,驅(qū)動開發(fā)基于WDM(Windows Driver Model)標準驅(qū)動模型。WDF[5] (Windows Driver Foundation)是微軟提出的下一代全新的驅(qū)動程序模型,它是在WDM(windows Driver Model)的基礎(chǔ)上發(fā)展而來的;WDF 是Vista 系統(tǒng)及其以后的版本采用的驅(qū)動模型,全面向上兼容WDM。最新發(fā)布的Windows7 中就采用了WDF。WDF 支持面向?qū)ο?、事件?qū)動的驅(qū)動程序開發(fā),提供了比WDM 更高層次抽象的高度靈活、可擴展、可診斷的驅(qū)動程序框架。WDF 框架管理了大多數(shù)與操作系統(tǒng)相關(guān)的交互,實現(xiàn)了公共的驅(qū)動程序功能(如電源管理、PnP 支持),隔離了設(shè)備驅(qū)動程序與操作系統(tǒng)內(nèi)核,降低了驅(qū)動程序?qū)?nèi)核的影響。
圖 4 WDF 驅(qū)動棧模型
對應(yīng)于驅(qū)動模型,分別有相應(yīng)的驅(qū)動開發(fā)套件。WDM 驅(qū)動模型對應(yīng)于DDK(Driver Develop Kit),而WDF 驅(qū)動模型對應(yīng)于WDK(Windows Driver Kit)。WDK 提供了兩個框架:KMDF(內(nèi)核模式驅(qū)動程序框架)和UMDF(用戶模式驅(qū)動程序框架)。對內(nèi)核模式和用戶模式對象來說,WDF 是兩者的父對象。相對于內(nèi)核模式,派生出的對象稱為“KMD 框架”,即KMDF;相對于用戶模式,派生出的模型稱為“UMD 框架”,即UMDF。具體到實現(xiàn),KMDF 對應(yīng)于.Sys 文件,負責(zé)硬件交互和處理;UMDF 對應(yīng)于.Dll 文件,負責(zé)和用戶的交互。
3.2.Windows USB 驅(qū)動原理
在 KMDF 中,USB 通信使用分層驅(qū)動模型,每層處理一部分通信任務(wù)。把通信分成層,可以使不同的設(shè)備在一些任務(wù)上使用相同的驅(qū)動。如圖5 所示,Windows 對構(gòu)成一個USB主機的不同軟件部分進行了清楚的劃分。USB 設(shè)備驅(qū)動程序通過Windows 定義的軟件接口與根集線器驅(qū)動程序進行通信,而USB 總線根集線器驅(qū)動程序則通過包含在USBD 中的USBDI(通用串行總線驅(qū)動程序接口)實現(xiàn)與通用串行總線驅(qū)動程序(USBD)的通信。然后,USBD 選擇兩種主機控制器驅(qū)動程序之一,同其下方的主控制器通信。最后,主控制器驅(qū)動程序通過PCI 枚舉器軟件直接實現(xiàn)對USB 物理總線的訪問。
USB 總線驅(qū)動程序由操作系統(tǒng)提供,它位于USB 功能驅(qū)動程序的下面,負責(zé)與實際的硬件打交道,實現(xiàn)繁瑣的底層通信[6]。USB 功能驅(qū)動程序由設(shè)備開發(fā)者編寫,位于USB 總線驅(qū)動程序的上面,不與實際的硬件打交道,而是通過向USB 總線驅(qū)動程序發(fā)送包含URB(USB Request Block,USB 請求塊)的IRP(I/0 Request Packet,I/O 請求包),來實現(xiàn)對USB設(shè)備信息的發(fā)送或接收。
圖 5 USB 分層結(jié)構(gòu)
如圖 5 所示,總線驅(qū)動對應(yīng)于PDO(Physical Device Object),功能驅(qū)動對應(yīng)于FDO(Functional Device Object)。在功能驅(qū)動程序之上以及功能驅(qū)動程序和總線驅(qū)動程序之間可能存在著各種的過濾驅(qū)動程序(Filter Driver)。過濾驅(qū)動程序也可以創(chuàng)建過濾設(shè)備對象FiDO(Filter Device Object)。過濾驅(qū)動程序是一個中間層的驅(qū)動程序,它可以截獲并處理經(jīng)過它的I/O 請求。過濾驅(qū)動程序用于變更標準設(shè)備驅(qū)動程序的行為。
USB 設(shè)備驅(qū)動程序的工作原理如下:當(dāng)應(yīng)用程序和指紋采集儀進行通信時,必須設(shè)置DeviceControl 例程,然后使用Windows API 函數(shù)DeviceIoCtrl()對WIN32 子系統(tǒng)進行WIN32調(diào)用。此調(diào)用由I/O 系統(tǒng)服務(wù)接收并通知I/O 管理器,I/O 管理器將此請求構(gòu)造成一個合適的I/O 請求包(I/O Request Packet,IRP)并把它傳遞給USB 功能驅(qū)動程序。
USB 功能驅(qū)動程序接收到這個IRP 以后,根據(jù)IRP 中包含的具體操作代碼,構(gòu)造相應(yīng)的USB 請求塊并把此URB 放到一個新的IRP 中,然后把此IRP 傳遞到USB 總線驅(qū)動程序,USB 總線驅(qū)動程序根據(jù)IRP 中所含的URB 執(zhí)行相應(yīng)的操作(如從USB 設(shè)備讀取數(shù)據(jù)),并把操作結(jié)果通過IRP 返還給USB 功能驅(qū)動程序。USB 功能驅(qū)動程序接收到此IRP 后,將操作結(jié)果通過IRP 返還給I/O 管理器,最后I/O 管理器將此IRP 中的操作結(jié)果返還給應(yīng)用程序,至此應(yīng)用程序?qū)SB設(shè)備的一次I/O 操作完成。USB 功能驅(qū)動程序除負責(zé)處理應(yīng)用程序的I/O 請求外,還要處理PnP 管理器發(fā)送給它的PnP 請求。通過對這些PnP 請求的處理,USB 功能驅(qū)動程序可支持設(shè)備的熱插拔和即插即用功能。
[nextpage] 3.3.指紋采集儀通信與傳輸方式
USB 定義了四種傳輸類型:控制傳輸、中斷傳輸、等時傳輸、批量傳輸??刂苽鬏敚嚎煽康?、非周期性的、由主機軟件發(fā)起的請求或者回應(yīng)的傳輸,通常用于命令事務(wù)和狀態(tài)事務(wù)。控制傳輸有兩個功能,攜帶USB 規(guī)范的要求,讓主機了解設(shè)備的功能與配置;攜帶群組或廠商定義的要求??刂苽鬏斢糜谠诳蛻糗浖退膽?yīng)用設(shè)備之間的設(shè)置信息、命令信息、狀態(tài)信息的傳輸,允許訪問一個設(shè)備的不同部分。中斷傳輸:小規(guī)模數(shù)據(jù)的、低速的、固定延遲的傳輸。中斷傳輸用于只傳送或接收少量數(shù)據(jù),而且并不經(jīng)常進行傳送,但卻有一個確定的服務(wù)周期。等時傳輸:在主機與設(shè)備之間的周期性的、連續(xù)的通信,一般用于傳輸與時間相關(guān)的信息。這種類型保留了將時間概念包含于數(shù)據(jù)中的能力。但這并不意味著,傳送這樣數(shù)據(jù)的時間總是很重要的,即傳輸并不一定很緊急。批量傳輸:非周期性的,大包的可靠的傳輸。典型地用于傳輸那些可以利用任何帶寬的數(shù)據(jù),而且這些數(shù)據(jù)當(dāng)沒有可用帶寬時,可以容忍等待。批量傳輸是為了支持在某些在不確定的時間進行的相當(dāng)大量的數(shù)據(jù)通信,對連續(xù)性不做要求。它可以利用任何可獲得的帶寬。
MBF200 使用內(nèi)部ROM 作為配置寄存器,在主機發(fā)出GET--DESCRIPTOR 命令時,可以從內(nèi)部ROM 中讀取USB 的描述符來配置USB 接口。在MBF200 的USB 接口中,使用了以下三個端點:端點0:端點O 是控制端點,常用于設(shè)備的枚舉和配置。FPS200 傳感器的功能寄存器的讀寫,都是使用控制傳輸方式向端點O 寫入廠商規(guī)定的命令字來完成。芯片初始化過程如圖6。端點1 采用批量輸入方式,專用來讀取寄存器CTRLA,即A/D 轉(zhuǎn)換器的輸出緩沖區(qū)。數(shù)據(jù)以64 字節(jié)的長度包傳送。如果是在GETROW 的圖像讀取方式下,根據(jù)行數(shù)的不同,最后一個數(shù)據(jù)包的長度可能會少于64 字節(jié)。端點2 是中斷端點,如果有中斷產(chǎn)生,ISR(Interrupt Status Register)的內(nèi)容就被傳送到端點2。如圖6 所示。
圖 6 MBF 初始化
4 指紋采集儀驅(qū)動設(shè)計
4.1 驅(qū)動程序設(shè)計
和 WDM 模型相同,KMDF 框架是面向?qū)ο?、事件?qū)動的驅(qū)動程序模型。它定義了一系列的對象用來表示設(shè)備、驅(qū)動、中斷、內(nèi)存等,每個對象有對應(yīng)的屬性、方法和事件。驅(qū)動程序利用這些方法創(chuàng)建對象、設(shè)置屬性和響應(yīng)事件??蚣芏x的主要對象有:WDFDRIVER對象、WDFDEVICE 對象、WDFREQUEST 對象、WDFQUEUE 對象、WDFQUEUE 對象、WDFINTERRUPT 對象等。
WDF 的對象模型是層次化的模型。WDFDRIVER 對象是根對象,其他對象都是它的子對象。對于大多數(shù)對象,驅(qū)動程序在創(chuàng)建它們的時候可以指定父對象,如果沒有指定,則框架默認其父對象為WDFDRIVER 對象。WDF 大大簡化了WDM 中的PNP 和電源管理的開發(fā)。WDF 框架為設(shè)備停止、設(shè)備刪除、電源狀態(tài)切換等PNP 和電源管理事件提供了適合的缺省行為,驅(qū)動程序本身不再糾纏于復(fù)雜的PNP 和電源管理事件處理。在WDM 驅(qū)動程序中, I/O 請求的取消是一個復(fù)雜難以理解的過程,開發(fā)人員必須有對內(nèi)核深刻的理解才能正確處理I/O 請求的取消。WDF 框架支持內(nèi)建的I/O 請求取消處理,使得驅(qū)動程序處理取消I/O請求的工作大大簡化。
USB 驅(qū)動入口函數(shù)[7]為DriverEntry(),其主要工作是把各種函數(shù)指針填入驅(qū)動程序?qū)ο?。這些指針為操作系統(tǒng)指明了驅(qū)動程序容器中各種子例程的位置。根據(jù) WDFUSBINTERFACE 和WDFUSBPIPE 對象方法,分別進行初始化。接口對象的初始化函數(shù):m_Interface.Initialize()。端點對象的初始化函數(shù):Pipe0.Initialize()和Pipe1.Initialize()。
例程的分發(fā)使用DeviceControl 函數(shù),自己定義好要實現(xiàn)的具體例程,如下:
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 軟中斷和硬中斷設(shè)計
指紋的自動檢測分為基于中斷寄存器的檢測和基于軟中斷的自動檢測?;谥袛嗉拇嫫鞯臋z測就是讀取中斷狀態(tài)寄存器的值,當(dāng)有指紋按下時,讀取ISR 的值;基于軟中斷的自動檢測是指自己設(shè)定檢測窗口和閾值,根據(jù)窗口內(nèi)指紋點的數(shù)目判斷是否有指紋按下,這樣,也可以濾出質(zhì)量不合格的指紋。
MBF200 的中斷狀態(tài)寄存器非常靈敏,只要有手指按下,就能被捕捉,改變狀態(tài)值。如果嚴格按照硬中斷來采集指紋,容易捕捉到不合格的指紋。故本文采用了兩級中斷。當(dāng)根據(jù)硬中斷采集到指紋時,采用軟中斷判斷是否符合所要求的指紋圖像標準。最后濾去不合格圖像(模糊、偏離中心等),送到特征提取和比對模塊進行處理。采用軟中斷,需要自己實現(xiàn)指紋圖像的判決函數(shù)Read_Threshold()。所用算法如下:
圖 7 軟中斷檢測指紋圖像
4.3 應(yīng)用程序與驅(qū)動程序的接口
應(yīng)用程序和驅(qū)動程序通信,主要有兩種方式:為設(shè)備創(chuàng)建的一個符號鏈;輸出到一個接口。
WDM 驅(qū)動程序建議使用輸出到一個接口而不推薦使用創(chuàng)建符號鏈的方法。這個接口保證PDO 的安全,也保證安全地創(chuàng)建一個惟一的、獨立于語言的訪問設(shè)備的方法。一個應(yīng)用程序使用Win32APIs 來調(diào)用設(shè)備。在某個Win32 APIs 和設(shè)備對象的分發(fā)函數(shù)之間存在一個映射關(guān)系。獲得對設(shè)備對象訪問的第一步就是打開一個設(shè)備對象的句柄。
1.用符號鏈打開一個設(shè)備的句柄
為了打開一個設(shè)備,應(yīng)用程序需要使用CreateFile。如果該設(shè)備有一個符號鏈出口,應(yīng)用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile(…);文件路徑名需要一個前綴,用來告訴系統(tǒng)本調(diào)用希望打開一個設(shè)備。這個設(shè)備必須有一個符號鏈,以便應(yīng)用程序能夠打開它。
2.使用一個輸出接口打開句柄
DriverWorks 庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClasCdeviceInterfaceClass 類封裝了一個設(shè)備信息集,該信息集包含了特殊類中的所有設(shè)備接口信息。
應(yīng)用程序能有用CdeviceInterfaceClass 類的一個實例來獲得一個或更多的CdeviceInterface 類的實例。CdeviceInterface 類是一個單一設(shè)備接口的抽象。它的成員函數(shù)DevicePath()返回一個路徑名的指針,該指針可以在CreateFile 中使用來打開設(shè)備。
采用第二種方法如下:
自己構(gòu)造通信函數(shù)OpenByInterface,根據(jù)ClassGuid 號來識別驅(qū)動程序。
CDeviceInterfaceClass DevClass(pClassGuid)
ClassGuid 號在驅(qū)動程序的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
在應(yīng)用程序中,若想調(diào)用調(diào)用驅(qū)動,只需要使用函數(shù)DeviceIoControl()即可:
4.4 驅(qū)動的安裝和發(fā)布
把驅(qū)動程序的INF 文件和SYS 文件打包,系統(tǒng)會根據(jù)INF 文件,自動搜索SYS 文件,并安裝,拷貝到系統(tǒng)目錄下。如圖7 所示:
圖 8 驅(qū)動安裝
4.5 試驗結(jié)果
經(jīng)過測試,采集的指紋圖像如圖8 所示:
圖 9 采集結(jié)果
5 結(jié)語
本文研究了基于MBF200 芯片的指紋采集儀的硬件設(shè)計,基于KMDF 架構(gòu)設(shè)計了USB驅(qū)動程序。采用MBF200 芯片,輔以外圍芯片和電路,實現(xiàn)了指紋采集儀的硬件電路設(shè)計。并設(shè)計了應(yīng)用程序和驅(qū)動程序的接口,通過這個接口,用戶可以方便的設(shè)計Windows 應(yīng)用程序,只要根據(jù)自己設(shè)計的驅(qū)動例程,設(shè)計好輸入輸出緩沖區(qū),使用DeviceIoControl 調(diào)用即可。