摘? 要: 從問題的由來、類驅(qū)動程序、通信協(xié)議、描述符、驅(qū)動開發(fā)等對USB的驅(qū)動進(jìn)行分析和討論,提出USB設(shè)備使用操作系統(tǒng)嵌入的通用類驅(qū)動程序成為趨勢。
關(guān)鍵詞: USB? 類驅(qū)動程序? 人工接口設(shè)備(HID)? Windows驅(qū)動程序模型(WDM)
?
最初設(shè)計USB(Universal Serial Bus)這種外設(shè)總線的目的之一就是為了便于使用,這是計算機(jī)發(fā)展的產(chǎn)物。外設(shè)總線最重要的就是操作系統(tǒng)對外設(shè)的自動識別、配置,實現(xiàn)熱插拔,即插即用。本文試圖以人工接口設(shè)備(Human interface device,簡稱HID)為主,從問題的由來、類驅(qū)動程序、通信協(xié)議、描述符、驅(qū)動開發(fā)等幾個方面來探討一下USB設(shè)備的驅(qū)動問題。
1 問題的由來
一個非常簡單的設(shè)備安裝有時得花用戶好幾天時間,原因何在?設(shè)備的驅(qū)動與其他的驅(qū)動程序或軟件不兼容,或隱有bug。如果操作系統(tǒng)本身就含有用戶需要的驅(qū)動程序,設(shè)備一插就能使用,這是最好不過的事情。
現(xiàn)已有上千種不同的設(shè)備,許多功能大致一樣。操作系統(tǒng)不可能為所有的設(shè)備提供全部的驅(qū)動程序。仔細(xì)考慮一下,許多設(shè)備可歸屬為少數(shù)幾個具有普遍特性和需求的類,因而為每種類定義一個通用的API接口,寫出通用的驅(qū)動程序是可實現(xiàn)的。
通過定義不同的設(shè)備類型,USB試圖實現(xiàn)通用驅(qū)動程序這一目標(biāo)。在USB規(guī)范里,除定義了基本的協(xié)議和構(gòu)造用來配置設(shè)備和傳輸數(shù)據(jù),還為所有的USB設(shè)備定義了機(jī)械和電器性能要求。USB規(guī)范定義了通信、打印、圖像、儲存、音頻和人工接口設(shè)備等類。一些設(shè)備是單一的類,一些是多種類的綜合體。具有多種類的設(shè)備稱為混合設(shè)備,在USB規(guī)范對設(shè)備有詳細(xì)的劃分。
2 類驅(qū)動程序
由于一些類尚未形成標(biāo)準(zhǔn),Win2000只包含了部分USB類的驅(qū)動程序。一旦形成標(biāo)準(zhǔn)得到認(rèn)可,通用的驅(qū)動程序也就自然嵌入到操作系統(tǒng)了。圖1為操作系統(tǒng)中USB驅(qū)動接口框圖。這是一個標(biāo)準(zhǔn)的Windows驅(qū)動程序模型(WDM),是一種分層模式。核心USB Driver Stack模型描述設(shè)備如何安裝和啟動,以及如何為用戶請求服務(wù)和與硬件打交道,并為上層USB驅(qū)動提供接口。上層驅(qū)動完成設(shè)備功能并為用戶層提供接口,這使得向USB總線發(fā)出請求是通過多層結(jié)構(gòu)。
?
HID類是為一些人工的輸入或輸出設(shè)備而設(shè)計的,最常用的象鍵盤、鼠標(biāo)、游戲控制器。這種類同時也包含了前面板顯示區(qū)和鍵盤區(qū)(象電話或VCR遠(yuǎn)程控制),還有觸覺和聽覺反饋設(shè)備。對于HID類的設(shè)備,操作系統(tǒng)已經(jīng)給出了相應(yīng)的驅(qū)動程序。
連接到計算機(jī)的USB設(shè)備幾乎都包含HID類,用以信號控制。比如一個USB揚(yáng)聲器,音量、音調(diào)控制用HID類,但音頻數(shù)據(jù)傳輸用音頻類。
通常情況下,USB設(shè)備與主機(jī)通信是經(jīng)過USB端口,類驅(qū)動程序無須擔(dān)心或考慮ISA總線、PCI總線、SCSI、IDE或ATAPI接口、串口、并口、鍵盤或鼠標(biāo)口、游戲接口及相關(guān)的一些東西。類驅(qū)動程序甚至不需要了解USB端口,這個物理接口被USB主機(jī)驅(qū)動程序管理形成抽象層,也正因為這個抽象層及其他相應(yīng)層,使通用驅(qū)動程序成為可能。每一層有自己的功能,并為上一層提供了API接口,上層沒有必要了解下一層如何工作及內(nèi)部體系結(jié)構(gòu),各層為一個封裝體。
圖2所示為USB各層之間的通信流程。USB用明確定義了的層協(xié)議來減少復(fù)雜化且有利于標(biāo)準(zhǔn)化,各層均有連接,但大多為邏輯型的。最低層的是USB主機(jī)控制器和USB設(shè)備接口之間的物理連接,包括連接線、連接器、狀態(tài)機(jī)。其次在計算機(jī)方面為USB主機(jī)驅(qū)動程序,這是操作系統(tǒng)所必須的。在設(shè)備方是用于設(shè)備管理和請求的固件程序(Firmware),此層是配置和控制USB接口的邏輯連接。第三層在主機(jī)方是設(shè)備驅(qū)動程序,通常稱為類驅(qū)動程序;在設(shè)備方是類屬性的固件程序,通過邏輯連接用于特殊類的控制和請求。最頂層為用戶層,為用戶所關(guān)心和考慮,比如在主機(jī)客戶方為飛行模擬仿真,在設(shè)備方則為操縱桿。此時用戶所關(guān)心的是操縱桿的輸入,不用考慮這些輸入如何讀、如何打包、如何傳輸。
?
3 通信協(xié)議
與USB設(shè)備進(jìn)行通信,主機(jī)軟件打開一系列的管道來傳輸數(shù)據(jù)。不同的管道對應(yīng)于USB的不同端口(endpoint)。USB有四種傳輸方式,分別為控制、中斷、同步和批量,每種方式對應(yīng)各自的管道。除同步方式外,均有握手信號,保證了數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。
一般的USB設(shè)備通常用控制、中斷或數(shù)據(jù)管道,如圖3所示。數(shù)據(jù)管道是單向的,用于批量或同步傳輸方式時使用。HID設(shè)備通常僅用控制和中斷兩個管道??刂乒艿罏槿笔?也可被USB設(shè)備用來接收、響應(yīng)特殊的請求或命令。中斷管道向主機(jī)異步發(fā)送數(shù)據(jù),其實USB不支持真正的中斷,而是用來傳輸無時序特征的信號變化。比如按下鍵、鼠標(biāo)移動、操縱桿運(yùn)動,不用特殊的請求就可實時地傳輸數(shù)據(jù)。
?
每一種數(shù)據(jù)傳輸方式中包含了多個事務(wù)數(shù)據(jù),這些數(shù)據(jù)被綜合完成一定功能。一個事務(wù)數(shù)據(jù)由三個部分組成:信令包段(Token Packet phase)、數(shù)據(jù)包段(Data Packet phase)、握手信號包段(Handshade Packet phase)。信令包定義了事務(wù)的類型,設(shè)備的地址也包含在其中。一些信令包單獨(dú)存在,后面沒有跟別的包。數(shù)據(jù)包里包含了與傳輸有關(guān)的負(fù)載。在單個的事務(wù)數(shù)據(jù)最大能承載1023個字節(jié)。
基于相同的管道配置和命令、通用的API接口,USB設(shè)備通用驅(qū)動程序得以實現(xiàn),設(shè)備之間的差異則使返回的數(shù)據(jù)結(jié)構(gòu)不同。
4 描述符
USB設(shè)備用預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)來表示他們的標(biāo)識符、性能、請求和協(xié)議,通常稱為描述符。設(shè)備一插入到主機(jī),操作系統(tǒng)就能立刻根據(jù)描述符找到與之相對應(yīng)的類驅(qū)動程序,完成USB設(shè)備的枚舉及其他功能。在USB規(guī)范里定義了必要的設(shè)備、配置、接口、端口、字符串描述。HID類除此之外又定義了報告描述符。報告描述符提供了HID類驅(qū)動程序能理解和解釋的報告,報告雖然靈活但卻很復(fù)雜。描述符可用固件程序來寫,編譯生成二進(jìn)制格式后儲存到設(shè)備中使用,便于類驅(qū)動識別和解釋。
下面是作者設(shè)計的一個利用EZUSB芯片提供的I2C連接多部醫(yī)監(jiān)設(shè)備的報告描述符。圖4為報告描述符所表達(dá)的數(shù)據(jù)結(jié)構(gòu)。
?
ReportDescriptor??? :???; Generated with HID Tool, copied to here
DB?? 6,0,0FFH??????; Usage_Page (Vendor Defined)?
DB?? 9,1????????????; Usage (I/O Device)?
DB?? 0A1H,1???????? ; Collection (Application)
DB?? 19H,1????????? ; Usage_Minimum?
DB?? 29H,2????????? ; Usage_Maximum?
DB?? 15H,0????????? ; Logical_Minimum (0)?
DB?? 26H,255,0???? ; Logical_Maximum (255)
DB?? 75H,8????????? ; Report_Size (8)
DB?? 95H,1????????? ; Report_Count (1) = Read Address
DB?? 81H,2????????? ; Input (Data,Var,Abs)
DB?? 19H,1????????? ; Usage_Minimum?
DB?? 29H,2????????? ; Usage_Maximum?
DB?? 95H,2????????? ;?Report_Count (2)=Write Address+Data
DB?? 91H, 2???????? ; Output (Data,Var,Abs)
DB?? 0C0H????????????; End_Collection
ReportLength? EQU $-ReportDescriptor
5 驅(qū)動程序的開發(fā)
對于USB設(shè)備來說,開發(fā)驅(qū)動程序是一件比較復(fù)雜的事情。通常驅(qū)動程序要實現(xiàn)以下的功能:
·設(shè)備的初始化;
·即插即用創(chuàng)建和刪除設(shè)備;
·處理Win32打開和關(guān)閉文件句柄的請求;
·類功能定義IOCTL(I/O Control)、功能實現(xiàn);
·IRP(I/O Request Packet)的調(diào)用處理;
·調(diào)用其他的驅(qū)動程序;
·訪問硬件。
USB驅(qū)動程序設(shè)計的核心是端點(diǎn)(Endpoint)及數(shù)據(jù)傳輸類型的選擇,通過端點(diǎn)建立起管道通信,實現(xiàn)定義的功能。這樣,在應(yīng)用層和設(shè)備之間就建立起了虛擬的通道,所有這些通過多線程的句柄調(diào)用實現(xiàn)。
每個驅(qū)動程序都必須有一個DriverEntry入口函數(shù),用于系統(tǒng)調(diào)用。
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
???????????????????? IN PUNICODE_STRING RegistryPath)
{
NTSTATUS status = STATUS_SUCCESS;
// Export other driver entry points...
DriverObject->DriverUnload = USBUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE]=USBCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE]=USBClose;
DriverObject->MajorFunction[IRP_MJ_READ]=USBRead;
DriverObject->MajorFunction[IRP_MJ_WRITE] =USBWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBDeviceControl;
RegisterForPnpNotification(DriverObject);
return status;
}
寫驅(qū)動程序的軟件較多,目前比較流行的軟件是DriverStudio、WinDriver等。它們均提供用于生成USB驅(qū)動的代碼生成器,用戶按照提示可以定義設(shè)備的配置和功能,然后做功能修改即可。利用軟件提供的例子進(jìn)行修改也是一個比較好的捷徑。
USB技術(shù)的應(yīng)用,是計算機(jī)產(chǎn)業(yè)的一大發(fā)展。目前以微軟為代表的各大公司積極對其進(jìn)行開發(fā),使得應(yīng)用越來越廣泛。微軟操作系統(tǒng)集成了HID類、音頻類的USB驅(qū)動程序。作者用EZUSB以HID類連接醫(yī)監(jiān)設(shè)備,不用寫驅(qū)動程序在Win2000上運(yùn)行良好。針對開發(fā)USB器件的需要,作者根據(jù)HID規(guī)范定義了自己特殊的類并重新寫上層的類驅(qū)動程序,測試較為滿意。從長遠(yuǎn)的角度來看,操作系統(tǒng)通過集成類驅(qū)動程序來支持各種USB設(shè)備勢在必行。
?
參考文獻(xiàn)
1 Compaq,Intel,Microsoft,NEC.Universal Serial Bus Specification.Revision2.0 May 18,2000
2 Chris Cant.Writing Windows WDM Device Drivers
3 EZ-USB Technical Reference Manual Version1.6.Anchor Chips Incorporated. Copyright1999
4 Jim Lyle.USB Primer Classer and Drivers
5 Device Class Definition for Human Interface Devices (HID). Firmware Specification 4/7/99. Version 1.1.
July 4, 1999
6 Peter G.Viscarola &W.Anthony Mason.Windows NT Device Driver Development
7 Mike Zerkus,John Lusher,Jonathan Ward.USB Primer
?
? Practical Design Guide