《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 業(yè)界動(dòng)態(tài) > Windows2000下USB接口的IC卡讀寫裝置客戶程序設(shè)計(jì)

Windows2000下USB接口的IC卡讀寫裝置客戶程序設(shè)計(jì)

2008-12-04
作者:張建新

  摘? 要: 分析了Windows2000下USB客戶程序的框架,并就如何開發(fā)Windows2000下USB接口的IC卡讀寫裝置客戶程序進(jìn)行了闡述。

  關(guān)鍵詞: USB總線? 客戶程序? IC卡? Windows2000

?

  IC卡是高科技的產(chǎn)物,它廣泛用于銀行、電信、交通運(yùn)輸、小區(qū)管理、校園管理等領(lǐng)域,體現(xiàn)了它的巨大優(yōu)越性。作者在開發(fā)一個(gè)IC卡機(jī)房收費(fèi)系統(tǒng)時(shí)遇到了新問題,那就是當(dāng)計(jì)算機(jī)和IC卡裝置通信的時(shí)候,如果采用傳統(tǒng)的串行通信方式固然可行,但供電必須采用單獨(dú)的外置電源,這樣加大了讀卡裝置的體積。通過翻閱資料發(fā)現(xiàn)USB接口可以輸出5V電壓、500mA的電流,能滿足IC卡裝置對(duì)電源的要求。另外,USB接口和Windows2000操作系統(tǒng)能良好地融合,支持即插即用和電源管理的新特性,使得其與主機(jī)的相連日趨簡(jiǎn)單和輕松。因此決定開發(fā)USB接口的IC卡讀寫裝置,一方面可以解決供電問題,使讀寫裝置使用方便;另一方面也可以滿足其它方面的性能需求。

  USB需要主機(jī)硬件、操作系統(tǒng)和外部設(shè)備三個(gè)方面的支持才能工作。目前主板一般都有支持USB功能的控制芯片組和USB接口插座。微軟" title="微軟">微軟Win9x操作系統(tǒng)以及Windows2000均支持USB,并提供了底層的驅(qū)動(dòng)程序,新版的Linux也支持USB。在USB設(shè)備方面,目前有許多公司生產(chǎn)支持USB的微控制器" title="微控制器">微控制器,比較著名的有Motorola公司的MC68HC05系列,Intel公司的80931HA,Cypress公司的CY7C63系列等。可以說(shuō),USB的發(fā)展已得到各軟硬件廠商的支持,前景光明。

1 Windows2000下的USB架構(gòu)

  主機(jī)要使用USB設(shè)備,必須有驅(qū)動(dòng)程序。微軟操作系統(tǒng)中,Windows98支持USB,WindowsNT4.0不支持USB,NT5.0(Windows2000)支持USB。Windows2000和Windows98對(duì)USB的支持主要是基于WDM(Windows驅(qū)動(dòng)程序模型)技術(shù),因此USB驅(qū)動(dòng)程序是WDM驅(qū)動(dòng)程序。WDM驅(qū)動(dòng)程序采用分層結(jié)構(gòu),由兩部分組成,一個(gè)為功能驅(qū)動(dòng)程序,即通常所說(shuō)的驅(qū)動(dòng)程序,它負(fù)責(zé)指揮硬件工作,由類驅(qū)動(dòng)程序和小類驅(qū)動(dòng)程序構(gòu)成;另外一個(gè)為總線驅(qū)動(dòng)程序,它負(fù)責(zé)管理計(jì)算機(jī)和硬件之間的連接。在功能驅(qū)動(dòng)程序上層和下層,一些設(shè)備還具有過濾驅(qū)動(dòng)程序。它們的作用是監(jiān)視功能驅(qū)動(dòng)程序執(zhí)行I/O操作及修改已有的功能驅(qū)動(dòng)程序。

