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

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

2008-12-04
作者:張建新

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

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

?

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

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

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

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

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

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

?

?

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

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

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

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

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

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

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

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

?

?

2 USB接口的 HID客戶程序

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

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

  USB接口HID內(nèi)核模式的客戶驅(qū)動程序是WDM驅(qū)動程序,它們支持即插即用和電源管理。其結(jié)構(gòu)和普通WDM驅(qū)動程序一樣,由很多例程" 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個引腳,128字節(jié)的RAM以及4K字節(jié)的可編程空間,可以滿足IC卡讀寫程序存儲的需要。CY7C63001A芯片與主機USB端口的互連如圖3所示。

?

?

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

  按HID類規(guī)范的規(guī)定,對于每一個USB接口的HID設(shè)備,應(yīng)包含以下幾個描述符:設(shè)備描述符、配置描述符、接口描述符、HID類描述符及端點描述符。這些描述符定義了本USB設(shè)備的基本信息,如零售商ID(應(yīng)該向USB組織申請,本設(shè)備采用0X4242H)、產(chǎn)品ID、配置數(shù)目(1個)、接口數(shù)目(1個)、端點數(shù)目(1個,控制端點為缺省的,還包括一個中斷輸入端點)及設(shè)備類別等。對于HID設(shè)備,在接口描述符中需要規(guī)定其類ID為3,在HID類描述符中需要規(guī)定其描述符類型為0X21。HID類設(shè)備的基本通信機制是HID報告。每一個HID設(shè)備必須定義一個報告描述符,用以詳細描述該設(shè)備報告的數(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é)為單位讀出、寫入。一次最多讀取或?qū)懭?個字節(jié),再加上命令字(表明數(shù)據(jù)的含義)及結(jié)束標(biāo)志,最長為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)

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

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

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

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

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

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

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

  ·對每一個接口,調(diào)用SetupDiGetDeviceInterfaceDetail函數(shù)獲取其詳細的信息,包括設(shè)備名稱(頭四個字節(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)品的版本號等??梢愿鶕?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è)備能力(如用法、報告描述符的大小等)的描述。調(diào)用HidP_GetValueCaps函數(shù)得到每一個設(shè)備的輸入、輸出及特征報告的屬性值。調(diào)用HidD_GetXXXString函數(shù),獲取設(shè)備的字符串描述信息。

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

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

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

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

?

參考文獻

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)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 欧美母乳| 久青草香蕉精品视频在线 | 日本三级香港三级国产三级 | 午夜寂寞网站 | 成人a大片高清在线观看 | 中文精品久久久久国产网址 | 欧美激情视频一区二区 | 久久精品国产亚洲网站 | 福利社午夜影院 | 日韩www视频 | 国产真实伦偷精品 | 色护士精品影院www 色狠狠色综合久久8狠狠色 | 色婷婷婷丁香亚洲综合不卡 | 国产精品99久久久 | 一级一片免费看 | 亚洲视频在线免费观看 | 福利午夜 | 最近中文国语字幕在线播放视频 | 成人国产精品免费视频不卡 | 国产伦一区二区三区免费 | 天天操天天射天天爽 | 天天碰夜夜| 我想看一级毛片免费的 | 手机看一级片 | 各类毛片 | 欧美成人看片一区二区三区 | 色婷婷99综合久久久精品 | 小处雏一区二区三区精 | 中文字幕免费播放 | 男女污污无遮挡免费观看 | 亚洲激情视频在线播放 | 2020最新国产精品视频 | 国产成人精品综合久久久软件 | 一本大道香蕉视频在线观看 | 成人久久免费视频 | 香蕉视频一级片 | 免费成人福利视频 | 美女很黄很黄是免费的 | 黄色网址免费 | 伊人影视在线观看日韩区 | 中文字幕在线观看免费 |