摘? 要: 分析了Windows2000下USB客戶程序的框架,并就如何開發(fā)Windows2000下USB接口的IC卡讀寫裝置客戶程序進行了闡述。
關鍵詞: USB總線? 客戶程序? IC卡? Windows2000
?
IC卡是高科技的產(chǎn)物,它廣泛用于銀行、電信、交通運輸、小區(qū)管理、校園管理等領域,體現(xiàn)了它的巨大優(yōu)越性。作者在開發(fā)一個IC卡機房收費系統(tǒng)時遇到了新問題,那就是當計算機和IC卡裝置通信的時候,如果采用傳統(tǒng)的串行通信方式固然可行,但供電必須采用單獨的外置電源,這樣加大了讀卡裝置的體積。通過翻閱資料發(fā)現(xiàn)USB接口可以輸出5V電壓、500mA的電流,能滿足IC卡裝置對電源的要求。另外,USB接口和Windows2000操作系統(tǒng)能良好地融合,支持即插即用和電源管理的新特性,使得其與主機的相連日趨簡單和輕松。因此決定開發(fā)USB接口的IC卡讀寫裝置,一方面可以解決供電問題,使讀寫裝置使用方便;另一方面也可以滿足其它方面的性能需求。
USB需要主機硬件、操作系統(tǒng)和外部設備三個方面的支持才能工作。目前主板一般都有支持USB功能的控制芯片組和USB接口插座。微軟" title="微軟">微軟Win9x操作系統(tǒng)以及Windows2000均支持USB,并提供了底層的驅動程序,新版的Linux也支持USB。在USB設備方面,目前有許多公司生產(chǎn)支持USB的微控制器" title="微控制器">微控制器,比較著名的有Motorola公司的MC68HC05系列,Intel公司的80931HA,Cypress公司的CY7C63系列等??梢哉f,USB的發(fā)展已得到各軟硬件廠商的支持,前景光明。
1 Windows2000下的USB架構
主機要使用USB設備,必須有驅動程序。微軟操作系統(tǒng)中,Windows98支持USB,WindowsNT4.0不支持USB,NT5.0(Windows2000)支持USB。Windows2000和Windows98對USB的支持主要是基于WDM(Windows驅動程序模型)技術,因此USB驅動程序是WDM驅動程序。WDM驅動程序采用分層結構,由兩部分組成,一個為功能驅動程序,即通常所說的驅動程序,它負責指揮硬件工作,由類驅動程序和小類驅動程序構成;另外一個為總線驅動程序,它負責管理計算機和硬件之間的連接。在功能驅動程序上層和下層,一些設備還具有過濾驅動程序。它們的作用是監(jiān)視功能驅動程序執(zhí)行I/O操作及修改已有的功能驅動程序。
Windows2000 USB驅動程序框架由USB功能驅動程序和USB總線驅動程序組成。USB總線驅動程序由Windows2000提供,包括USB主控制器驅動程序(OPENHCI.SYS 或 UHCD.SYS,它們分別支持不同的USB主控制器)、USB HUB驅動程序(USBHUB.SYS)以及為控制器驅動程序使用的類驅動程序 (USBD.SYS)。它們一起組成了USB驅動程序棧,可為所有的USB設備驅動程序共用。用戶或廠商所寫的針對特定USB設備的WDM 驅動程序稱為功能驅動程序或客戶驅動程序(位于USB驅動程序棧的上層)。它并不直接訪問硬件,而是調用驅動程序棧完成對硬件的操作。USB驅動程序棧通過USBDI(USB Driver Interface)向客戶驅動程序提供WDM系統(tǒng)服務。
Windows2000下USB驅動程序棧如圖1所示。
?
?
有過驅動程序編制經(jīng)驗的人都知道,編寫驅動程序是一項需要較高技巧并且很繁瑣的工作。對于某一些USB規(guī)范定義的類設備,微軟提供了類驅動程序,負責該類設備的設備驅動。對于這類設備,系統(tǒng)能夠自動識別它們,并不需要附加額外的驅動程序,用戶只需編寫普通的Win32程序即可對其進行訪問。目前,Windows2000為HID(Human Input Device人工輸入設備)類、音頻設備類等提供了類驅動程序。
HID設備,顧名思義是指那些能被人們用來直接輸入數(shù)據(jù)給計算機的設備,例如鍵盤、鼠標、游戲桿及其他虛擬現(xiàn)實設備如數(shù)據(jù)手套等。盡管HID設備概指人工輸入設備,但是那些傳輸數(shù)據(jù)量較小、傳輸速度" title="傳輸速度">傳輸速度較慢的設備,因與輸入設備類似,也可歸類為人工輸入設備,例如遠程控制設備、面板等。IC卡讀寫裝置與計算機之間的數(shù)據(jù)交換具有量小、傳輸速度慢、雙向傳輸?shù)奶攸c,因而可歸類為HID設備。HID設備包括USB接口的設備及其他接口的設備。USB類規(guī)范中詳細定義了USB接口的人工輸入設備類標準及HID設備的用法表,任何USB接口的HID應該遵循這個規(guī)范。
Windows98僅支持USB接口的HID設備;Windows 2000支持USB接口的HID及其他接口的HID設備,Windows2000為人工輸入設備類提供的支持包括:
(1)Windows2000包含HID驅動程序(hidclass.sys 及hidusb.sys,Hidparse.sys)文件,為USB接口的HID設備提供內置的驅動程序支持。
(2)Windows2000提供了HID.dll,為用戶模式及內核模式的程序提供了一些可用的API(應用程序接口)和DDI(設備驅動程序接口),可用來編寫基于HID類的應用程序。
(3)對非USB接口或非HID設備可通過編寫小類驅動程序間接使用HID類驅動程序,省去了重新編寫類驅動程序的麻煩。
因此,對于USB接口的HID設備,通常用戶只需要編寫用戶模式的客戶程序,使用Win32 API函數(shù)對USB HID設備進行操作,不需要再編寫額外的驅動程序。但在有些情況下,用戶也需要編寫一些基于HID類驅動程序的內核客戶驅動程序。譬如,需要向HID設備發(fā)送命令而不僅僅是讀取或寫入數(shù)據(jù)時,可能需要編寫內核模式的HID程序。對于本IC卡讀寫裝置,由于只涉及到一般的數(shù)據(jù)讀寫操作(將數(shù)據(jù)在IC卡和主機之間雙向傳遞),以及較少量的控制操作,并不需要編寫內核模式的客戶驅動程序。
圖2是客戶程序與IC卡讀寫裝置的交互過程。
?
?
2 USB接口的 HID客戶程序
這里說的客戶程序是指在主機上運行,負責和USB設備通信的那部分程序。包括兩種類型:用戶模式下的客戶程序以及內核模式下的客戶驅動程序。USB HID客戶程序執(zhí)行兩大主要任務:設備枚舉和設備操作。設備枚舉是指客戶程序和USB設備交互,獲取其配置信息,譬如設備有幾個配置,每個配置包括多少接口等,并執(zhí)行一些操作如選擇配置,這期間主要是與各類描述符" title="描述符">描述符結構打交道。在設備操作的時候,客戶程序處理從用戶程序發(fā)出的請求,并與設備進行通信,完成操作。
USB HID客戶驅動程序并不直接和硬件打交道,而是通過調用HID類以及USB設備棧提供的DDI服務控制USB硬件的操作。USB客戶驅動程序將有關的控制信息包裝在URB(USB請求塊)結構中,作為IRP的一個參數(shù)傳遞給HID類驅動程序,類驅動程序再調用USB設備棧的下層驅動程序,獲取有關的控制信息,與具體的USB設備進行交互,并返回結果給USB客戶驅動程序。
USB接口HID內核模式的客戶驅動程序是WDM驅動程序,它們支持即插即用和電源管理。其結構和普通WDM驅動程序一樣,由很多例程" title="例程">例程構成。在這些例程中可以調用HID類提供的各種DDI函數(shù)(一般以HIDP開頭)完成設備的操作。
3 USB接口的IC卡讀寫裝置用戶模式客戶程序
IC卡讀寫裝置采用Cypress公司生產(chǎn)的CY7C63001A微控制器。該芯片是8位一次性編程的微控制器,內置1.5Mbps 的USB串行接口引擎。該芯片有35條專門用于USB操作的指令,20個引腳,128字節(jié)的RAM以及4K字節(jié)的可編程空間,可以滿足IC卡讀寫程序存儲的需要。CY7C63001A芯片與主機USB端口的互連如圖3所示。
?
?
3.1 IC卡設備部分的描述符結構
按HID類規(guī)范的規(guī)定,對于每一個USB接口的HID設備,應包含以下幾個描述符:設備描述符、配置描述符、接口描述符、HID類描述符及端點描述符。這些描述符定義了本USB設備的基本信息,如零售商ID(應該向USB組織申請,本設備采用0X4242H)、產(chǎn)品ID、配置數(shù)目(1個)、接口數(shù)目(1個)、端點數(shù)目(1個,控制端點為缺省的,還包括一個中斷輸入端點)及設備類別等。對于HID設備,在接口描述符中需要規(guī)定其類ID為3,在HID類描述符中需要規(guī)定其描述符類型為0X21。HID類設備的基本通信機制是HID報告。每一個HID設備必須定義一個報告描述符,用以詳細描述該設備報告的數(shù)據(jù)協(xié)議及數(shù)據(jù)類型。報告描述符由主項目、局部項目和全局項目組成。一個報告必須包含下列項目:Input(Output或 Feature),Usage,Usage Page,Logical Minimum,Logical Maximum,Report Size,Report Count。每一個數(shù)據(jù)項的位長度等于Report Size × Report Count。不同的報告通過報告ID相互區(qū)分,用法(Usage)表明該用法頁(Usage Page)下各個數(shù)據(jù)的具體含義或目的。報告的大小并不受端點的約束,主機會自動將報告分解成適合傳輸大小的數(shù)據(jù)包。
本系統(tǒng)中,IC卡數(shù)據(jù)以字節(jié)為單位讀出、寫入。一次最多讀取或寫入8個字節(jié),再加上命令字(表明數(shù)據(jù)的含義)及結束標志,最長為13個字節(jié)。輸入報告描述符如下所示:
usage? 01-vendor defined
usage? 02-vendor defined
Logical Minimum (-128)
Logical Maximum (127)
Physical Minimum (0)
Physical Maximum (255)
Report Size(8) (bits)?? ??????? //一個字節(jié)為8位
Report Count(13) (fields) ? ?? //最大為13個字節(jié)
Input(Data, Variable, Absolute)
為了更好地說明設備的信息,還可以為USB設備定義可選的字符串描述符。定義字符串描述符的好處是可以讓主機顯示有意義的設備信息,如廠商名稱、產(chǎn)品名稱等,這對于非通用設備很有好處。本IC卡設備為非通用設備,因此也定義了字符串描述符。另外,字符串語言可通過LanguageID設定,微軟規(guī)定中文的LanguageID為0804H,美國英語的LanguageID為0409H。
3.2 用戶模式客戶程序的編制步驟
HID類驅動程序及HID.DLL提供了兩類讀寫USB設備的函數(shù)。一類是以HidP為前綴,適用于內核模式的客戶驅動程序。另外一類是以HidD為前綴,適用于用戶模式的客戶程序。利用這些函數(shù)編制讀寫USB設備的步驟如下:
第一步,檢測已安裝的HID設備,或稱USB設備枚舉。在和USB設備通信之前,必須得知設備的配置、接口及所用的端點信息,還要獲取設備名。
·首先調用HidD_GetHidGuid函數(shù)獲取HID設備的類標識(GUID);
·調用SetupDiGetClassDevs函數(shù)查詢所有已安裝的HID設備,得到一個指向該HID設備集合的句柄;
·調用SetupDiEnumDeviceInterfaces函數(shù)查詢HID設備集中每一個設備的接口信息;
·對每一個接口,調用SetupDiGetDeviceInterfaceDetail函數(shù)獲取其詳細的信息,包括設備名稱(頭四個字節(jié)),CreateFile用此設備名打開設備。
·調用SetupDiDestroyDeviceInfoList函數(shù)釋放設備信息集合。
第二步,打開設備,獲取設備的屬性值以及設備能力描述。
·調用CreateFile函數(shù)打開本設備。
·調用HidD_GetAttributes函數(shù),獲取USB設備的有關屬性。它包含了設備的零售商ID、產(chǎn)品ID及產(chǎn)品的版本號等。可以根據(jù)這些信息判斷該設備是否為目標設備。
·調用HidD_GetPreparsedData函數(shù),獲取USB設備的預解析數(shù)據(jù)。這些數(shù)據(jù)存放在緩沖區(qū)內,該緩沖區(qū)的數(shù)據(jù)也可以為其它API函數(shù)使用;
·調用HidP_GetCaps函數(shù)從上述緩沖區(qū)中獲取關于該設備能力(如用法、報告描述符的大小等)的描述。調用HidP_GetValueCaps函數(shù)得到每一個設備的輸入、輸出及特征報告的屬性值。調用HidD_GetXXXString函數(shù),獲取設備的字符串描述信息。
第三步,與HID設備交互。
主機在接收報告的時候,需要從報告中提取數(shù)據(jù)。由于報告中包含了各種類型的數(shù)據(jù),為了方便辨別不同類型的數(shù)據(jù),HID類提供了HidP_GetXxx例程,從設備中讀取不同類型的數(shù)據(jù)。如果程序員知道各個數(shù)據(jù)的含義,則可直接使用ReadFile函數(shù)讀出數(shù)據(jù)。本程序直接使用ReadFile函數(shù)讀出數(shù)據(jù)。同樣,主機發(fā)送數(shù)據(jù)給設備的時候,也要先創(chuàng)建報告;為了方便發(fā)送不同類型的數(shù)據(jù)給設備,HID類提供了HidP_SetXxx 函數(shù)。當然,如果程序員知道各個數(shù)據(jù)的含義,也可以直接使用WriteFile函數(shù)將報告?zhèn)鹘o設備。
完成設備操作后,應關閉設備句柄,釋放預解析數(shù)據(jù)所占用的內存區(qū)域。
微軟為了方便串行通信,提供了一個MSCom控件。同樣,為了方便類似USB接口的HID設備通信,可以將以上的通信程序制作成控件,供不同的HID設備使用。
?
參考文獻
1 USB Implementers' Forum.Device Class Definition for Human Interface Devices (HID),1999
2 USB Implementers' Forum.HID Usage Tables,1999
3 Microsoft Corporation.Microsoft Windows 2000 Driver?Development Kit,2000
4 http://www.usb.org
5 http://www.lvr.com
6 Cypress Semiconductor Corporation.CY7C63001A Universal Serial Bus Microcontroller Datasheet,2000
7 王卓人,鄧晉鈞,劉宗祥.IC卡的技術及其應用.北京:電子工業(yè)出版社,1999