Windows2000 USB驅(qū)動(dòng)程序框架由USB功能驅(qū)動(dòng)程序和USB總線驅(qū)動(dòng)程序組成。USB總線驅(qū)動(dòng)程序由Windows2000提供,包括USB主控制器驅(qū)動(dòng)程序(OPENHCI.SYS 或 UHCD.SYS,它們分別支持不同的USB主控制器)、USB HUB驅(qū)動(dòng)程序(USBHUB.SYS)以及為控制器驅(qū)動(dòng)程序使用的類驅(qū)動(dòng)程序 (USBD.SYS)。它們一起組成了USB驅(qū)動(dòng)程序棧,可為所有的USB設(shè)備驅(qū)動(dòng)程序共用。用戶或廠商所寫的針對(duì)特定USB設(shè)備的WDM 驅(qū)動(dòng)程序稱為功能驅(qū)動(dòng)程序或客戶驅(qū)動(dòng)程序(位于USB驅(qū)動(dòng)程序棧的上層)。它并不直接訪問硬件,而是調(diào)用驅(qū)動(dòng)程序棧完成對(duì)硬件的操作。USB驅(qū)動(dòng)程序棧通過USBDI(USB Driver Interface)向客戶驅(qū)動(dòng)程序提供WDM系統(tǒng)服務(wù)。

  Windows2000下USB驅(qū)動(dòng)程序棧如圖1所示。

?

?

  有過驅(qū)動(dòng)程序編制經(jīng)驗(yàn)的人都知道,編寫驅(qū)動(dòng)程序是一項(xiàng)需要較高技巧并且很繁瑣的工作。對(duì)于某一些USB規(guī)范定義的類設(shè)備,微軟提供了類驅(qū)動(dòng)程序,負(fù)責(zé)該類設(shè)備的設(shè)備驅(qū)動(dòng)。對(duì)于這類設(shè)備,系統(tǒng)能夠自動(dòng)識(shí)別它們,并不需要附加額外的驅(qū)動(dòng)程序,用戶只需編寫普通的Win32程序即可對(duì)其進(jìn)行訪問。目前,Windows2000為HID(Human Input Device人工輸入設(shè)備)類、音頻設(shè)備類等提供了類驅(qū)動(dòng)程序。

  HID設(shè)備,顧名思義是指那些能被人們用來(lái)直接輸入數(shù)據(jù)給計(jì)算機(jī)的設(shè)備,例如鍵盤、鼠標(biāo)、游戲桿及其他虛擬現(xiàn)實(shí)設(shè)備如數(shù)據(jù)手套等。盡管HID設(shè)備概指人工輸入設(shè)備,但是那些傳輸數(shù)據(jù)量較小、傳輸速度" title="傳輸速度">傳輸速度較慢的設(shè)備,因與輸入設(shè)備類似,也可歸類為人工輸入設(shè)備,例如遠(yuǎn)程控制設(shè)備、面板等。IC卡讀寫裝置與計(jì)算機(jī)之間的數(shù)據(jù)交換具有量小、傳輸速度慢、雙向傳輸?shù)奶攸c(diǎn),因而可歸類為HID設(shè)備。HID設(shè)備包括USB接口的設(shè)備及其他接口的設(shè)備。USB類規(guī)范中詳細(xì)定義了USB接口的人工輸入設(shè)備類標(biāo)準(zhǔn)及HID設(shè)備的用法表,任何USB接口的HID應(yīng)該遵循這個(gè)規(guī)范。

Windows98僅支持USB接口的HID設(shè)備;Windows 2000支持USB接口的HID及其他接口的HID設(shè)備,Windows2000為人工輸入設(shè)備類提供的支持包括:

  (1)Windows2000包含HID驅(qū)動(dòng)程序(hidclass.sys 及hidusb.sys,Hidparse.sys)文件,為USB接口的HID設(shè)備提供內(nèi)置的驅(qū)動(dòng)程序支持。

  (2)Windows2000提供了HID.dll,為用戶模式及內(nèi)核模式的程序提供了一些可用的API(應(yīng)用程序接口)和DDI(設(shè)備驅(qū)動(dòng)程序接口),可用來(lái)編寫基于HID類的應(yīng)用程序。

  (3)對(duì)非USB接口或非HID設(shè)備可通過編寫小類驅(qū)動(dòng)程序間接使用HID類驅(qū)動(dòng)程序,省去了重新編寫類驅(qū)動(dòng)程序的麻煩。

因此,對(duì)于USB接口的HID設(shè)備,通常用戶只需要編寫用戶模式的客戶程序,使用Win32 API函數(shù)對(duì)USB HID設(shè)備進(jìn)行操作,不需要再編寫額外的驅(qū)動(dòng)程序。但在有些情況下,用戶也需要編寫一些基于HID類驅(qū)動(dòng)程序的內(nèi)核客戶驅(qū)動(dòng)程序。譬如,需要向HID設(shè)備發(fā)送命令而不僅僅是讀取或?qū)懭霐?shù)據(jù)時(shí),可能需要編寫內(nèi)核模式的HID程序。對(duì)于本IC卡讀寫裝置,由于只涉及到一般的數(shù)據(jù)讀寫操作(將數(shù)據(jù)在IC卡和主機(jī)之間雙向傳遞),以及較少量的控制操作,并不需要編寫內(nèi)核模式的客戶驅(qū)動(dòng)程序。

  圖2是客戶程序與IC卡讀寫裝置的交互過程。

?

?

2 USB接口的 HID客戶程序

  這里說(shuō)的客戶程序是指在主機(jī)上運(yùn)行,負(fù)責(zé)和USB設(shè)備通信的那部分程序。包括兩種類型:用戶模式下的客戶程序以及內(nèi)核模式下的客戶驅(qū)動(dòng)程序。USB HID客戶程序執(zhí)行兩大主要任務(wù):設(shè)備枚舉和設(shè)備操作。設(shè)備枚舉是指客戶程序和USB設(shè)備交互,獲取其配置信息,譬如設(shè)備有幾個(gè)配置,每個(gè)配置包括多少接口等,并執(zhí)行一些操作如選擇配置,這期間主要是與各類描述符" title="描述符">描述符結(jié)構(gòu)打交道。在設(shè)備操作的時(shí)候,客戶程序處理從用戶程序發(fā)出的請(qǐng)求,并與設(shè)備進(jìn)行通信,完成操作。

  USB HID客戶驅(qū)動(dòng)程序并不直接和硬件打交道,而是通過調(diào)用HID類以及USB設(shè)備棧提供的DDI服務(wù)控制USB硬件的操作。USB客戶驅(qū)動(dòng)程序?qū)⒂嘘P(guān)的控制信息包裝在URB(USB請(qǐng)求塊)結(jié)構(gòu)中,作為IRP的一個(gè)參數(shù)傳遞給HID類驅(qū)動(dòng)程序,類驅(qū)動(dòng)程序再調(diào)用USB設(shè)備棧的下層驅(qū)動(dòng)程序,獲取有關(guān)的控制信息,與具體的USB設(shè)備進(jìn)行交互,并返回結(jié)果給USB客戶驅(qū)動(dòng)程序。

  USB接口HID內(nèi)核模式的客戶驅(qū)動(dòng)程序是WDM驅(qū)動(dòng)程序,它們支持即插即用和電源管理。其結(jié)構(gòu)和普通WDM驅(qū)動(dòng)程序一樣,由很多例程" title="例程">例程構(gòu)成。在這些例程中可以調(diào)用HID類提供的各種DDI函數(shù)(一般以HIDP開頭)完成設(shè)備的操作。

3 USB接口的IC卡讀寫裝置用戶模式客戶程序

  IC卡讀寫裝置采用Cypress公司生產(chǎn)的CY7C63001A微控制器。該芯片是8位一次性編程的微控制器,內(nèi)置1.5Mbps 的USB串行接口引擎。該芯片有35條專門用于USB操作的指令,20個(gè)引腳,128字節(jié)的RAM以及4K字節(jié)的可編程空間,可以滿足IC卡讀寫程序存儲(chǔ)的需要。CY7C63001A芯片與主機(jī)USB端口的互連如圖3所示。

?

?

3.1 IC卡設(shè)備部分的描述符結(jié)構(gòu)

  按HID類規(guī)范的規(guī)定,對(duì)于每一個(gè)USB接口的HID設(shè)備,應(yīng)包含以下幾個(gè)描述符:設(shè)備描述符、配置描述符、接口描述符、HID類描述符及端點(diǎn)描述符。這些描述符定義了本USB設(shè)備的基本信息,如零售商ID(應(yīng)該向USB組織申請(qǐng),本設(shè)備采用0X4242H)、產(chǎn)品ID、配置數(shù)目(1個(gè))、接口數(shù)目(1個(gè))、端點(diǎn)數(shù)目(1個(gè),控制端點(diǎn)為缺省的,還包括一個(gè)中斷輸入端點(diǎn))及設(shè)備類別等。對(duì)于HID設(shè)備,在接口描述符中需要規(guī)定其類ID為3,在HID類描述符中需要規(guī)定其描述符類型為0X21。HID類設(shè)備的基本通信機(jī)制是HID報(bào)告。每一個(gè)HID設(shè)備必須定義一個(gè)報(bào)告描述符,用以詳細(xì)描述該設(shè)備報(bào)告的數(shù)據(jù)協(xié)議及數(shù)據(jù)類型。報(bào)告描述符由主項(xiàng)目、局部項(xiàng)目和全局項(xiàng)目組成。一個(gè)報(bào)告必須包含下列項(xiàng)目:Input(Output或 Feature),Usage,Usage Page,Logical Minimum,Logical Maximum,Report Size,Report Count。每一個(gè)數(shù)據(jù)項(xiàng)的位長(zhǎng)度等于Report Size × Report Count。不同的報(bào)告通過報(bào)告ID相互區(qū)分,用法(Usage)表明該用法頁(yè)(Usage Page)下各個(gè)數(shù)據(jù)的具體含義或目的。報(bào)告的大小并不受端點(diǎn)的約束,主機(jī)會(huì)自動(dòng)將報(bào)告分解成適合傳輸大小的數(shù)據(jù)包。

本系統(tǒng)中,IC卡數(shù)據(jù)以字節(jié)為單位讀出、寫入。一次最多讀取或?qū)懭?個(gè)字節(jié),再加上命令字(表明數(shù)據(jù)的含義)及結(jié)束標(biāo)志,最長(zhǎng)為13個(gè)字節(jié)。輸入報(bào)告描述符如下所示:

  usage? 01-vendor defined

  usage? 02-vendor defined

  Logical Minimum (-128)

  Logical Maximum (127)

  Physical Minimum (0)

  Physical Maximum (255)

  Report Size(8) (bits)?? ??????? //一個(gè)字節(jié)為8位

  Report Count(13) (fields) ? ?? //最大為13個(gè)字節(jié)

  Input(Data, Variable, Absolute)

  為了更好地說(shuō)明設(shè)備的信息,還可以為USB設(shè)備定義可選的字符串描述符。定義字符串描述符的好處是可以讓主機(jī)顯示有意義的設(shè)備信息,如廠商名稱、產(chǎn)品名稱等,這對(duì)于非通用設(shè)備很有好處。本IC卡設(shè)備為非通用設(shè)備,因此也定義了字符串描述符。另外,字符串語(yǔ)言可通過LanguageID設(shè)定,微軟規(guī)定中文的LanguageID為0804H,美國(guó)英語(yǔ)的LanguageID為0409H。

3.2 用戶模式客戶程序的編制步驟

  HID類驅(qū)動(dòng)程序及HID.DLL提供了兩類讀寫USB設(shè)備的函數(shù)。一類是以HidP為前綴,適用于內(nèi)核模式的客戶驅(qū)動(dòng)程序。另外一類是以HidD為前綴,適用于用戶模式的客戶程序。利用這些函數(shù)編制讀寫USB設(shè)備的步驟如下:

  第一步,檢測(cè)已安裝的HID設(shè)備,或稱USB設(shè)備枚舉。在和USB設(shè)備通信之前,必須得知設(shè)備的配置、接口及所用的端點(diǎn)信息,還要獲取設(shè)備名。

  ·首先調(diào)用HidD_GetHidGuid函數(shù)獲取HID設(shè)備的類標(biāo)識(shí)(GUID);

  ·調(diào)用SetupDiGetClassDevs函數(shù)查詢所有已安裝的HID設(shè)備,得到一個(gè)指向該HID設(shè)備集合的句柄;

  ·調(diào)用SetupDiEnumDeviceInterfaces函數(shù)查詢HID設(shè)備集中每一個(gè)設(shè)備的接口信息;

  ·對(duì)每一個(gè)接口,調(diào)用SetupDiGetDeviceInterfaceDetail函數(shù)獲取其詳細(xì)的信息,包括設(shè)備名稱(頭四個(gè)字節(jié)),CreateFile用此設(shè)備名打開設(shè)備。

  ·調(diào)用SetupDiDestroyDeviceInfoList函數(shù)釋放設(shè)備信息集合。

  第二步,打開設(shè)備,獲取設(shè)備的屬性值以及設(shè)備能力描述。

  ·調(diào)用CreateFile函數(shù)打開本設(shè)備。

  ·調(diào)用HidD_GetAttributes函數(shù),獲取USB設(shè)備的有關(guān)屬性。它包含了設(shè)備的零售商ID、產(chǎn)品ID及產(chǎn)品的版本號(hào)等??梢愿鶕?jù)這些信息判斷該設(shè)備是否為目標(biāo)設(shè)備。

  ·調(diào)用HidD_GetPreparsedData函數(shù),獲取USB設(shè)備的預(yù)解析數(shù)據(jù)。這些數(shù)據(jù)存放在緩沖區(qū)內(nèi),該緩沖區(qū)的數(shù)據(jù)也可以為其它API函數(shù)使用;

  ·調(diào)用HidP_GetCaps函數(shù)從上述緩沖區(qū)中獲取關(guān)于該設(shè)備能力(如用法、報(bào)告描述符的大小等)的描述。調(diào)用HidP_GetValueCaps函數(shù)得到每一個(gè)設(shè)備的輸入、輸出及特征報(bào)告的屬性值。調(diào)用HidD_GetXXXString函數(shù),獲取設(shè)備的字符串描述信息。

  第三步,與HID設(shè)備交互。

  主機(jī)在接收?qǐng)?bào)告的時(shí)候,需要從報(bào)告中提取數(shù)據(jù)。由于報(bào)告中包含了各種類型的數(shù)據(jù),為了方便辨別不同類型的數(shù)據(jù),HID類提供了HidP_GetXxx例程,從設(shè)備中讀取不同類型的數(shù)據(jù)。如果程序員知道各個(gè)數(shù)據(jù)的含義,則可直接使用ReadFile函數(shù)讀出數(shù)據(jù)。本程序直接使用ReadFile函數(shù)讀出數(shù)據(jù)。同樣,主機(jī)發(fā)送數(shù)據(jù)給設(shè)備的時(shí)候,也要先創(chuàng)建報(bào)告;為了方便發(fā)送不同類型的數(shù)據(jù)給設(shè)備,HID類提供了HidP_SetXxx 函數(shù)。當(dāng)然,如果程序員知道各個(gè)數(shù)據(jù)的含義,也可以直接使用WriteFile函數(shù)將報(bào)告?zhèn)鹘o設(shè)備。

  完成設(shè)備操作后,應(yīng)關(guān)閉設(shè)備句柄,釋放預(yù)解析數(shù)據(jù)所占用的內(nèi)存區(qū)域。

微軟為了方便串行通信,提供了一個(gè)MSCom控件。同樣,為了方便類似USB接口的HID設(shè)備通信,可以將以上的通信程序制作成控件,供不同的HID設(shè)備使用。

?

參考文獻(xiàn)

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卡的技術(shù)及其應(yīng)用.北京:電子工業(yè)出版社,1999

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。